From 5bd02655d8ddb4c6281e2a7b9bee1b022e38fe5b Mon Sep 17 00:00:00 2001 From: Mint <> Date: Mon, 13 Mar 2023 00:21:46 +0300 Subject: [PATCH] Report findings to a bot --- config.defaults.json | 6 ++++- fetch_blocks.py | 60 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/config.defaults.json b/config.defaults.json index 97a5258..06a3230 100644 --- a/config.defaults.json +++ b/config.defaults.json @@ -1,5 +1,9 @@ { "base_url": "", "port": 8069, - "useragent": "Mozilla/5.0 (Windows NT 10.0; rv:102.0) Gecko/20100101 Firefox/102.0" + "useragent": "Mozilla/5.0 (Windows NT 10.0; rv:102.0) Gecko/20100101 Firefox/102.0", + "bot_enabled": false, + "bot_instance": "https://example.com", + "bot_token": "", + "bot_visibility": "unlisted" } diff --git a/fetch_blocks.py b/fetch_blocks.py index 8b39eed..f79a206 100644 --- a/fetch_blocks.py +++ b/fetch_blocks.py @@ -7,6 +7,7 @@ from json import dumps from json import loads import re from time import time +import itertools with open("config.json") as f: config = loads(f.read()) @@ -15,6 +16,26 @@ headers = { "user-agent": config["useragent"] } +def send_bot_post(instance: str, blocks: dict): + message = instance + " has blocked the following instances:\n\n" + truncated = False + if len(blocks) > 20: + truncated = True + blocks = blocks[0 : 19] + for block in blocks: + if block["reason"] == None or block["reason"] == '': + message = message + block["blocked"] + " with unspecified reason\n" + else: + message = message + block["blocked"] + ' for "' + block["reason"] + '"\n' + if truncated: + message = message + "(the list has been truncated to the first 20 entries)" + + botheaders = {**headers, **{"Authorization": "Bearer " + config["bot_token"]}} + req = post(f"{config['bot_instance']}/api/v1/statuses", + data={"status":message, "visibility":config['bot_visibility'], "content_type":"text/plain"}, + headers=botheaders, timeout=10).json() + print(req) + return True def get_mastodon_blocks(domain: str) -> dict: blocks = { @@ -205,10 +226,12 @@ conn = sqlite3.connect("blocks.db") c = conn.cursor() c.execute( - "select domain, software from instances where software in ('pleroma', 'mastodon', 'friendica', 'misskey', 'gotosocial')" + #"select domain, software from instances where software in ('pleroma', 'mastodon', 'friendica', 'misskey', 'gotosocial')" + "select domain, software from instances where domain = 'mstdn.social'" ) for blocker, software in c.fetchall(): + blockdict = [] blocker = tidyup(blocker) if software == "pleroma": print(blocker) @@ -253,6 +276,12 @@ for blocker, software in c.fetchall(): "insert into blocks select ?, ?, '', ?, ?, ?", (blocker, blocked, block_level, timestamp, timestamp), ) + if block_level == "reject": + blockdict.append( + { + "blocked": blocked, + "reason": None + }) else: c.execute( "update blocks set last_seen = ? where blocker = ? and blocked = ? and block_level = ?", @@ -283,6 +312,10 @@ for blocker, software in c.fetchall(): "update blocks set reason = ? where blocker = ? and blocked = ? and block_level = ? and reason = ''", (reason["reason"], blocker, blocked, block_level), ) + for entry in blockdict: + if entry["blocked"] == blocked: + entry["reason"] = reason["reason"] + conn.commit() except Exception as e: print("error:", e, blocker) @@ -364,6 +397,12 @@ for blocker, software in c.fetchall(): timestamp, ), ) + if block_level == "reject": + blockdict.append( + { + "blocked": blocked, + "reason": reason + }) else: c.execute( "update blocks set last_seen = ? where blocker = ? and blocked = ? and block_level = ?", @@ -433,6 +472,12 @@ for blocker, software in c.fetchall(): timestamp ), ) + if block_level == "reject": + blockdict.append( + { + "blocked": blocked, + "reason": reason + }) else: c.execute( "update blocks set last_seen = ? where blocker = ? and blocked = ? and block_level = ?", @@ -483,6 +528,11 @@ for blocker, software in c.fetchall(): "insert into blocks select ?, ?, ?, ?, ?, ?", (blocker, blocked, "", "reject", timestamp, timestamp), ) + blockdict.append( + { + "blocked": blocked, + "reason": None + }) else: c.execute( "update blocks set last_seen = ? where blocker = ? and blocked = ? and block_level = ?", @@ -494,7 +544,15 @@ for blocker, software in c.fetchall(): "update blocks set reason = ? where blocker = ? and blocked = ? and block_level = ? and reason = ''", (reason, blocker, blocked, "reject"), ) + for entry in blockdict: + if entry["blocked"] == blocked: + entry["reason"] = reason conn.commit() except Exception as e: print("error:", e, blocker) + + if config["bot_enabled"] and len(blockdict) > 0: + send_bot_post(blocker, blockdict) + blockdict = [] + conn.close() -- 2.39.2