File size: 3,485 Bytes
9963647
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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} постов.")