from instagrapi import Client
from instagrapi.exceptions import ChallengeRequired, ClientError
import time
import random
import os
from pathlib import Path

class InstagramGrowthBot:
    def __init__(self):
        self.cl = Client()
        self.SESSION_FILE = "ig_session.json"
        self.cl.delay_range = [1, 3]
        self.actions_today = 0
        self.MAX_ACTIONS = 150
        self.DELAY_RANGE = (8, 25)
        self.username = ""
        self.load_session()

    def load_session(self):
        if Path(self.SESSION_FILE).exists():
            try:
                self.cl.load_settings(self.SESSION_FILE)
                self.cl.get_timeline_feed()
                self.username = self.cl.account_info().username
                print("✅ تم استعادة الجلسة بنجاح!")
                self.show_daily_stats()
                return True
            except Exception as e:
                print(f"❌ الجلسة منتهية: {e}")
                os.remove(self.SESSION_FILE)
        return False

    def save_session(self):
        self.cl.dump_settings(self.SESSION_FILE)
        print("🔒 تم حفظ الجلسة!")

    def safe_login(self):
        if self.load_session():
            return
            
        print("\n" + "="*30)
        print("🎭 تسجيل الدخول إلى إنستجرام")
        self.username = input("أدخل اسم المستخدم: ").strip()
        password = input("أدخل كلمة المرور: ").strip()

        try:
            self.cl.login(self.username, password)
            print(f"\n✅ تم تسجيل الدخول كـ {self.username} بنجاح!")
            self.save_session()
            self.show_daily_stats()
        except ChallengeRequired:
            self.handle_challenge()
        except ClientError as e:
            print(f"\n❌ خطأ في التسجيل: {e}")
            exit()

    def handle_challenge(self):
        print("\n⚠️ يلزم تأكيد الهوية (تم إرسال رمز إلى بريدك أو رقم الهاتف)")
        code = input("أدخل الرمز المكون من 6 أرقام: ").strip()
        try:
            self.cl.challenge_resolve(self.cl.last_json, code)
            print("✅ تم تأكيد الهوية بنجاح!")
            self.save_session()
            self.show_daily_stats()
        except Exception as e:
            print(f"❌ فشل التأكيد: {e}")
            exit()

    def show_daily_stats(self):
        print("\n" + "="*30)
        print(f"📊 إحصائيات اليوم ({time.strftime('%Y-%m-%d')}):")
        print(f"- الإجراءات المتبقية: {self.MAX_ACTIONS - self.actions_today}")
        print(f"- الإجراءات المستخدمة: {self.actions_today}")
        if self.actions_today >= self.MAX_ACTIONS * 0.8:
            print("\n⚠️ اقتربت من الحد اليومي!")

    def human_delay(self):
        delay = random.uniform(*self.DELAY_RANGE)
        print(f"\n⏳ انتظر {delay:.1f} ثانية...", end="", flush=True)
        time.sleep(delay)
        print("\r" + " "*30 + "\r", end="")

    def interactive_menu(self):
        while True:
            print("\n" + "="*30)
            print("📱 قائمة التحكم الرئيسية:")
            print("1. التفاعل مع المنشورات")
            print("2. متابعة الحسابات")
            print("3. نشر محتوى")
            print("4. الإحصائيات")
            print("5. الخروج")
            
            choice = input("\nاختر إجراء (1-5): ").strip()
            
            if choice == "1":
                self.run_interaction_flow()
            elif choice == "2":
                self.run_follow_flow()
            elif choice == "3":
                self.run_post_flow()
            elif choice == "4":
                self.show_daily_stats()
            elif choice == "5":
                self.cl.logout()
                print("\n✅ تم تسجيل الخروج!")
                exit()
            else:
                print("\n❌ خيار غير صحيح!")

    def run_interaction_flow(self):
        print("\n" + "="*30)
        print("💬 تفاعل مع المنشورات")
        hashtags = self.select_hashtags()
        amount = self.get_number_input("عدد المنشورات (10-50): ", 10, 50)
        self.engage_with_content(hashtags, amount)

    def run_follow_flow(self):
        print("\n" + "="*30)
        print("👥 متابعة الحسابات")
        hashtags = self.select_hashtags()
        amount = self.get_number_input("عدد المتابعات (5-30): ", 5, 30)
        self.smart_follow(hashtags, amount)

    def run_post_flow(self):
        print("\n" + "="*30)
        print("📤 نشر محتوى جديد")
        image_path = input("مسار الصورة: ").strip()
        
        if not os.path.exists(image_path):
            print("\n❌ الملف غير موجود!")
            return
            
        caption = input("وصف المنشور: ").strip()
        hashtags = self.select_hashtags()
        self.post_content(image_path, caption, hashtags)

    def select_hashtags(self):
        print("\n" + "-"*20)
        print("اختر فئة الهاشتاجات:")
        categories = [
            ["تصوير", "فن", "إبداع"],
            ["تكنولوجيا", "برمجة", "ذكاء_اصطناعي"],
            ["رياضة", "لياقة", "صحة"]
        ]
        
        for i, cat in enumerate(categories, 1):
            print(f"{i}. {' '.join(f'#{h}' for h in cat)}")
            
        choice = self.get_number_input("اختر فئة (1-3): ", 1, 3)
        return categories[choice-1]

    def get_number_input(self, prompt, min_val, max_val):
        while True:
            try:
                num = int(input(prompt))
                if min_val <= num <= max_val:
                    return num
                print(f"يجب أن يكون بين {min_val}-{max_val}!")
            except ValueError:
                print("أدخل رقمًا صحيحًا!")

    def engage_with_content(self, hashtags, amount):
        for hashtag in hashtags:
            try:
                posts = self.cl.hashtag_medias_recent(hashtag, amount=amount)
                for post in posts:
                    if self.actions_today >= self.MAX_ACTIONS:
                        return
                    if not post.has_liked:
                        self.cl.media_like(post.id)
                        print(f"♥️ إعجاب: @{post.user.username}")
                        self.actions_today += 1
                        self.human_delay()
                        if random.random() < 0.3:
                            comments = ["رائع 👏", "إبداع ❤️", "جميل 😍"]
                            self.cl.media_comment(post.id, random.choice(comments))
                            self.actions_today += 1
                            self.human_delay()
            except ClientError as e:
                print(f"❌ خطأ في #{hashtag}: {e}")

    def smart_follow(self, hashtags, limit):
        followed_users = set()
        for hashtag in hashtags:
            try:
                posts = self.cl.hashtag_medias_recent(hashtag, amount=50)
                for post in posts:
                    user_id = post.user.pk
                    try:
                        user_info = self.cl.user_info(user_id)
                        friendship = self.cl.user_friendship(user_id)
                        if self.actions_today >= self.MAX_ACTIONS or user_id in followed_users:
                            break
                        if not friendship.following:
                            self.cl.user_follow(user_id)
                            followed_users.add(user_id)
                            print(f"→ متابعة: @{user_info.username}")
                            self.actions_today += 1
                            self.human_delay()
                        if len(followed_users) >= limit:
                            break
                    except Exception as e:
                        print(f"❌ خطأ في معالجة المستخدم: {e}")
                        continue
            except ClientError as e:
                print(f"❌ خطأ في #{hashtag}: {e}")

    def post_content(self, image_path, caption, hashtags):
        if self.actions_today >= self.MAX_ACTIONS:
            return
        try:
            caption += "\n\n" + " ".join(f"#{h}" for h in hashtags[:25])
            self.cl.photo_upload(image_path, caption=caption)
            print("✅ تم النشر بنجاح!")
            self.actions_today += 1
        except ClientError as e:
            print(f"❌ خطأ في النشر: {e}")

