如何利用Python模擬GitHub登錄詳解
前言
最近學(xué)習(xí)了Fiddler抓包工具的簡(jiǎn)單使用,通過抓包,我們可以抓取到HTTP請(qǐng)求,并對(duì)其進(jìn)行分析?,F(xiàn)在我準(zhǔn)備嘗試著結(jié)合Python來(lái)模擬GitHub登錄。
Fiddler抓包分析
首先,我們想要模擬一個(gè)網(wǎng)站的登錄,我們必須要簡(jiǎn)單了解其大致過程。
在這里,我通過Fiddler來(lái)抓取GitHub登錄的請(qǐng)求,從網(wǎng)頁(yè)上登錄的URL為:https://github.com/login ,抓包結(jié)果如下:
左邊的是會(huì)話列表,右邊的是請(qǐng)求和響應(yīng)的數(shù)據(jù)。一般情況下,登錄都是用POST請(qǐng)求,因?yàn)槲以谧筮叺臅?huì)話列表中設(shè)置了顯示RequestMethod一列,因此能夠很方便的找到POST請(qǐng)求。當(dāng)然,F(xiàn)iddler默認(rèn)不顯示RequestMethod,如果沒有設(shè)置,還可以通過命令“=post”來(lái)快速過濾POST請(qǐng)求。
在GitHub登錄時(shí),我們通過抓包發(fā)現(xiàn),GitHub登錄的URL雖然時(shí)https://github.com/login,但發(fā)生了302重定向,其真正提交POST表單數(shù)據(jù)的URL是 https://github.com/session ,當(dāng)?shù)卿洺晒r(shí),則會(huì)跳轉(zhuǎn)到 https://github.com/ 首頁(yè)。
打開WebForm,我們可以看到POST表單數(shù)據(jù)提交的值,可以發(fā)現(xiàn),只有authenticity_token、login、password三個(gè)字段是會(huì)變化的,其余的每次登錄都是固定的值。而login、password分別是我們登錄的用戶和密碼,因此我們只需要分析出 authenticity_token 從何而來(lái),便可以實(shí)現(xiàn)模擬登錄了。
至于如何確定 authenticity_token 從哪個(gè)頁(yè)面返回的,我們直接在響應(yīng)數(shù)據(jù)中搜索就行了,或者把數(shù)據(jù)復(fù)制出來(lái)再進(jìn)行搜索。最后我們會(huì)發(fā)現(xiàn),authenticity_token 是在 https://github.com/login 這個(gè)請(qǐng)求中返回的,只不過用 hidden 隱藏起來(lái)了。
好了,到目前大致流程我們已經(jīng)梳理清楚了,接下來(lái)我們便通過Python來(lái)實(shí)現(xiàn)模擬GitHub登錄。
代碼實(shí)現(xiàn)
本人環(huán)境:PyCharm 2018.2.4、Python3.7.0
1. 設(shè)置請(qǐng)求頭和Session
# 設(shè)置Session self.s = requests.session() # 設(shè)置請(qǐng)求頭 self.headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:44.0) Gecko/20100101 Firefox/44.0" } # 在使用Fiddler時(shí)進(jìn)行請(qǐng)求,通過該代碼忽略SSLError錯(cuò)誤 self.s.verify = False
在這里,我們?cè)O(shè)置了Session會(huì)話對(duì)象,Session相當(dāng)于1個(gè)微型瀏覽器,能夠自動(dòng)幫我們保持請(qǐng)求中的某些參數(shù)(如cookies),有了它,我們一般不需要額外去處理cookies、header等。
假如我們是在Fiddler打開的狀態(tài)下,通過代碼進(jìn)行請(qǐng)求,那么將會(huì)遇到SSLError的錯(cuò)誤,而當(dāng)加上 self.s.verify = False 這行代碼后,我們便可以忽略該錯(cuò)誤。
requests.exceptions.SSLError: HTTPSConnectionPool(host='github.com', port=443): Max retries exceeded with url: /login (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1045)')))
注意:
我們通過上面的代碼忽略了SSLError的錯(cuò)誤后,再次運(yùn)行,這時(shí)仍然會(huì)出現(xiàn)2行警告,這2個(gè)警告并不影響我們的登錄,可以不管它。
D:\Python\installation\lib\site-packages\urllib3\connectionpool.py:847: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning) D:\Python\installation\lib\site-packages\urllib3\connectionpool.py:847: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning)
如果我們想去掉這2行警告,也可以通過如下代碼來(lái)解決(針對(duì)Python3):
import urllib3 urllib3.disable_warnings()
2. 獲取authenticity_token
login_url = "https://github.com/login" r = self.s.get(login_url, headers = self.headers) authenticity_token = re.findall('<input type="hidden" name="authenticity_token" value="(.+?)" />', r.text) print("authenticity_token:{}".format(authenticity_token)) return authenticity_token[1]
當(dāng)我們?cè)L問 https://github.com/login 時(shí),登錄界面會(huì)生成隱藏參數(shù)authenticity_token,而這恰是我們?cè)诘卿浱峤槐韱螘r(shí)需要用到的參數(shù)。我們可通過正則表達(dá)式 re.findall 來(lái)獲取authenticity_token。另外,我們還會(huì)發(fā)現(xiàn),HTML界面中存在2個(gè)authenticity_token,因此通過正則返回的是一個(gè)長(zhǎng)度為2的列表,經(jīng)過分析,GitHub在登錄時(shí)用到的是列表中的第二個(gè)元素,即authenticity_token[1]。
3. 模擬登錄
def github_login(self, authenticity_token, username, password): session_url = "https://github.com/session" body = { "authenticity_token":authenticity_token, "commit":"Sign in", "login":username, "password":password, "utf8":"✓", "webauthn-support":"unknown" } r = self.s.post(session_url, headers = self.headers, data = body) title = re.findall('<title>(.+?)</title>',r.text) print("title:%s" %title[0]) return title[0]
我們?cè)谏厦娴玫絘uthenticity_token后,便可以來(lái)實(shí)現(xiàn)登錄了。通過POST請(qǐng)求提交表單后,我們需要判斷是否登錄成功。在這里,我是通過頁(yè)面的標(biāo)題來(lái)判斷GitHub是否登錄成功,當(dāng)然,還有許多方法可以用于判斷。
4. 通過 title 判斷是否登錄成功
def is_login_success(self, title): if "GitHub" == title: return True else: return False
GitHub登錄成功后,界面的標(biāo)題會(huì)顯示"GitHub",而登錄失敗時(shí),一般顯示的標(biāo)題則是"Sign in to GitHub · GitHub"。
OK,以上就是通過Python模擬GitHub登錄的過程,難度不大,相信大多數(shù)人閱讀后都應(yīng)該可以進(jìn)行實(shí)踐。
附源碼:
import requests import re import urllib3 urllib3.disable_warnings() class Github_Login(): def __init__(self): # 設(shè)置Session self.s = requests.session() # 設(shè)置請(qǐng)求頭 self.headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:44.0) Gecko/20100101 Firefox/44.0" } # 在使用Fiddler時(shí)進(jìn)行請(qǐng)求,通過該代碼忽略SSLError錯(cuò)誤 self.s.verify = False # 獲取 authenticity_token def get_authenticity_token(self): login_url = "https://github.com/login" r = self.s.get(login_url, headers = self.headers) authenticity_token = re.findall('<input type="hidden" name="authenticity_token" value="(.+?)" />', r.text) print("authenticity_token:{}".format(authenticity_token)) return authenticity_token[1] # 模擬登錄,并返回 title def github_login(self, authenticity_token, username, password): session_url = "https://github.com/session" body = { "authenticity_token":authenticity_token, "commit":"Sign in", "login":username, "password":password, "utf8":"✓", "webauthn-support":"unknown" } r = self.s.post(session_url, headers = self.headers, data = body) title = re.findall('<title>(.+?)</title>',r.text) print("title:%s" %title[0]) return title[0] # 通過 title 判斷是否登錄成功 def is_login_success(self, title): if "GitHub" == title: return True else: return False if __name__ == '__main__': github = Github_Login() authenticity_token = github.get_authenticity_token() title = github.github_login(authenticity_token, username = "用戶名", password = "密碼") login_result = github.is_login_success(title) print(login_result)
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
- python 模擬登陸github的示例
- Python基于Webhook實(shí)現(xiàn)github自動(dòng)化部署
- GitHub上值得推薦的8個(gè)python 項(xiàng)目
- Python 通過爬蟲實(shí)現(xiàn)GitHub網(wǎng)頁(yè)的模擬登錄的示例代碼
- Python3以GitHub為例來(lái)實(shí)現(xiàn)模擬登錄和爬取的實(shí)例講解
- python requests模擬登陸github的實(shí)現(xiàn)方法
- 使用Python快樂學(xué)數(shù)學(xué)Github萬(wàn)星神器Manim簡(jiǎn)介
- 使用GitHub和Python實(shí)現(xiàn)持續(xù)部署的方法
- GitHub 熱門:Python 算法大全,Star 超過 2 萬(wàn)
- 使用 Python 玩轉(zhuǎn) GitHub 的貢獻(xiàn)板(推薦)
- Python爬蟲使用腳本登錄Github并查看信息
- Python基于identicon庫(kù)創(chuàng)建類似Github上用的頭像功能
- python使用心得之獲得github代碼庫(kù)列表
- 如何用 Python 制作 GitHub 消息助手
相關(guān)文章
PyTorch 中的傅里葉卷積實(shí)現(xiàn)示例
這篇文章主要介紹了PyTorch 中的傅里葉卷積實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Python腳本實(shí)現(xiàn)隨機(jī)數(shù)據(jù)生成自由詳解
這篇文章主要為大家詳細(xì)介紹了Python如何通過腳本實(shí)現(xiàn)隨機(jī)數(shù)據(jù)生成自由,文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧2023-12-12python+django+sql學(xué)生信息管理后臺(tái)開發(fā)
這篇文章主要為大家詳細(xì)介紹了python+django+sql學(xué)生信息管理后臺(tái)開發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Python實(shí)現(xiàn)快速提取PDF文檔中的圖片
提取PDF文檔中的圖片是一項(xiàng)常見的任務(wù),本文將介紹如何使用PyPDF2和pdfminer.six這兩個(gè)庫(kù)來(lái)提取PDF文檔中的圖片,感興趣的可以了解一下2023-06-06python+matplotlib實(shí)現(xiàn)鼠標(biāo)移動(dòng)三角形高亮及索引顯示
這篇文章主要介紹了Python+matplotlib實(shí)現(xiàn)鼠標(biāo)移動(dòng)三角形高亮及索引顯示,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Python 面向?qū)ο蟛糠种R(shí)點(diǎn)小結(jié)
這篇文章主要介紹了Python 面向?qū)ο蟛糠种R(shí)點(diǎn),總結(jié)分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中類、對(duì)象、實(shí)例等相關(guān)概念、原理與使用技巧,需要的朋友可以參考下2020-03-03