Login bei MediaWiki mit Python
Jean Pütz
ubuntuusers
Es gibt zwei Möglichkeiten, sich bei MediaWiki einzuloggen,
- per
api.php
- als “normaler” User (über die
index.php
)
api.php
Diese Variante setzt voraus, dass du Special:BotPasswords
für deinen Account vergeben hast. Mit der API-Methode ist wirklich nur die api.php
erreichbar. Versucht man mit der Session die index.php
zu erreichen, erhält man die Meldung “Du musst angemeldet sein!”
Zunächst die Anmeldung, weche wir in einer request.session speichern:
#!/usr/bin/env python3
import requests
= 'produnis' # Username to login with
username = 'myapibot@foobarfoobarfoobars52o8mk8apimpsb8' # Password of Special:BotPasswords in the style BOTNAME@password
botpwd
= "https://my.wiki.ltd/api.php"
api_url = requests.Session()
session = session.get(api_url, params={
r1 'format': 'json',
'action': 'query',
'meta': 'tokens',
'type': 'login',
})
= session.post(api_url, data={
r2 'format': 'json',
'action': 'login',
'lgname': username,
'lgpassword': botpwd,
'lgtoken': r1.json()['query']['tokens']['logintoken'],
})if r2.json()['login']['result'] != 'Success':
raise RuntimeError(r2.json())
Nun kann die API wie folgt aufgerufen und ausgelesen werden:
= {
MyParams "action": "query",
"format": "json",
"prop": "pageprops",
"titles": "Kategorie:Hauptkategorie"
}= session.get(api_url, params=MyParams)
mycontent =mycontent.json
mydataprint("i got: ", mydata()['query']['pages'])
index.php
Wenn wir die index.php nutzen wollen, zB um die Mpdf-Extension aufzurufen, müssen wir uns anders einloggen:
#!/usr/bin/env python3
import requests
from bs4 import BeautifulSoup as bs
= 'produnis' # Username to login with
username = 'SuperSecreet' # Userpassword
userpwd = 'myapibot@foobarfoobarfoobars52o8mk8apimpsb8' # Password of Special:BotPasswords in the style BOTNAME@password
botpwd
= "https://my.wiki.ltd/api.php"
api_url = "https://my.wiki.ltd/index.php"
index_url
= {
payload 'wpName': username,
'wpPassword': userpwd,
'wploginattempt': 'Log in',
'wpEditToken': "+\\",
'title': "Special:UserLogin",
'authAction': "login",
'force': "",
'wpForceHttps': "1",
'wpFromhttp': "1",
#'wpLoginToken': '',
}
def get_login_token(raw_resp):
= bs(raw_resp.text, 'lxml')
soup = [n.get('value', '') for n in soup.find_all('input')
token if n.get('name', '') == 'wpLoginToken']
return token[0]
with requests.session() as s:
= s.get(index_url + '?title=Spezial:UserLogin')
resp 'wpLoginToken'] = get_login_token(resp)
payload[= s.post(index_url + '?title=Spezial:UserLogin&action=submitlogin&type=login', data=payload) response_post
Nun können Seiten ausgerufen werden per:
= s.get(index_url + '?title=Special:Watchlist') response
Weblinks
- https://stackoverflow.com/a/38378803/1493264 how to login to Mediawiki with Python
- https://www.mediawiki.org/wiki/User:Produnis/Login_to_MediaWiki_using_Python
- https://github.com/produnis/myscripts/blob/master/python/mwc2pdf.py