-
Notifications
You must be signed in to change notification settings - Fork 283
Expand file tree
/
Copy path_bridge.py
More file actions
151 lines (127 loc) · 4.49 KB
/
_bridge.py
File metadata and controls
151 lines (127 loc) · 4.49 KB
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
import importlib
import sys
import traceback
import json
import os
method_dict = {
'init': 'init',
'home': 'homeContent',
'homeVod': 'homeVideoContent',
'category': 'categoryContent',
'detail': 'detailContent',
'search': 'searchContent',
'play': 'playerContent',
'proxy': 'localProxy',
'action': 'action',
}
def import_module(module_url):
return importlib.import_module(module_url)
def load_spider(script_path, env):
"""动态加载指定路径的 Python 脚本并实例化 Spider 类"""
try:
env = json.loads(env)
except json.JSONDecodeError:
# 保持原始字符串
pass
try:
script_name = os.path.basename(script_path)[:-3]
print('load_spider:', script_name)
module = import_module(script_name)
# 检查 Spider 类是否存在
if not hasattr(module, 'Spider'):
raise AttributeError(f"Script {script_path} does not contain a 'Spider' class")
proxyUrl = env.get('proxyUrl') if isinstance(env, dict) else ''
# 实例化 Spider
spider = module.Spider(t4_api=proxyUrl)
return spider
except Exception as e:
# 打印详细错误信息
error_msg = {
"error": str(e),
"traceback": traceback.format_exc()
}
print(error_msg)
def t4_spider_init(spider, ext=''):
# 调用方法
spider.setExtendInfo(ext)
# 获取依赖项
depends = spider.getDependence() or []
modules = []
module_names = []
for lib in depends:
try:
module = import_module(lib).Spider(t4_api=ext)
modules.append(module)
module_names.append(lib)
except Exception as e:
print(f'装载依赖{lib}发生错误:{e}')
if len(module_names) > 0:
print(f'当前依赖列表:{module_names}')
result = spider.init(modules)
setattr(spider, '_init_ok_', True)
return spider, result
def call_spider_method(spider, method_name, env, args):
"""调用 Spider 实例的指定方法"""
invoke_method_name = method_dict.get(method_name) or method_name
try:
# 检查方法是否存在
if not hasattr(spider, invoke_method_name):
raise AttributeError(f"Spider has no method named '{invoke_method_name}'")
method = getattr(spider, invoke_method_name)
# 解析参数
parsed_args = []
for arg in args:
try:
# 尝试解析 JSON
parsed_args.append(json.loads(arg))
except json.JSONDecodeError:
# 保持原始字符串
parsed_args.append(arg)
try:
env = json.loads(env)
except json.JSONDecodeError:
# 保持原始字符串
pass
print(f'parsed_args:{parsed_args}')
if method_name == 'init':
extend = parsed_args[0] if parsed_args and isinstance(parsed_args, list) else ''
spider, result = t4_spider_init(spider, extend)
# result = spider.init(modules)
return result
else:
if not hasattr(spider, '_init_ok_'):
# spider,_ = t4_spider_init(spider,*parsed_args) # 需要传extend参数,暂时没有好办法
# extend = parsed_args[0] if parsed_args and isinstance(parsed_args,list) else ''
# extend = env.get('ext','')
extend = env.get('ext') if isinstance(env, dict) else ''
spider, _ = t4_spider_init(spider, extend)
method = getattr(spider, invoke_method_name)
result = method(*parsed_args)
# 返回结果
if result:
try:
return spider.json2str(result)
except Exception as e:
pass
return result
except Exception as e:
# 打印详细错误信息
error_msg = {
"error": str(e),
"traceback": traceback.format_exc()
}
print(error_msg)
def main():
if len(sys.argv) < 3:
print("Usage: python bridge.py <script_path> <method_name> [args...]")
return
script_path = sys.argv[1]
method_name = sys.argv[2]
env = sys.argv[3]
args = sys.argv[4:]
print(f'script_path:{script_path},method_name:{method_name}')
spider = load_spider(script_path, env)
result = call_spider_method(spider, method_name, env, args)
print(result)
if __name__ == '__main__':
main()