因为使用到了requests库,所以需要先安装,直接使用pip安装
进入python安装目录\Scripts,执行 pip install requests(需要python版本支持)
安装完成后就可以开始分析CSDN的登入流程了
1.首先使用chrome退出CSDN,然后选择登入,F12打开开发者工具,选择Network,勾选Preserve log选项
https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn
如下(如果有之前遗留的信息,就点击红点旁的那个斜杠圈就行)
2.输入账号密码,点击登入,在左边选择最上面的一个,点击查看,就可以看到右边的详细信息,比较重要的几个就是
headers信息
Host:passport.csdn.net
Referer:https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36
和
Form data参数
3.从上图中的form data参数中,我们可知,在登入CSDN时,将会向后台发送5个参数(当然如果你勾选了自动登入的话还会多一个rememberMe参数)
前2个用户名密码没啥好说的,后面3个其实是登入页面上的隐藏参数,在登入页面右键,查看源代码,搜索一下就可以发下如下语段,所以在模拟登入时,从登入页面中直接获取即可
<!-- 该参数可以理解成每个需要登录的用户都有一个流水号。只有有了webflow发放的有效的流水号,用户才可以说明是已经进入了webflow流程。否则,没有流水号的情况下,webflow会认为用户还没有进入webflow流程,从而会重新进入一次webflow流程,从而会重新出现登录界面。 -->
<input type="hidden" name="lt" value="LT-346446-4wYz1t1bpBo9dTQKHXccfCmeJbDVbJ" />
<input type="hidden" name="execution" value="e32s1" />
<input type="hidden" name="_eventId" value="submit" />
<input class="logging" accesskey="l" value="登 录" tabindex="6" type="button" />
4.现在所需的东西基本都获取了,即可以开始着手代码的编写了,python 3.63。说明都放在注释中了,如果想要在第二次登录时自动登入,就将rememberMe处的注释去掉,这样经过第一次登入后,之后的登入都会自动登入。
# -*- coding: utf-8 -*-
import requests
try:
import cookielib
except:
import http.cookiejar as cookielib
import re
import time
import os.path
# 构造 Request headers ,就是刚才获取的headers 信息
agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36'
headers = {
"Host": "passport.csdn.net",
"Referer": "https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn",
'User-Agent': agent
}
# 使用登录cookie信息,这里如果存在cookie信息,则会直接读取已有cookie,之后就能直接自动登入了
session = requests.session()
session.cookies = cookielib.LWPCookieJar(filename='cookies')
try:
session.cookies.load(ignore_discard=True)
print("Cookie 加载")
except:
print("Cookie 未能加载")
index_url = 'https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn'
index_page = session.get(index_url, headers=headers)
html = index_page.text
def getlt():
# 获取登录时需要用到的lt
pattern = r'name="lt" value="(.*?)"'
# 这里的lt 返回的是一个list
lt = re.findall(pattern, html)
print(lt[0])
return lt[0]
def getExecution():
# 获取登录时需要用到的Execution
pattern = r'name="execution" value="(.*?)"'
# 这里的execution 返回的是一个list
execution = re.findall(pattern, html)
print(execution[0])
return execution[0]
def get_eventId():
# 获取登录时需要用到的_eventId
pattern = r'name="_eventId" value="(.*?)"'
# 这里的_eventId 返回的是一个list
_eventId = re.findall(pattern, html)
print(_eventId[0])
return _eventId[0]
#登入
def login(secret, account):
post_url = 'https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn'
postdata = {
'lt': getlt(),
'execution': getExecution(),
'_eventId': get_eventId(),
'password': account,
'username': secret
#'rememberMe': 'true'
}
print(postdata)
# 直接登录
login_page = session.post(post_url, data=postdata, headers=headers)
print(login_page.text)
#login_code = login_page
#print(session.get('http://msg.csdn.net/').text)
# 保存 cookies 到文件,
# 下次可以使用 cookie 直接登录,不需要输入账号和密码
session.cookies.save()
def isLogin():
# 通过查看个人信息来判断是否已经登录
url = "http://msg.csdn.net/"
login_code = session.get(url, headers=headers, allow_redirects=False).status_code
print(login_code)
if login_code == 200:
return True
else:
return False
if __name__ == '__main__':
if isLogin():
print('已登入')
else:
login('账号','密码')