用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 相关文章推荐
Python基于time模块求程序运行时间的方法
Sep 18 Python
Python实现加载及解析properties配置文件的方法
Mar 29 Python
python计算两个数的百分比方法
Jun 29 Python
详解js文件通过python访问数据库方法
Mar 03 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 Python
python图的深度优先和广度优先算法实例分析
Oct 26 Python
解决pandas展示数据输出时列名不能对齐的问题
Nov 18 Python
使用opencv将视频帧转成图片输出
Dec 10 Python
40个你可能不知道的Python技巧附代码
Jan 29 Python
解析python 中/ 和 % 和 //(地板除)
Jun 28 Python
简单了解如何封装自己的Python包
Jul 08 Python
python中Django文件上传方法详解
Aug 05 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
PHP操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
mysql总结之explain
2012/02/27 PHP
Yii CDBCriteria常用方法实例小结
2017/01/19 PHP
thinkPHP简单调用函数与类库的方法
2017/03/15 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
jQuery ul标签下拉菜单演示代码
2010/12/11 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
限制textbox或textarea输入字符长度的JS代码
2013/10/16 Javascript
jquery将一个表单序列化为一个对象的方法
2013/12/02 Javascript
javascript 终止函数执行操作
2014/02/14 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
react性能优化达到最大化的方法 immutable.js使用的必要性
2017/03/09 Javascript
对 Vue-Router 进行单元测试的方法
2018/11/05 Javascript
基于mpvue的简单弹窗组件mptoast使用详解
2019/08/02 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
vue输入框使用模糊搜索功能的实现代码
2020/05/26 Javascript
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
python验证码识别的实例详解
2016/09/09 Python
python中实现迭代器(iterator)的方法示例
2017/01/19 Python
numpy中的delete删除数组整行和整列的实例
2018/05/09 Python
利用python开发app实战的方法
2019/07/09 Python
python 使用opencv 把视频分割成图片示例
2019/12/12 Python
利用Pytorch实现简单的线性回归算法
2020/01/15 Python
H5仿微信界面教程(一)
2017/07/05 HTML / CSS
Sperry官网:帆船鞋创始品牌
2016/09/07 全球购物
eDreams葡萄牙:全球最大的在线旅行社之一
2019/04/15 全球购物
高中毕业生自我鉴定
2013/11/03 职场文书
机械电子工程专业推荐信范文
2013/11/20 职场文书
工程业务员工作职责
2013/12/07 职场文书
幼儿园小班家长寄语
2014/04/02 职场文书
单位租房协议书样本
2014/10/30 职场文书
给女朋友道歉的话大全
2015/01/20 职场文书
化工生产实习心得体会
2016/01/22 职场文书
CSS3实现列表无限滚动/轮播效果
2021/06/23 HTML / CSS
python中的sys模块和os模块
2022/03/20 Python