Last active 1698081812

a script to forward fediverse posts from a jsonfeed url to a discord webhook, optionally filtering by keyword/hashtag

fedipost.py Raw
1#!/usr/bin/env python3
2# usage: fedipost.py jsonfeed_url webhook_url [filter_text]
3# e.g: fedipost.py https://blahaj.zone/@alypet.json webhook #alyblog
4from markdownify import markdownify
5from requests import get,post
6import os, sys
7
8WH = sys.argv[2]
9
10try:
11 with open("posts.txt") as f:
12 posts = f.read().strip().split("\n")
13except:
14 posts = []
15
16feed = get(sys.argv[1]).json()
17items = []
18for item in feed["items"]:
19 if item["url"] in posts:
20 continue
21 content = item["content_html"].split('<span class="new_note')[0].split(" <span class=\"reply_note")[0]
22 if len(sys.argv) > 3:
23 if sys.argv[3] not in content:
24 continue
25 img = {"image": {"url": ""}}
26 if "<img" in content:
27 content, img_url = content.split("<img",1)
28 img["image"]["url"] = img_url.split(' src="',1)[1].split('"')[0]
29 content = markdownify(content).strip()
30 data = {
31 "username": "Fediverse",
32 "avatar_url": feed["icon"],
33 "embeds": [
34 {
35 "title": feed["title"],
36 "url": feed["home_page_url"],
37 "color": 16711829,
38 "fields": [
39 {
40 "name": "New post",
41 "value": content[:1020] + ("..." if len(content) > 1020 else "")
42 }
43 ],
44 "url": item["url"],
45 "timestamp": item["date_modified"][:-5] + "Z",
46 **img
47 }
48 ]
49 }
50 post(WH, json=data)
51 posts.append(item["url"])
52 with open("posts.txt", "w") as f:
53 f.write("\n".join(posts))