python 脚本登录百度空间

最近半年的时间,百度空间进行了多次变更,自从去年的wordpress百度空间博文同步插件不可用之后,就一直没有维护更新,最近百度空间基本稳定了,通过抓包对比分析,发现和以前的登录过程很不一样,先利用python脚本进行登录过程的模拟,然后再利用php实现,来维护更新同步插件。

大体的登录原理如下:

1. 首先获取登录的cookie文件,没有cookie的话,百度空间不能正常登录,访问如下网址获取cookie

https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=false

2. 获取登录过程的token,同样再次请求上面的网址,但是这一次需要携带第1步中server返回的cookie信息

https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=false

3. 发送登录账号信息(用户名,密码等)到如下网址,同样需要携带步骤2中server返回的cookie信息

http://passport.baidu.com/v2/api/?login

4. 至此,登录过程完毕

代码示例:

下面的示例代码会登录百度空间,然后把所有的博文自动备份到本地,其中登录的过程就如上面的原理所讲。

#!/usr/bin/python#coding:utf8import cookielib, urllib2, urllibimport os,sys,socket,re#解析有多少页博客pageStr = """var PagerInfo = {\s*allCount\s*:\s*'(\d+)',\s*pageSize\s*:\s*'(\d+)',\s*curPage\s*:\s*'\d+'\s*};"""pageObj = re.compile(pageStr, re.DOTALL)#获取登陆tokenlogin_tokenStr = '''bdPass.api.params.login_token='(.*?)';'''login_tokenObj = re.compile(login_tokenStr,re.DOTALL)#获取博客标题和urlblogStr = r'''.*?(.*?)'''blogObj = re.compile(blogStr,re.DOTALL)class Baidu(object):????def __init__(self,user = '', psw = '', blog = ''):????????self.user = user????????self.psw??= psw????????self.blog = blog????????if not user or not psw or not blog:????????????print "Plz enter enter 3 params:user,psw,blog"????????????sys.exit(0)????????if not os.path.exists(self.user):????????????os.mkdir(self.user)????????self.cookiename = 'baidu%s.coockie' % (self.user)????????self.token = ''????????self.allCount??= 0????????self.pageSize??= 10????????self.totalpage = 0????????self.logined = False????????self.cj = cookielib.LWPCookieJar()????????try:????????????self.cj.revert(self.cookiename)????????????self.logined = True????????????print "OK"????????except Exception, e:????????????print e????????self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))????????self.opener.addheaders = [('User-agent','Opera/9.23')]????????urllib2.install_opener(self.opener)????????socket.setdefaulttimeout(30)????#登陆百度????def login(self):????????#如果没有获取到cookie,就模拟登陆????????if not self.logined:????????????print "logon to baidu ..."????????????#第一次先访问一下,目的是为了先保存一个cookie下来????????????qurl = '''https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=false'''????????????r = self.opener.open(qurl)????????????self.cj.save(self.cookiename)????????????#第二次访问,目的是为了获取token????????????qurl = '''https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=false'''????????????r = self.opener.open(qurl)????????????rsp = r.read()????????????#print rsp????????????self.cj.save(self.cookiename)????????????#通过正则表达式获取token????????????matched_objs = login_tokenObj.findall(rsp)????????????if matched_objs:????????????????self.token = matched_objs[0]????????????????print 'token =', self.token????????????????#然后用token模拟登陆????????????????post_data = urllib.urlencode({'username':self.user,??????????????????????????????????????????????'password':self.psw,??????????????????????????????????????????????'token':self.token,??????????????????????????????????????????????'charset':'UTF-8',??????????????????????????????????????????????'callback':'parent.bd12Pass.api.login._postCallback',??????????????????????????????????????????????'index':'0',??????????????????????????????????????????????'isPhone':'false',??????????????????????????????????????????????'mem_pass':'on',??????????????????????????????????????????????'loginType':'1',??????????????????????????????????????????????'safeflg':'0',??????????????????????????????????????????????'staticpage':'https://passport.baidu.com/v2Jump.html',??????????????????????????????????????????????'tpl':'mn',??????????????????????????????????????????????'u':'http://www.baidu.com/',??????????????????????????????????????????????'verifycode':'',????????????????????????????????????????????})????????????????#path = 'http://passport.baidu.com/?login'????????????????path = 'http://passport.baidu.com/v2/api/?login'????????????????self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))????????????????self.opener.addheaders = [('User-agent','Opera/9.23')]????????????????urllib2.install_opener(self.opener)????????????????headers = {??????????????????"Accept": "image/gif, */*",??????????????????"Referer": "https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F",??????????????????"Accept-Language": "zh-cn",??????????????????"Content-Type": "application/x-www-form-urlencoded",??????????????????"Accept-Encoding": "gzip, deflate",??????????????????"User-Agent": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)",??????????????????"Host": "passport.baidu.com",??????????????????"Connection": "Keep-Alive",??????????????????"Cache-Control": "no-cache"????????????????}????????????????req = urllib2.Request(path,????????????????????????????????post_data,????????????????????????????????headers=headers,????????????????????????????????)????????????????rsp = self.opener.open(req).read()????????????????#print rsp????????????????self.cj.save(self.cookiename)????????????????#for login test????????????????#qurl = '''http://hi.baidu.com/pub/show/createtext'''????????????????#rsp = self.opener.open(qurl).read()????????????????#file_object = open('login.txt', 'w')????????????????#file_object.write(rsp)????????????????#file_object.close()????????????else:????????????????print "Login Fail"????????????????sys.exit(0)????#获取博客一共有多少页,如果有私有博文的话,登陆和不登陆获取的是不一样的????def getTotalPage(self):????????#获取博客的总页数????????req2 = urllib2.Request(self.blog)????????rsp = urllib2.urlopen(req2).read()????????if rsp:????????????rsp = rsp.replace('\r','').replace('\n','').replace('\t','')????????????matched_objs = pageObj.findall(rsp)????????????if matched_objs:????????????????obj0,obj1 = matched_objs[0]????????????????self.allCount = int(obj0)????????????????self.pageSize = int(obj1)????????????????self.totalpage = (self.allCount / self.pageSize) + 1????????????????print 'allCount:%d, pageSize:%d, totalpage:%d' % (self.allCount,self.pageSize,self.totalpage)????#获取每一页里的博客链接????def fetchPage(self,url):????????req = urllib2.Request(url)????????rsp = urllib2.urlopen(req).read()????????if rsp:????????????rsp = rsp.replace('\r','').replace('\n','').replace('\t','')????????????matched_objs = blogObj.findall(rsp)????????????if matched_objs:????????????????for obj in matched_objs:????????????????????#这里可以用多线程改写一下,单线程太慢????????????????????self.download(obj[0],obj[1])????def downloadBywinget(self,url,title):????????#比如使用wget之类的第三方工具,自己填参数写????????pass????#下载博客????def download(self,url,title):????????path = '%s/%s.html' % (self.user,title.decode('utf-8'))????????url = 'http://hi.baidu.com%s' % (url)????????print "Download url %s" % (url)????????nFail = 0????????while nFail < 5:????????????try:????????????????sock = urllib.urlopen(url)????????????????htmlSource = sock.read()????????????????myfile = file(path,'w')????????????????myfile.write(htmlSource)????????????????myfile.close()????????????????sock.close()????????????????return????????????except:????????????????nFail += 1????????print ('download blog fail:%s' % (url))????def dlownloadall(self):????????for page in range(1,self.totalpage+1):????????????url = "%s?page=%d" % (self.blog,page)????????????#这里可以用多线程改写一下,单线程太慢????????????self.fetchPage(url)def main():????user = 'runsheng2005'???????#你的百度登录名????psw??= 'password'??#你的百度登陆密码,不输入用户名和密码,得不到私有的文章????blog = "http://hi.baidu.com/zhourunsheng" #你自己的百度博客链接????baidu = Baidu(user,psw,blog)????baidu.login()????baidu.getTotalPage()????baidu.dlownloadall()if __name__ == '__main__':????main()

