用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绘图库Matplotlib的安装
Jul 03 Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
Nov 28 Python
在SAE上部署Python的Django框架的一些问题汇总
May 30 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
Apr 11 Python
解决python 自动安装缺少模块的问题
Oct 22 Python
Mac下Anaconda的安装和使用教程
Nov 29 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
Jul 03 Python
简单了解Python读取大文件代码实例
Dec 18 Python
Django ModelForm操作及验证方式
Mar 30 Python
Django与pyecharts结合的实例代码
May 13 Python
python动态规划算法实例详解
Nov 22 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
第七节 类的静态成员 [7]
2006/10/09 PHP
php实现的简易扫雷游戏实例
2015/07/09 PHP
php+js实现点赞功能的示例详解
2020/08/07 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
2020/12/16 PHP
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
2013/11/22 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
Js+php实现异步拖拽上传文件
2015/06/23 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
jQuery实现本地预览上传图片功能
2016/01/08 Javascript
jQuery select自动选中功能实现方法分析
2016/11/28 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
2017/02/28 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
JavaScript跳出循环的三种方法(break, return, continue)
2019/07/30 Javascript
微信小程序组件传值图示过程详解
2019/07/31 Javascript
koa2的中间件功能及应用示例
2020/03/05 Javascript
vue实现从外部修改组件内部的变量的值
2020/07/30 Javascript
[43:49]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[41:17]完美世界DOTA2联赛PWL S3 access vs CPG 第二场 12.13
2020/12/17 DOTA
Python实现Linux的find命令实例分享
2017/06/04 Python
Python UnboundLocalError和NameError错误根源案例解析
2018/10/31 Python
Python有参函数使用代码实例
2020/01/06 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
Pycharm中配置远程Docker运行环境的教程图解
2020/06/11 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
做一个能自适应高度的textarea的示例代码
2019/09/06 HTML / CSS
将时尚融入珠宝:Adornmonde
2019/10/17 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
仓库管理专业个人的自我评价
2013/12/30 职场文书
文明城市标语
2014/06/16 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
欠条格式范本
2015/07/03 职场文书
食品安全主题班会
2015/08/13 职场文书
详解用Python把PDF转为Word方法总结
2021/04/27 Python
解决Golang中goroutine执行速度的问题
2021/05/02 Golang