guazi111 发表于 2016-6-14 22:38

【原创】自动从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();




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





中华田园犬 发表于 2016-6-15 15:45

还不会用SS{:1_466:},有简单教程么

Pale_Cheung 发表于 2016-6-15 16:35

base64

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

另外base64 是轻松可逆的编码

那你28行做例子
echo YWRtaW46YWRtaW4=|base64 -d
echo -n admin:admin|base64

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里抓到的直接黏贴过来了

guazi111 发表于 2016-6-16 12:43

本帖最后由 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();





Pale_Cheung 发表于 2016-6-16 15:59

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

base64 是http传送用户名密码默认的编码方式,大部分语言都应该支持的

adminpomme 发表于 2016-10-6 21:56

可以试下看,谢谢老大
页: [1]
查看完整版本: 【原创】自动从iss更新padavan路由器ss密码的脚本,6.17更新