Achtung

Dieser Beitrag ist schon sehr alt, und die Infos hier sind sicherlich hoffnungslos veraltet…

Login bei MediaWiki mit Python

Jean Pütz
ubuntuusers
Autor:in

produnis

Veröffentlichungsdatum

27. Januar 2019

Es gibt zwei Möglichkeiten, sich bei MediaWiki einzuloggen,

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
    username        = 'produnis'                    # Username to login with
    botpwd          = 'myapibot@foobarfoobarfoobars52o8mk8apimpsb8' # Password of Special:BotPasswords in the style BOTNAME@password
    
    api_url   = "https://my.wiki.ltd/api.php"
    session = requests.Session()
    r1 = session.get(api_url, params={
        'format': 'json',
        'action': 'query',
        'meta': 'tokens',
        'type': 'login',
    })
    
    r2 = session.post(api_url, data={
        '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"
    }
    mycontent = session.get(api_url, params=MyParams)
    mydata=mycontent.json
    print("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
    
    username        = 'produnis'                    # Username to login with
    userpwd         = 'SuperSecreet'                # Userpassword
    botpwd          = 'myapibot@foobarfoobarfoobars52o8mk8apimpsb8' # Password of Special:BotPasswords in the style BOTNAME@password
    
    api_url   = "https://my.wiki.ltd/api.php"
    index_url = "https://my.wiki.ltd/index.php"
    
    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):
        soup = bs(raw_resp.text, 'lxml')
        token = [n.get('value', '') for n in soup.find_all('input')
            if n.get('name', '') == 'wpLoginToken']
        return token[0]
    
    with requests.session() as s:
        resp = s.get(index_url + '?title=Spezial:UserLogin')
        payload['wpLoginToken'] = get_login_token(resp)
        response_post = s.post(index_url + '?title=Spezial:UserLogin&action=submitlogin&type=login', data=payload)

Nun können Seiten ausgerufen werden per:

        response = s.get(index_url + '?title=Special:Watchlist')