用python登录Dr.com思路以及代码分享
2014-06-26 19:51
585 查看
前提:isp得支持web登录的方式。效果可以看下具体51搜索展示http://www.51bt.cc,结合Xunsearch全文检索技术,可以达到毫秒级的数据搜索
说明:每个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:]);
说明:每个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登录Dr.com思路以及代码分享
- 用python登录Dr.com思路以及代码分享
- 用python登录Dr.com
- Python基础练习之用户登录实现代码分享
- selenium+python关于登录的脚本代码,使用了读取excel以及向excel中写入测试结果的方法
- php导出csv格式数据并将数字转换成文本的思路以及代码分享
- selenium+python关于登录的脚本代码,使用了读取excel以及向excel中写入测试结果的方法
- python模拟登录百度代码分享(获取百度贴吧等级)
- php导出csv格式数据并将数字转换成文本的思路以及代码分享
- python模拟登录百度代码分享(获取百度贴吧等级)
- 使用python的列表解析以及函数式计算来简化代码
- ssh批量登录并执行命令的python实现代码
- 分享:带会员注册登录一级纯css导航栏代码
- python 图片验证码代码分享
- ssh批量登录并执行命令的python实现代码
- php后台多用户权限组思路与实现程序代码分享
- python 图片验证码代码分享 详细出处参考:http://www.jb51.net/article/30731.htm
- C#.NET 可以为不同的客户定制不同的登录窗体的设计思路参考【功能代码组件化,可以灵活选配】
- web测试常用python代码——ssh远程登陆以及命令执行
- Python 代码性能优化技巧分享