import os import json import time from config import THREADS_ACCESS_TOKEN THREADS_API_BASE = "https://graph.threads.net/v1.0" import requests TRACKER_FILE = "threads_daily_tracker.json" def load_tracker(): if not os.path.exists(TRACKER_FILE): return [] try: with open(TRACKER_FILE, "r", encoding="utf-8") as f: return json.load(f) except Exception as e: print(f"[Tracker Error] Ошибка загрузки трекера: {e}") return [] def save_tracker(data): try: with open(TRACKER_FILE, "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=4) except Exception as e: print(f"[Tracker Error] Ошибка сохранения трекера: {e}") def add_post_to_tracker(media_id, text, category, predicted_score=0): data = load_tracker() # Avoid duplicates for post in data: if post.get("media_id") == media_id: return new_entry = { "media_id": str(media_id), "text": text, "category": category, "predicted_score": predicted_score, "timestamp": int(time.time()), "likes": 0, "replies": 0, "views": 0, "last_updated": int(time.time()) } data.append(new_entry) save_tracker(data) print(f"[Tracker] Пост {media_id} добавлен в базу.") def get_top_performing_posts(limit=3): data = load_tracker() if not data: return [] # Sort by sum of likes and replies sorted_data = sorted(data, key=lambda x: x.get("likes", 0) + x.get("replies", 0), reverse=True) return sorted_data[:limit] def fetch_post_metrics(media_id): """ Получает актуальные метрики (лайки, реплаи, просмотры) поста через API. """ url = f"{THREADS_API_BASE}/{media_id}" params = { "fields": "like_count,reply_count,views", "access_token": THREADS_ACCESS_TOKEN } try: r = requests.get(url, params=params, timeout=10) if r.status_code == 200: return r.json() else: print(f"[Tracker Error] Ошибка получения метрик для {media_id}: {r.status_code}") return None except Exception as e: print(f"[Tracker Exception] {e}") return None def refresh_metrics(): """ Обновляет статистику для последних 30 постов в трекере. """ data = load_tracker() if not data: return print(f"[Tracker] Запуск обновления метрик для {min(len(data), 30)} последних постов...") # Sort by timestamp, get newest 30 data.sort(key=lambda x: x.get("timestamp", 0), reverse=True) recent_posts = data[:30] updated_count = 0 for post in recent_posts: metrics = fetch_post_metrics(post["media_id"]) if metrics: post["likes"] = metrics.get("like_count", post.get("likes", 0)) post["replies"] = metrics.get("reply_count", post.get("replies", 0)) post["views"] = metrics.get("views", post.get("views", 0)) post["last_updated"] = int(time.time()) updated_count += 1 save_tracker(data) print(f"[Tracker] Успешно обновлены метрики для {updated_count} постов.")