from instagrapi import Client
from instagrapi.exceptions import ChallengeRequired, ClientError, LoginRequired
import os
import time
import json
from colorama import Fore, Style, init

# تهيئة ألوان الكونسول
init(autoreset=True)

# إعدادات الثوابت
SESSION_FILE = "instagram_session.json"
USERNAME = "hadari472i"
PASSWORD = "drea1991"
TARGETS = ["leomessi", "cristiano"]
DELAY_RANGE = (5, 10)  # تأخير عشوائي بين العمليات

class InstagramBot:
    def __init__(self):
        self.client = Client()
        self._setup_client()
        
    def _setup_client(self):
        """تهيئة إعدادات العميل"""
        self.client.delay_range = DELAY_RANGE
        self.client.set_user_agent(
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 (KHTML, like Gecko) "
            "Chrome/118.0.0.0 Safari/537.36"
        )
        
    def _save_session(self):
        """حفظ جلسة العمل في ملف"""
        try:
            settings = self.client.get_settings()
            with open(SESSION_FILE, 'w') as f:
                json.dump(settings, f, indent=4)
            self._success_report("تم حفظ جلسة العمل بنجاح")
        except Exception as e:
            self._error_report(f"فشل في حفظ الجلسة: {e}")

    def _load_session(self):
        """تحميل جلسة العمل من الملف"""
        if os.path.exists(SESSION_FILE):
            try:
                with open(SESSION_FILE, 'r') as f:
                    settings = json.load(f)
                    self.client.set_settings(settings)
                    self.client.get_settings()
                self._success_report("تم تحميل الجلسة بنجاح")
                return True
            except Exception as e:
                self._error_report(f"فشل تحميل الجلسة: {e}")
        return False

    def _handle_2fa(self):
        """معالجة التحقق بخطوتين"""
        try:
            code = input(Fore.YELLOW + "أدخل رمز التحقق (6 أرقام): " + Style.RESET_ALL).strip()
            self.client.challenge_code_handler(code)
            self._save_session()
            self._success_report("تم التحقق بنجاح")
        except Exception as e:
            self._error_report(f"فشل التحقق: {e}")
            exit()

    def _login(self):
        """إجراءات تسجيل الدخول"""
        if self._load_session():
            try:
                self.client.account_info()
                self._success_report("الجلسة صالحة - لا حاجة للتسجيل")
                return
            except LoginRequired:
                self._warning_report("الجلسة منتهية - يتطلب إعادة تسجيل")

        try:
            self.client.login(USERNAME, PASSWORD)
            self._save_session()
            self._success_report("تم التسجيل الدخول بنجاح")
        except ChallengeRequired:
            self._warning_report("مطلوب تحقق بخطوتين (2FA)")
            self._handle_2fa()

    def _success_report(self, message):
        print(Fore.GREEN + f"✓ {message}" + Style.RESET_ALL)

    def _warning_report(self, message):
        print(Fore.YELLOW + f"⚠ {message}" + Style.RESET_ALL)

    def _error_report(self, message):
        print(Fore.RED + f"✗ {message}" + Style.RESET_ALL)

    def _follow_user(self, username):
        """متابعة مستخدم مع معالجة الأخطاء"""
        for attempt in range(3):
            try:
                user = self.client.user_info_by_username(username)
                self.client.user_follow(user.pk)
                self._success_report(f"تم متابعة @{username}")
                return user.pk
            except ClientError as e:
                self._error_report(f"محاولة {attempt+1}: فشل متابعة @{username} - {e}")
                time.sleep(15)
        return None

    def _unfollow_user(self, user_id):
        """إلغاء متابعة مستخدم"""
        try:
            self.client.user_unfollow(user_id)
            self._success_report(f"تم إلغاء متابعة المستخدم ID: {user_id}")
            return True
        except ClientError as e:
            self._error_report(f"فشل إلغاء المتابعة: {e}")
            return False

    def run_operation(self):
        """تشغيل العملية الرئيسية"""
        try:
            self._login()
            
            # مرحلة المتابعة
            followed_ids = []
            for target in TARGETS:
                user_id = self._follow_user(target)
                if user_id:
                    followed_ids.append(user_id)
                time.sleep(DELAY_RANGE[0] + 2)  # تأخير بين العمليات

            # فترة الانتظار
            self._warning_report(f"انتظار {60} ثانية...")
            time.sleep(60)

            # مرحلة إلغاء المتابعة
            for user_id in followed_ids:
                self._unfollow_user(user_id)
                time.sleep(DELAY_RANGE[0] + 2)

        except Exception as e:
            self._error_report(f"خطأ غير متوقع: {e}")
        finally:
            self.client.logout()
            self._success_report("تم إنهاء العملية بنجاح")

if __name__ == "__main__":
    bot = InstagramBot()
    bot.run_operation()  صلح جميع الاخطاء الموجودة فيه