最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2019年07月15日 08:55:46   作者:wintest  
這篇文章主要給大家介紹了關(guān)于如何利用Python模擬GitHub登錄的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

最近學習了Fiddler抓包工具的簡單使用,通過抓包,我們可以抓取到HTTP請求,并對其進行分析?,F(xiàn)在我準備嘗試著結(jié)合Python來模擬GitHub登錄。

Fiddler抓包分析

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

左邊的是會話列表,右邊的是請求和響應的數(shù)據(jù)。一般情況下,登錄都是用POST請求,因為我在左邊的會話列表中設(shè)置了顯示RequestMethod一列,因此能夠很方便的找到POST請求。當然,F(xiàn)iddler默認不顯示RequestMethod,如果沒有設(shè)置,還可以通過命令“=post”來快速過濾POST請求。

在GitHub登錄時,我們通過抓包發(fā)現(xiàn),GitHub登錄的URL雖然時https://github.com/login,但發(fā)生了302重定向,其真正提交POST表單數(shù)據(jù)的URL是 https://github.com/session ,當?shù)卿洺晒r,則會跳轉(zhuǎn)到 https://github.com/ 首頁。

打開WebForm,我們可以看到POST表單數(shù)據(jù)提交的值,可以發(fā)現(xiàn),只有authenticity_token、login、password三個字段是會變化的,其余的每次登錄都是固定的值。而login、password分別是我們登錄的用戶和密碼,因此我們只需要分析出 authenticity_token 從何而來,便可以實現(xiàn)模擬登錄了。

至于如何確定 authenticity_token 從哪個頁面返回的,我們直接在響應數(shù)據(jù)中搜索就行了,或者把數(shù)據(jù)復制出來再進行搜索。最后我們會發(fā)現(xiàn),authenticity_token 是在 https://github.com/login 這個請求中返回的,只不過用 hidden 隱藏起來了。

好了,到目前大致流程我們已經(jīng)梳理清楚了,接下來我們便通過Python來實現(xiàn)模擬GitHub登錄。

代碼實現(xiàn)

本人環(huán)境:PyCharm 2018.2.4、Python3.7.0

1. 設(shè)置請求頭和Session

    # 設(shè)置Session
    self.s = requests.session()
    # 設(shè)置請求頭
    self.headers = {
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:44.0) Gecko/20100101 Firefox/44.0"
    }
    # 在使用Fiddler時進行請求,通過該代碼忽略SSLError錯誤
    self.s.verify = False

在這里,我們設(shè)置了Session會話對象,Session相當于1個微型瀏覽器,能夠自動幫我們保持請求中的某些參數(shù)(如cookies),有了它,我們一般不需要額外去處理cookies、header等。
假如我們是在Fiddler打開的狀態(tài)下,通過代碼進行請求,那么將會遇到SSLError的錯誤,而當加上 self.s.verify = False 這行代碼后,我們便可以忽略該錯誤。

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的錯誤后,再次運行,這時仍然會出現(xiàn)2行警告,這2個警告并不影響我們的登錄,可以不管它。

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行警告,也可以通過如下代碼來解決(針對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]

當我們訪問 https://github.com/login 時,登錄界面會生成隱藏參數(shù)authenticity_token,而這恰是我們在登錄提交表單時需要用到的參數(shù)。我們可通過正則表達式 re.findall 來獲取authenticity_token。另外,我們還會發(fā)現(xiàn),HTML界面中存在2個authenticity_token,因此通過正則返回的是一個長度為2的列表,經(jīng)過分析,GitHub在登錄時用到的是列表中的第二個元素,即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]

我們在上面得到authenticity_token后,便可以來實現(xiàn)登錄了。通過POST請求提交表單后,我們需要判斷是否登錄成功。在這里,我是通過頁面的標題來判斷GitHub是否登錄成功,當然,還有許多方法可以用于判斷。

4. 通過 title 判斷是否登錄成功

  def is_login_success(self, title):
    if "GitHub" == title:
      return True
    else:
      return False

GitHub登錄成功后,界面的標題會顯示"GitHub",而登錄失敗時,一般顯示的標題則是"Sign in to GitHub · GitHub"。

