簡體   English   中英

使用使用 python3 登錄網站(Mediawiki)的請求

[英]Using the requests to login to a website(Mediawiki) with python3

我想使用 Python3 中的Requests庫登錄到Mediawiki網站。

我已經在尋找類似的主題,但我結束的解決方案不起作用。

我要使用的登錄公式如下所示:

<form name="userlogin" class="mw-ui-vform" method="post" action="/index.php?title=Spezial:Anmelden&amp;action=submitlogin&amp;type=login&amp;returnto=Hauptseite">
    <section class="mw-form-header"></section>

    <div class="mw-ui-vform-field">
        <label for='wpName1'> Benutzername </label>
        <input class="loginText mw-ui-input" id="wpName1" tabindex="1" autofocus="" placeholder="Gib deinen Benutzernamen ein" name="wpName"/>
    </div>

    <div class="mw-ui-vform-field">
        <label for='wpPassword1'> Passwort </label>
        <input class="loginPassword mw-ui-input" id="wpPassword1" tabindex="2" placeholder="Gib dein Passwort ein" type="password" name="wpPassword" />
    </div>

    <div class="mw-ui-vform-field">
        <div class="mw-ui-checkbox">
            <input name="wpRemember" type="checkbox" value="1" id="wpRemember" tabindex="4">
            <label for="wpRemember"> Angemeldet bleiben</label>
        </div>
    </div>

    <div class="mw-ui-vform-field">
        <input id="wpLoginAttempt" name="wpLoginAttempt" tabindex="6" type="submit" value="Anmelden" class="mw-ui-button mw-ui-constructive" />
    </div>

    <div class="mw-ui-vform-field mw-form-related-link-container" id="mw-userlogin-help">
        <a href="https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Logging_in">Hilfe beim Anmelden</a>
    </div>
    <div class="mw-ui-vform-field mw-form-related-link-container">
        <a href="/index.php/Spezial:Passwort_neu_vergeben" title="Spezial:Passwort neu vergeben">Passwort vergessen?</a>
    </div>
    <input type="hidden" value="9a57c2f503220304d0cc80633bad12d1" name="wpLoginToken" />
</form>

我的代碼如下:

import requests
import re
a=('user','pass')

postloginurl='https://example.com/index.php?title=Spezial:Anmelden&amp;action=submitlogin&amp;type=login&amp;returnto=Hauptseite'
requesturl='https://example.com/index.php/Hauptseite'   


with requests.Session() as session:
  session.auth=a

  #finding the logintoken for the formular
  get = session.get(postloginurl)
  m=re.search('value="(?P<logintoken>.*)" name="wpLoginToken"',get.text)
  logintoken=m.group('logintoken')

  #fill out the login formular
  name=input('name:')
  password=input('password:')
  payload={'action': 'login', 'wpName':name, 'wpPassword':password, 'wpRemember':'1' , 'wpLoginAttempt':'Anmelden', 'wpLoginToken':logintoken, 'submit':'submit'}
  post = session.post(postloginurl, data=payload)

  #test if I'm logged in
  r = session.get(requesturl)
  print(r.text)
  #here it says: ""wgUserName":null" in the head, so I'm not logged in

該站點還使用身份驗證,因此我需要身份驗證部分。 我還嘗試管理登錄令牌,每次開始新會話時都會更改。

你們知道什么可能是錯的,或者我可以測試什么來發現我的錯誤嗎?

您必須將headers添加到登錄請求中。 無需在session.auth添加 'user' 和 'pass' 。

import requests
import bs4 as bs

login_page_url = 'https://www.mediawiki.org/w/index.php?title=Special:UserLogin&returnto=MediaWiki'
login_url = 'https://www.mediawiki.org/w/index.php?title=Special:UserLogin&returnto=MediaWiki'

# Create Session.
session = requests.session()

# Get HTML of Login page.
response = session.get(login_page_url)

# Extract token from HTML using BeautifulSoup.
soup = bs.BeautifulSoup(response.text, 'lxml')
wpLoginToken = soup.find('input', {'name': 'wpLoginToken'}).get('value')

payload = {
    "wpName":"YOUR_USERNAME",
    "wpPassword":"YOUR_PASSWORD",
    "wpRemember":"1", "authAction":"login",
    "wpLoginToken":wpLoginToken}

headers = {
    'Host': 'www.mediawiki.org','Origin': 'https://www.mediawiki.org', 'Content-Type': 'application/x-www-form-urlencoded',
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br',
    'Referer': 'https://www.mediawiki.org/w/index.php?title=Special:UserLogin&returnto=MediaWiki',
}

# Login request.
response = session.post(login_url, data=payload,)
print(response.status_code, response.text)

並且可以在response.text ("wgUserName":"YOUR_USERNAME") 中找到您的用戶名

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM