【原创】自动从iss更新padavan路由器ss密码的脚本,6.17更新
本帖最后由 guazi111 于 2016-6-17 12:41 编辑rt
发现使用urllib2模拟登录提交有时候提交成功但是没有生效,所以回头看了一下telnetlib的说明以及padavan的ss.sh脚本,又写了一个通过telnet更新的py脚本,具体看5楼
padavan的ss自动梯子还是不错的,设置成通过gfwlist区别流量,属于简便易行
ishadowsocks会免费共享ss服务器,但是每6个小时就会更新一次密码,全部手动的话实在太痛苦,所以花了些时间研究了一下python,写了这么个脚本,能够自动从iss获取最新的数据并提交到padavan,基于python2.7---没选择最新的python3的原因主要是俺还有一个刷了openwrt的硬改大亚sb120,想通过它来定期运行,那上面的python貌似木有3,所以就这样了
运行脚本的结果大约如下图:
脚本代码如下,29,35行的IP改成自己的路由器IP,根据三楼的提示添加本地base64编码,把22行的“admin:admin”按照用户名:密码的格式改一下就可以了
#!/usr/bin/python
# -*- coding: utf-8 -*-
#by guazi111
#---------------------------------import---------------------------------------
import urllib2;
import urllib;
import re;
import base64;
#from BeautifulSoup import BeautifulSoup;
#------------------------------------------------------------------------------
def main():
#-------这部分是从ishadowsocks获取最新的源码
getSSUrl = "http://www.ishadowsocks.net/";
req = urllib2.Request(getSSUrl);
resp = urllib2.urlopen(req);
respHtml = resp.read();
#-----------在up后面写自己的用户名密码
up = "admin:admin"
routerauth = base64.b64encode(up);
#----------这一部分是定义本地路由器的管理提交页面,登录信息等
headers = {
#host一栏是路由器IP
"Host":"172.16.1.1",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0",
#这里需要根据大家自己的用户名密码修改Basic后面那一串东西,用户名@密码然后base64编码一下就行了
"Authorization":"Basic "+routerauth
}
#routerSSurl这里须要修改一下IP地址为具体的路由器IP
routerSSurl = "http://172.16.1.1/start_apply.htm"
ssreq = urllib2.Request(routerSSurl,headers = headers);
ssreqp = urllib2.urlopen(ssreq);
ssrespHtml = ssreqp.read();
#print ssrespHtml
resetSSurl = "http://172.16.1.1/apply.cgi"
resetssreq = urllib2.Request(resetSSurl,headers = headers);
resetssreqp = urllib2.urlopen(resetssreq);
resetssrespHtml = resetssreqp.read();
#-------------这一部分是从ishadowsocks的源码中获取3个ss服务器的最新地址,端口和密码----------------------
#<h4>A服务器地址:XXXX</h4>
foundAserv = re.search('<h4>A服务器地址:(?P<aserv>.+?)</h4>', respHtml);
#print "foundApass=",foundApass;
if(foundAserv):
aserv = foundAserv.group("aserv");
# print "A_Server:",aserv;
#-
foundAport = re.search('<h4>端口:(?P<aport>.+?)</h4>\n<h4>A密码', respHtml);
if(foundAport):
aport = foundAport.group("aport");
#<h4>C密码:xxxxxxx</h4>
foundApass = re.search('<h4>A密码:(?P<apass>.+?)</h4>', respHtml);
#print "foundApass=",foundApass;
if(foundApass):
apass = foundApass.group("apass");
print aserv+":"+aport+"'s Password:"+apass;
else:
apass = '';
print aserv+":"+aport+"'s Password:none";
#------------------------------------
#<h4>B服务器地址:XXXX</h4>
foundBserv = re.search('<h4>B服务器地址:(?P<bserv>.+?)</h4>', respHtml);
if(foundBserv):
bserv = foundBserv.group("bserv");
# print "B_Server:",bserv;
#<h4>B服务器地址:XXXXX</h4>
# <h4>端口:8989</h4>
foundBport = re.search('<h4>端口:(?P<bport>.+?)</h4>\n<h4>B密码', respHtml);
if(foundBport):
bport = foundBport.group("bport");
else:
bport = "none";
# print "B_port:",bport;
#<h4>B密码:xxxxxxx</h4>
foundBpass = re.search('<h4>B密码:(?P<bpass>.+?)</h4>', respHtml);
#
if(foundBpass):
bpass = foundBpass.group("bpass");
print bserv+":"+bport+"'s Password:"+bpass;
else:
bpass = '';
print bserv+":"+bport+"'s Password:none";
#------------------------------------
#
#<h4>C服务器地址:XXXXX</h4>
foundCserv = re.search('<h4>C服务器地址:(?P<cserv>.+?)</h4>', respHtml);
#print "foundCpass=",foundCpass;
if(foundCserv):
cserv = foundCserv.group("cserv");
# print "C_Server:",cserv;
#-
foundCport = re.search('<h4>端口:(?P<cport>.+?)</h4>\n<h4>C密码', respHtml);
if(foundCport):
cport = foundCport.group("cport");
#<h4>C密码:xxxxxxx</h4>
foundCpass = re.search('<h4>C密码:(?P<cpass>.+?)</h4>', respHtml);
#print "foundCpass=",foundCpass;
if(foundCpass):
cpass = foundCpass.group("cpass");
print cserv+":"+cport+"'s Password:"+cpass;
else:
cpass = '';
print cserv+":"+cport+"'s Password:none";
#-------------------------------------
#-----------以下这部分是提交获取到的信息,俺这里是只把日本的服务器相关信息给更新上去了,即cserv,cport和cpass
postData = {
'current_page':'/Advanced_Extensions_SS.asp',
'sid_list':'LANHostConfig;General;',
'action_mode': 'Apply',
'ss_enable':'1',
'ss_mode_x':'1',
'ss_server':cserv,
'ss_server_port':cport,
'ss_key':cpass,
'ss_method':'aes-256-cfb',
'ss_mode':'0',
'ss_programs_x':'3',
'ss_opt_x':'2'
}
resetsspostData = {
'action_mode':'button_script3'
}
#合成post数据
data = urllib.urlencode(postData)
print "data:###############"
print data
resetdata = urllib.urlencode(resetsspostData)
print resetdata
#创建request
#构造request请求
request = urllib2.Request(routerSSurl,data,headers)
try:
#访问页面
response = urllib2.urlopen(request)
#cur_url =response.geturl()
#print "cur_url:",cur_url
status = response.getcode()
print status
excepturllib2.HTTPError, e:
print e.code
resetSSrequest = urllib2.Request(resetSSurl,resetdata,headers)
try:
#访问页面
response = urllib2.urlopen(resetSSrequest)
#cur_url =response.geturl()
#print "cur_url:",cur_url
status = response.getcode()
print status
excepturllib2.HTTPError, e:
print e.code
###############################################################################
if __name__=="__main__":
main();
或者直接下载附件后解压运行也可以
还不会用SS{:1_466:},有简单教程么 base64
一般的linux都有,当然openwrt这种为嵌入式设备而生的发行版没有。
另外base64 是轻松可逆的编码
那你28行做例子
echo YWRtaW46YWRtaW4=|base64 -d
echo -n admin:admin|base64 本帖最后由 guazi111 于 2016-6-16 11:28 编辑
Pale_Cheung 发表于 2016-6-15 16:35
base64
一般的linux都有,当然openwrt这种为嵌入式设备而生的发行版没有。
已经更新,python自己也能base64的编解码,只是之前偷懒直接把httpfox里抓到的直接黏贴过来了
本帖最后由 guazi111 于 2016-6-16 12:51 编辑
发现有时候明明提交成功了但是却没有生效,所以又写了一个通过telnet更新的py脚本,需要先在padavan里面打开telnet功能
s
s
#!/usr/bin/python
# -*- coding: utf-8 -*-
#by guazi111
#---------------------------------import---------------------------------------
import urllib2;
import urllib;
import re;
import telnetlib;
#from BeautifulSoup import BeautifulSoup;
#------------------------------------------------------------------------------
def main():
#-------这部分是从ishadowsocks获取最新的源码
getSSUrl = "http://www.ishadowsocks.net/";
req = urllib2.Request(getSSUrl);
resp = urllib2.urlopen(req);
respHtml = resp.read();
#-------------这一部分是从ishadowsocks的源码中获取3个ss服务器的最新地址,端口和密码----------------------
#<h4>A服务器地址:XXXX</h4>
foundAserv = re.search('<h4>A服务器地址:(?P<aserv>.+?)</h4>', respHtml);
#print "foundApass=",foundApass;
if(foundAserv):
aserv = foundAserv.group("aserv");
# print "A_Server:",aserv;
#-
foundAport = re.search('<h4>端口:(?P<aport>.+?)</h4>\n<h4>A密码', respHtml);
if(foundAport):
aport = foundAport.group("aport");
#<h4>C密码:xxxxxxx</h4>
foundApass = re.search('<h4>A密码:(?P<apass>.+?)</h4>', respHtml);
#print "foundApass=",foundApass;
if(foundApass):
apass = foundApass.group("apass");
print aserv+":"+aport+"'s Password:"+apass;
else:
apass = '';
print aserv+":"+aport+"'s Password:none";
#------------------------------------
#<h4>B服务器地址:XXXX</h4>
foundBserv = re.search('<h4>B服务器地址:(?P<bserv>.+?)</h4>', respHtml);
if(foundBserv):
bserv = foundBserv.group("bserv");
# print "B_Server:",bserv;
#<h4>B服务器地址:XXXXX</h4>
# <h4>端口:8989</h4>
foundBport = re.search('<h4>端口:(?P<bport>.+?)</h4>\n<h4>B密码', respHtml);
if(foundBport):
bport = foundBport.group("bport");
else:
bport = "none";
# print "B_port:",bport;
#<h4>B密码:xxxxxxx</h4>
foundBpass = re.search('<h4>B密码:(?P<bpass>.+?)</h4>', respHtml);
#
if(foundBpass):
bpass = foundBpass.group("bpass");
print bserv+":"+bport+"'s Password:"+bpass;
else:
bpass = '';
print bserv+":"+bport+"'s Password:none";
#------------------------------------
#
#<h4>C服务器地址:XXXXX</h4>
foundCserv = re.search('<h4>C服务器地址:(?P<cserv>.+?)</h4>', respHtml);
#print "foundCpass=",foundCpass;
if(foundCserv):
cserv = foundCserv.group("cserv");
# print "C_Server:",cserv;
#-
foundCport = re.search('<h4>端口:(?P<cport>.+?)</h4>\n<h4>C密码', respHtml);
if(foundCport):
cport = foundCport.group("cport");
#<h4>C密码:xxxxxxx</h4>
foundCpass = re.search('<h4>C密码:(?P<cpass>.+?)</h4>', respHtml);
#print "foundCpass=",foundCpass;
if(foundCpass):
cpass = foundCpass.group("cpass");
print cserv+":"+cport+"'s Password:"+cpass;
else:
cpass = '';
print cserv+":"+cport+"'s Password:none";
#-------------------------------------
#-----------以下这部分是提交获取到的信息,俺这里是只把日本的服务器相关信息给更新上去了,即cserv,cport和cpass
tlHost = '172.16.1.1' # 路由器IP,根据实际更改
tluser = 'admin' # 登录用户名,根据实际更改
tlpass = 'admin'# 登录密码,根据实际更改
tlfinish = ']# ' # 命令提示符(标识着上一条命令已执行完毕)
# 连接Telnet服务器
tn = telnetlib.Telnet(tlHost)
tn.read_until('K1 login:')
tn.write(tluser+ '\n')
# 输入登录密码
tn.read_until('Password: ')
tn.write(tlpass + '\n')
# 登录完毕后,执行命令
tn.read_until(tlfinish)
tn.write('nvram set ss_server='+cserv+'\n')
tn.read_until(tlfinish)
tn.write('nvram set ss_server_port='+cport+'\n')
tn.read_until(tlfinish)
tn.write('nvram set ss_key='+cpass+'\n')
tn.read_until(tlfinish)
tn.write('cd /tmp\n')
tn.read_until(tlfinish)
tn.write('cd /tmp\n')
# ss脚本执行完毕后,终止Telnet连接(或输入exit退出)
tn.read_until(tlfinish)
tn.write('./ss.sh\n')
tn.write('\n')
tn.read_until(tlfinish)
tn.close() # tn.write('exit\n')
###############################################################################
if __name__=="__main__":
main();
guazi111 发表于 2016-6-16 12:43
发现有时候明明提交成功了但是却没有生效,所以又写了一个通过telnet更新的py脚本,需要先在padavan里面打 ...
base64 是http传送用户名密码默认的编码方式,大部分语言都应该支持的 可以试下看,谢谢老大
页:
[1]