Fetch actual profile data with avatars for suggested accounts
This commit is contained in:
parent
62b78d4700
commit
97cfc5ee6d
1 changed files with 50 additions and 3 deletions
|
|
@ -192,19 +192,66 @@ async def get_suggested_accounts(
|
||||||
try:
|
try:
|
||||||
accounts = await PlaywrightManager.fetch_suggested_accounts(cookies, user_agent, limit)
|
accounts = await PlaywrightManager.fetch_suggested_accounts(cookies, user_agent, limit)
|
||||||
|
|
||||||
if accounts:
|
if accounts and len(accounts) >= 5: # Need at least 5 accounts from dynamic fetch
|
||||||
_suggested_cache["accounts"] = accounts
|
_suggested_cache["accounts"] = accounts
|
||||||
_suggested_cache["updated_at"] = time.time()
|
_suggested_cache["updated_at"] = time.time()
|
||||||
return {"accounts": accounts[:limit], "cached": False}
|
return {"accounts": accounts[:limit], "cached": False}
|
||||||
else:
|
else:
|
||||||
# Fallback if API fails
|
# Fallback: fetch actual profile data with avatars for static list
|
||||||
return {"accounts": get_fallback_accounts()[:limit], "cached": False, "fallback": True}
|
print("Dynamic fetch failed, fetching profile data for static accounts...")
|
||||||
|
fallback_list = get_fallback_accounts()[:min(limit, 20)] # Limit to 20 for speed
|
||||||
|
return await fetch_profiles_with_avatars(fallback_list, cookies, user_agent)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error fetching suggested accounts: {e}")
|
print(f"Error fetching suggested accounts: {e}")
|
||||||
return {"accounts": get_fallback_accounts()[:limit], "cached": False, "fallback": True}
|
return {"accounts": get_fallback_accounts()[:limit], "cached": False, "fallback": True}
|
||||||
|
|
||||||
|
|
||||||
|
async def fetch_profiles_with_avatars(accounts: list, cookies: list, user_agent: str) -> dict:
|
||||||
|
"""Fetch actual profile data with avatars for a list of accounts."""
|
||||||
|
|
||||||
|
cookie_str = "; ".join([f"{c['name']}={c['value']}" for c in cookies])
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
"User-Agent": user_agent or PlaywrightManager.DEFAULT_USER_AGENT,
|
||||||
|
"Referer": "https://www.tiktok.com/",
|
||||||
|
"Cookie": cookie_str,
|
||||||
|
"Accept": "application/json",
|
||||||
|
}
|
||||||
|
|
||||||
|
enriched = []
|
||||||
|
|
||||||
|
async with httpx.AsyncClient(timeout=10.0) as client:
|
||||||
|
for acc in accounts:
|
||||||
|
try:
|
||||||
|
url = f"https://www.tiktok.com/api/user/detail/?uniqueId={acc['username']}"
|
||||||
|
res = await client.get(url, headers=headers)
|
||||||
|
|
||||||
|
if res.status_code == 200:
|
||||||
|
data = res.json()
|
||||||
|
user = data.get("userInfo", {}).get("user", {})
|
||||||
|
stats = data.get("userInfo", {}).get("stats", {})
|
||||||
|
|
||||||
|
if user:
|
||||||
|
enriched.append({
|
||||||
|
"username": acc["username"],
|
||||||
|
"nickname": user.get("nickname") or acc.get("nickname", acc["username"]),
|
||||||
|
"avatar": user.get("avatarThumb") or user.get("avatarMedium"),
|
||||||
|
"followers": stats.get("followerCount", 0),
|
||||||
|
"verified": user.get("verified", False),
|
||||||
|
"region": "VN"
|
||||||
|
})
|
||||||
|
continue
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error fetching profile for {acc['username']}: {e}")
|
||||||
|
|
||||||
|
# Fallback: use original data without avatar
|
||||||
|
enriched.append(acc)
|
||||||
|
|
||||||
|
return {"accounts": enriched, "cached": False, "enriched": True}
|
||||||
|
|
||||||
|
|
||||||
def get_fallback_accounts():
|
def get_fallback_accounts():
|
||||||
"""Static fallback list of popular Vietnamese TikTokers."""
|
"""Static fallback list of popular Vietnamese TikTokers."""
|
||||||
return [
|
return [
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue