commit e1b6ea0

grunfink  ·  2025-05-30 17:03:49 +0000 UTC
parent 017e59e
auto_follower_webhook.py new example program.
1 files changed,  +55, -0
+55, -0
 1@@ -0,0 +1,55 @@
 2+#!/usr/bin/env python3
 3+
 4+# This is an example of a snac webhook that automatically follows all new followers.
 5+
 6+# To use it, set the variables snac_basedir and snac_user to something reasonable,
 7+# configure the user webhook to be http://localhost:12345, and run this program.
 8+
 9+# copyright (C) 2025 grunfink et al. / MIT license
10+
11+from http.server import BaseHTTPRequestHandler, HTTPServer
12+import time
13+import json
14+import os
15+
16+host_name = "localhost"
17+server_port = 12345
18+snac_basedir = "/var/snac/example_instance"
19+snac_user = "example_user"
20+
21+class SnacAutoResponderServer(BaseHTTPRequestHandler):
22+
23+    def do_POST(self):
24+        self.send_response(200)
25+        self.end_headers()
26+
27+        content_type = self.headers["content-type"]
28+        content_length = int(self.headers["content-length"])
29+        payload = self.rfile.read(content_length).decode("utf-8")
30+
31+        if content_type == "application/json":
32+            try:
33+                noti = json.loads(payload)
34+
35+                type = noti["type"]
36+
37+                if type == "Follow":
38+                    actor = noti["actor"]
39+                    cmd = "snac follow %s %s %s" % (snac_basedir, snac_user, actor)
40+
41+                    os.system(cmd)
42+
43+            except:
44+                print("Error parsing notification")
45+
46+if __name__ == "__main__":        
47+    webServer = HTTPServer((host_name, server_port), SnacAutoResponderServer)
48+    print("Webhook started http://%s:%s" % (host_name, server_port))
49+
50+    try:
51+        webServer.serve_forever()
52+    except KeyboardInterrupt:
53+        pass
54+
55+    webServer.server_close()
56+    print("Webhook stopped.")