Automation_Threads_EU / tracker.py
FincH12's picture
Initial commit from local
9963647 verified
Raw History Blame Contribute Delete
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} постов.")