例如,我的用户名是runsheng2005,则会在工作目录建立一个名为baidurunsheng2005.coockie的文件用来保存cookie信息,

其中的内容如下:

#LWP-Cookies-2.0Set-Cookie3: BAIDUID="25B820FB17B13E5F4F7C9836FB465C96:FG=1"; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2043-05-07 14:28:07Z"; version=0Set-Cookie3: BDUSS=mJjbjFrZmp3WXNNbUhIQUxkWDJIMjFaR2dSZjdLaHdwcnhhRDBRLVNxcjQxcmxSQVFBQUFBJCQAAAAAAAAAAAEAAABv9HAAcnVuc2hlbmcyMDA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPhJklH4SZJRW; path="/"; domain=".baidu.com"; path_spec; expires="2021-07-31 14:28:08Z"; version=0Set-Cookie3: HOSUPPORT=1; path="/"; domain=".passport.baidu.com"; path_spec; expires="2021-07-31 14:28:07Z"; httponly=None; version=0Set-Cookie3: PTOKEN=2bb1ab99373dbeeeec6b69af75e6a4c6; path="/"; domain=".passport.baidu.com"; path_spec; expires="2021-07-31 14:28:08Z"; version=0Set-Cookie3: SAVEUSERID=a00277ba04dba8956259a5c4dfec4d40; path="/"; domain=".passport.baidu.com"; path_spec; expires="2021-07-31 14:28:08Z"; version=0Set-Cookie3: STOKEN=1f4790267126b2e7dddb1f735f29074f; path="/"; domain=".passport.baidu.com"; path_spec; expires="2021-07-31 14:28:08Z"; version=0

在名为runsheng2005的子目录下面,会下载所有的博文例如 打造个人的云端笔记本(CareyDiary).html等等

The post python 脚本登录百度空间 appeared first on 润物无声.

从一开始就提醒自己,世上没有后悔药吃。

python 脚本登录百度空间

相关文章:

你感兴趣的文章:

标签云: