2022-10-10 00:51:43 +00:00
|
|
|
"""
|
|
|
|
Class for interfacing with mediawiki
|
|
|
|
"""
|
2022-10-16 03:15:33 +00:00
|
|
|
from typing import List
|
|
|
|
from urllib.parse import urljoin
|
|
|
|
from dataclasses import dataclass
|
|
|
|
from wiki_postbot.creds import Mediawiki_Creds
|
|
|
|
import requests
|
2022-10-10 00:51:43 +00:00
|
|
|
|
2022-10-16 03:15:33 +00:00
|
|
|
# creds = Mediawiki_Creds.from_json('mediawiki_creds.json')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Wiki:
|
|
|
|
def __init__(self, url:str, api_suffix:str="/api.php"):
|
|
|
|
self.url = url
|
|
|
|
self.api_url = urljoin(self.url, api_suffix)
|
|
|
|
self.sess = None
|
|
|
|
|
|
|
|
|
|
|
|
def login(self, creds:Mediawiki_Creds) -> requests.Session:
|
|
|
|
# get token to log in
|
|
|
|
sess = requests.Session()
|
|
|
|
|
|
|
|
login_token = sess.get(
|
|
|
|
self.api_url,
|
|
|
|
params={
|
|
|
|
"action":"query",
|
|
|
|
"meta":"tokens",
|
|
|
|
"type":"login",
|
|
|
|
"format":"json"
|
|
|
|
},
|
|
|
|
verify=False
|
|
|
|
).json()['query']['tokens']['logintoken']
|
|
|
|
|
|
|
|
|
|
|
|
login_result = sess.post(
|
|
|
|
self.api_url,
|
|
|
|
data = {
|
|
|
|
"action":"login",
|
|
|
|
"lgname":creds.user,
|
|
|
|
"lgpassword":creds.password,
|
|
|
|
"lgtoken": login_token,
|
|
|
|
"format": "json"
|
|
|
|
},
|
|
|
|
verify=False
|
|
|
|
)
|
|
|
|
assert login_result.json()['login']['result'] == "Success"
|
|
|
|
self.sess = sess
|
|
|
|
return sess
|
|
|
|
|
|
|
|
def get_page_content(self, page:str) -> str:
|
|
|
|
|
|
|
|
content = self.sess.get(
|
|
|
|
self.api_url,
|
|
|
|
params={
|
|
|
|
'action':'parse',
|
|
|
|
'page': page,
|
|
|
|
'prop': 'wikitext',
|
|
|
|
'formatversion':'2',
|
|
|
|
'format':'json'
|
|
|
|
}
|
|
|
|
).json()
|
|
|
|
return content['parse']['wikitext']
|
|
|
|
|
|
|
|
def insert_text(self, page, section, text):
|
|
|
|
|
|
|
|
token = self.sess.get(
|
|
|
|
self.api_url,
|
|
|
|
params={
|
|
|
|
"action": "query",
|
|
|
|
"meta": "tokens",
|
|
|
|
"format": "json"
|
|
|
|
},
|
|
|
|
verify=False
|
|
|
|
).json()['query']['tokens']['csrftoken']
|
|
|
|
|
|
|
|
result = self.sess.post(
|
|
|
|
self.api_url,
|
|
|
|
data={
|
|
|
|
"action":"edit",
|
|
|
|
"title":page,
|
|
|
|
"section":"new",
|
|
|
|
"sectiontitle":section,
|
|
|
|
"appendtext":text,
|
|
|
|
"format":"json",
|
|
|
|
"token":token
|
|
|
|
}
|
|
|
|
)
|