成功模拟登录GitHub以及关于登录CSDN的问题

模拟登录GitHub时只须要在登录界面获取一个参数authenticity_token便可,其余参数都是固定的,以下图:html

这个参数在登录界面的Elements,Ctrl+f 进入查找就可获取位置,而后用xpath获取便可python

代码以下:git

import requests
from lxml import etree

class Logon(object):
    def __init__(self):
        self.herders = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
                          ' Chrome/74.0.3729.169 Safari/537.36',
            'Referer': 'https://github.com/',
            'Host':'github.com'
        }
        #登录界面,用于获取参数和cookies信息
        self.logon_url = 'https://github.com/login'
        #传参连接,用于传递密码等参数登录
        self.post_url = 'https://github.com/session'
        #获取cookie以维持会话
        self.session = requests.Session()

    #用于获取参数authenticity_token
    def token(self):
        resp = self.session.get(url=self.logon_url,headers=self.herders)
        text = etree.HTML(resp.text)
        token = text.xpath("//div[@id='login']//input[2]/@value")[0]
        print(token)
        return token

    def login(self):
        data = {
            'commit':'Sign in',
            'utf8':'✓',
            'authenticity_token':self.token(),
            'login':'543091881@qq.com',
            'password':'我是密码',
            'webauthn-support':'supported'
        }
        resp = self.session.post(url=self.post_url,data=data,headers=self.herders)
        if resp.status_code == 200:
            print("登录成功")
            print(resp.url)


if __name__ == '__main__':
    login = Logon()
    login.login()

运行:github

 若是登录成功,那么咱们点击连接会直接跳到咱们的主页web

成功。chrome

注意一下,若是以前已经登录过,必定要清空cookies,否则登录失败点击连接也会跳到主页。 cookie

————————————————————————分割线————————————————————————————session

作完这个以后,我尝试作了一下登录CSDN的代码,很遗憾,失败了,好像是最近csdn改了加密参数,由于我百度的时候,最新的是五月一号还有人作模拟登录,若是不是直接抄袭,那就是最近改了加密参数,先分析一下post

http://www.javashuo.com/article/p-gzdcttgp-kd.html加密

上面连接是之前模拟登录csdn的代码及分析,能够很清晰的看见须要的参数和github同样能够在Elements里面找到

那么,如今的呢

咱们能够看见这个doLogin就是登录传参的连接

那么,它须要什么参数呢

很遗憾,除了密码,帐号,登录类型,其余都是加密参数,并且在登陆页Elements没法获取这些信息,不信的话能够ctrl+f查找一下,是查不到的。

若是不用这些加密参数能够登录吗?我试了一下:

import requests

class Login(object):
    def __init__(self):
        self.herders = {
            'user-agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
                           ' Chrome/74.0.3729.169 Safari/537.36',
            'referer' : 'https://www.csdn.ne',
        }
        #登陆页面
        self.login_url = 'https://passport.csdn.net/login?code=public'
        #传递参数页面
        self.post_url = 'https://passport.csdn.net/v1/register/pc/login/doLogin'
        #我的主页
        # self.profile_url = 'https://blog.csdn.net/s_kangkang_A'
        #自动处理session处理会话
        self.session = requests.Session()

    def login(self):
        #访问登陆页获取cookies信息维持会话
        resp = self.session.get(self.login_url,headers=self.herders)
        if resp.status_code == 200:
            print("我到了登录页面")
        else:
            print("到达登陆页面失败")
        #构造参数
        data = {
            'loginType' : '1',
            'pwdOrVerifyCode' : '我是密码',
            'userIdentification' : '我是帐号'
        }
        #登录
        response = self.session.post(self.post_url,data=data,headers=self.herders)
        if response.status_code == 200:
            print("Login successfully")

         #访问我的主页
        # response = self.session.get(self.profile_url,headers=self.herders)
        # if response.status_code == 200:
        #     print("Access to success")

if __name__ == '__main__':
    login = Login()
    login.login()

并不行,直接失败。因此目前只能用selenium+chromedriver去登录(个人能力范围内),但愿有大佬能够找到这些加密参数,或者多是我找错网页了?传授并指正一下。