Python模拟登陆dede cms后台遇到的问题

网上好多Python模拟登陆网站的源码,今天捣腾了一天时间,全部用了个遍,无奈没有一个可以直接用的,关键是dede的登陆流程没有分析好,开始发现浏览器cookies的sessonid是一直不变的,不论登陆或注销状态都是一样的,估计在服务端的session对应的每次会记录变化,不会每次在cookies更新session标识,而用python访问生成的cookies,如果程序不结束,一直输出cookies中的sessionid也都是一样的,如果程序关闭了,则访问一次在cookies中的sessionid会变化一次,看到博客园也有人遇到过这问题,最终还是在客户端session标识的问题在纠结,尝试用浏览器登陆后在cookies中取出sessionid,然后用python获取登陆后的页面是正常获取的,在python中用下面代码跟踪cookies,一直是失败。

#获得一个cookieJar实例
cj = cookielib.LWPCookieJar()
#cookieJar作为参数,获得一个opener的实例
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

压根没用过urllib和urllib2这两个库,一直在调试sessionid的问题,最后发现是cookies问题,网上的代码适合直接提交表单,如果没有访问页面直接提交表单的,就不行了,今天一天折腾了这一个问题,像dedecms这种需要先访问页面,然后就会有cookies标识了,和浏览器的操作是同步的就没有问题了。最后用requests库自己写了一个模拟dedecms登陆的小程序,源码如下:

#!/usr/bin/python
#coding:utf8
import requests
login_url = "http://021soft.net/login/login.php"
header = {?? ?"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
"Referer"?? ?:"http://021soft.net/md5/login.php"
}
postdata = {
'userid' : 'test',
'pwd'??? : 'test',
'dopost' : 'login'
}
s = requests.session()#带着sessionid访问,保存登陆状态
loadcookies = s.get(login_url,headers = header) #理解为要先打开网页才能提交表单,先给cookies赋值
post_html = s.post(login_url,data = postdata,headers = header)
print post_html.content
#http://021soft.net/md5/content_list.php?channelid=1
get_html = s.get('http://021soft.net/md5/content_list.php?channelid=1',headers = header)
print get_html.content

标红的为解决问题的部分,过程中把dede的登陆模块都去掉了,php打印数据等等,终于找出问题所在了。下面是利用浏览器登陆后取得cookies中的sessionid登陆访问测试代码:

# coding:utf8
import urllib2,cookielib
import re

cj = cookielib.LWPCookieJar()
cookie_support = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
login_url='http://021soft.net/md5/index.php'
headers = {'cookie':"PHPSESSID=4c1a5105cdc543d6dba394c39932cf59;"}
html=urllib2.urlopen(urllib2.Request(url=login_url,headers=headers)).read()
print html

dedecms经过抓包研究,只需要提交三个字段就好了dopost、userid、pwd其他的隐藏域可以不提交,抓包挨个去掉测试,是否影响登陆。

发表评论

电子邮件地址不会被公开。 必填项已用*标注