diff --git a/add_links/api.py b/add_links/api.py index e0174b7..05fc7b1 100644 --- a/add_links/api.py +++ b/add_links/api.py @@ -272,6 +272,10 @@ def call_get_diff(title: str, section_num: int, section_text: str) -> str: } s = get_session() - ret = s.post(get_query_url(), data=data).json() + r = s.post(get_query_url(), data=data) + try: + ret = r.json() + except JSONDecodeError: + raise MediawikiError(f"HTTP {r.status_code}: {r.text[:200]!r}") check_for_error(ret) return typing.cast(str, ret["query"]["pages"][0]["revisions"][0]["diff"]["body"]) diff --git a/add_links/mediawiki_api.py b/add_links/mediawiki_api.py index c834021..611ab5b 100644 --- a/add_links/mediawiki_api.py +++ b/add_links/mediawiki_api.py @@ -4,8 +4,14 @@ import typing from pprint import pprint from typing import Any, cast +import requests + from . import mediawiki_oauth + +class APIError(Exception): + """Unexpected response from the MediaWiki API.""" + wiki_hostname = "en.wikipedia.org" wiki_api_php = f"https://{wiki_hostname}/w/api.php" user_agent = "add-links/0.1" @@ -27,10 +33,13 @@ def parse_page(enwiki: str) -> dict[str, Any]: return parse -def call(params: dict[str, str | int]) -> dict[str, typing.Any]: +def call(params: dict[str, str | int], timeout: int = 4) -> dict[str, typing.Any]: """Make GET request to mediawiki API.""" - data = mediawiki_oauth.api_post_request(params) - return cast(dict[str, Any], data.json()) + r = mediawiki_oauth.api_post_request(params, timeout=timeout) + try: + return cast(dict[str, Any], r.json()) + except requests.exceptions.JSONDecodeError: + raise APIError(f"HTTP {r.status_code}: {r.text[:200]!r}") def article_exists(title: str) -> bool: @@ -92,7 +101,7 @@ def edit_page( "summary": summary, "section": section, } - ret = call(params) + ret = call(params, timeout=30) if "edit" not in ret: print("params") pprint(params) diff --git a/add_links/mediawiki_oauth.py b/add_links/mediawiki_oauth.py index 9b4de72..39aecb0 100644 --- a/add_links/mediawiki_oauth.py +++ b/add_links/mediawiki_oauth.py @@ -8,6 +8,8 @@ import requests from flask import current_app, session from requests_oauthlib import OAuth1Session +from .api import ua + wiki_hostname = "en.wikipedia.org" api_url = f"https://{wiki_hostname}/w/api.php" @@ -27,7 +29,7 @@ def get_edit_proxy() -> dict[str, str]: return {} -def api_post_request(params: dict[str, str | int]) -> requests.Response: +def api_post_request(params: dict[str, str | int], timeout: int = 4) -> requests.Response: """HTTP Post using Oauth.""" app = current_app # url = "https://www.wikidata.org/w/api.php" @@ -39,8 +41,9 @@ def api_post_request(params: dict[str, str | int]) -> requests.Response: resource_owner_key=session["owner_key"], resource_owner_secret=session["owner_secret"], ) + oauth.headers.update({"User-Agent": ua}) proxies = get_edit_proxy() - return oauth.post(api_url, data=params, timeout=4, proxies=proxies) + return oauth.post(api_url, data=params, timeout=timeout, proxies=proxies) def raw_request(params: typing.Mapping[str, str | int]) -> requests.Response: @@ -57,6 +60,7 @@ def raw_request(params: typing.Mapping[str, str | int]) -> requests.Response: resource_owner_key=session["owner_key"], resource_owner_secret=session["owner_secret"], ) + oauth.headers.update({"User-Agent": ua}) proxies = get_edit_proxy() return oauth.get( api_url + "?" + urllib.parse.urlencode(params), timeout=4, proxies=proxies