首页 > 技术文章 > 模拟登陆百度首页完整版

june2014 2014-03-23 17:59 原文

import re
import cookielib
import urllib
import urllib2
import optparse

def checkAllCookiesExist(cookieNameList,cookieJar):
    cookiesDict={}
    for eachCookieName in cookieNameList:
        cookiesDict[eachCookieName]=False

    allCookieFound=True
    for cookie in cookieJar:
        if(cookie.name in cookiesDict):
            cookiesDict[cookie.name]=True

    for eachCookie in cookiesDict.keys():
        if(not cookiesDict[eachCookie]):
            allCookieFound=False
            break
    return allCookieFound

def printDelimiter():
    print '-'*80

def emulateLoginBaidu():
    print 'Function: Used to demostrate how to use Python code to emulate login baidu main page: http://www.baidu.com/'
    print 'Usage: emulate_login_baidu_python.py -u yourBaiduUsername -p yourBaiduPassword'
    printDelimiter()

parser=optparse.OptionParser()
parser.add_option('-u','--username',action='store',type='string',default='',dest='username',help='Your Baidu Username')
parser.add_option('-p','--password',action='store',type='string',default='',dest='username',help='Your Baidu Password')
(options,args)=parser.parse_args()
for i in dir(options):
    exec(i+'=options.'+i)

printDelimiter()
print '[preparation] using cookiejar & HTTPCookieProcessor to antomatically handle cookies'
cj=cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)

printDelimiter()
print '[step1] to get cookie BAIDUID'
baiduMainUrl='http://www.baidu.com'
resp=urllib2.urlopen(baiduMainUrl)
for index,cookie in enumerate(cj):
    print '[',index,']',cookie

printDelimiter()
print '[step2] to get token value'
getapiUrl='https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true'
getapiResp=urllib2.urlopen(getapiUrl)
getapiRespHtml=getapiResp.read()
foundTokenVal=re.search("bdPass\.api\.params\.login_token='(?P<tokenVal>\w+)';",getapiRespHtml)
if(foundTokenVal):
    tokenVal=foundTokenVal.group('tokenVal')
    print 'tokenVal',tokenVal

    printDelimiter()
    print '[step3] emulate login baidu'
    staticpage='http://www.baidu.com/cache/user/html/jump.html'
    baiduMainLoginUrl='http://passport.baidu.com/v2/api/?login'
    postDict={
        'charset':'utf-8',
        'token':tokenVal,
        'isPhone':'false',
        'index':'0',
        'staticpage':staticpage,
        'loginType':'1',
        'tpl':'mn',
        'callback':'parent.bdPass.api.login._postCallback',
        'username':'332541940@qq.com',
        'password':'jing3701139',
        'mem_pass':'on',
        }
    postData=urllib.urlencode(postDict)
    req=urllib2.Request(baiduMainLoginUrl,postData)
    req.add_header('Content-Type','application/x-www-form-urlencoded')
    resq=urllib2.urlopen(req)
    cookiesToCheck=['BDUSS','PTOKEN','STOKEN','SAVEUSERID']
    loginBaiduOK=checkAllCookiesExist(cookiesToCheck,cj)
    if(loginBaiduOK):
        print '+++ Emulate login baidu is OK'
    else:
        print '--- Failed to emulate login baidu'
else:
    print 'Fail to extract token value from html=',getapiRespHtml

if __name__=='__main__':
    emulateLoginBaidu()

   

 

推荐阅读