模拟登陆GitHub时只需要在登陆界面获取一个参数authenticity_token即可,其他参数都是固定的,如下图:
这个参数在登陆界面的Elements,Ctrl+f 进入查找就可获取位置,然后用xpath获取即可
代码如下:
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()
运行:
如果登陆成功,那么我们点击链接会直接跳到我们的主页
成功。
注意一下,如果之前已经登陆过,一定要清空cookies,不然登陆失败点击链接也会跳到主页。
————————————————————————分割线————————————————————————————
做完这个之后,我尝试做了一下登陆CSDN的代码,很遗憾,失败了,好像是最近csdn改了加密参数,因为我百度的时候,最新的是五月一号还有人做模拟登陆,如果不是直接抄袭,那就是最近改了加密参数,先分析一下
https://www.cnblogs.com/woainifanfan/p/5754580.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去登陆(我的能力范围内),希望有大佬可以找到这些加密参数,或者可能是我找错网页了?传授并指正一下。