|
本帖最后由 chunjiu 于 2023-2-24 16:11 编辑
本来在半小时内就能解决的事情,但因为网络不停的出现故障中断,折腾了一个下午才搞完,大家可以一起 R 他先人!
PS:
对前面问题的回答是残缺不全的,最后这个问题是综合前面回答来改的,尽量把自己的需求说清楚,不产生歧义。
ChatGPT 最终的回答可以满足需求了。
问:
用 python 代码解析一个 vmess 协议字符串,并返回一个字典。这个字符串使用 “vmess://” 开头,剩下的是使用 base64 编码的 URL 内容。在对它解析完成后,第一步先检查解析出的必要元素是否完整,第二步对每一个解析出的元素值内容检查是否合法。如果在此过程中出现任何一个错误,就将检查结果从标准输出中打印出来,并返回 None。
答:
可以使用上述代码的基础上进行修改,将所有的错误信息都存储到一个列表中,并在遍历完所有元素后,判断错误列表是否为空,如果为空,则返回解析后的字典,否则将错误信息打印到标准输出,并返回 None。
以下是修改后的代码实现:
- import base64
- import json
- def parse_vmess(vmess_str):
- # 检查协议是否合法
- if not vmess_str.startswith('vmess://'):
- print('Invalid vmess protocol.')
- return None
- # 对 URL 进行 base64 解码
- url_str = base64.urlsafe_b64decode(vmess_str[8:]).decode('utf-8')
- # 将 URL 字符串解析为字典
- try:
- vmess_dict = json.loads(url_str)
- except json.JSONDecodeError:
- print('Failed to decode vmess string.')
- return None
- # 检查必要元素是否存在
- required_keys = {'v', 'ps', 'add', 'port', 'id'}
- if not required_keys.issubset(vmess_dict.keys()):
- print('Missing required keys.')
- return None
- # 检查每一个元素的值是否正确
- errors = []
- if not isinstance(vmess_dict['v'], str):
- errors.append('v must be a string.')
- if not isinstance(vmess_dict['ps'], str):
- errors.append('ps must be a string.')
- if not isinstance(vmess_dict['add'], str):
- errors.append('add must be a string.')
- if not isinstance(vmess_dict['port'], int) or not (0 <= vmess_dict['port'] <= 65535):
- errors.append('port must be an integer between 0 and 65535.')
- if not isinstance(vmess_dict['id'], str):
- errors.append('id must be a string.')
- if 'aid' in vmess_dict and not isinstance(vmess_dict['aid'], int):
- errors.append('aid must be an integer.')
- if 'net' in vmess_dict and vmess_dict['net'] not in {'tcp', 'kcp', 'ws', 'http', 'quic'}:
- errors.append('net must be one of tcp, kcp, ws, http or quic.')
- if 'type' in vmess_dict and vmess_dict['type'] not in {'none', 'http', 'tls'}:
- errors.append('type must be one of none, http or tls.')
- if 'host' in vmess_dict and not isinstance(vmess_dict['host'], str):
- errors.append('host must be a string.')
- if 'path' in vmess_dict and not isinstance(vmess_dict['path'], str):
- errors.append('path must be a string.')
- if 'tls' in vmess_dict and not isinstance(vmess_dict['tls'], str):
- errors.append('tls must be a string.')
- if errors:
- print('Invalid vmess parameters:\n{}'.format('\n'.join(errors)))
- return None
- return vmess_dict
复制代码 |
|