diff --git a/daily_top.py b/daily_top.py index 438ca4c..1ba5cd5 100644 --- a/daily_top.py +++ b/daily_top.py @@ -35,8 +35,7 @@ def api_get(url, token): raise def clean_content(content): - text = re.sub(r']*class="[^"]*hashtag[^"]*"[^>]*>.*?', "", content, flags=re.IGNORECASE) - text = re.sub(r"<[^>]+>", " ", text) + text = re.sub(r"<[^>]+>", " ", content) text = html.unescape(text) return re.sub(r"\s+", " ", text).strip() @@ -56,6 +55,12 @@ def main(): except Exception: sys.exit(1) + try: + trend_tags = api_get(f"{base_url}/api/v1/trends/tags?limit=5", token) + tags = [t["name"] for t in trend_tags] + except Exception: + tags = [] + candidates = [] for s in statuses: if "@" in s.get("account", {}).get("acct", ""): @@ -68,6 +73,7 @@ def main(): candidates.append({ "acct": s["account"]["acct"], "text": text, + "url": s.get("url", ""), "reblogs": reblogs, "favourites": favourites, "score": reblogs + favourites, @@ -81,9 +87,9 @@ def main(): out_path = os.path.join("data", f"{today}.json") with open(out_path, "w", encoding="utf-8") as f: - json.dump({"date": today, "top": top}, f, ensure_ascii=False, indent=2) + json.dump({"date": today, "top": top, "tags": tags}, f, ensure_ascii=False, indent=2) - print(f"Uloženo: {out_path} ({len(top)} tootů)") + print(f"Uloženo: {out_path} ({len(top)} tootů, {len(tags)} hashtagů)") if __name__ == "__main__": main() diff --git a/weekly_report.py b/weekly_report.py index 718abd6..e823688 100644 --- a/weekly_report.py +++ b/weekly_report.py @@ -7,6 +7,7 @@ import sys import argparse import urllib.request import urllib.error +from collections import Counter from datetime import datetime, timezone, timedelta TIPS = [ @@ -103,7 +104,6 @@ def get_measures(base_url, admin_token, date_from, date_to, keys=None): raise def truncate(text, max_chars=100): - text = re.sub(r']*class="[^"]*hashtag[^"]*"[^>]*>.*?', "",text, flags=re.IGNORECASE) text = re.sub(r"<[^>]+>", " ", text) text = html.unescape(text) text = re.sub(r"\s+", " ", text).strip() @@ -147,7 +147,7 @@ def build_monthly_toot(measures_data, tags, top_tooty, date_to, prev_stats, inst if top_tooty: blocks = "\n\n".join( - f"👤 @{s['acct']}\n\"{truncate(s['text'], 80).replace(chr(10), ' ')}\"\n🔁 {s['reblogs']} ⭐ {s['favourites']}" + f"👤 @{s['acct']}\n\"{truncate(s['text'], 80).replace(chr(10), ' ')}\"\n🔁 {s['reblogs']} ⭐ {s['favourites']}\n🔗 {s.get('url', '')}" for s in top_tooty ) tooty_sekce = f"\n🌟 Tooty měsíce:\n\n{blocks}" @@ -182,7 +182,7 @@ def build_toot(measures_data, tags, top_tooty, date_from, date_to, week_number): if top_tooty: blocks = "\n\n".join( - f"👤 @{s['acct']}\n\"{truncate(s['text'], 80).replace(chr(10), ' ')}\"\n🔁 {s['reblogs']} ⭐ {s['favourites']}" + f"👤 @{s['acct']}\n\"{truncate(s['text'], 80).replace(chr(10), ' ')}\"\n🔁 {s['reblogs']} ⭐ {s['favourites']}\n🔗 {s.get('url', '')}" for s in top_tooty ) toot_tyden = f"🌟 Tooty týdne:\n\n{blocks}\n\n" @@ -208,6 +208,26 @@ def build_toot(measures_data, tags, top_tooty, date_from, date_to, week_number): f"💡 Tip týdne: {tip}" ) +def load_tags_from_data(date_to, days, top_n): + counts = Counter() + found_any = False + for i in range(days): + day = (date_to - timedelta(days=i)).strftime("%Y-%m-%d") + path = os.path.join("data", f"{day}.json") + try: + with open(path, encoding="utf-8") as f: + file_data = json.load(f) + tags = file_data.get("tags") + if tags: + found_any = True + for tag in tags: + counts[tag] += 1 + except FileNotFoundError: + pass + if not found_any: + return None + return [{"name": tag} for tag, _ in counts.most_common(top_n)] + def load_tooty_from_data(date_to, days): seen = set() all_tooty = [] @@ -258,10 +278,12 @@ def main(): except Exception: sys.exit(1) - try: - tags = api_get(f"{base_url}/api/v1/trends/tags?limit=5", admin_token) - except Exception: - tags = [] + tags = load_tags_from_data(date_to, 30, 5) + if tags is None: + try: + tags = api_get(f"{base_url}/api/v1/trends/tags?limit=5", admin_token) + except Exception: + tags = [] try: instance_info = api_get(f"{base_url}/api/v1/instance") @@ -314,10 +336,12 @@ def main(): except Exception: sys.exit(1) - try: - tags = api_get(f"{base_url}/api/v1/trends/tags?limit=3", admin_token) - except Exception: - tags = [] + tags = load_tags_from_data(date_to, 7, 3) + if tags is None: + try: + tags = api_get(f"{base_url}/api/v1/trends/tags?limit=3", admin_token) + except Exception: + tags = [] top_tooty = load_tooty_from_data(date_to, 7) toot = build_toot(measures_data, tags, top_tooty, date_from, date_to, week_number)