用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中enumerate函数用法实例分析
May 20 Python
Python中关于使用模块的基础知识
May 24 Python
python字典基本操作实例分析
Jul 11 Python
python用户评论标签匹配的解决方法
May 31 Python
python实现ID3决策树算法
Aug 29 Python
python实现二级登陆菜单及安装过程
Jun 21 Python
Pandas之MultiIndex对象的示例详解
Jun 25 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
May 26 Python
Python通过yagmail实现发送邮件代码解析
Oct 27 Python
python tqdm库的使用
Nov 30 Python
python 第三方库paramiko的常用方式
Feb 20 Python
python通过opencv调用摄像头操作实例分析
Jun 07 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实现读取和编写XML DOM代码
2010/04/07 PHP
php去除换行符的方法小结(PHP_EOL变量的使用)
2013/02/16 PHP
php修改NetBeans默认字体的大小
2013/07/02 PHP
PHP APC配置文件2套和参数详解
2014/06/11 PHP
php-redis中的sort排序函数总结
2015/07/08 PHP
给WordPress的编辑后台添加提示框的代码实例分享
2015/12/25 PHP
层序遍历在ExtJs的TreePanel中的应用
2009/10/16 Javascript
JS简单的图片放大缩小的两种方法
2013/11/11 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
基于JavaScript实现选项卡效果
2017/07/21 Javascript
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
2017/09/29 NodeJs
JS数组的高级使用方法示例小结
2020/03/14 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
Python greenlet实现原理和使用示例
2014/09/24 Python
Python实现把回车符\r\n转换成\n
2015/04/23 Python
编写Python脚本来获取mp3文件tag信息的教程
2015/05/04 Python
Python3使用PyQt5制作简单的画板/手写板实例
2017/10/19 Python
python机器学习实战之树回归详解
2017/12/20 Python
在Python中输入一个以空格为间隔的数组方法
2018/11/13 Python
python中update的基本使用方法详解
2019/07/17 Python
实现Python与STM32通信方式
2019/12/18 Python
pytorch加载自己的图像数据集实例
2020/07/07 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
玩具反斗城天猫官方旗舰店:享誉全球的玩具店
2017/10/10 全球购物
经理秘书岗位职责
2013/11/14 职场文书
名人演讲稿范文
2013/12/28 职场文书
2014年道德讲堂实施方案
2014/03/05 职场文书
护士节策划方案
2014/05/19 职场文书
公司授权委托书范文
2014/09/21 职场文书
计划生育目标责任书
2015/05/09 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript
nginx基于域名,端口,不同IP的虚拟主机设置的实现
2021/03/31 Servers
pytorch中的model.eval()和BN层的使用
2021/05/22 Python