通过参考文章,以及查阅相关语法,最终我使用python3执行以下相关代码,获得了v2ray订阅地址并进行了解析。
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
|
import urllib.request import base64 import json import urllib.parse
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'} subscribe_url = '你的订阅地址' req = urllib.request.Request(url=subscribe_url, headers=headers) return_content = urllib.request.urlopen(req).read()
lens = len(return_content) lenx = lens - (lens % 4 if lens % 4 else 4) try: result = base64.decodestring(return_content[:lenx]) share_links=result.splitlines() schemes_allow = ['vmess', 'ss', 'socks'] configs = [] for share_link in share_links: share_link=bytes.decode(share_link) url=share_link.split("://") scheme=url[0] print(scheme) if scheme not in schemes_allow: print(scheme+"不支持") continue net=url[1] net=str.encode(net) lens = len(net) lenx = lens - (lens % 4 if lens % 4 else 4) resultJson = base64.decodestring(net) configs.append(json.loads(bytes.decode(resultJson))) print(configs) except Exception as e : print(e) pass
|
问题
(1) urllib.error.HTTPError: HTTP Error 403: Forbidden
设置headers,模拟浏览器请求。
(2) Python解码base64遇到Incorrect padding错误
将base64.b64decode(return_content),用decodestring代替。
我刚开始使用了下面的方法,对某些情况下有用,对于有些地方不适应,比如我解析了trojan的地址
1 2 3 4 5 6 7
| lens = len(strg) lenx = lens - (lens % 4 if lens % 4 else 4) try: result = base64.decodestring(strg[:lenx]) except: pass
|
对于特殊的情况还可以使用下面的方式进行:
1 2 3
| base64.b64decode(strg, '-_')
base64.urlsafe_b64decode(base64_url)
|
(3) invalid share link
这是其实是:url.scheme not in schemes_allow: raise RuntimeError('invalid share link')
这段代码返回的错误。
1 2 3 4
| schemes_allow = ['vmess', 'ss', 'socks']
print(b'vmess' in schemes_allow)
|
以b开头的字符串,是bytes类型的字符串。
(4) expected bytes-like object, not str
随着修改代码,又出现了新的问题。
生成json并写入文件中:
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
|
import urllib.request import base64 import json import urllib.parse
def base64StrFun(base64Str): try: base64Str=base64.urlsafe_b64decode(base64Str) except: lens = len(base64Str) lenx = lens - (lens % 4 if lens % 4 else 4) base64Str= base64.decodestring(base64Str[:lenx]) return base64Str
def parseVmess(nodeStr): return
def parseSSR(nodeStr): result=base64StrFun(nodeStr) result=bytes.decode(result) print(result) result='{}' return result
def parseTrojan(nodeStr): result=base64StrFun(nodeStr) result=bytes.decode(result) print(result) return result
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
subscribe_url = '你的'
req = urllib.request.Request(url=subscribe_url, headers=headers) return_content = urllib.request.urlopen(req).read()
try: result=base64StrFun(return_content) print(result) share_links=result.splitlines() schemes_allow = ['vmess', 'ss', 'socks'] configs = [] print(share_links); for share_link in share_links: share_link=bytes.decode(share_link) url=share_link.split("://") net=url[1] net=str.encode(net) scheme=url[0] if scheme == "trojan" : nodeStr=parseTrojan(net) elif scheme == "ssr": nodeStr=parseSSR(net) else : nodeStr= base64StrFun(net) nodeStr=bytes.decode(nodeStr)
configs.append(json.loads(nodeStr)) print(configs) with open("record.json","w") as dump_f: json.dump(configs,dump_f) except Exception as e : print(e) pass
|
问题
写入的json文件中文出现乱码,也不算乱码,就是中文被编码成了unicode编码。。
只需要在使用json.dump(configs,dump_f,ensure_ascii=False)
就可以了。
(4) Temporary failure in name resolution
编辑/etc/resolv.conf文件,添加如下内容(问题也没有解决)
1 2 3
| nameserver 202.96.209.133 nameserver 61.129.88.123 nameserver 114.114.114.114
|