From 210d0327039a5537b0d1a6b3291c70bd92fd770d Mon Sep 17 00:00:00 2001 From: simon987 Date: Tue, 13 Aug 2019 15:26:01 -0400 Subject: [PATCH] Initial commit --- .gitignore | 6 ++ README.md | 13 ++++ chan.py | 92 +++++++++++++++++++++++ monitoring.png | Bin 0 -> 88710 bytes monitoring.py | 18 +++++ post_process.py | 45 +++++++++++ run.py | 195 ++++++++++++++++++++++++++++++++++++++++++++++++ util.py | 60 +++++++++++++++ 8 files changed, 429 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 chan.py create mode 100644 monitoring.png create mode 100644 monitoring.py create mode 100644 post_process.py create mode 100644 run.py create mode 100644 util.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ac6df84 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.idea/ +__pychache__/ +*.pyc +*.iml +*.db +*.log \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d41a47f --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +### chan_feed + +Daemon that fetches posts from compatible *chan +image boards and publishes serialised JSON to RabbitMQ + for real-time ingest. + +Compatible image boards: 4chan, lainchan, uboachan, +22chan, wizchan, 1chan. + +Can optionally push monitoring data to InfluxDB. Below is an +example of Grafana being used to display it. + +![monitoring.png](monitoring.png) diff --git a/chan.py b/chan.py new file mode 100644 index 0000000..c2c8ba5 --- /dev/null +++ b/chan.py @@ -0,0 +1,92 @@ +class ChanHelper: + def __init__(self, db_id, base_url, image_url, thread_path, image_path, boards): + self.db_id = db_id + self._base_url = base_url + self._image_url = image_url + self._thread_path = thread_path + self._image_path = image_path + self.boards = boards + + def image_url(self, board, tim, extension): + return "%s%s%s%s%s" % (self._image_url, board, self._image_path, tim, extension) + + def threads_url(self, board): + return "%s%s/threads.json" % (self._base_url, board) + + def posts_url(self, board, thread): + return "%s%s%s%d.json" % (self._base_url, board, self._thread_path, thread) + + +CHANS = { + "4chan": ChanHelper( + 1, + "https://a.4cdn.org/", + "https://i.4cdn.org/", + "/thread/", + "/", + [ + "a", "b", "c", "d", "e", "f", "g", "gif", "h", "hr", + "k", "m", "o", "p", "r", "s", "t", "u", "v", "vg", + "vr", "w", "wg", "i", "ic", "r9k", "s4s", "vip", "qa", + "cm", "hm", "lgbt", "y", "3", "aco", "adv", "an", "asp", + "bant", "biz", "cgl", "ck", "co", "diy", "fa", "fit", + "gd", "hc", "his", "int", "jp", "lit", "mlp", "mu", "n", + "news", "out", "po", "pol", "qst", "sci", "soc", "sp", + "tg", "toy", "trv", "tv", "vp", "wsg", "wsr", "x" + ] + ), + "lainchan": ChanHelper( + 2, + "https://lainchan.org/", + "https://lainchan.org/", + "/res/", + "/src/", + [ + "λ", "diy", "sec", "tech", "inter", "lit", "music", "vis", + "hum", "drg", "zzz", "layer" "q", "r", "cult", "psy", + "mega", "random" + ] + ), + "uboachan": ChanHelper( + 3, + "https://uboachan.net/", + "https://uboachan.net/", + "/res/", + "/src/", + [ + "yn", "yndd", "fg", "yume", "o", "lit", "media", "og", + "ig", "2", "ot", "hikki", "cc", "x", "sugg" + ] + ), + "22chan": ChanHelper( + 4, + "https://22chan.org/", + "https://22chan.org/", + "/res/", + "/src/", + [ + "a", "b", "f", "feels", "i", "k", "mu", "pol", "sewers", + "sg", "t", "vg" + ] + ), + "wizchan": ChanHelper( + 5, + "https://wizchan.org/", + "https://wizchan.org/", + "/res/", + "/src/", + [ + "wiz", "dep", "hob", "lounge", "jp", "meta", "games", "music", + ] + ), + "1chan": ChanHelper( + 6, + "https://www.1chan.net/", + "https://www.1chan.net/", + "/res/", + "/src/", + [ + "rails" + ] + ) +} diff --git a/monitoring.png b/monitoring.png new file mode 100644 index 0000000000000000000000000000000000000000..ae76b180c5ddd4a09e82f1f4e6ae1a210d5adfe9 GIT binary patch literal 88710 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 b$H6^6k86L7L#E66+rFeISfoTq$NPT)NVNxy literal 0 HcmV?d00001 diff --git a/monitoring.py b/monitoring.py new file mode 100644 index 0000000..23f945c --- /dev/null +++ b/monitoring.py @@ -0,0 +1,18 @@ +from influxdb import InfluxDBClient + +client = InfluxDBClient("localhost", 8086, "root", "root", "chan_feed") + + +def init(): + db_exists = False + for db in client.get_list_database(): + if db["name"] == "chan_feed": + db_exists = True + break + + if not db_exists: + client.create_database("chan_feed") + + +def log(event): + client.write_points(event) diff --git a/post_process.py b/post_process.py new file mode 100644 index 0000000..764b3b0 --- /dev/null +++ b/post_process.py @@ -0,0 +1,45 @@ +import re + +LINK_RE = re.compile(r"(https?://[\w\-_.]+\.[a-z]{2,4}([^\s<'\"]*|$))") + + +def post_process(thing, board, helper): + thing["v"] = 1.0 + + thing["board"] = board + thing["chan"] = helper.db_id + + if "com" in thing and thing["com"]: + thing["urls"] = get_links_from_body(thing["com"]) + elif "sub" in thing and thing["sub"]: + thing["urls"] = get_links_from_body(thing["sub"]) + if "fsize" in thing and thing["fsize"]: + url = helper.image_url(board, thing["tim"], thing["ext"]) + if "urls" in thing: + thing["urls"].append(url) + else: + thing["urls"] = [url] + if "urls" not in thing: + thing["urls"] = [] + + return thing + + +def get_links_from_body(body): + result = set() + + body = body \ + .replace("", "") \ + .replace("", "") \ + .replace(" dot ", ".") + + for match in LINK_RE.finditer(body): + url = match.group(1) + if is_external(url): + result.add(url) + + return list(result) + + +def is_external(url): + return not url.startswith(("#", "/")) diff --git a/run.py b/run.py new file mode 100644 index 0000000..7f26786 --- /dev/null +++ b/run.py @@ -0,0 +1,195 @@ +import datetime +import json +import sqlite3 +import sys +import traceback +from datetime import datetime +from queue import Queue +from threading import Thread + +import pika + +import monitoring +from chan import CHANS +from post_process import post_process +from util import logger, Web + +MONITORING = True + + +class ChanScanner: + def __init__(self, helper): + self.web = Web(monitoring if MONITORING else None) + self.helper = helper + self.state = ChanState() + + def _fetch_threads(self, board): + r = self.web.get(self.helper.threads_url(board)) + if r.status_code == 200: + return r.json() + return [] + + def _fetch_posts(self, board, thread): + r = self.web.get(self.helper.posts_url(board, thread)) + if r.status_code == 200: + return r.json() + return {"posts": []} + + def _threads(self, board): + for page in self._fetch_threads(board): + for thread in page["threads"]: + yield thread + + def _posts(self, board): + for thread in sorted(self._threads(board), key=lambda x: x["no"]): + if self.state.has_new_posts(thread, self.helper): + for post in sorted(self._fetch_posts(board, thread["no"])["posts"], key=lambda x: x["no"]): + yield post + self.state.mark_thread_as_visited(thread, self.helper) + + def all_posts(self): + for board in self.helper.boards: + for post in self._posts(board): + yield post, board + + +def once(func): + def wrapper(item, board, helper): + if not state.has_visited(item["no"], helper): + func(item, board, helper) + state.mark_visited(item["no"], helper) + + return wrapper + + +class ChanState: + def __init__(self): + self._db = "state.db" + + with sqlite3.connect(self._db) as conn: + conn.execute( + "CREATE TABLE IF NOT EXISTS posts " + "(" + " post INT," + " ts INT DEFAULT (strftime('%s','now'))," + " chan INT," + " PRIMARY KEY(post, chan)" + ")" + ) + conn.execute( + "CREATE TABLE IF NOT EXISTS threads " + "(" + " thread INT," + " last_modified INT," + " ts INT DEFAULT (strftime('%s','now'))," + " chan INT," + " PRIMARY KEY(thread, chan)" + ")" + ) + conn.execute("PRAGMA journal_mode=wal") + conn.commit() + + def mark_visited(self, item: int, helper): + with sqlite3.connect(self._db) as conn: + conn.execute( + "INSERT INTO posts (post, chan) VALUES (?,?)", + (item, helper.db_id) + ) + + def has_visited(self, item: int, helper): + with sqlite3.connect(self._db) as conn: + cur = conn.cursor() + cur.execute( + "SELECT post FROM posts WHERE post=? AND chan=?", + (item, helper.db_id) + ) + return cur.fetchone() is not None + + def has_new_posts(self, thread, helper): + with sqlite3.connect(self._db) as conn: + cur = conn.cursor() + cur.execute( + "SELECT last_modified FROM threads WHERE thread=? AND chan=?", + (thread["no"], helper.db_id) + ) + row = cur.fetchone() + if not row or thread["last_modified"] != row[0]: + return True + return False + + def mark_thread_as_visited(self, thread, helper): + with sqlite3.connect(self._db) as conn: + conn.execute( + "INSERT INTO threads (thread, last_modified, chan) " + "VALUES (?,?,?) " + "ON CONFLICT (thread, chan) " + "DO UPDATE SET last_modified=?", + (thread["no"], thread["last_modified"], helper.db_id, + thread["last_modified"]) + ) + conn.commit() + + +def publish_worker(queue: Queue, helper): + while True: + try: + item, board = queue.get() + publish(item, board, helper) + + except Exception as e: + logger.error(str(e) + ": " + traceback.format_exc()) + finally: + queue.task_done() + + +@once +def publish(item, board, helper): + item_type = "thread" if "sub" in item else "post" + post_process(item, board, helper) + + chan_channel.basic_publish( + exchange='chan', + routing_key="%d.%s.%s" % (helper.db_id, item_type, board), + body=json.dumps(item) + ) + + if MONITORING: + distance = datetime.utcnow() - datetime.fromtimestamp(item["time"]) + monitoring.log([{ + "measurement": helper.db_id, + "time": str(datetime.utcnow()), + "tags": { + "board": board + }, + "fields": { + "distance": distance.total_seconds() + } + }]) + + +if __name__ == "__main__": + + if len(sys.argv) < 3: + logger.error("You must specify RabbitMQ host & chan!") + quit(1) + + rabbitmq_host = sys.argv[1] + chan = sys.argv[2] + chan_helper = CHANS[chan] + + if MONITORING: + monitoring.init() + state = ChanState() + + publish_q = Queue() + publish_thread = Thread(target=publish_worker, args=(publish_q, chan_helper)) + publish_thread.start() + + rabbit = pika.BlockingConnection(pika.ConnectionParameters(host=rabbitmq_host)) + chan_channel = rabbit.channel() + chan_channel.exchange_declare(exchange="chan", exchange_type="topic") + + s = ChanScanner(chan_helper) + while True: + for p, b in s.all_posts(): + publish_q.put((p, b)) diff --git a/util.py b/util.py new file mode 100644 index 0000000..0f074ba --- /dev/null +++ b/util.py @@ -0,0 +1,60 @@ +import logging +import sys +import time +from datetime import datetime +from logging import FileHandler, StreamHandler + +import requests + +last_time_called = dict() + +logger = logging.getLogger("default") +logger.setLevel(logging.DEBUG) + +formatter = logging.Formatter('%(asctime)s %(levelname)-5s %(message)s') +file_handler = FileHandler("chan_feed.log") +file_handler.setFormatter(formatter) +for h in logger.handlers: + logger.removeHandler(h) +logger.addHandler(file_handler) +logger.addHandler(StreamHandler(sys.stdout)) + + +def rate_limit(per_second): + min_interval = 1.0 / float(per_second) + + def decorate(func): + last_time_called[func] = 0 + + def wrapper(*args, **kwargs): + elapsed = time.perf_counter() - last_time_called[func] + wait_time = min_interval - elapsed + if wait_time > 0: + time.sleep(wait_time) + + last_time_called[func] = time.perf_counter() + return func(*args, **kwargs) + + return wrapper + + return decorate + + +class Web: + def __init__(self, monitoring): + self.session = requests.Session() + self.monitoring = monitoring + + @rate_limit(1 / 2) # TODO: per chan rate limit? + def get(self, url, **kwargs): + r = self.session.get(url, **kwargs) + logger.debug("GET %s <%d>" % (url, r.status_code)) + if self.monitoring: + self.monitoring.log([{ + "measurement": "web", + "time": str(datetime.utcnow()), + "fields": { + "status_code": r.status_code + } + }]) + return r