如何优雅的在Win系统建立自己的SS5实现轻松快速翻墙【2】-24小时运行-自动更新密码

神之力量击穿叹息之墙

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