PCEVA,PC绝对领域,探寻真正的电脑知识
打印 上一主题 下一主题
开启左侧

【原创】自动从iss更新padavan路由器ss密码的脚本,6.17更新

[复制链接]
跳转到指定楼层
1#
guazi111 发表于 2016-6-14 22:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
点击数:6274|回复数:6
本帖最后由 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”按照用户名:密码的格式改一下就可以了



  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. #by guazi111


  4. #---------------------------------import---------------------------------------
  5. import urllib2;
  6. import urllib;
  7. import re;
  8. import base64;

  9. #from BeautifulSoup import BeautifulSoup;

  10. #------------------------------------------------------------------------------
  11. def main():
  12.     #-------这部分是从ishadowsocks获取最新的源码
  13.     getSSUrl = "http://www.ishadowsocks.net/";
  14.     req = urllib2.Request(getSSUrl);
  15.     resp = urllib2.urlopen(req);
  16.     respHtml = resp.read();
  17.     #-----------在up后面写自己的用户名密码
  18.     up = "admin:admin"
  19.     routerauth = base64.b64encode(up);
  20.    

  21.     #----------这一部分是定义本地路由器的管理提交页面,登录信息等
  22.     headers = {
  23.                         #host一栏是路由器IP
  24.                         "Host":"172.16.1.1",
  25.                         "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0",
  26.                         #这里需要根据大家自己的用户名密码修改Basic后面那一串东西,用户名@密码然后base64编码一下就行了
  27.                         "Authorization":"Basic "+routerauth
  28.           }
  29.     #routerSSurl这里须要修改一下IP地址为具体的路由器IP
  30.     routerSSurl = "http://172.16.1.1/start_apply.htm"
  31.     ssreq = urllib2.Request(routerSSurl,headers = headers);
  32.     ssreqp = urllib2.urlopen(ssreq);
  33.     ssrespHtml = ssreqp.read();
  34.     #print ssrespHtml
  35.     resetSSurl = "http://172.16.1.1/apply.cgi"
  36.     resetssreq = urllib2.Request(resetSSurl,headers = headers);
  37.     resetssreqp = urllib2.urlopen(resetssreq);
  38.     resetssrespHtml = resetssreqp.read();

  39.     #-------------这一部分是从ishadowsocks的源码中获取3个ss服务器的最新地址,端口和密码----------------------
  40.     #<h4>A服务器地址:XXXX</h4>
  41.     foundAserv = re.search('<h4>A服务器地址:(?P<aserv>.+?)</h4>', respHtml);
  42.     #print "foundApass=",foundApass;
  43.     if(foundAserv):
  44.         aserv = foundAserv.group("aserv");
  45.     #    print "A_Server:",aserv;
  46.     #-
  47.     foundAport = re.search('<h4>端口:(?P<aport>.+?)</h4>\n<h4>A密码', respHtml);
  48.     if(foundAport):
  49.         aport = foundAport.group("aport");
  50.     #<h4>C密码:xxxxxxx</h4>
  51.     foundApass = re.search('<h4>A密码:(?P<apass>.+?)</h4>', respHtml);
  52.     #print "foundApass=",foundApass;
  53.     if(foundApass):
  54.         apass = foundApass.group("apass");
  55.         print aserv+":"+aport+"'s Password:"+apass;
  56.     else:
  57.         apass = '';
  58.         print aserv+":"+aport+"'s Password:none";
  59.     #------------------------------------
  60.     #<h4>B服务器地址:XXXX</h4>
  61.     foundBserv = re.search('<h4>B服务器地址:(?P<bserv>.+?)</h4>', respHtml);
  62.     if(foundBserv):
  63.         bserv = foundBserv.group("bserv");
  64.     #    print "B_Server:",bserv;
  65.     #<h4>B服务器地址:XXXXX</h4>
  66.     #               <h4>端口:8989</h4>
  67.     foundBport = re.search('<h4>端口:(?P<bport>.+?)</h4>\n<h4>B密码', respHtml);
  68.     if(foundBport):
  69.         bport = foundBport.group("bport");
  70.     else:
  71.         bport = "none";

  72.     #    print "B_port:",bport;
  73.         
  74.     #<h4>B密码:xxxxxxx</h4>
  75.     foundBpass = re.search('<h4>B密码:(?P<bpass>.+?)</h4>', respHtml);
  76.     #
  77.     if(foundBpass):
  78.         bpass = foundBpass.group("bpass");
  79.         print bserv+":"+bport+"'s Password:"+bpass;
  80.     else:
  81.         bpass = '';
  82.         print bserv+":"+bport+"'s Password:none";
  83.     #------------------------------------
  84.     #
  85.     #<h4>C服务器地址:XXXXX</h4>
  86.     foundCserv = re.search('<h4>C服务器地址:(?P<cserv>.+?)</h4>', respHtml);
  87.     #print "foundCpass=",foundCpass;
  88.     if(foundCserv):
  89.         cserv = foundCserv.group("cserv");
  90.     #   print "C_Server:",cserv;
  91.     #-
  92.     foundCport = re.search('<h4>端口:(?P<cport>.+?)</h4>\n<h4>C密码', respHtml);
  93.     if(foundCport):
  94.         cport = foundCport.group("cport");
  95.     #<h4>C密码:xxxxxxx</h4>
  96.     foundCpass = re.search('<h4>C密码:(?P<cpass>.+?)</h4>', respHtml);
  97.     #print "foundCpass=",foundCpass;
  98.     if(foundCpass):
  99.         cpass = foundCpass.group("cpass");
  100.         print cserv+":"+cport+"'s Password:"+cpass;
  101.     else:
  102.         cpass = '';
  103.         print cserv+":"+cport+"'s Password:none";
  104.     #-------------------------------------
  105.     #-----------以下这部分是提交获取到的信息,俺这里是只把日本的服务器相关信息给更新上去了,即cserv,cport和cpass
  106.     postData = {
  107.         'current_page':'/Advanced_Extensions_SS.asp',
  108.         'sid_list':'LANHostConfig;General;',
  109.         'action_mode': 'Apply',
  110.         'ss_enable':'1',
  111.         'ss_mode_x':'1',
  112.         'ss_server':cserv,
  113.         'ss_server_port':cport,
  114.         'ss_key':cpass,
  115.         'ss_method':'aes-256-cfb',
  116.         'ss_mode':'0',
  117.         'ss_programs_x':'3',
  118.         'ss_opt_x':'2'
  119.      }
  120.     resetsspostData = {
  121.         'action_mode':'button_script3'
  122.      }


  123. #合成post数据
  124.     data = urllib.urlencode(postData)   
  125.     print "data:###############"
  126.     print data

  127.     resetdata = urllib.urlencode(resetsspostData)
  128.     print resetdata
  129. #创建request
  130. #构造request请求
  131.     request = urllib2.Request(routerSSurl,data,headers)
  132.     try:
  133.     #访问页面
  134.         response = urllib2.urlopen(request)
  135.         #cur_url =  response.geturl()
  136.         #print "cur_url:",cur_url
  137.         status = response.getcode()
  138.         print status
  139.     except  urllib2.HTTPError, e:
  140.         print e.code
  141.     resetSSrequest = urllib2.Request(resetSSurl,resetdata,headers)
  142.     try:
  143.     #访问页面
  144.         response = urllib2.urlopen(resetSSrequest)
  145.         #cur_url =  response.geturl()
  146.         #print "cur_url:",cur_url
  147.         status = response.getcode()
  148.         print status
  149.     except  urllib2.HTTPError, e:
  150.         print e.code

  151. ###############################################################################
  152. if __name__=="__main__":
  153.     main();
