-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclient.py
174 lines (140 loc) · 4.86 KB
/
client.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#
# Copyright (c) 2016-2023, Smart Engines Service LLC
# All rights reserved
#
import asyncio
from io import FileIO
import pathlib
import pickle
import json
import time
from datetime import date
import struct
import argparse
import uuid
from datetime import datetime, timezone
"""
This client send settings object to the server and return recognition result in json file.
Example: python3 client.py -mask "mrz.mrp" -s=YOUR_SIGNATURE_HERE --image_path="./Smart-ID-Engine/testdata/mrz_passport_2.jpg"
Response:
{
"error":false,
"response":{
"docType":"mrz.mrp",
"fields":{
"full_mrz":{
"name":"full_mrz",
"value":"P<CANMARTIN<<SARAH<<<08",
"isAccepted":true,
"attr":{
"control_digit_check":"passed"
}
},
"mrz_birth_date":{
"name":"mrz_birth_date",
"value":"01.01.1985",
"isAccepted":true,
"attr":{
"control_digit_check":"passed"
}
},
"mrz_gender":{
"name":"mrz_gender",
"value":"F",
"isAccepted":true
}
}
}
}
Arguments:
--mask - Document mask. [default "*"]
--mode - Engine mode. [default "default"]
--signature - *required*. Licencse key.
--image_path - *required*. Path to local image.
--output - Output folder for result. [default "./result"]
--forensics - If you want to check forensics data. This option must be enabled with `"common.currentDate": "DD.MM.YYYY"` in `options`forensics data. [default false]
--endpoint - server ip adress
--port - Port of your server endpoint. [default 53000]
"""
parser = argparse.ArgumentParser()
parser.add_argument('-mask', '--mask', default="*")
parser.add_argument('-mode', '--mode', default="default")
parser.add_argument('-s', '--signature')
parser.add_argument('-i', '--image_path')
parser.add_argument('-o', '--output', default="./result")
parser.add_argument('-f', '--forensics', action='store_true')
parser.add_argument('-e', '--endpoint', default="127.0.0.1")
parser.add_argument('-p', '--port', default=53000)
parser.add_argument('-l', '--log', action='store_true')
parser.add_argument('-t', '--stdout', action='store_true')
args = parser.parse_args()
mode = args.mode
mask = args.mask
sign = args.signature
input = args.image_path
folder_dest = args.output
is_forensics = args.forensics
is_log = args.log
endpoint = args.endpoint
port = args.port
if is_log:
settings = {
"log": True
}
else:
# Get current date for forensics
today = date.today()
# dd.mm.yyyy
currentDate = today.strftime("%d.%m.%Y")
input = FileIO(input).read()
settings = {
"mode": mode,
"mask": [mask],
"forensics": is_forensics,
"options": {"common.currentDate": currentDate},
"input": input,
"signature": sign
}
async def save_result(data):
""" Create folder and save result as json file. """
if (folder_dest == "stdout"):
print(json.dumps(data, ensure_ascii=False, indent=4, sort_keys=True))
else:
# Create folder if not exist
pathlib.Path(folder_dest).mkdir(parents=True, exist_ok=True)
# get the current time
time = datetime.now(
timezone.utc).strftime("%Y-%m-%d_%H-%M")
# Filename = time + random salt
filename = time + '_' + str(uuid.uuid4().hex)[0:8] + '.json'
full_path = folder_dest + '/' + filename
with open(full_path, 'w', encoding='utf-8') as f:
json.dump(data, f,
ensure_ascii=False, indent=4, sort_keys=True)
async def tcp_client(settings):
""" Connect to async sockets. Encode data for transmission and Decode for result.
Result will be saved in a folder.
"""
reader, writer = await asyncio.open_connection(endpoint, port)
# send request
serialized_data = pickle.dumps(settings)
writer.write(struct.pack('<L', len(serialized_data)))
writer.write(serialized_data)
await writer.drain()
# get response
request_size = struct.unpack('<L', await reader.readexactly(4))[0]
request_body = await reader.readexactly(request_size)
message = pickle.loads(request_body)
writer.close()
if (message.get("error") == True):
""" Log server exceptions """
desc = message.get("desc")
print(desc)
file_object = open('error.log', 'a')
timestr = time.strftime("%Y-%m-%d-%H%M%S")
file_object.write("\r\n ========= " + timestr + " ========= \r\n")
file_object.write(desc)
file_object.close()
else:
await save_result(message)
asyncio.run(tcp_client(settings))