(4)Python筆記:模擬登入CSDN(requests庫實現)

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

完整代碼
https://github.com/SecondMagic/-1-python-csdn/blob/master/4.requests%20%E5%AE%9E%E7%8E%B0%E6%A8%A1%E6%8B%9F%E7%99%BB%E5%85%A5CSDN/requests.py

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章