|
import instaloader |
|
from typing import List, Dict |
|
from fastapi import HTTPException |
|
import requests |
|
|
|
|
|
L = instaloader.Instaloader() |
|
|
|
async def fetch_user_posts(username: str, max_posts: int = 20) -> List[Dict]: |
|
try: |
|
print(f"Fetching posts for user: {username}") |
|
profile = instaloader.Profile.from_username(L.context, username) |
|
|
|
posts = [] |
|
for count, post in enumerate(profile.get_posts()): |
|
if count >= max_posts: |
|
break |
|
posts.append({ |
|
"caption": post.caption or "No Caption", |
|
"likes": post.likes, |
|
"comments": post.comments, |
|
"date": post.date_utc.isoformat(), |
|
"image_url": post.url, |
|
}) |
|
|
|
if not posts: |
|
print("No posts found.") |
|
return [] |
|
|
|
return posts |
|
|
|
except instaloader.exceptions.ProfileNotExistsException: |
|
raise HTTPException(status_code=404, detail=f"Profile '{username}' does not exist.") |
|
except instaloader.exceptions.ConnectionException: |
|
raise HTTPException(status_code=503, detail="Instagram connection failed. Try again later.") |
|
except Exception as e: |
|
raise HTTPException(status_code=500, detail=f"Unexpected error: {str(e)}") |
|
|
|
|
|
def find_similar_accounts(username: str, rapidapi_key: str) -> List[str]: |
|
""" |
|
Fetch similar accounts using the RapidAPI endpoint. |
|
""" |
|
url = "https://instagram-scraper-api2.p.rapidapi.com/v1/similar_accounts" |
|
querystring = {"username_or_id_or_url": username} |
|
|
|
headers = { |
|
"x-rapidapi-host": "instagram-scraper-api2.p.rapidapi.com", |
|
"x-rapidapi-key": rapidapi_key |
|
} |
|
|
|
try: |
|
response = requests.get(url, headers=headers, params=querystring) |
|
response.raise_for_status() |
|
data = response.json() |
|
|
|
|
|
if data.get("status") == "success": |
|
return data.get("data", {}).get("similar_accounts", []) |
|
else: |
|
print(f"Error fetching similar accounts: {data.get('message')}") |
|
return [] |
|
except requests.exceptions.RequestException as e: |
|
print(f"API request failed: {e}") |
|
return [] |
|
|
|
|
|
async def fetch_competitors_posts(username: str, rapidapi_key: str, max_posts: int = 50) -> List[Dict]: |
|
""" |
|
Fetch posts for similar accounts (competitors) using the RapidAPI endpoint. |
|
""" |
|
|
|
similar_accounts = find_similar_accounts(username, rapidapi_key) |
|
if not similar_accounts: |
|
print("No similar accounts found.") |
|
return [] |
|
|
|
|
|
all_posts = [] |
|
for account in similar_accounts: |
|
print(f"Fetching posts for competitor: {account}") |
|
try: |
|
competitor_posts = await fetch_user_posts(account, max_posts) |
|
all_posts.extend(competitor_posts) |
|
except HTTPException as e: |
|
print(f"Error fetching posts for {account}: {e.detail}") |