亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

如何利用Python模擬GitHub登錄詳解

系統(tǒng) 1946 0

前言

最近學(xué)習(xí)了Fiddler抓包工具的簡(jiǎn)單使用,通過(guò)抓包,我們可以抓取到HTTP請(qǐng)求,并對(duì)其進(jìn)行分析。現(xiàn)在我準(zhǔn)備嘗試著結(jié)合Python來(lái)模擬GitHub登錄。

Fiddler抓包分析

首先,我們想要模擬一個(gè)網(wǎng)站的登錄,我們必須要簡(jiǎn)單了解其大致過(guò)程。
在這里,我通過(guò)Fiddler來(lái)抓取GitHub登錄的請(qǐng)求,從網(wǎng)頁(yè)上登錄的URL為:https://github.com/login ,抓包結(jié)果如下:

如何利用Python模擬GitHub登錄詳解_第1張圖片

左邊的是會(huì)話(huà)列表,右邊的是請(qǐng)求和響應(yīng)的數(shù)據(jù)。一般情況下,登錄都是用POST請(qǐng)求,因?yàn)槲以谧筮叺臅?huì)話(huà)列表中設(shè)置了顯示RequestMethod一列,因此能夠很方便的找到POST請(qǐng)求。當(dāng)然,F(xiàn)iddler默認(rèn)不顯示RequestMethod,如果沒(méi)有設(shè)置,還可以通過(guò)命令“=post”來(lái)快速過(guò)濾POST請(qǐng)求。

如何利用Python模擬GitHub登錄詳解_第2張圖片

在GitHub登錄時(shí),我們通過(guò)抓包發(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è)。

打開(kāi)WebForm,我們可以看到POST表單數(shù)據(jù)提交的值,可以發(fā)現(xiàn),只有authenticity_token、login、password三個(gè)字段是會(huì)變化的,其余的每次登錄都是固定的值。而login、password分別是我們登錄的用戶(hù)和密碼,因此我們只需要分析出 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)求中返回的,只不過(guò)用 hidden 隱藏起來(lái)了。

如何利用Python模擬GitHub登錄詳解_第3張圖片

好了,到目前大致流程我們已經(jīng)梳理清楚了,接下來(lái)我們便通過(guò)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)求,通過(guò)該代碼忽略SSLError錯(cuò)誤
    self.s.verify = False
          

在這里,我們?cè)O(shè)置了Session會(huì)話(huà)對(duì)象,Session相當(dāng)于1個(gè)微型瀏覽器,能夠自動(dòng)幫我們保持請(qǐng)求中的某些參數(shù)(如cookies),有了它,我們一般不需要額外去處理cookies、header等。
假如我們是在Fiddler打開(kāi)的狀態(tài)下,通過(guò)代碼進(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)')))
          

注意:

我們通過(guò)上面的代碼忽略了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行警告,也可以通過(guò)如下代碼來(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('
            
            ', r.text)
    print("authenticity_token:{}".format(authenticity_token))
    return authenticity_token[1]
          

當(dāng)我們?cè)L問(wèn) https://github.com/login 時(shí),登錄界面會(huì)生成隱藏參數(shù)authenticity_token,而這恰是我們?cè)诘卿浱峤槐韱螘r(shí)需要用到的參數(shù)。我們可通過(guò)正則表達(dá)式 re.findall 來(lái)獲取authenticity_token。另外,我們還會(huì)發(fā)現(xiàn),HTML界面中存在2個(gè)authenticity_token,因此通過(guò)正則返回的是一個(gè)長(zhǎng)度為2的列表,經(jīng)過(guò)分析,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('
            ',r.text)
    print("title:%s" %title[0])
    return title[0]
          

我們?cè)谏厦娴玫絘uthenticity_token后,便可以來(lái)實(shí)現(xiàn)登錄了。通過(guò)POST請(qǐng)求提交表單后,我們需要判斷是否登錄成功。在這里,我是通過(guò)頁(yè)面的標(biāo)題來(lái)判斷GitHub是否登錄成功,當(dāng)然,還有許多方法可以用于判斷。

4. 通過(guò) 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,以上就是通過(guò)Python模擬GitHub登錄的過(guò)程,難度不大,相信大多數(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)求,通過(guò)該代碼忽略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('
            
            ', 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('
            ',r.text)
    print("title:%s" %title[0])
    return title[0]

  # 通過(guò) 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 = "用戶(hù)名", password = "密碼")
  login_result = github.is_login_success(title)
  print(login_result)
          

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 看久久| 国产精品亚洲第一区二区三区 | 亚洲日本va中文字幕 | 九九视频在线看精品 | 91视频一区二区 | 成人性a激情免费视频 | 高清欧美色欧美综合网站 | 色综合久久天天综线观看 | 国产欧美日韩精品一区二 | 国产成人综合一区精品 | 欧美视频在线视频 | 日韩精品特黄毛片免费看 | 国产一级视频久久 | 国产日产久久 | 天天草天天 | 欧美日韩国产一区二区三区 | 四虎欧美永久在线精品免费 | 综合欧美一区二区三区 | 成人精品亚洲人成在线 | 国产成人综合久久综合 | 天天搞天天操 | 国产精品1区 | 亚洲精品在线不卡 | 欧美精品综合一区二区三区 | 天天干国产 | 欧美亚洲中日韩中文字幕在线 | 久草在线这里只有精品 | 国产美女a做受大片在线观看 | 四虎网址 | 激情综合色综合啪啪开心 | 国产一区二区亚洲精品天堂 | 综合爱爱 | 久久久青草青青国产亚洲免观 | 99精品影视 | 狠狠狠色丁香婷婷综合久久88 | 国产亚洲精品网站 | 欧美精品一区二区在线观看 | 99热久久只有精品6国产32 | 欧美在线观看第一页 | 天天做天天爰夜夜爽 | 熊出没之重启未来免费观看 |