复制代码




或者直接下载附件后解压运行也可以





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
2#
中华田园犬 发表于 2016-6-15 15:45 | 只看该作者
还不会用SS,有简单教程么
3#
Pale_Cheung 发表于 2016-6-15 16:35 | 只看该作者
base64

一般的linux都有,当然openwrt这种为嵌入式设备而生的发行版没有。

另外base64 是轻松可逆的编码

那你28行做例子
  1. echo YWRtaW46YWRtaW4=|base64 -d
  2. echo -n admin:admin|base64
复制代码
4#
guazi111  楼主| 发表于 2016-6-16 08:43 | 只看该作者
本帖最后由 guazi111 于 2016-6-16 11:28 编辑
Pale_Cheung 发表于 2016-6-15 16:35
base64

一般的linux都有,当然openwrt这种为嵌入式设备而生的发行版没有。

已经更新,python自己也能base64的编解码,只是之前偷懒直接把httpfox里抓到的直接黏贴过来了
5#
guazi111  楼主| 发表于 2016-6-16 12:43 | 只看该作者
本帖最后由 guazi111 于 2016-6-16 12:51 编辑

发现有时候明明提交成功了但是却没有生效,所以又写了一个通过telnet更新的py脚本,需要先在padavan里面打开telnet功能

s
s

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. #by guazi111


  4. #---------------------------------import---------------------------------------
  5. import urllib2;
  6. import urllib;
  7. import re;
  8. import telnetlib;

  9. #from BeautifulSoup import BeautifulSoup;

  10. #------------------------------------------------------------------------------
  11. def main():
  12.     #-------这部分是从ishadowsocks获取最新的源码
  13.     getSSUrl = "http://www.ishadowsocks.net/";
  14.     req = urllib2.Request(getSSUrl);
  15.     resp = urllib2.urlopen(req);
  16.     respHtml = resp.read();
  17.   



  18.     #-------------这一部分是从ishadowsocks的源码中获取3个ss服务器的最新地址,端口和密码----------------------
  19.     #<h4>A服务器地址:XXXX</h4>
  20.     foundAserv = re.search('<h4>A服务器地址:(?P<aserv>.+?)</h4>', respHtml);
  21.     #print "foundApass=",foundApass;
  22.     if(foundAserv):
  23.         aserv = foundAserv.group("aserv");
  24.     #    print "A_Server:",aserv;
  25.     #-
  26.     foundAport = re.search('<h4>端口:(?P<aport>.+?)</h4>\n<h4>A密码', respHtml);
  27.     if(foundAport):
  28.         aport = foundAport.group("aport");
  29.     #<h4>C密码:xxxxxxx</h4>
  30.     foundApass = re.search('<h4>A密码:(?P<apass>.+?)</h4>', respHtml);
  31.     #print "foundApass=",foundApass;
  32.     if(foundApass):
  33.         apass = foundApass.group("apass");
  34.         print aserv+":"+aport+"'s Password:"+apass;
  35.     else:
  36.         apass = '';
  37.         print aserv+":"+aport+"'s Password:none";
  38.     #------------------------------------
  39.     #<h4>B服务器地址:XXXX</h4>
  40.     foundBserv = re.search('<h4>B服务器地址:(?P<bserv>.+?)</h4>', respHtml);
  41.     if(foundBserv):
  42.         bserv = foundBserv.group("bserv");
  43.     #    print "B_Server:",bserv;
  44.     #<h4>B服务器地址:XXXXX</h4>
  45.     #               <h4>端口:8989</h4>
  46.     foundBport = re.search('<h4>端口:(?P<bport>.+?)</h4>\n<h4>B密码', respHtml);
  47.     if(foundBport):
  48.         bport = foundBport.group("bport");
  49.     else:
  50.         bport = "none";

  51.     #    print "B_port:",bport;
  52.         
  53.     #<h4>B密码:xxxxxxx</h4>
  54.     foundBpass = re.search('<h4>B密码:(?P<bpass>.+?)</h4>', respHtml);
  55.     #
  56.     if(foundBpass):
  57.         bpass = foundBpass.group("bpass");
  58.         print bserv+":"+bport+"'s Password:"+bpass;
  59.     else:
  60.         bpass = '';
  61.         print bserv+":"+bport+"'s Password:none";
  62.     #------------------------------------
  63.     #
  64.     #<h4>C服务器地址:XXXXX</h4>
  65.     foundCserv = re.search('<h4>C服务器地址:(?P<cserv>.+?)</h4>', respHtml);
  66.     #print "foundCpass=",foundCpass;
  67.     if(foundCserv):
  68.         cserv = foundCserv.group("cserv");
  69.     #   print "C_Server:",cserv;
  70.     #-
  71.     foundCport = re.search('<h4>端口:(?P<cport>.+?)</h4>\n<h4>C密码', respHtml);
  72.     if(foundCport):
  73.         cport = foundCport.group("cport");
  74.     #<h4>C密码:xxxxxxx</h4>
  75.     foundCpass = re.search('<h4>C密码:(?P<cpass>.+?)</h4>', respHtml);
  76.     #print "foundCpass=",foundCpass;
  77.     if(foundCpass):
  78.         cpass = foundCpass.group("cpass");
  79.         print cserv+":"+cport+"'s Password:"+cpass;
  80.     else:
  81.         cpass = '';
  82.         print cserv+":"+cport+"'s Password:none";
  83.     #-------------------------------------
  84.     #-----------以下这部分是提交获取到的信息,俺这里是只把日本的服务器相关信息给更新上去了,即cserv,cport和cpass




  85.     tlHost = '172.16.1.1' # 路由器IP,根据实际更改  
  86.     tluser = 'admin'   # 登录用户名,根据实际更改  
  87.     tlpass = 'admin'  # 登录密码,根据实际更改
  88.     tlfinish = ']# '      # 命令提示符(标识着上一条命令已执行完毕)
  89.      # 连接Telnet服务器  
  90.     tn = telnetlib.Telnet(tlHost)  
  91.     tn.read_until('K1 login:')  
  92.     tn.write(tluser+ '\n')  
  93.    
  94.     # 输入登录密码  
  95.     tn.read_until('Password: ')  
  96.     tn.write(tlpass + '\n')  
  97.     # 登录完毕后,执行命令  
  98.     tn.read_until(tlfinish)  
  99.     tn.write('nvram set ss_server='+cserv+'\n')  
  100.     tn.read_until(tlfinish)  
  101.     tn.write('nvram set ss_server_port='+cport+'\n')  
  102.     tn.read_until(tlfinish)  
  103.     tn.write('nvram set ss_key='+cpass+'\n')  
  104.     tn.read_until(tlfinish)  
  105.     tn.write('cd /tmp\n')  
  106.     tn.read_until(tlfinish)  
  107.     tn.write('cd /tmp\n')  
  108.     # ss脚本执行完毕后,终止Telnet连接(或输入exit退出)  
  109.     tn.read_until(tlfinish)  
  110.     tn.write('./ss.sh\n')
  111.     tn.write('\n')  
  112.     tn.read_until(tlfinish)  
  113.     tn.close() # tn.write('exit\n')  


  114. ###############################################################################
  115. if __name__=="__main__":
  116.     main();
复制代码





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
6#
Pale_Cheung 发表于 2016-6-16 15:59 | 只看该作者
guazi111 发表于 2016-6-16 12:43
发现有时候明明提交成功了但是却没有生效,所以又写了一个通过telnet更新的py脚本,需要先在padavan里面打 ...

base64 是http传送用户名密码默认的编码方式,大部分语言都应该支持的
7#
adminpomme 发表于 2016-10-6 21:56 | 只看该作者
可以试下看,谢谢老大
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部