From 9947478c6c4e3f9f9f99c742c2c2287e51a98a29 Mon Sep 17 00:00:00 2001 From: Brandon Rozek Date: Sun, 15 May 2022 20:38:27 -0400 Subject: [PATCH] Script to archive a mastodon toot --- archive_toot.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100755 archive_toot.py diff --git a/archive_toot.py b/archive_toot.py new file mode 100755 index 0000000..5ae7cdb --- /dev/null +++ b/archive_toot.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python +""" +Saves a toot to reference as a shortcode +in a post. +""" +from http.client import HTTPResponse +from urllib.parse import urlparse +from urllib import request +from typing import Optional +import argparse +import json +import sys + +SAVE_DIR = "static/data/toots" + +# Grab arguments +parser = argparse.ArgumentParser(description="Save a toot") +parser.add_argument("toot_url", type=str, help="URL to specific toot") +args = vars(parser.parse_args()) + +parsed_url = urlparse(args['toot_url']) + +# Parse Arguments +SERVER = f"{parsed_url.scheme}://{parsed_url.netloc}" +TOOT_ID = parsed_url.path.split("/")[-1] + +# Query server +url = SERVER + "/api/v1/statuses/" + TOOT_ID +response: Optional[HTTPResponse] = None + +try: + response = request.urlopen(url) +except Exception: + print("Unable to grab toots from Mastodon.") +if response is None: + sys.exit(-1) + +# Parse server response +server_data: Optional[dict] = None +try: + server_data = json.loads(response.read()) +except Exception: + print("Malformed JSON response from server.") + +if server_data is None: + sys.exit(-1) + +if not isinstance(server_data, dict): + print("Unexpected JSON response, should be of form dict.") + sys.exit(-1) + +# Save toot +TOOT_REFERENCE = f"{parsed_url.netloc.replace('.', '-')}-{TOOT_ID}" +TOOT_SAVE_FILE = f"{SAVE_DIR}/{TOOT_REFERENCE}.json" + +try: + with open(TOOT_SAVE_FILE, "w", encoding="UTF-8") as f: + json.dump(server_data, f) +except: + print("Unable to write to save location.") + sys.exit(-1) + +print("Saved Toot Reference", TOOT_REFERENCE)