requests模拟登录百度


# coding:utf-8
"""
rsa加密算法一窍不通,没有对密码加密而是直接使用的Firefox中已加密的密码
因为用的是登陆时候的加密密码,所以rsakey等都要是登录时的值
"""
import requests
import re,os
from PIL import Image
import cookielib
import rsa,base64


agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0"
headers = {
    "Host":"passport.baidu.com",
    "User-Agent":agent,
    "Referer":"https://www.baidu.com/"
}
session = requests.session()
session.cookies = cookielib.LWPCookieJar(filename='Baidu_cookies')

try:
    session.cookies.load(ignore_discard=True)
except:
    print "cookie未加载!"

def get_token():
    url = "https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true"
    session.get(url, headers=headers)
    html = session.get(url,headers=headers).content
    patt = re.compile(r"login_token='(.*?)';")
    token =re.findall(patt,html)[0]
    return token
def get_codestring(name,password):
    url = "https://passport.baidu.com/v2/api/?login"
    post_data1 = {

        "staticpage": "https://www.baidu.com/cache/user/html/v3Jump.html",
        "charset": "UTF-8",
        "token": get_token(),
        "tpl": "mn",
        "subpro": "",
        "apiver": "v3",
        "tt": "1477293628520",#登录时的tt
        "codestring": "",
        "safeflg": "0",
        "u": "https://www.baidu.com/",
        "isPhone": "false",
        "detect": "1",
        "gid": "F869E08-5340-42BC-B189-058C960376E9",#登录时的gid
        "quick_user": "0",
        "logintype": "dialogLogin",
        "logLoginType": "pc_loginDialog",
        "idc": "",
        "loginmerge": "true",
        "splogin": "rate",
        "username": name,
        "password": password,
        "mem_pass": "on",
        "rsakey": "VlDcAx3iLF0Ktr6AJe1Db76JFJ0kf7RT",#登录时的rsakey
        "crypttype": "12",
        "ppui_logintime": "6055",#登录时的值
        "countrycode": "",
        "callback": "parent.bd__pcbs__je2d8f",#登录时的值
    }
    login_html = session.post(url,data=post_data1,headers=headers)
    verifycode = re.findall(r'codeString=(.*?)&userName',login_html.text)[0]
    #print verifycode
    return verifycode


def get_verifycode(name,password,codestring):
    img_url = "https://passport.baidu.com/cgi-bin/genimage?" + codestring
    r = session.get(img_url,headers=headers).content

    with open('Baidu_captcha.jpg','wb') as f:
        f.write(r)
        f.close()
    try:
        image = Image.open('Baidu_captcha.jpg')
        image.show()
        image.close()
    except:
        print "请到目录%s查看Baidu_captcha.jpg并输入"%os.path.abspath('Baidu_captcha.jpg')
    verifycode = raw_input("请输入验证码:\n> ")
    return verifycode

def islogin():
    url = "http://i.baidu.com/"
    html = session.get(url,headers=headers).text
    #print html
    pattern = re.compile(r'<a class="header-tu-img header-tool-user-nick" href="javascript:;" />(.*?)</a>',re.S)
    item = re.findall(pattern,html)
    for content in item:
        return content.strip()



def login_Baidu(name,password,codestring):
    post_url = "https://passport.baidu.com/v2/api/?login"
    post_data = {
        "staticpage": "https://www.baidu.com/cache/user/html/v3Jump.html",
        "charset": "UTF-8",
        "token": get_token(),
        "tpl": "mn",
        "subpro": "",
        "apiver": "v3",
        "tt": "1476934121419",#登录时的值
        "codestring": codestring,  # 验证码编号,动态
        "safeflg": "0",
        "u": "https://www.baidu.com/",
        "isPhone": "false",
        "detect": "1",
        "gid": "6ABF1D6-2FFE-4D4F-BF10-F2A2153F26F9",#登录时的值
        "quick_user": "0",
        "logintype": "dialogLogin",
        "logLoginType": "pc_loginDialog",
        "idc": "",
        "loginmerge": "true",
        "splogin": "rate",
        "username": name,  # 加密了
        "password": password,  # 加密了
        "verifycode": get_verifycode(name,password,codestring),  # 验证码
        "rsakey": "6rzx1Dkc3e6sNtDbcOlv4DxYQg4O1DG7",#登录时的值
        "crypttype": "12",
        "ppui_logintime": "74490",#登录时的值
        "countrycode": "",
        "callback": "parent.bd__pcbs__brxpoi",#登录时的值

    }
    login_page = session.post(post_url,data=post_data,headers=headers)
    print login_page.status_code
    if islogin():
        print "模拟登录成功!"
    session.cookies.save(ignore_discard=True, ignore_expires=True)

if __name__ == '__main__':
    if islogin():
        print "cookie登录成功!"
    else:
        name = raw_input("请输入账号:>")
        password = raw_input("请输入密码:>")
        codestring = get_codestring(name,password)
        login_Baidu(name,password,codestring)#统一验证码编号,防止获取验证码的编号与post_data中的不一致
        print islogin()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值