用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 查找文件夹下所有文件 实现代码
Jul 01 Python
用Python进行行为驱动开发的入门教程
Apr 23 Python
LRUCache的实现原理及利用python实现的方法
Nov 21 Python
Pandas中把dataframe转成array的方法
Apr 13 Python
Python多进程写入同一文件的方法
Jan 14 Python
python 表格打印代码实例解析
Oct 12 Python
如何基于windows实现python定时爬虫
May 01 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
May 22 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
Jun 12 Python
python redis存入字典序列化存储教程
Jul 16 Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 Python
Python __slots__的使用方法
Nov 15 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
浅谈Windows下 PHP4.0与oracle 8的连接设置
2006/10/09 PHP
我的论坛源代码(三)
2006/10/09 PHP
PHP的拦截器实例分析
2014/11/03 PHP
php开发中的页面跳转方法总结
2015/04/26 PHP
php正则preg_replace_callback函数用法实例
2015/06/01 PHP
详解PHP中的Traits
2015/07/29 PHP
PHP版单点登陆实现方案的实例
2016/11/17 PHP
PHP未登录自动跳转到登录页面
2016/12/21 PHP
php5对象复制、clone、浅复制与深复制实例详解
2019/08/14 PHP
Stop SQL Server
2007/06/21 Javascript
jquery.validate使用攻略 第一部
2010/07/01 Javascript
javascript 原型继承介绍
2011/08/30 Javascript
IE与FireFox中的childNodes区别
2011/10/20 Javascript
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
js中this用法实例详解
2015/05/05 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
Vue数据驱动模拟实现2
2017/01/11 Javascript
解决微信内置浏览器返回上一页强制刷新问题方法
2017/02/05 Javascript
基于Node.js模板引擎教程-jade速学与实战1
2017/09/17 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
webpack打包多页面的方法
2018/11/30 Javascript
[06:37]2014DOTA2国际邀请赛 昔日王者渴望重回巅峰
2014/07/12 DOTA
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
2017/06/07 Python
Python下载网络文本数据到本地内存的四种实现方法示例
2018/02/05 Python
Keras—embedding嵌入层的用法详解
2020/06/10 Python
三只松鼠官方旗舰店:全网坚果销售第1
2017/11/25 全球购物
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
租房协议书
2014/09/12 职场文书
关于九一八事变的演讲稿2014
2014/09/17 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
幼儿园大班见习报告
2014/10/31 职场文书
环境建议书
2015/02/04 职场文书
幼儿园亲子活动通知
2015/04/24 职场文书
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
CSS基础详解
2021/10/16 HTML / CSS
mysql sock 文件解析及作用讲解
2022/07/15 MySQL