神之力量击穿叹息之墙
1、首先,请参考我的上一个帖子,实现了Win下的SS【快速】翻墙,如果没有SS,要翻墙都要忍受蜗牛速度。为SS的原版牛逼作者十万个赞,也要为翻版作者以及iss网站一万个赞。但是有个小问题,因为源头的SS账号每隔6小时变更,因此总是需要人工更新密码,那么如何把他做成自动更新?
2、方案,爬虫捕捉新密码+重写json加载。
3、细节分析:
用lxml代替了bs4,数据部分也变更修改,可能原作者写的时候网站数据模式和如今的不同,另增加了一些函数。
如下图,因为iss变更的是密码,因此爬虫也抓密码就好,比较简单
4、代码,关于json部分请看参考资料部分:
# -*- coding: utf-8 -*-
# python 3.5.2
# 测试系统,Win10
# Author:Van
# 实现SS5本机自动更新密码,争取24小时保持连接
# 实际做不到24小时,因为iss网站的密码的变更有一定时间的延迟
# 所以最好能有其他的SS源头网站
# V1.0
# 欢迎各种改进意见
# 请把对应的帐号密码修改成自己的
# 请把SS软件的路径改成自己的
import requests, json, os, copy, time
from lxml import etree
import smtplib
from email.mime.text import MIMEText
from email.header import Header
TIME_GAP = 300
CONFIG_DIR = 'E:\\迅雷下载\\ShadowsocksR-win-3.7.4.1\\gui-config.json'
oldPwdList = []
def modify_json(pwd):
with open(CONFIG_DIR,'r') as f:
data = json.loads(f.read())
for index, rawPwd in enumerate(pwd):
data['configs'][index]['password'] = rawPwd.split(':')[-1]
data = json.dumps(data)
print(data)
with open(CONFIG_DIR,'w') as f:
f.write(data)
def check_update():
url = 'http://www.ishadowsocks.org'
html = requests.get(url).content.decode('utf-8', 'replace')
pwd = etree.HTML(html).xpath('//*[@id="free"]/div/div[2]//h4[3]/text()')
print('实时密码是:', pwd)
if not pwd or oldPwdList == pwd:
return pwd, False
else:
return pwd, True
def send_email(htm):
# send email to notice new WestWorld is coming
sender = 'xxxxxx@163.com'
receiver = 'xxxxxx@qq.com,xxxxxx@163.com'
subject = 'SS5密码有更新!'
smtpserver = 'smtp.163.com'
username = 'xxxxxx@163.com'
password = 'xxxxxx'
msg = MIMEText(htm, 'html', 'utf-8')
msg['Subject'] = Header(subject, 'UTF-8')
msg['From'] = sender
msg['To'] = ','.join(receiver)
smtp = smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
if __name__ == '__main__':
pwd, update = check_update()
while 1:
if update:
print('password changed, will update!')
modify_json(pwd)
oldPwdList = pwd
print('新的临时密码是:', oldPwdList)
try:
send_email(str(pwd))
except Exception as e:
print("email failed:", e)
pwd, update = check_update()
time.sleep(TIME_GAP)
5、测试结果:
通过5分钟一次取密码,重点观察iss站在更换密码的时候,有以下特点:
- 比如18点换密码,老密码回马上失效,但新密码不是马上更新到网站,导致有一段时间的真空期
- 同时,这段时间,读取的密码出现了波动,不过总体影响不算太大。
6、SS 资源站点列表:
7、参考资料:
8、安卓手机测试了类似方案,也是通过的,其实更简单,都不需要设置浏览器。
9、特别感谢
LittleCoder 帮忙修正了bug,美化了代码。
10、github库:
https://github.com/vansnowpea/shadowsocks-24hr-atuo-by-python