OK,以上就是通過Python模擬GitHub登錄的過程,難度不大,相信大多數(shù)人閱讀后都應該可以進行實踐。

附源碼:

import requests
import re
import urllib3
urllib3.disable_warnings()

class Github_Login():

  def __init__(self):
    # 設(shè)置Session
    self.s = requests.session()
    # 設(shè)置請求頭
    self.headers = {
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:44.0) Gecko/20100101 Firefox/44.0"
    }
    # 在使用Fiddler時進行請求,通過該代碼忽略SSLError錯誤
    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é)

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

相關(guān)文章

  • python 爬取華為應用市場評論

    python 爬取華為應用市場評論

    項目需要爬取評論數(shù)據(jù),在此做一個記錄,這里爬取的是web端的數(shù)據(jù),以后可能會考慮爬取android app中的數(shù)據(jù)。
    2021-05-05
  • Python argparse中的action=store_true用法小結(jié)

    Python argparse中的action=store_true用法小結(jié)

    這篇文章主要介紹了Python argparse中的action=store_true用法小結(jié),本文結(jié)合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • Pytorch四維Tensor轉(zhuǎn)圖片并保存方式(維度順序調(diào)整)

    Pytorch四維Tensor轉(zhuǎn)圖片并保存方式(維度順序調(diào)整)

    這篇文章主要介紹了Pytorch四維Tensor轉(zhuǎn)圖片并保存方式(維度順序調(diào)整),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • python函數(shù)參數(shù),名稱空間,以及函數(shù)嵌套

    python函數(shù)參數(shù),名稱空間,以及函數(shù)嵌套

    這篇文章主要給大家介紹python函數(shù)參數(shù)、名稱空間、以及函數(shù)嵌套的相關(guān)資料,想具體了解的小伙伴請和小編一起進入下面文章內(nèi)容吧
    2021-10-10
  • Python?sklearn轉(zhuǎn)換器估計器和K-近鄰算法

    Python?sklearn轉(zhuǎn)換器估計器和K-近鄰算法

    這篇文章主要介紹了Python?sklearn轉(zhuǎn)換器估計器和K-近鄰算法,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 總結(jié)歸納python os庫常用方法

    總結(jié)歸納python os庫常用方法

    這篇文章主要為大家介紹了python os庫常用方法的總結(jié)歸納,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • pandas 數(shù)據(jù)實現(xiàn)行間計算的方法

    pandas 數(shù)據(jù)實現(xiàn)行間計算的方法

    今天小編就為大家分享一篇pandas 數(shù)據(jù)實現(xiàn)行間計算的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 詳解python中遞歸函數(shù)

    詳解python中遞歸函數(shù)

    這篇文章主要介紹了python遞歸函數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • python內(nèi)置函數(shù)map/filter/reduce詳解

    python內(nèi)置函數(shù)map/filter/reduce詳解

    在Python中,map(), filter(), 和 reduce() 是內(nèi)置的高級函數(shù)(實際是class),用于處理可迭代對象(如列表、元組等)的元素,這篇文章主要介紹了python內(nèi)置函數(shù)map/filter/reduce的相關(guān)知識,需要的朋友可以參考下
    2024-05-05
  • Django使用Celery加redis執(zhí)行異步任務的實例內(nèi)容

    Django使用Celery加redis執(zhí)行異步任務的實例內(nèi)容

    在本篇文章里小編給大家整理的是關(guān)于Django使用Celery加redis執(zhí)行異步任務,需要的朋友們可以學習下。
    2020-02-02

最新評論

化州市| 新乐市| 九江市| 廉江市| 漾濞| 大丰市| 都江堰市| 抚顺市| 徐州市| 江永县| 武胜县| 长兴县| 江山市| 巴中市| 冕宁县| 竹山县| 东明县| 赤城县| 夏津县| 大丰市| 乌拉特中旗| 灵寿县| 普安县| 农安县| 射洪县| 慈溪市| 永靖县| 南城县| 博湖县| 海晏县| 临沭县| 乌兰浩特市| 保定市| 揭阳市| 历史| 新巴尔虎右旗| 辽阳县| 郸城县| 牡丹江市| 鲜城| 河间市|