在路由器上写CMCC自动登录验证脚本

今天入手了一个新的路由器,160RMB,特点是体积很小,像个火柴盒,但有64MB内存,安装openWRT(Linux)操作系统,内核比较新。玩了一下,功能很强大,跟那些几千元的大型路由器有的比呀!

如下图模型:


买回来马上看看配置如何,

看起来蛮不错的,内存也很足够,能做一般的web服务了。目前我博客的web服务占用的内存也就在60MB左右,如果不用php和mysql的话,web服务只需要30MB就够!

 

刚买回来的路由,最想做的第一件事当然是在上面安装Python了,在这个基础上,我以前的一堆代理程序和VPN程序都能够跑了。

然而悲剧的是,我刚想用opkg安装python软件包,系统提示我仅剩下200多kb内存空间了,无法安装成功。看来这个内置的Flash容量太少了,装个python当然不行。所以,我把我经常戴在钥匙上的U盘拿下来了,在路由系统里用ext2格式化了一次。把系统软件转移到了U盘上(做法很简单,直接把python安装到u盘,然后在环境变量的PATH里设置U盘上的bin目录即可)。

root@OpenWrt:~# python -V
Python 2.7.3rc2

 

本来打算今晚写好一个基于IPv6通信的VPN程序,放在实验室里跑的,这样在宿舍就能够免费撑实验室的网而且不断网了!但是折腾了一个晚上,都无法解决一个很诡异的错误:

[Errno 81] File descriptor in bad state.

Google了也找不到解决方案。所以无法在python里创建tun设备了,VPN也没戏了。奇怪的是,我用ip tuntap命令是可以创建和配置的,难道是我的python库有问题???

 

VPN没有搞成,最后搞了一个CMCC的无线中继。而且免去了CMCC的登录验证,因为验证已经在路由里完成了。我的做法是,在原有的无线网的基础上,增加另外一个无线网络,但是采用客户端模式,而不是接入点模式,openWRT的配置操作很简单,几步就完成了。

但是,CMCC的登录验证代码还是要自己写的。所以还是花了时间去研究一下登录过程。

代码如下:

#!/usr/bin/env python
import cookielib, urllib2
import re
import os
import random
import time

username = ''
passwd = ''

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

test = opener.open('http://xiaoxia.org')
data = test.read()
userip = re.search(r'NAME="wlanuserip" value="(.+)">', data).group(1)
acname = re.search(r'NAME="wlanacname" value="(.+)">', data).group(1)
acip = re.search(r'NAME="wlanacip" value="(.+)">', data).group(1)

url = os.path.join(os.path.dirname(test.url), 'index.jsp')
data = 'wlanuserip=%s&wlanacname=%s&wlanacip=%s' % (userip, acname, acip)
print 'opening', url, data
data = opener.open(url, data).read()

url = os.path.join(os.path.dirname(test.url), 'jsp/do_login.jsp')
data = 'bpssUSERNAME=%s&bpssBUSPWD=%s&' +\
 'Submit=\xb5\xc7\xc2\xbc&bpssLoginType=1' % (username, passwd)
print 'opening', url, data
data = opener.open(url, data).read()
print 'result', data

代码是在路由器上打的,所以看起来比较乱,但是步骤不多。如果已经登录成功,则肯定可以打开xiaoxia.org,所以后面的步骤都不起作用。如果未登录,会被跳转到登录页面,提交帐号登录即可。

为了能够让路由器保持CMCC的在线状态,把上面的脚本加入了crontab,设置为10分钟自动执行一次该脚本。所以今晚的努力还是没有白费,以后在笔记本或者手机上可以不用输入帐号使用无线网了,也不用担心老登不上CMCC的那个bug了。。。

That’s all. Thank you :)

