用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 实现文件的递归拷贝实现代码
Aug 02 Python
Python运算符重载用法实例
May 28 Python
利用python实现命令行有道词典的方法示例
Jan 31 Python
python 环境变量和import模块导入方法(详解)
Jul 11 Python
python3 图片referer防盗链的实现方法
Mar 12 Python
Python3多线程操作简单示例
May 22 Python
wxpython布局的实现方法
Nov 01 Python
解决pytorch DataLoader num_workers出现的问题
Jan 14 Python
在python中logger setlevel没有生效的解决
Feb 21 Python
python str字符串转uuid实例
Mar 03 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
Mar 09 Python
详解基于Scrapy的IP代理池搭建
Sep 29 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
关于Intype一些小问题的解决办法
2008/03/28 PHP
深入PHP FTP类的详解
2013/06/13 PHP
PHP 类与构造函数解析
2017/02/06 PHP
详解php语言最牛掰的Laravel框架
2017/11/20 PHP
jQuery EasyUI API 中文文档 - Parser 解析器
2011/09/29 Javascript
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
js取得html iframe中的元素和变量值
2014/06/30 Javascript
纯JS实现旋转图片3D展示效果
2015/04/12 Javascript
JQuery显示、隐藏div的几种方法简明总结
2015/04/16 Javascript
JavaScript操作XML文件之XML读取方法
2015/06/09 Javascript
jQuery简单实现验证邮箱格式
2015/07/15 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
js格式化时间的方法
2015/12/18 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
2016/06/16 Javascript
JavaScript实现二分查找实例代码
2017/02/22 Javascript
使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
2017/03/01 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
React中ES5与ES6写法的区别总结
2017/04/21 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
微信小程序实现聊天对话(文本、图片)功能
2018/07/06 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
vue-cli4.x创建企业级项目的方法步骤
2020/06/18 Javascript
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
2017/08/18 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
2017/08/18 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
python IP地址转整数
2020/11/20 Python
面料业务员岗位职责
2013/12/26 职场文书
学校安全工作汇报材料
2014/08/16 职场文书
老干部工作先进事迹
2014/08/17 职场文书
优秀班主任材料
2014/12/16 职场文书
2014年大学宣传部工作总结
2014/12/19 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书
85句关于理想的名言警句大全
2019/08/22 职场文书
退休劳动合同怎么写?
2019/10/25 职场文书
Python内置类型集合set和frozenset的使用详解
2022/04/26 Python