设为首页 加入收藏

TOP

用Python登录Dr.com
2014-11-23 22:06:59 来源: 作者: 【 】 浏览:13
Tags:Python 登录 Dr.com

如今一般的大学校园或者公寓都是通过客户端来限制路由器使用,基本上都是Dr.com客户端,有的是登录样式,有的是插件样式。下面我们来说说Python定制自己的客户端。


前提:isp得支持web登录的方式。

说明:每个ISP的登录页面不一样,不过我估计算法都是一样的,于是解决方案应该也是相似的,只是表单的key可能不太一样。


首先,分析登录页面。

页面head镶嵌了<script>标签,所有的提交相关的脚本都在这里。页面关键部分是两个表单:f1和f0。整个f0是看不见的,但是点击f1的提交时,会直接调用f0的提交而不是提交自己。表单的table布局就不吐槽了...


部分HTML



01.


02.
03....
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15....
16.


这里可以看见,点击submit的时候,调用cc(0),提交的时候调用ee()函数


部分js:


01.function cc(ss) {
02. f0.R1.value = ss;
03.}
04.
05.function ee() {
06. if (f1.DDDDD.value == "") {
07. alert("请输入您的账号 Please enter your account account number");
08. return false;
09. }
10. f0.DDDDD.value = f1.DDDDD.value
11. if (ps == 0) {
12. f0.upass.value = xproc1(f1.upass.value);
13. } else {
14. tmpchar = pid + f1.upass.value + calg;
15. f0.upass.value = calcMD5(tmpchar) + calg + pid;
16. f0.R2.value = 1;
17. }
18. document.f0.submit();
19. return false;
20.}


显然,点击提交后,会对f0进行一系列赋值,如果没有问题就会提交f0


f0:


01.

02.
03.
04.


参考js里的内容,用python的dict表示f0的话有如下的伪代码:


01.f0={}
02.f0["DDDDD"] = f1['DDDD']
03.f0["upass"] = calcMD5(pid + f1['upass'] + calg) + calg + pid;
04.f0["R1"] = ss
05.f0["R2"] = 1
06.f0["para"] = 00
07.f0["0MKKey"] = 123456

其中 ss、pid、calg都是常量,f1['DDDD']、f1['upass']分别是用户输入的用户名和密码字符串


关键在于calcMD5的算法。

从函数名和函数本身来看,这个函数是MD5的一种实现。然而对js代码进行移植的过程中出现了一些问题:js和python的移位操作表现不同。

既然整个f0[’upass’]字段除了用户输入的密码以外,其它都是常量,完全可以用js计算出f0[’upass’],python中只要保存这个字符串就行了。


用Python登录Dr.com


检查cookies发现整个网页没有使用cookies。

登录后跳转到登出页面,分析登出页面发现,登出只需要访问某个特定的网页就行了。


于是整个思路很简单,pos登录服务器实现登录,get指定网页登出。实现代码如下:


01.import sys
02.from urllib import urlencode
03.from urllib2 import urlopen
04.
05.username = "s10********"
06.upass = "6696a3***********************************"
07.LOGIN = "http://202.1**.***.***/"
08.LOGOUT = "http://202.1**.***.***/F.htm"
09.
10.def post(url, data=None):
11. if data:
12. data = urlencode(data)
13. response = urlopen(url, data)
14. return response.read()
15.
16.def login():
17. data={}
18. data["DDDDD"] = username
19. data["upass"] = upass
20. data["R1"] = 0
21. data["R2"] = 1
22. data["para"] = 00
23. data["0MKKey"] = 123456
24. post(LOGIN, data)
25. pass
26.
27.def logout():
28. post(LOGOUT)
29.
30.def main(argv):
31. if argv[0] in ('login','in','i'):
32. login()
33. elif argv[0] in ('logout','out','o'):
34. logout()
35. pass
36. pass
37.
38.if __name__ == '__main__':
39. main(sys.argv[1:]);


账号 Account
密码 Password
 
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux ARM交叉编译器设定 下一篇用Python切掉图片的黑边

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: