import time
import random
from instagrapi import Client
from instagrapi.exceptions import (
    ClientError, ChallengeRequired, 
    LoginRequired, BadPassword
)
from fake_useragent import UserAgent

# إعدادات الأمان
DELAY = (5, 15)  # تأخير بين 5-15 ثانية
MAX_FOLLOWERS = 300  # الحد الأقصى للمتابعين للمسح
USERNAME_LENGTHS = [4, 5]  # أطوال أسماء المستخدمين المطلوبة

class AbandonedAccountFinder:
    def __init__(self):
        self.cl = Client()
        self.ua = UserAgent()
        self.configure_client()

    def configure_client(self):
        """تهيئة العميل مع إعدادات مكافحة الحظر"""
        self.cl.set_user_agent(self.ua.instagram)
        self.cl.delay_range = DELAY
        self.cl.set_timezone_offset(3600)
        self.cl.set_locale("en_US")
        self.cl.set_device(self.cl.generate_device_id())

    def safe_request(self, func, *args, **kwargs):
        """تنفيذ الطلبات مع التعامل مع الأخطاء"""
        try:
            return func(*args, **kwargs)
        except (ClientError, ChallengeRequired) as e:
            print(f"خطأ في الطلب: {e} - إعادة المحاولة...")
            self.rotate_identity()
            time.sleep(random.uniform(*DELAY))
            return self.safe_request(func, *args, **kwargs)

    def rotate_identity(self):
        """تغيير بصمة الجهاز والهوية"""
        self.cl.set_user_agent(self.ua.random)
        self.cl.set_device(self.cl.generate_device_id())

    def login(self, username, password):
        """تسجيل دخول آمن"""
        try:
            return self.cl.login(username, password)
        except (ChallengeRequired, BadPassword) as e:
            print(f"خطأ في الدخول: {e}")
            return False

    def get_target_followers(self, target_username):
        """الحصول على قائمة المتابعين مع الفلترة"""
        user_id = self.cl.user_id_from_username(target_username)
        followers = self.safe_request(
            self.cl.user_followers, 
            user_id, 
            amount=MAX_FOLLOWERS
        )
        return [
            user.username for user in followers.values()
            if len(user.username) in USERNAME_LENGTHS
            and not user.is_private
            and user.media_count < 5  # افتراض أن الحساب المهجور لديه منشورات قليلة
        ]

    def save_results(self, usernames, filename="abandoned.txt"):
        """حفظ النتائج في ملف"""
        with open(filename, "w", encoding="utf-8") as f:
            f.write("\n".join(usernames))
        print(f"تم حفظ {len(usernames)} حسابات في {filename}")

    def run(self, target_username, your_username, your_password):
        """تشغيل السكريبت الرئيسي"""
        if self.login(your_username, your_password):
            print("تم الدخول بنجاح، بدء المسح...")
            abandoned = self.get_target_followers(target_username)
            self.save_results(abandoned)
            print("الحسابات المهجورة:")
            for idx, user in enumerate(abandoned, 1):
                print(f"{idx}. {user}")
        else:
            print("فشل في تسجيل الدخول")

if __name__ == "__main__":
    finder = AbandonedAccountFinder()
    finder.run(
        target_username="runnersglobe",  # استبداله باسم المستخدم المستهدف
        your_username="hadari472i",      # بياناتك الخاصة
        your_password="drea1991"       # 
    )  صلح هذا السكريبت من جميع الاخطاء