diff --git a/web_view.py b/web_view.py index 96ab370..32fb1da 100755 --- a/web_view.py +++ b/web_view.py @@ -186,6 +186,7 @@ def start_oauth() -> Response: request_token_url = wiki_index_php + "?title=Special%3aOAuth%2finitiate" oauth = OAuth1Session(client_key, client_secret=client_secret, callback_uri="oob") + oauth.headers.update({"User-Agent": api.ua}) fetch_response = oauth.fetch_request_token(request_token_url) flask.session["owner_key"] = fetch_response.get("oauth_token") @@ -223,7 +224,7 @@ def oauth_callback() -> werkzeug.wrappers.response.Response: resource_owner_secret=flask.session["owner_secret"], verifier=verifier, ) - + oauth.headers.update({"User-Agent": api.ua}) oauth_tokens = oauth.fetch_access_token(access_token_url) flask.session["owner_key"] = oauth_tokens.get("oauth_token") flask.session["owner_secret"] = oauth_tokens.get("oauth_token_secret") @@ -298,27 +299,37 @@ def get_best_hit(title: str, hits: list[Hit]) -> tuple[Hit, dict[str, typing.Any except NoMatch: print("no match") continue + except api.MediawikiError as e: + print(f"MediawikiError for {hit['title']!r}: {e}") + continue return (hit, found) raise NoGoodHit +def handle_post(url_title: str) -> Response: + """Handle POST request.""" + from_title = url_title.replace("_", " ").strip() + hit_title = flask.request.form["hit"] + try: + do_save(from_title, hit_title) + except mediawiki_oauth.LoginNeeded: + return flask.redirect(flask.url_for("start_oauth")) + except mediawiki_api.APIError as e: + return flask.make_response(f"Save failed: {e}", 502) + return flask.redirect( + flask.url_for("article_page", url_title=url_title, after=hit_title) + ) + + @app.route("/link/", methods=["GET", "POST"]) def article_page(url_title: str) -> str | Response: """Article page.""" - from_title = url_title.replace("_", " ").strip() - if flask.request.method == "POST": - hit_title = flask.request.form["hit"] - try: - do_save(from_title, hit_title) - except mediawiki_oauth.LoginNeeded: - return flask.redirect(flask.url_for("start_oauth")) - return flask.redirect( - flask.url_for("article_page", url_title=url_title, after=hit_title) - ) + return handle_post(url_title) + from_title = url_title.replace("_", " ").strip() article_title = flask.request.args.get("title") total = search_count(from_title)