if __name__ == "__main__":
    bot = InstagramGrowthBot()
    bot.safe_login()
    bot.interactive_menu()   from instagrapi import Client
from instagrapi.exceptions import ChallengeRequired, ClientError
import time
import random
import os
from pathlib import Path

class InstagramGrowthBot:
    def __init__(self):
        self.cl = Client()
        self.SESSION_FILE = "ig_session.json"
        self.cl.delay_range = [1, 3]
        self.actions_today = 0
        self.MAX_ACTIONS = 150
        self.DELAY_RANGE = (8, 25)
        self.username = ""
        self.load_session()

    def load_session(self):
        if Path(self.SESSION_FILE).exists():
            try:
                self.cl.load_settings(self.SESSION_FILE)
                self.cl.get_timeline_feed()
                self.username = self.cl.account_info().username
                print("✅ تم استعادة الجلسة بنجاح!")
                self.show_daily_stats()
                return True
            except Exception as e:
                print(f"❌ الجلسة منتهية: {e}")
                os.remove(self.SESSION_FILE)
        return False

    def save_session(self):
        self.cl.dump_settings(self.SESSION_FILE)
        print("🔒 تم حفظ الجلسة!")

    def safe_login(self):
        if self.load_session():
            return
            
        print("\n" + "="*30)
        print("🎭 تسجيل الدخول إلى إنستجرام")
        self.username = input("أدخل اسم المستخدم: ").strip()
        password = input("أدخل كلمة المرور: ").strip()

        try:
            self.cl.login(self.username, password)
            print(f"\n✅ تم تسجيل الدخول كـ {self.username} بنجاح!")
            self.save_session()
            self.show_daily_stats()
        except ChallengeRequired:
            self.handle_challenge()
        except ClientError as e:
            print(f"\n❌ خطأ في التسجيل: {e}")
            exit()

    def handle_challenge(self):
        print("\n⚠️ يلزم تأكيد الهوية (تم إرسال رمز إلى بريدك أو رقم الهاتف)")
        code = input("أدخل الرمز المكون من 6 أرقام: ").strip()
        try:
            self.cl.challenge_resolve(self.cl.last_json, code)
            print("✅ تم تأكيد الهوية بنجاح!")
            self.save_session()
            self.show_daily_stats()
        except Exception as e:
            print(f"❌ فشل التأكيد: {e}")
            exit()

    def show_daily_stats(self):
        print("\n" + "="*30)
        print(f"📊 إحصائيات اليوم ({time.strftime('%Y-%m-%d')}):")
        print(f"- الإجراءات المتبقية: {self.MAX_ACTIONS - self.actions_today}")
        print(f"- الإجراءات المستخدمة: {self.actions_today}")
        if self.actions_today >= self.MAX_ACTIONS * 0.8:
            print("\n⚠️ اقتربت من الحد اليومي!")

    def human_delay(self):
        delay = random.uniform(*self.DELAY_RANGE)
        print(f"\n⏳ انتظر {delay:.1f} ثانية...", end="", flush=True)
        time.sleep(delay)
        print("\r" + " "*30 + "\r", end="")

    def interactive_menu(self):
        while True:
            print("\n" + "="*30)
            print("📱 قائمة التحكم الرئيسية:")
            print("1. التفاعل مع المنشورات")
            print("2. متابعة الحسابات")
            print("3. نشر محتوى")
            print("4. الإحصائيات")
            print("5. الخروج")
            
            choice = input("\nاختر إجراء (1-5): ").strip()
            
            if choice == "1":
                self.run_interaction_flow()
            elif choice == "2":
                self.run_follow_flow()
            elif choice == "3":
                self.run_post_flow()
            elif choice == "4":
                self.show_daily_stats()
            elif choice == "5":
                self.cl.logout()
                print("\n✅ تم تسجيل الخروج!")
                exit()
            else:
                print("\n❌ خيار غير صحيح!")

    def run_interaction_flow(self):
        print("\n" + "="*30)
        print("💬 تفاعل مع المنشورات")
        hashtags = self.select_hashtags()
        amount = self.get_number_input("عدد المنشورات (10-50): ", 10, 50)
        self.engage_with_content(hashtags, amount)

    def run_follow_flow(self):
        print("\n" + "="*30)
        print("👥 متابعة الحسابات")
        hashtags = self.select_hashtags()
        amount = self.get_number_input("عدد المتابعات (5-30): ", 5, 30)
        self.smart_follow(hashtags, amount)

    def run_post_flow(self):
        print("\n" + "="*30)
        print("📤 نشر محتوى جديد")
        image_path = input("مسار الصورة: ").strip()
        
        if not os.path.exists(image_path):
            print("\n❌ الملف غير موجود!")
            return
            
        caption = input("وصف المنشور: ").strip()
        hashtags = self.select_hashtags()
        self.post_content(image_path, caption, hashtags)

    def select_hashtags(self):
        print("\n" + "-"*20)
        print("اختر فئة الهاشتاجات:")
        categories = [
            ["تصوير", "فن", "إبداع"],
            ["تكنولوجيا", "برمجة", "ذكاء_اصطناعي"],
            ["رياضة", "لياقة", "صحة"]
        ]
        
        for i, cat in enumerate(categories, 1):
            print(f"{i}. {' '.join(f'#{h}' for h in cat)}")
            
        choice = self.get_number_input("اختر فئة (1-3): ", 1, 3)
        return categories[choice-1]

    def get_number_input(self, prompt, min_val, max_val):
        while True:
            try:
                num = int(input(prompt))
                if min_val <= num <= max_val:
                    return num
                print(f"يجب أن يكون بين {min_val}-{max_val}!")
            except ValueError:
                print("أدخل رقمًا صحيحًا!")

    def engage_with_content(self, hashtags, amount):
        for hashtag in hashtags:
            try:
                posts = self.cl.hashtag_medias_recent(hashtag, amount=amount)
                for post in posts:
                    if self.actions_today >= self.MAX_ACTIONS:
                        return
                    if not post.has_liked:
                        self.cl.media_like(post.id)
                        print(f"♥️ إعجاب: @{post.user.username}")
                        self.actions_today += 1
                        self.human_delay()
                        if random.random() < 0.3:
                            comments = ["رائع 👏", "إبداع ❤️", "جميل 😍"]
                            self.cl.media_comment(post.id, random.choice(comments))
                            self.actions_today += 1
                            self.human_delay()
            except ClientError as e:
                print(f"❌ خطأ في #{hashtag}: {e}")

    def smart_follow(self, hashtags, limit):
        followed_users = set()
        for hashtag in hashtags:
            try:
                posts = self.cl.hashtag_medias_recent(hashtag, amount=50)
                for post in posts:
                    user_id = post.user.pk
                    try:
                        user_info = self.cl.user_info(user_id)
                        friendship = self.cl.user_friendship(user_id)
                        if self.actions_today >= self.MAX_ACTIONS or user_id in followed_users:
                            break
                        if not friendship.following:
                            self.cl.user_follow(user_id)
                            followed_users.add(user_id)
                            print(f"→ متابعة: @{user_info.username}")
                            self.actions_today += 1
                            self.human_delay()
                        if len(followed_users) >= limit:
                            break
                    except Exception as e:
                        print(f"❌ خطأ في معالجة المستخدم: {e}")
                        continue
            except ClientError as e:
                print(f"❌ خطأ في #{hashtag}: {e}")

    def post_content(self, image_path, caption, hashtags):
        if self.actions_today >= self.MAX_ACTIONS:
            return
        try:
            caption += "\n\n" + " ".join(f"#{h}" for h in hashtags[:25])
            self.cl.photo_upload(image_path, caption=caption)
            print("✅ تم النشر بنجاح!")
            self.actions_today += 1
        except ClientError as e:
            print(f"❌ خطأ في النشر: {e}")

if __name__ == "__main__":
    bot = InstagramGrowthBot()
    bot.safe_login()
    bot.interactive_menu()