Report findings to a bot

This commit is contained in:
Mint 2023-03-13 00:21:46 +03:00
parent 441d050305
commit 5bd02655d8
2 changed files with 64 additions and 2 deletions

View file

@ -1,5 +1,9 @@
{ {
"base_url": "", "base_url": "",
"port": 8069, "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"
} }

View file

@ -7,6 +7,7 @@ from json import dumps
from json import loads from json import loads
import re import re
from time import time from time import time
import itertools
with open("config.json") as f: with open("config.json") as f:
config = loads(f.read()) config = loads(f.read())
@ -15,6 +16,26 @@ headers = {
"user-agent": config["useragent"] "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: def get_mastodon_blocks(domain: str) -> dict:
blocks = { blocks = {
@ -205,10 +226,12 @@ conn = sqlite3.connect("blocks.db")
c = conn.cursor() c = conn.cursor()
c.execute( 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(): for blocker, software in c.fetchall():
blockdict = []
blocker = tidyup(blocker) blocker = tidyup(blocker)
if software == "pleroma": if software == "pleroma":
print(blocker) print(blocker)
@ -253,6 +276,12 @@ for blocker, software in c.fetchall():
"insert into blocks select ?, ?, '', ?, ?, ?", "insert into blocks select ?, ?, '', ?, ?, ?",
(blocker, blocked, block_level, timestamp, timestamp), (blocker, blocked, block_level, timestamp, timestamp),
) )
if block_level == "reject":
blockdict.append(
{
"blocked": blocked,
"reason": None
})
else: else:
c.execute( c.execute(
"update blocks set last_seen = ? where blocker = ? and blocked = ? and block_level = ?", "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 = ''", "update blocks set reason = ? where blocker = ? and blocked = ? and block_level = ? and reason = ''",
(reason["reason"], blocker, blocked, block_level), (reason["reason"], blocker, blocked, block_level),
) )
for entry in blockdict:
if entry["blocked"] == blocked:
entry["reason"] = reason["reason"]
conn.commit() conn.commit()
except Exception as e: except Exception as e:
print("error:", e, blocker) print("error:", e, blocker)
@ -364,6 +397,12 @@ for blocker, software in c.fetchall():
timestamp, timestamp,
), ),
) )
if block_level == "reject":
blockdict.append(
{
"blocked": blocked,
"reason": reason
})
else: else:
c.execute( c.execute(
"update blocks set last_seen = ? where blocker = ? and blocked = ? and block_level = ?", "update blocks set last_seen = ? where blocker = ? and blocked = ? and block_level = ?",
@ -433,6 +472,12 @@ for blocker, software in c.fetchall():
timestamp timestamp
), ),
) )
if block_level == "reject":
blockdict.append(
{
"blocked": blocked,
"reason": reason
})
else: else:
c.execute( c.execute(
"update blocks set last_seen = ? where blocker = ? and blocked = ? and block_level = ?", "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 ?, ?, ?, ?, ?, ?", "insert into blocks select ?, ?, ?, ?, ?, ?",
(blocker, blocked, "", "reject", timestamp, timestamp), (blocker, blocked, "", "reject", timestamp, timestamp),
) )
blockdict.append(
{
"blocked": blocked,
"reason": None
})
else: else:
c.execute( c.execute(
"update blocks set last_seen = ? where blocker = ? and blocked = ? and block_level = ?", "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 = ''", "update blocks set reason = ? where blocker = ? and blocked = ? and block_level = ? and reason = ''",
(reason, blocker, blocked, "reject"), (reason, blocker, blocked, "reject"),
) )
for entry in blockdict:
if entry["blocked"] == blocked:
entry["reason"] = reason
conn.commit() conn.commit()
except Exception as e: except Exception as e:
print("error:", e, blocker) print("error:", e, blocker)
if config["bot_enabled"] and len(blockdict) > 0:
send_bot_post(blocker, blockdict)
blockdict = []
conn.close() conn.close()