Download tracker.py from FincH12/Automation_Threads_EU: direct link, hf CLI and curl.
- Browser
- Download file 3.49 kB
-
https://huggingface.co/spaces/FincH12/Automation_Threads_EU/resolve/main/tracker.py
- Command line
-
hf download hf://spaces/FincH12/Automation_Threads_EU/tracker.py
-
curl -L -o tracker.py https://huggingface.co/spaces/FincH12/Automation_Threads_EU/resolve/main/tracker.py
3.49 kB
| 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} постов.") | |