#!/usr/bin/env python3 import sys import requests import datetime from bs4 import BeautifulSoup from urllib.parse import urlparse def get_hn_items(username): url = f"https://hacker-news.firebaseio.com/v0/user/{username}.json" resp = requests.get(url) if resp.status_code != 200: sys.exit(f"Failed to fetch HN user: {resp.status_code}") data = resp.json() return data.get("submitted", []) def get_hn_item(item_id): url = f"https://hacker-news.firebaseio.com/v0/item/{item_id}.json" resp = requests.get(url) if resp.status_code != 200: return None return resp.json() def fetch_lobsters_date(article_url): params = {"q": article_url, "what": "stories", "order": "newest"} resp = requests.get("https://lobste.rs/search", params=params) if resp.status_code != 200: return None soup = BeautifulSoup(resp.text, "html.parser") for link in soup.find_all("a", class_="u-url"): if link.get("href") != article_url: continue time_tag = link.find_next("time") if not time_tag or not time_tag.has_attr("datetime"): continue raw = time_tag["datetime"] # e.g. "2025-06-01 01:23:30-0500" try: lob_dt = datetime.datetime.strptime(raw, "%Y-%m-%d %H:%M:%S%z") except ValueError: continue lob_utc = lob_dt.astimezone(datetime.timezone.utc).replace(tzinfo=None) return lob_utc return None def truncate(text, length=60): return text if len(text) <= length else text[:length-3] + "..." def main(): if len(sys.argv) != 2: sys.exit("Usage: script.py ") username = sys.argv[1] item_ids = get_hn_items(username) for item_id in item_ids: item = get_hn_item(item_id) if not item or item.get("type") != "story": continue title = item.get("title", "") url = item.get("url") if not url: continue hn_ts = item.get("time", 0) hn_time = datetime.datetime.fromtimestamp(hn_ts, datetime.timezone.utc).replace(tzinfo=None) lob_time = fetch_lobsters_date(url) if not lob_time: continue delta = hn_time - lob_time seconds = delta.total_seconds() relation = "earlier" if seconds > 0 else "later" if seconds < 0 else "same" domain = urlparse(url).netloc short_title = truncate(title) print(f"{seconds} seconds {relation} - {domain} - {short_title}") if __name__ == "__main__": main()