通过参考文章,以及查阅相关语法,最终我使用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.V2Ray 订阅解析 (代码在这里,经过改造和错误修改之后,最终产生了新的代码)
问题
(1) urllib.error.HTTPError: HTTP Error 403: Forbidden
设置headers,模拟浏览器请求。
参考文章:
1.Python3安装与使用urllib2包之小坑
2.Python 3.x 中”HTTP Error 403: Forbidden”问题的解决方案
3.urllib — URL 处理模块
4.python爬虫——urllib2库的安装及使用
5.Python3.X如何下载安装urllib2包 ?
(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)
|
参考文章:
1.Python解码base64遇到Incorrect padding错误 (这个非常有用)
2.编码解码Base64数据
3.Python: Ignore ‘Incorrect padding’ error when base64 decoding
4.python base64解码TypeError: Incorrect padding错误 (这个提示了一个decodestring方法进行base64解析,很有用)
(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类型的字符串。
参考文章:
1.python 字符串string 开头r b u f 含义 str bytes 转换 format
2.14.7 捕获所有异常
(4) expected bytes-like object, not str
随着修改代码,又出现了新的问题。
参考文章:
1.python中Base64编码和解码:TypeError: a bytes-like object is required, 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) 就可以了。
参考文章:
1.python读写json文件
2.python写入json文件中文乱码问题
3.python json.dumps 中文编码
(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
|
参考文章:
1.Temporary failure in name resolution 错误解决方法
2.Ubuntu Server 18.04 Temporary failure in name resolution