用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 04 Python
在Python的struct模块中进行数据格式转换的方法
Jun 17 Python
利用python代码写的12306订票代码
Dec 20 Python
python编码最佳实践之总结
Feb 14 Python
django 2.0更新的10条注意事项总结
Jan 05 Python
Pytorch提取模型特征向量保存至csv的例子
Jan 03 Python
python扫描线填充算法详解
Feb 19 Python
python之MSE、MAE、RMSE的使用
Feb 24 Python
Python填充任意颜色,不同算法时间差异分析说明
May 16 Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
Jun 27 Python
Django中的JWT身份验证的实现
May 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
Drupal简体中文语言包安装教程
2014/09/27 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
2013/11/21 Javascript
关闭浏览器时提示onbeforeunload事件
2013/12/25 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
javascript中的循环语句for语句深入理解
2014/04/04 Javascript
js事件监听机制(事件捕获)总结
2014/08/08 Javascript
详解JavaScript对W3C DOM模版的支持情况
2015/06/16 Javascript
javascript中利用柯里化函数实现bind方法【推荐】
2016/04/29 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
2016/12/16 Javascript
基于node.js express mvc轻量级框架实践
2017/09/14 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
微信小程序实现日期格式化和倒计时
2020/11/01 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
2020/08/03 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
JS常用跨域方法实现原理解析
2020/12/09 Javascript
python提取字典key列表的方法
2015/07/11 Python
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
django+js+ajax实现刷新页面的方法
2017/05/22 Python
Python语言快速上手学习方法
2018/12/14 Python
python中import与from方法总结(推荐)
2019/03/21 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
wxPython色环电阻计算器
2019/11/18 Python
零基础小白多久能学会python
2020/06/22 Python
Pandas之缺失数据的实现
2021/01/06 Python
GANT葡萄牙官方商店:拥有美国运动服传统的生活方式品牌
2018/10/18 全球购物
最新党员的自我评价分享
2013/11/04 职场文书
人事专员的岗位职责
2014/03/01 职场文书
公司会议开幕词
2015/01/29 职场文书
李强感恩观后感
2015/06/17 职场文书
十大最强火系宝可梦,喷火龙上榜,第一名有双火属性
2022/03/18 日漫
Nginx速查手册及常见问题
2022/04/07 Servers