用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学习笔记(一)(基础入门之环境搭建)
Jun 05 Python
python循环监控远程端口的方法
Mar 14 Python
Python的Flask框架中实现登录用户的个人资料和头像的教程
Apr 20 Python
pytorch 转换矩阵的维数位置方法
Dec 08 Python
python ipset管理 增删白名单的方法
Jan 14 Python
详解python之heapq模块及排序操作
Apr 04 Python
Python中@property的理解和使用示例
Jun 11 Python
Python Tensor FLow简单使用方法实例详解
Jan 14 Python
python学习笔记之多进程
Aug 06 Python
python 常见的反爬虫策略
Sep 27 Python
python基础之匿名函数详解
Apr 21 Python
Python torch.flatten()函数案例详解
Aug 30 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 接口类与抽象类的实际作用
2009/11/26 PHP
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
2014/10/20 PHP
php+mysqli数据库连接的两种方式
2015/01/28 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
php版微信js-sdk支付接口类用法示例
2016/10/12 PHP
基于PHP实现用户登录注册功能的详细教程
2020/08/04 PHP
javascript mouseover、mouseout停止事件冒泡的解决方案
2009/04/07 Javascript
简单实用的全选反选按钮例子
2013/10/18 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
在JavaScript中正确引用bind方法的应用
2015/05/11 Javascript
jQuery实现自定义checkbox和radio样式
2015/07/13 Javascript
深入浅析AngularJS中的module(模块)
2016/01/04 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
2016/04/18 Javascript
AngularJS入门教程之AngularJS模型
2016/04/18 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
2016/11/25 Javascript
jQuery实现图片滑动效果
2017/03/08 Javascript
详解前后端分离之VueJS前端
2017/05/24 Javascript
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
2018/03/21 Javascript
基于vue-ssr的静态网站生成器VuePress 初体验
2018/04/17 Javascript
详解javascript中的babel到底是什么
2018/06/21 Javascript
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
this.$toast() 了解一下?
2019/04/18 Javascript
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
2019/04/29 Javascript
python实现计算倒数的方法
2015/07/11 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
利用Python如何批量修改数据库执行Sql文件
2018/07/29 Python
python 的 openpyxl模块 读取 Excel文件的方法
2019/09/09 Python
python中get和post有什么区别
2020/06/19 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
彪马荷兰官网:PUMA荷兰
2019/05/08 全球购物
南京某公司笔试题
2013/01/27 面试题
师说教学反思
2014/02/07 职场文书
实习单位证明范例
2014/11/17 职场文书
小学数学教学随笔
2015/08/14 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
2016年最美孝心少年事迹材料
2016/02/26 职场文书