因爲使用到了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('賬號','密碼')