用python登录Dr.com思路以及代码分享


Posted in Python onJune 25, 2014

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

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

首先,分析登录页面。

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

部分HTML

<form name="f1" method="post" action="" onsubmit="return ee()">
<table border="0" width="100%" cellspacing="1" cellpadding="0" height="100%" class="f1">
...
<tr>
<td height="34" width="35%" align="right">账号 Account </td><td height="34" width="64%"> <input name="DDDDD" type="text" maxlength="26" class="input-border"></td>
</tr>

<tr>
<td height="32" width="35%" align="right">密码 Password </td><td height="32" width="64%"> <input name="upass" type="password" maxlength="16" class="input-border"></td>
</tr>

<tr>
<td height="57" width="35%"> </td><td height="57" width="64%"> <input type="submit" name="0MKKey" value="" onclick="cc(0)" class="login-b">  <input type="submit" name="" value="" onclick="reset();return false;"></td>
</tr>
...
</form>

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

部分js:

function cc(ss) {
 f0.R1.value = ss;
}

function ee() {
 if (f1.DDDDD.value == "") {
  alert("请输入您的账号 Please enter your account account number");
  return false;
 }
 f0.DDDDD.value = f1.DDDDD.value
 if (ps == 0) {
  f0.upass.value = xproc1(f1.upass.value);
 } else {
  tmpchar = pid + f1.upass.value + calg;
  f0.upass.value = calcMD5(tmpchar) + calg + pid;
  f0.R2.value = 1;
 }
 document.f0.submit();
 return false;
}

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

f0:

<form name="f0" method="post" action=""><input type="hidden" name="DDDDD" value="0"><input type="hidden" name="upass" value="0">
<input type="hidden" name="R1" value="0"><input type="hidden" name="R2" value="0"><input type="hidden" name="para" value="00">
<input type="hidden" name="0MKKey" value="123456">
</form>

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

f0={}
 f0["DDDDD"] = f1['DDDD']
 f0["upass"] = calcMD5(pid + f1['upass'] + calg) + calg + pid;
 f0["R1"] = ss
 f0["R2"] = 1
 f0["para"] = 00
 f0["0MKKey"] = 123456

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

关键在于calcMD5的算法。

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

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

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

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

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

import sys
from urllib import urlencode
from urllib2 import urlopen

username = "s10********"
upass = "6696a3***********************************"
LOGIN = "http://202.1**.***.***/"
LOGOUT = "http://202.1**.***.***/F.htm"

def post(url, data=None):
 if data:
  data = urlencode(data)
 response = urlopen(url, data)
 return response.read()

def login():
 data={}
 data["DDDDD"] = username
 data["upass"] = upass
 data["R1"] = 0
 data["R2"] = 1
 data["para"] = 00
 data["0MKKey"] = 123456
 post(LOGIN, data)
 pass

def logout():
 post(LOGOUT)

def main(argv):
 if argv[0] in ('login','in','i'):
  login()
 elif argv[0] in ('logout','out','o'):
  logout()
  pass
 pass

if __name__ == '__main__': 
 main(sys.argv[1:]);
Python 相关文章推荐
vc6编写python扩展的方法分享
Jan 17 Python
Python中的生成器和yield详细介绍
Jan 09 Python
python使用Flask框架获取用户IP地址的方法
Mar 21 Python
python文件特定行插入和替换实例详解
Jul 12 Python
python Matplotlib画图之调整字体大小的示例
Nov 20 Python
python模块smtplib学习
May 22 Python
完美解决安装完tensorflow后pip无法使用的问题
Jun 11 Python
转换科学计数法的数值字符串为decimal类型的方法
Jul 16 Python
set在python里的含义和用法
Jun 24 Python
python3中替换python2中cmp函数的实现
Aug 20 Python
Python可以实现栈的结构吗
May 27 Python
python字典通过值反查键的实现(简洁写法)
Sep 30 Python
python正则表达式re模块详解
Jun 25 #Python
Python通过websocket与js客户端通信示例分析
Jun 25 #Python
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
Jun 25 #Python
Python中文编码那些事
Jun 25 #Python
教你如何在Django 1.6中正确使用 Signal
Jun 22 #Python
python抓取网页时字符集转换问题处理方案分享
Jun 19 #Python
python在linux中输出带颜色的文字的方法
Jun 19 #Python
You might like
DEDECMS首页调用图片集里的多张图片
2015/06/05 PHP
PHP模板引擎Smarty中的保留变量用法分析
2016/04/11 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
thinkPHP批量删除的实现方法分析
2016/11/09 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
Javascript常考语句107条收集
2010/03/09 Javascript
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
JS Date函数整理方便使用
2013/10/23 Javascript
JavaScript中的typeof操作符用法实例
2014/04/05 Javascript
利用HTML5的画布Canvas实现刮刮卡效果
2015/09/06 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
2016/05/31 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
nodejs基础应用
2017/02/03 NodeJs
JS中利用localStorage防止页面动态添加数据刷新后数据丢失
2017/03/10 Javascript
基于AngularJS的简单使用详解
2017/09/10 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
react native 仿微信聊天室实例代码
2019/09/17 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
JavaScript实现缓动动画
2020/11/25 Javascript
[03:41]DOTA2上海特锦赛小组赛第三日recap精彩回顾
2016/02/28 DOTA
Python中设置变量访问权限的方法
2015/04/27 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
python如何利用paramiko执行服务器命令
2020/11/07 Python
在Python中字典按值排序的实现方法
2020/11/12 Python
美国购买韩国护肤和美容产品网站:Althea Korea
2020/11/16 全球购物
婚前协议书范本
2014/04/15 职场文书
应届生求职信
2014/05/31 职场文书
颂军魂爱军营演讲稿
2014/09/13 职场文书
合伙经营协议书范本(通用版)
2014/12/03 职场文书
2015年学生会工作总结范文
2015/03/31 职场文书
公司员工宿舍管理制度
2015/08/03 职场文书
保护环境建议书作文500字
2015/09/14 职场文书
优秀党员主要事迹材料
2015/11/04 职场文书
mysql 如何获取两个集合的交集/差集/并集
2021/06/08 MySQL