在路由器上写CMCC自动登录验证脚本》上有152条评论

    1. Xiaoxia 文章作者

      当然可以呀,在服务器上执行
      python -m SimpleHTTPServer
      就成功建立一个静态的Web服务器了。

      其实,还剩下那么多空闲内存,可以装个nginx和php来玩的 😀

      回复
      1. 依云

        玩 Tornado 吧,Python 你已经搞定了。跑点服务我这里也不到 20M,效率又好。PHP 那个太占内存了,php-cgi 进程一个就 20M+。

        回复
  1. 老刘

    能顺道研究下这个能否输出控制信号,控制其他设备,如开关?如果可以,那就是一个比较理想的物联网终端啊

    回复
    1. Xiaoxia 文章作者

      不是,tb上买的,卖家刷好的了。。。
      最近还没折腾这个!!!有需求才买的嘛 😛

      回复
        1. Xiaoxia 文章作者

          嗯,其实原厂那个配置可能没这个那么高。
          因为这个是卖家改版的,内存升级到了64M,目前有很大发展空间。只不过闪存有点少,装软件必须外接u盘或者移动硬盘了。

          回复
    1. Xiaoxia 文章作者

      应该支持的呀!但是没有那个电话线的接口的。只有rj45. pppop拨号应该是连入了网络就可以的了吧!
      例如,我连进了你手机建立的wifi热点,我也可以用pppoe协议拨号吧,只要是能够支持的话?

      回复
    1. Xiaoxia 文章作者

      对的, 😛
      不知道低配置能不能跑openWRT了。我感觉这系统功能很强大,vpn,bt下载,防火墙都有了。

      回复
      1. 鬼仔

        低配的可以,但是配置太弱了,还是改过的比较好。
        嗯,openwrt的确是很强大,楼下提到的机器人小车,我做过,有用到openwrt。

        回复
      1. nonememory

        小虾你好,我刚从同一家店入手了一个720N,但怎么也设置不成和你一样的功能,能否指点一下,我QQ409490766,多谢啊!

        回复
  2. willy

    我看网上有人用openwrt路由器做的机器人小车。。有些路由器上有串口输出。所以可以直接控制一些外接的硬件。

    回复
    1. Xiaoxia 文章作者

      hi,不是所有路由。有的路由厂商不能让你改的,也不能让你安装openWRT的。
      另外,openWRT支持的路由器类型应该也有一个范围。

      回复
      1. steve

        你好可以问个问题吗?
        我们学校是闪讯上网 基于pppoe的 但是真实账号会随机在原账号前面产生一段乱码 怎么产生我说不清 貌似要用到md5加密还有获取系统运行时间什么的 如果写成自动拨号的脚本 这样可行吗? ddwrt的固件

        回复
          1. sunc

            已被这种账号前加码的玩死,乱码不是本地产生的,是验证服务器发往客户端后拨号的。每次都要制造一个伪申请,等服务器发过来帐号再快速填入路由,实现宿舍一拖四。

            回复
    1. Xiaoxia 文章作者

      哇,这都行!!!
      我现在这个感觉闪存空间大一点就很足够了。装软件也方便点!

      回复
    1. Xiaoxia 文章作者

      据说高手都喜欢用openwrt,而ddwrt可能比openwrt更易用吧。
      openwrt挺不错的,我觉得稳定和够用就好!

      回复
    1. Xiaoxia 文章作者

      嗯,当时不知道8M装不了什么软件,买回来试试才发现的呢!
      不过为了方便,还是外接一个u盘来存放提供服务的资料文件和重要的数据,还是挺好的。

      回复
        1. Xiaoxia 文章作者

          IPv6不会断网的!你当然可以通过IPv6建立一个VPN。
          我现在是有实验室的vpn,所以校园网用起来比较顺畅,实验室的网络能走广州电信。

          这个学期校园网好像不断的。。。。

          回复
  3. luguo

    16ROM 64RAM 价格 66元 可刷openWRT的,我买了4~5个,做测试用,比PC省电
    703n拿着方便,缺点ROM小,RAM小,就1个RJ45,有些时候受限制
    你买这个703n更省电,我测过,开无线状态,功耗也只有不到2W,24小时开机一个月不到2度电

    回复
    1. Xiaoxia 文章作者

      16ROM 64RAM 价格 66元 这个是什么产品呢?
      话说,想知道你是做什么测试用的,网络测试?

      回复
    1. Xiaoxia 文章作者

      不是同一种,我买这个是改装和升级版本。
      Sorry这么迟才看到你这条评论。。。

      回复
    1. Xiaoxia 文章作者

      hi, 你在chrome浏览器里按F12,打开调试面板,找到网络栏目。然后登录cmcc,把发送的网络请求都抓下来。然后就可以研究登录过程了。
      你用脚本模拟该登录过程,就能写出自动登录的程序。

      不好意思,这么迟才回复。

      回复
  4. Pingback引用通告: 在路由器上写CMCC自动登录脚本2 (shell篇) « Xiaoxia[PG]

    1. Xiaoxia 文章作者

      路由器是写入固件的,可以通过ttl线等控制吧。估计也可以通过tftp等安装系统。我没有试过,没啥经验。

      回复
  5. 卢瑞源

    您好!我想咨询您一个问题。真诚地希望您有空的时候,可以抽时间,看下我的问题。
    我现在用的网络是CMCC-EDU(就是高校专用的移动无线网络),请问,可以实现路由器接收CMCC-EDU信号,同时使其自动登录吗?您提及的是CMCC,我不知道CMCC和CMCC-EDU是否一致。
    另外,如何实现通过有多WAN口合并的路由器,来实现对多个CMCC-EDU的带宽合并?
    我的邮箱是775902689@qq.com

    回复
    1. Xiaoxia 文章作者

      这个路由ID名字是无关紧要的吧,我在机场CMCC-AIR也一样的登陆界面,所以应该是看地区的。多wan合并,我就没什么经验了。但是我觉得,只要自己会配置路由规则,是有办法可以实现的。

      回复
  6. 浅色

    今天百度找到你的博客,看了很多你写的文章,真的很不错,可以给个联系方式吗?我加你。做个朋友,同样玩c++

    回复
  7. howard

    你好,xiaoxia,我对wifi网络设备很着迷,但是对编程、软件就是一个白丁了。请教一下:
    “我的做法是,在原有的无线网的基础上,增加另外一个无线网络,但是采用客户端模式,而不是接入点模式,openWRT的配置操作很简单,几步就完成了。”
    实现这几句话对我来说有点难度,有空的话,能否给出稍微具体一点的步骤,不胜感谢!

    回复
    1. weakdancer

      就是在 网络 -无线 -搜索
      找到 CMCC 点击 加入
      最下边 保存并应用。

      前提是你必须用lan接入路由器
      不能用无线
      因为这样一做路由器和CMCC连无线了,和你的无线就断开了。

      回复
      1. Howard

        感谢回复。
        不过,我想你弄错了。你说的是指wr703n只做为wireless client(无线客户端模式),即只做为无线网卡来用。
        而xiaoxia的模式应该是wireless repeater(无线中继模式)。请看他原文中下部的无线信号图示,很明显虚拟出了两个无线接口(界面):CMCC-HEMC client和CMCC_FREE master,其中前者cmcc-hemc应该是作为client 连接广州大学城的移动wlan,后者则是作为无线ap分享给周围的无线设备。
        我的问题就是怎么样虚拟出这两个无线界面的具体步骤。

        回复
        1. weakdancer

          你不说的话我还一直没有注意到,我以前一位一个无线网卡只能起一种作用。
          就是在我之前的基础上再添加一个网络。(点击 添加)
          这次设为AP模式,网络点选 LAN,即可。

          回复
  8. xzc2601a

    博主,看了文章我觉得很有用,先表示感谢,另外还有一个问题请教你,中继chinanet后,怎样在命令中加入每隔10秒钟ping某个ip地址来保持登陆状态,这个脚本怎么写,本人是小白,不太懂命令行

    回复
  9. xiaoxin

    你好,我是myqq用户,很早就知道你了。我之前就看过这篇文章,当时还没用上,现在我宿舍覆盖了chinanet,我觉得也可以这样桥接网络,想和你讨论一下。有关openwrt的配置还有就是脚本的修改,因为chinanet有验证码,你说能不能把验证码down回来再手动输入?期待回讨论或者邮件讨论

    回复
  10. wyseeker

    小虾,你好!
    万分仰慕啊,能不能告诉我一下你的QQ之类的联系方式啊,有个问题想请教你一下,歇息你了,我的QQ:21633054.

    回复
  11. wyseeker

    您好!我想咨询您一个问题。真诚地希望您有空的时候,可以抽时间,看下我的问题。
    我现在用的网络是CMCC-EDU(就是高校专用的移动无线网络),请问,可以实现路由器接收CMCC-EDU信号,同时使其自动登录吗?您提及的是CMCC,我不知道CMCC和CMCC-EDU是否一致。我的邮箱是wyseeker@163.com

    回复
  12. 黄枫叶

    小虾你好,请教一个问题,我在安装python的时候,出现一下代码
    root@OpenWrt:~# opkg –dest usb install python
    Installing python (2.7.3-2) to usb…
    Downloading http://downloads.openwrt.org/snapshots/trunk/brcm63xx/packages//python_2.7.3-2_brcm63xx.ipk.
    Multiple packages (libpthread and libpthread) providing same name marked HOLD or PREFER. Using latest.
    Multiple packages (libpthread and libpthread) providing same name marked HOLD or PREFER. Using latest.
    Installing libffi (3.0.10-1) to usb…
    Downloading http://downloads.openwrt.org/snapshots/trunk/brcm63xx/packages//libffi_3.0.10-1_brcm63xx.ipk.
    Installing python-mini (2.7.3-2) to usb…
    Downloading http://downloads.openwrt.org/snapshots/trunk/brcm63xx/packages//python-mini_2.7.3-2_brcm63xx.ipk.
    Configuring libffi.
    Configuring python-mini.
    Configuring python.
    Collected errors:
    * extract_archive: Cannot create symlink from ./usr/lib/libffi.so.5 to ‘libffi.so.5.0.10′: Operation not permitted.
    * extract_archive: Cannot create symlink from ./usr/bin/python to ‘python2.7′: Operation not permitted.

    显然,python没有安装成功,所以想问问小虾是否清楚?
    (安装到U盘的,
    echo dest usb /mnt/hdd/packages/ >> /etc/opkg.conf
    opkg –dest usb install python)

    回复
  13. Pingback引用通告: 无聊开始玩路由器,入门Tomato固件

    1. 罗洋

      恩 刚刚重新看了一片 但是 你说的研究登录过程 真的无从下嘴啊 关于下这方面 白痴一个 路过啊啊

      回复
    1. Xiaoxia 文章作者

      你在实验室里有一台主机用来做vpn服务器即可。不过现在SCUT的网络好像改善了,应该没这个必要。

      回复
  14. scola

    我想在703n上安装python,flash空间不足,也安装在u盘上,但是一直报
    opkg_install_pkg: Package python md5sum mismatch. Either the opkg or the package index are corrupt
    这个错误。
    小虾遇到过么

    回复
  15. mongoose

    您好博主,这篇博文我已经收藏一年多了,一直没有学习,最近看了一下python,了解了一下http header,有一些问题想请问一下。尤其是第5点。
    1 浏览一个网页首先浏览器发送一个request,但是为什么request header中还会出现cookie:XXXXX,并且根据不同的网站,cookie的形式都不一样。难道是浏览器首先检查本地有没有cookie,没有就自动创建,如果是这样,那么为什么cookie的形式不一样,有的是JSESSIONID=XXXX,难道浏览器在发送request之前还从服务器接受了什么信息?
    2 您在博文中写道cj = cookielib.CookieJar() ,难道是在本地创建了一个cookie文件?还是上面那个问题,不同的网站request header中的cookie形式不一样,本地的cookie和request header的cookie后面跟得字符有什么关联吗?
    3 如何获得request header 信息,在python3中,urlopen返回的是一个http.client.HTTPResponse对象,它getheader之后获得的是response header,那request header 如何获得?
    4 使用的python3,在连接cmcc之后,open=urllib.request.urlopen(‘http://www.baidu.com’) open.geturl()得到的url是cmcc的登录地址,由于是采用的get方式,?号之后还会有很长的一串字符,这一串字符肯定不是python能自己生成的,是否是因为cmcc那个路由器(不知道那是什么东西)重定向的?
    5 以上只是我的疑问,不知道也大概能写出程序来……但是这个问题,还没有办法解决。
    在cmcc-edu logout的时候,由于它是采用的get方式下线的,所以需要一个带问号的连接,在第4点中,由于不知为何的原因能获得真实的带问号的地址,但是在登出的时候无法获得这样的地址,只能自己构建,但是有三个是不知道从何处得到的,如:CSRFToken_HW:5ff126748ef88b03eb35de1d4c5298de; uuid:A094E3D63C9D35F9436FB8D91BD04E5C ; flowID:20140831223421826 手机号 (这个flowid,前面的数字20140831还有意义,后面的22341826不是登录时间也不是下线的时间,不知道是何意思),难道是随机生成的?

    回复

Creke进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>