Создать EditToken в Python для MediaWiki UserMerge? - PullRequest
0 голосов
/ 19 сентября 2018

Требуется опыт в расширении UserMerge ...

Я пытаюсь очистить вики с помощью нелепого количества поддельных имен пользователей.

Следуя инструкциям на Массовый пользователь Mediawiki delete / merge / block привел меня к точке, где я создал работающий URL, и я смог увидеть все параметры.Однако рекомендуемый плагин Firefox не работает с моей текущей версией Firefox.Итак, я подумал: Python и MediaWiki API на помощь.Это моя первая поездка по той кроличьей норе, но я смог добраться до точки, где он дал мне токен редактирования ... но, возможно, не правильный ВИД токена редактирования?

Код (с личнымбиты отредактированы):

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
  user_merge.py

  The goal, eventually, is to send ~1,500 requests like:

      https://<MEDIAWIKI>/index.php
          ?wpolduser=<OLD_USER>
          &wpnewuser=<NEW_USER>
          &wpdelete=1
          &wpEditToken=<EDIT_TOKEN>
          &title=Special%3AUserMerge
          &redirectparams=

  where <OLD_USER> changes with every iteration through the loop,
  but   <NEW_USER> and <EDIT_TOKEN> are constant
"""

import requests

API_URL  = "https://<MEDIAWIKI>/api.php"
USERNAME = "<BOT_USERNAME>"
PASSWORD = "<BOT_PASSWORD>"
URL      = "https://<MEDIAWIKI>/index.php"
NEW_USER = "<SPAMMER_0>"

session = requests.Session()

# Retrieve login token first

PARAMS_0 = {"action": "query",
            "meta":   "tokens",
            "type":   "login",
            "format": "json"}
response = session.get(url=API_URL,
                       params=PARAMS_0)
response.raise_for_status()
results  = response.json()
LOGIN_TOKEN = results["query"]["tokens"]["logintoken"]

# Send a post request to login as bot

PARAMS_1 = {"action":     "login",
            "lgname":     USERNAME,
            "lgpassword": PASSWORD,
            "lgtoken":    LOGIN_TOKEN,
            "format":     "json"}
response = session.post(API_URL,
                        data=PARAMS_1)
results  = response.json()
if results["login"]["result"] != "Success":
    raise RuntimeError(results["login"]["reason"])

# Get edit token

PARAMS_2 = {"action": "query",
            "meta":   "tokens",
            "format": "json"}
response = session.get(API_URL,
                       params=PARAMS_2)
results  = response.json()
EDIT_TOKEN = results["query"]["tokens"]["csrftoken"][:-2]

# Fill in and submit Special:UserMerge form

old_user = "<SPAMMER_1>"  # Eventually read from 1500-line file

PARAMS_3 = {"wpolduser":      old_user,
            "wpnewuser":      NEW_USER,
            "wpdelete":       "1",
            "wpEditToken":    EDIT_TOKEN,
            "title":          "Special%3AUserMerge",
            "redirectparams": ""}

# (Fails with either POST or GET)

response = session.get(URL,
                       params=PARAMS_3)
response.raise_for_status()
results  = response  # Unsure if it needs JSON munging

# Logout

PARAMS_9 = {"action":     "logout",
            "format":     "json"}

response = session.post(API_URL,
                        data=PARAMS_9)
results  = response.json()

Я могу войти в систему и успешно получить токен редактирования.Но когда я пытаюсь использовать его так, как я мог использовать его из Firefox, код завершается ошибкой:

Traceback (most recent call last):
  File "./user_merge.py", line 140, in <module>
    main()
  File "./user_merge.py", line 119, in main
    response.raise_for_status()
  File "/usr/lib/python3.7/site-packages/requests/models.py", line 939, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: https://<MEDIAWIKI>/index.php?wpolduser=<OLD_USER>&wpnewuser=<NEW_USER>&wpdelete=1&wpEditToken=<EDIT_TOKEN>&title=Special%253AUserMerge&redirectparams=
...