smartrack-sdk 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of smartrack-sdk might be problematic. Click here for more details.
- examples/__init__.py +7 -0
- examples/basic_usage.py +360 -0
- examples/callback_server.py +435 -0
- examples/test_client.py +303 -0
- smartrack_sdk/__init__.py +129 -0
- smartrack_sdk/callback/__init__.py +19 -0
- smartrack_sdk/callback/fastapi_handler.py +151 -0
- smartrack_sdk/callback/flask_handler.py +137 -0
- smartrack_sdk/callback/handler.py +220 -0
- smartrack_sdk/callback/service.py +14 -0
- smartrack_sdk/client/__init__.py +13 -0
- smartrack_sdk/client/smart_rack_client.py +523 -0
- smartrack_sdk/exceptions/__init__.py +21 -0
- smartrack_sdk/exceptions/api.py +29 -0
- smartrack_sdk/exceptions/base.py +25 -0
- smartrack_sdk/exceptions/configuration.py +28 -0
- smartrack_sdk/exceptions/network.py +50 -0
- smartrack_sdk/exceptions/validation.py +28 -0
- smartrack_sdk/models/__init__.py +85 -0
- smartrack_sdk/models/callback.py +184 -0
- smartrack_sdk/models/enums.py +203 -0
- smartrack_sdk/models/requests.py +291 -0
- smartrack_sdk/models/responses.py +209 -0
- smartrack_sdk/tests/__init__.py +7 -0
- smartrack_sdk/tests/test_callback.py +295 -0
- smartrack_sdk/tests/test_client.py +264 -0
- smartrack_sdk-1.0.0.dist-info/METADATA +557 -0
- smartrack_sdk-1.0.0.dist-info/RECORD +31 -0
- smartrack_sdk-1.0.0.dist-info/WHEEL +5 -0
- smartrack_sdk-1.0.0.dist-info/entry_points.txt +2 -0
- smartrack_sdk-1.0.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
WebAPI回调处理服务器示例
|
|
6
|
+
展示如何使用SmartRack SDK处理WebAPI回调请求
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
import threading
|
|
11
|
+
import time
|
|
12
|
+
from datetime import datetime
|
|
13
|
+
|
|
14
|
+
# 导入回调处理器
|
|
15
|
+
from smartrack_sdk.callback import CellEventCallbackService, CellEventHandler
|
|
16
|
+
from smartrack_sdk.models.callback import CellEventHandleRequest, CellEventHandleResponse, CellEventData
|
|
17
|
+
from smartrack_sdk.models.enums import TriggerState, OperationResultCode, LedColors
|
|
18
|
+
|
|
19
|
+
# 配置日志
|
|
20
|
+
logging.basicConfig(
|
|
21
|
+
level=logging.INFO,
|
|
22
|
+
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
|
23
|
+
)
|
|
24
|
+
logger = logging.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class CustomCellEventHandler(CellEventHandler):
|
|
28
|
+
"""自定义储位事件处理器"""
|
|
29
|
+
|
|
30
|
+
def handle(self, request: CellEventHandleRequest) -> CellEventHandleResponse:
|
|
31
|
+
"""
|
|
32
|
+
处理储位事件回调
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
request: 回调请求
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
回调响应
|
|
39
|
+
"""
|
|
40
|
+
logger.info(f"收到储位事件回调 - 用户: {request.user_id}, 客户端: {request.client_id}")
|
|
41
|
+
|
|
42
|
+
event_data_list = request.data
|
|
43
|
+
if not event_data_list:
|
|
44
|
+
logger.warning("没有事件数据")
|
|
45
|
+
return CellEventHandleResponse.error(100102, "没有事件数据", request.session_id)
|
|
46
|
+
|
|
47
|
+
try:
|
|
48
|
+
# 处理每个事件
|
|
49
|
+
for event_data in event_data_list:
|
|
50
|
+
self._process_cell_event(event_data)
|
|
51
|
+
|
|
52
|
+
# 所有事件处理成功
|
|
53
|
+
return CellEventHandleResponse.success(request.session_id)
|
|
54
|
+
|
|
55
|
+
except Exception as e:
|
|
56
|
+
logger.error("处理事件失败", exc_info=True)
|
|
57
|
+
return CellEventHandleResponse.error(100103, f"处理事件失败: {str(e)}", request.session_id)
|
|
58
|
+
|
|
59
|
+
def _process_cell_event(self, event_data: CellEventData) -> None:
|
|
60
|
+
"""
|
|
61
|
+
处理单个事件数据
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
event_data: 事件数据
|
|
65
|
+
"""
|
|
66
|
+
logger.info(f"处理事件 - 储位: {event_data.cell_id}, GRN: {event_data.grn}, "
|
|
67
|
+
f"状态: {event_data.cell_state.name_en}, 结果: {event_data.code}")
|
|
68
|
+
|
|
69
|
+
# 检查操作结果
|
|
70
|
+
if event_data.code != OperationResultCode.SUCCESS.value:
|
|
71
|
+
self._handle_operation_error(event_data)
|
|
72
|
+
return
|
|
73
|
+
|
|
74
|
+
# 根据触发状态处理不同操作
|
|
75
|
+
if event_data.cell_state == TriggerState.PUT_IN:
|
|
76
|
+
self._handle_put_in_event(event_data)
|
|
77
|
+
elif event_data.cell_state == TriggerState.TAKE_OUT:
|
|
78
|
+
self._handle_take_out_event(event_data)
|
|
79
|
+
else:
|
|
80
|
+
logger.warning(f"未知的储位状态: {event_data.cell_state}")
|
|
81
|
+
|
|
82
|
+
def _handle_put_in_event(self, event_data: CellEventData) -> None:
|
|
83
|
+
"""
|
|
84
|
+
处理放入事件
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
event_data: 事件数据
|
|
88
|
+
"""
|
|
89
|
+
logger.info(f"处理入库事件 - 储位: {event_data.cell_id}, GRN: {event_data.grn}, 单号: {event_data.sheet_id}")
|
|
90
|
+
|
|
91
|
+
# 验证数据
|
|
92
|
+
if not event_data.grn or not event_data.grn.strip():
|
|
93
|
+
raise ValueError("GRN不能为空")
|
|
94
|
+
|
|
95
|
+
# 这里可以添加具体的入库业务逻辑
|
|
96
|
+
# 例如:更新数据库记录、发送通知、触发工作流等
|
|
97
|
+
|
|
98
|
+
# 模拟业务处理
|
|
99
|
+
self._update_inventory_for_put_in(event_data)
|
|
100
|
+
self._send_notification("入库成功", event_data)
|
|
101
|
+
|
|
102
|
+
logger.info(f"入库事件处理完成 - 储位: {event_data.cell_id}")
|
|
103
|
+
|
|
104
|
+
def _handle_take_out_event(self, event_data: CellEventData) -> None:
|
|
105
|
+
"""
|
|
106
|
+
处理取出事件
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
event_data: 事件数据
|
|
110
|
+
"""
|
|
111
|
+
logger.info(f"处理出库事件 - 储位: {event_data.cell_id}, GRN: {event_data.grn}, 单号: {event_data.sheet_id}")
|
|
112
|
+
|
|
113
|
+
# 验证数据
|
|
114
|
+
if not event_data.grn or not event_data.grn.strip():
|
|
115
|
+
raise ValueError("GRN不能为空")
|
|
116
|
+
|
|
117
|
+
# 这里可以添加具体的出库业务逻辑
|
|
118
|
+
# 例如:更新数据库记录、发送通知、触发工作流等
|
|
119
|
+
|
|
120
|
+
# 模拟业务处理
|
|
121
|
+
self._update_inventory_for_take_out(event_data)
|
|
122
|
+
self._send_notification("出库成功", event_data)
|
|
123
|
+
|
|
124
|
+
logger.info(f"出库事件处理完成 - 储位: {event_data.cell_id}")
|
|
125
|
+
|
|
126
|
+
def _handle_operation_error(self, event_data: CellEventData) -> None:
|
|
127
|
+
"""
|
|
128
|
+
处理操作错误
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
event_data: 事件数据
|
|
132
|
+
"""
|
|
133
|
+
logger.error(f"操作错误 - 储位: {event_data.cell_id}, GRN: {event_data.grn}, "
|
|
134
|
+
f"错误代码: {event_data.code}, 错误消息: {event_data.message}")
|
|
135
|
+
|
|
136
|
+
# 处理不同类型的错误
|
|
137
|
+
if event_data.code == OperationResultCode.ILLEGAL_STOCK_IN.value:
|
|
138
|
+
self._handle_illegal_stock_in(event_data)
|
|
139
|
+
elif event_data.code == OperationResultCode.ILLEGAL_STOCK_OUT.value:
|
|
140
|
+
self._handle_illegal_stock_out(event_data)
|
|
141
|
+
elif event_data.code == OperationResultCode.ILLEGAL_STOCK_IN_CLEAR_ERROR.value:
|
|
142
|
+
self._handle_illegal_stock_in_clear_error(event_data)
|
|
143
|
+
elif event_data.code == OperationResultCode.ILLEGAL_STOCK_OUT_CLEAR_ERROR.value:
|
|
144
|
+
self._handle_illegal_stock_out_clear_error(event_data)
|
|
145
|
+
else:
|
|
146
|
+
self._handle_unknown_error(event_data)
|
|
147
|
+
|
|
148
|
+
# 业务方法实现
|
|
149
|
+
def _update_inventory_for_put_in(self, event_data: CellEventData) -> None:
|
|
150
|
+
"""更新库存 - 入库"""
|
|
151
|
+
logger.debug(f"更新库存 - 入库: 储位={event_data.cell_id}, GRN={event_data.grn}")
|
|
152
|
+
# 实际实现中,这里会更新数据库中的库存记录
|
|
153
|
+
|
|
154
|
+
def _update_inventory_for_take_out(self, event_data: CellEventData) -> None:
|
|
155
|
+
"""更新库存 - 出库"""
|
|
156
|
+
logger.debug(f"更新库存 - 出库: 储位={event_data.cell_id}, GRN={event_data.grn}")
|
|
157
|
+
# 实际实现中,这里会更新数据库中的库存记录
|
|
158
|
+
|
|
159
|
+
def _send_notification(self, message: str, event_data: CellEventData) -> None:
|
|
160
|
+
"""发送通知"""
|
|
161
|
+
logger.debug(f"发送通知 - 消息: {message}, 储位: {event_data.cell_id}, GRN: {event_data.grn}")
|
|
162
|
+
# 实际实现中,这里会发送邮件、短信或其他通知
|
|
163
|
+
|
|
164
|
+
def _handle_illegal_stock_in(self, event_data: CellEventData) -> None:
|
|
165
|
+
"""处理非法上架"""
|
|
166
|
+
logger.warning(f"非法上架 - 储位: {event_data.cell_id}, GRN: {event_data.grn}")
|
|
167
|
+
self._send_alert("非法上架警告", event_data)
|
|
168
|
+
|
|
169
|
+
def _handle_illegal_stock_out(self, event_data: CellEventData) -> None:
|
|
170
|
+
"""处理非法下架"""
|
|
171
|
+
logger.warning(f"非法下架 - 储位: {event_data.cell_id}, GRN: {event_data.grn}")
|
|
172
|
+
self._send_alert("非法下架警告", event_data)
|
|
173
|
+
|
|
174
|
+
def _handle_illegal_stock_in_clear_error(self, event_data: CellEventData) -> None:
|
|
175
|
+
"""处理非法上架清错"""
|
|
176
|
+
logger.warning(f"非法上架清错 - 储位: {event_data.cell_id}, GRN: {event_data.grn}")
|
|
177
|
+
self._send_alert("非法上架清错警告", event_data)
|
|
178
|
+
|
|
179
|
+
def _handle_illegal_stock_out_clear_error(self, event_data: CellEventData) -> None:
|
|
180
|
+
"""处理非法下架清错"""
|
|
181
|
+
logger.warning(f"非法下架清错 - 储位: {event_data.cell_id}, GRN: {event_data.grn}")
|
|
182
|
+
self._send_alert("非法下架清错警告", event_data)
|
|
183
|
+
|
|
184
|
+
def _handle_unknown_error(self, event_data: CellEventData) -> None:
|
|
185
|
+
"""处理未知错误"""
|
|
186
|
+
logger.error(f"未知错误 - 储位: {event_data.cell_id}, GRN: {event_data.grn}, "
|
|
187
|
+
f"错误代码: {event_data.code}")
|
|
188
|
+
self._send_alert("未知错误警告", event_data)
|
|
189
|
+
|
|
190
|
+
def _send_alert(self, alert_type: str, event_data: CellEventData) -> None:
|
|
191
|
+
"""发送告警通知"""
|
|
192
|
+
logger.debug(f"发送告警 - 类型: {alert_type}, 储位: {event_data.cell_id}, GRN: {event_data.grn}")
|
|
193
|
+
# 实际实现中,这里会发送告警邮件、短信或其他通知
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def demonstrate_callback_processing():
|
|
197
|
+
"""演示回调处理"""
|
|
198
|
+
logger.info("=== 演示回调处理 ===")
|
|
199
|
+
|
|
200
|
+
# 创建自定义处理器
|
|
201
|
+
handler = CustomCellEventHandler()
|
|
202
|
+
|
|
203
|
+
# 创建模拟请求
|
|
204
|
+
request = CellEventHandleRequest()
|
|
205
|
+
request.user_id = "demo-user"
|
|
206
|
+
request.client_id = "demo-client"
|
|
207
|
+
request.session_id = f"demo-session-{int(datetime.now().timestamp())}"
|
|
208
|
+
|
|
209
|
+
# 创建事件数据
|
|
210
|
+
event_data = CellEventData()
|
|
211
|
+
event_data.code = OperationResultCode.SUCCESS.value
|
|
212
|
+
event_data.message = "入库成功"
|
|
213
|
+
event_data.cell_id = "A0010001"
|
|
214
|
+
event_data.cell_state = TriggerState.PUT_IN
|
|
215
|
+
event_data.grn = "DEMO-PRODUCT-001"
|
|
216
|
+
event_data.sheet_id = "DEMO-SHEET-001"
|
|
217
|
+
event_data.led_color = LedColors.GREEN
|
|
218
|
+
event_data.is_blink = False
|
|
219
|
+
event_data.rack_id = "A001"
|
|
220
|
+
|
|
221
|
+
request.add_event_data(event_data)
|
|
222
|
+
|
|
223
|
+
# 处理回调
|
|
224
|
+
response = handler.handle(request)
|
|
225
|
+
|
|
226
|
+
# 显示结果
|
|
227
|
+
logger.info(f"回调处理结果: 代码={response.code}, 消息={response.message}")
|
|
228
|
+
|
|
229
|
+
if response.is_success:
|
|
230
|
+
logger.info("回调处理成功!")
|
|
231
|
+
else:
|
|
232
|
+
logger.error(f"回调处理失败: {response.message}")
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def demonstrate_error_handling():
|
|
236
|
+
"""演示错误处理"""
|
|
237
|
+
logger.info("=== 演示错误处理 ===")
|
|
238
|
+
|
|
239
|
+
handler = CustomCellEventHandler()
|
|
240
|
+
|
|
241
|
+
# 创建包含错误的请求
|
|
242
|
+
request = CellEventHandleRequest()
|
|
243
|
+
request.user_id = "demo-user"
|
|
244
|
+
request.client_id = "demo-client"
|
|
245
|
+
request.session_id = f"demo-session-{int(datetime.now().timestamp())}"
|
|
246
|
+
|
|
247
|
+
# 创建错误事件数据
|
|
248
|
+
event_data = CellEventData()
|
|
249
|
+
event_data.code = OperationResultCode.ILLEGAL_STOCK_IN.value
|
|
250
|
+
event_data.message = "非法上架"
|
|
251
|
+
event_data.cell_id = "A0010001"
|
|
252
|
+
event_data.cell_state = TriggerState.PUT_IN
|
|
253
|
+
event_data.grn = "DEMO-PRODUCT-001"
|
|
254
|
+
event_data.led_color = LedColors.RED
|
|
255
|
+
event_data.is_blink = True
|
|
256
|
+
event_data.rack_id = "A001"
|
|
257
|
+
|
|
258
|
+
request.add_event_data(event_data)
|
|
259
|
+
|
|
260
|
+
# 处理回调
|
|
261
|
+
response = handler.handle(request)
|
|
262
|
+
|
|
263
|
+
# 显示结果
|
|
264
|
+
logger.info(f"错误处理结果: 代码={response.code}, 消息={response.message}")
|
|
265
|
+
logger.info("即使有错误,回调处理仍然成功完成")
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def start_callback_server(host: str = "0.0.0.0", port: int = 8080):
|
|
269
|
+
"""启动回调服务器"""
|
|
270
|
+
try:
|
|
271
|
+
# 尝试导入Flask
|
|
272
|
+
from flask import Flask, request, jsonify
|
|
273
|
+
FLASK_AVAILABLE = True
|
|
274
|
+
except ImportError:
|
|
275
|
+
FLASK_AVAILABLE = False
|
|
276
|
+
|
|
277
|
+
if FLASK_AVAILABLE:
|
|
278
|
+
_start_flask_server(host, port)
|
|
279
|
+
else:
|
|
280
|
+
logger.error("Flask不可用,请安装: pip install Flask")
|
|
281
|
+
logger.info("您可以使用以下方式手动处理回调:")
|
|
282
|
+
_show_manual_callback_setup()
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def _start_flask_server(host: str, port: int):
|
|
286
|
+
"""启动Flask服务器"""
|
|
287
|
+
from flask import Flask, request, jsonify
|
|
288
|
+
|
|
289
|
+
app = Flask(__name__)
|
|
290
|
+
app.config['JSON_AS_ASCII'] = False
|
|
291
|
+
|
|
292
|
+
# 创建事件处理器
|
|
293
|
+
handler = CustomCellEventHandler()
|
|
294
|
+
|
|
295
|
+
@app.route('/api/SmartRack/CellEventHandle', methods=['POST'])
|
|
296
|
+
def handle_cell_event():
|
|
297
|
+
"""处理储位事件回调"""
|
|
298
|
+
try:
|
|
299
|
+
# 获取请求数据
|
|
300
|
+
request_data = request.get_json()
|
|
301
|
+
if not request_data:
|
|
302
|
+
return jsonify({
|
|
303
|
+
'code': 100100,
|
|
304
|
+
'message': '请求数据为空',
|
|
305
|
+
'sessionId': '',
|
|
306
|
+
'timestamp': datetime.now().isoformat()
|
|
307
|
+
}), 400
|
|
308
|
+
|
|
309
|
+
# 创建回调请求对象
|
|
310
|
+
callback_request = CellEventHandleRequest.from_dict(request_data)
|
|
311
|
+
logger.info(f"收到储位事件回调: {callback_request}")
|
|
312
|
+
|
|
313
|
+
# 处理事件
|
|
314
|
+
response = handler.handle(callback_request)
|
|
315
|
+
|
|
316
|
+
# 返回响应
|
|
317
|
+
return jsonify(response.to_dict())
|
|
318
|
+
|
|
319
|
+
except Exception as e:
|
|
320
|
+
logger.error("处理储位事件回调时发生错误", exc_info=True)
|
|
321
|
+
return jsonify({
|
|
322
|
+
'code': 100101,
|
|
323
|
+
'message': f'处理回调时发生错误: {str(e)}',
|
|
324
|
+
'sessionId': '',
|
|
325
|
+
'timestamp': datetime.now().isoformat()
|
|
326
|
+
}), 500
|
|
327
|
+
|
|
328
|
+
@app.route('/api/SmartRack/health', methods=['GET'])
|
|
329
|
+
def health():
|
|
330
|
+
"""健康检查接口"""
|
|
331
|
+
return jsonify({
|
|
332
|
+
'status': 'ok',
|
|
333
|
+
'message': 'SmartRack Callback Service is running',
|
|
334
|
+
'timestamp': datetime.now().isoformat()
|
|
335
|
+
})
|
|
336
|
+
|
|
337
|
+
@app.route('/', methods=['GET'])
|
|
338
|
+
def index():
|
|
339
|
+
"""首页"""
|
|
340
|
+
return jsonify({
|
|
341
|
+
'service': 'SmartRack Callback Service',
|
|
342
|
+
'version': '1.0.0',
|
|
343
|
+
'endpoints': {
|
|
344
|
+
'callback': '/api/SmartRack/CellEventHandle',
|
|
345
|
+
'health': '/api/SmartRack/health'
|
|
346
|
+
},
|
|
347
|
+
'timestamp': datetime.now().isoformat()
|
|
348
|
+
})
|
|
349
|
+
|
|
350
|
+
logger.info(f"启动Flask服务器 - 地址: {host}:{port}")
|
|
351
|
+
logger.info("回调端点: POST http://{}:{}/api/SmartRack/CellEventHandle".format(host, port))
|
|
352
|
+
logger.info("健康检查: GET http://{}:{}/api/SmartRack/health".format(host, port))
|
|
353
|
+
|
|
354
|
+
# 在单独的线程中启动服务器
|
|
355
|
+
def run_server():
|
|
356
|
+
app.run(host=host, port=port, debug=False, threaded=True)
|
|
357
|
+
|
|
358
|
+
server_thread = threading.Thread(target=run_server, daemon=True)
|
|
359
|
+
server_thread.start()
|
|
360
|
+
|
|
361
|
+
return server_thread
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
def _show_manual_callback_setup():
|
|
365
|
+
"""显示手动回调设置说明"""
|
|
366
|
+
logger.info("=== 手动回调设置说明 ===")
|
|
367
|
+
logger.info("1. 使用其他Web框架(如FastAPI、Django等)")
|
|
368
|
+
logger.info("2. 实现HTTP POST接口: /api/SmartRack/CellEventHandle")
|
|
369
|
+
logger.info("3. 使用CustomCellEventHandler处理请求")
|
|
370
|
+
logger.info("4. 返回JSON格式的响应")
|
|
371
|
+
logger.info("")
|
|
372
|
+
logger.info("示例Flask代码:")
|
|
373
|
+
logger.info("""
|
|
374
|
+
from flask import Flask, request, jsonify
|
|
375
|
+
from smartrack_sdk.callback import CustomCellEventHandler
|
|
376
|
+
|
|
377
|
+
app = Flask(__name__)
|
|
378
|
+
handler = CustomCellEventHandler()
|
|
379
|
+
|
|
380
|
+
@app.route('/api/SmartRack/CellEventHandle', methods=['POST'])
|
|
381
|
+
def handle_cell_event():
|
|
382
|
+
data = request.get_json()
|
|
383
|
+
callback_request = CellEventHandleRequest.from_dict(data)
|
|
384
|
+
response = handler.handle(callback_request)
|
|
385
|
+
return jsonify(response.to_dict())
|
|
386
|
+
""")
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
def main():
|
|
390
|
+
"""主函数"""
|
|
391
|
+
logger.info("SmartRack WebAPI回调处理示例")
|
|
392
|
+
logger.info("=" * 50)
|
|
393
|
+
|
|
394
|
+
# 演示回调处理
|
|
395
|
+
demonstrate_callback_processing()
|
|
396
|
+
logger.info("")
|
|
397
|
+
|
|
398
|
+
# 演示错误处理
|
|
399
|
+
demonstrate_error_handling()
|
|
400
|
+
logger.info("")
|
|
401
|
+
|
|
402
|
+
# 显示服务器启动选项
|
|
403
|
+
logger.info("启动WebAPI回调服务器选项:")
|
|
404
|
+
logger.info("1. 启动内置Flask服务器: python callback_server.py --server")
|
|
405
|
+
logger.info("2. 查看手动设置说明: python callback_server.py --manual")
|
|
406
|
+
logger.info("")
|
|
407
|
+
|
|
408
|
+
# 检查命令行参数
|
|
409
|
+
import sys
|
|
410
|
+
if len(sys.argv) > 1:
|
|
411
|
+
if sys.argv[1] == "--server":
|
|
412
|
+
logger.info("启动Flask回调服务器...")
|
|
413
|
+
try:
|
|
414
|
+
start_callback_server()
|
|
415
|
+
logger.info("服务器已启动,按Ctrl+C停止")
|
|
416
|
+
|
|
417
|
+
# 保持服务器运行
|
|
418
|
+
try:
|
|
419
|
+
while True:
|
|
420
|
+
time.sleep(1)
|
|
421
|
+
except KeyboardInterrupt:
|
|
422
|
+
logger.info("服务器已停止")
|
|
423
|
+
except Exception as e:
|
|
424
|
+
logger.error(f"启动服务器失败: {e}")
|
|
425
|
+
elif sys.argv[1] == "--manual":
|
|
426
|
+
_show_manual_callback_setup()
|
|
427
|
+
else:
|
|
428
|
+
logger.error(f"未知参数: {sys.argv[1]}")
|
|
429
|
+
else:
|
|
430
|
+
logger.info("使用参数启动服务器: python callback_server.py --server")
|
|
431
|
+
logger.info("或查看手动设置: python callback_server.py --manual")
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
if __name__ == "__main__":
|
|
435
|
+
main()
|