بازگشت به وبلاگ

پروکسی برای ربات‌های دیسکورد: چگونه اتوماسیون را بدون مسدود شدن و محدودیت‌های نرخ تنظیم کنیم

راهنمای کامل تنظیم پروکسی برای ربات‌های دیسکورد: انتخاب نوع پروکسی، تنظیم چرخش IP، دور زدن محدودیت‌های نرخ و حفاظت در برابر بن‌ها در هنگام اتوماسیون.

📅۳۰ دی ۱۴۰۴
```html

دیسکورد به طور فعال با اتوماسیون و ربات‌ها مبارزه می‌کند و از سیستم‌های پیشرفته شناسایی استفاده می‌کند: تحلیل آدرس‌های IP، الگوهای رفتار و محدودیت‌های نرخ. اگر شما ربات‌هایی برای مدیریت، ارسال پیام یا اتوماسیون اقدامات در سرورها راه‌اندازی می‌کنید، بدون پروکسی‌های به درستی تنظیم شده، در ساعات اولیه کار با مسدود شدن مواجه خواهید شد. در این راهنما بررسی خواهیم کرد که کدام پروکسی‌ها برای دیسکورد مناسب هستند، چگونه چرخش IP را تنظیم کنیم و چگونه می‌توانیم از مکانیزم‌های حفاظتی پلتفرم عبور کنیم.

چرا دیسکورد ربات‌ها را مسدود می‌کند و چگونه محافظت کار می‌کند

دیسکورد از یک سیستم چند لایه برای محافظت در برابر اتوماسیون استفاده می‌کند که چندین پارامتر را به طور همزمان تحلیل می‌کند. این پلتفرم فقط تعداد درخواست‌ها از یک IP را بررسی نمی‌کند — بلکه پروفایل رفتار هر اتصال را می‌سازد و آن را با الگوهای کاربران عادی مقایسه می‌کند.

مکانیزم‌های اصلی شناسایی ربات‌ها در دیسکورد:

  • محدودیت‌های نرخ (Rate Limits) — دیسکورد محدودیت‌های سختی برای تعداد اقدامات در یک واحد زمان تعیین می‌کند. به عنوان مثال، حداکثر 5 پیام در 5 ثانیه از یک حساب کاربری، حداکثر 50 درخواست به API در دقیقه. تجاوز از محدودیت‌ها منجر به مسدود شدن موقت (HTTP 429) می‌شود.
  • تحلیل آدرس‌های IP — اگر چندین ربات از یک IP کار کنند یا فعالیت مشکوکی (تغییر سریع حساب‌ها، اقدامات انبوه) مشاهده شود، دیسکورد ممکن است کل آدرس IP را برای چند ساعت یا چند روز مسدود کند.
  • شناسایی اتصالات — پلتفرم پارامترهای فنی را تحلیل می‌کند: User-Agent، هدرهای درخواست، نسخه کتابخانه، زمان پاسخ. اگر پارامترها با مشتری عادی دیسکورد مطابقت نداشته باشد، حساب به عنوان مشکوک علامت‌گذاری می‌شود.
  • تحلیل رفتاری — دیسکورد الگوهای اقدامات را پیگیری می‌کند: واکنش‌های بسیار سریع، فاصله‌های ایده‌آل بین پیام‌ها، عدم تصادفی بودن در اقدامات. ربات‌هایی که بر اساس یک الگوریتم سخت کار می‌کنند، سریع‌تر شناسایی می‌شوند.

سناریوهای متداول مسدود شدن بدون پروکسی:

  • راه‌اندازی 3-5 ربات از یک IP خانگی — مسدود شدن IP در مدت 2-6 ساعت پس از شروع کار
  • ارسال انبوه دعوتنامه‌ها به سرور — مسدود شدن حساب و IP پس از 10-15 دعوتنامه ارسال شده
  • مدیریت خودکار (حذف پیام‌ها، اعطای نقش‌ها) — مسدود شدن در صورت تجاوز از 100 اقدام در ساعت از یک IP
  • تحلیل اعضای سرورها — شناسایی و مسدود شدن پس از اسکن 200-300 پروفایل

پروکسی‌ها این مشکلات را حل می‌کنند و درخواست‌ها را بین آدرس‌های IP مختلف توزیع می‌کنند و ظاهری از کاربران عادی از مکان‌های مختلف ایجاد می‌کنند. اما مهم است که نوع پروکسی را به درستی انتخاب کرده و چرخش را تنظیم کنید — پیکربندی نادرست می‌تواند منجر به مسدود شدن سریع‌تر شود.

کدام نوع پروکسی‌ها برای ربات‌های دیسکورد مناسب هستند

انتخاب نوع پروکسی به وظایف شما بستگی دارد: تعداد ربات‌ها، فرکانس درخواست‌ها، بودجه و سطح مورد نیاز ناشناسی. سه نوع اصلی پروکسی و کاربرد آن‌ها برای دیسکورد را بررسی خواهیم کرد.

نوع پروکسی مزایا معایب مناسب برای
پروکسی‌های دیتاسنتر سرعت بالا (پینگ 10-50 میلی‌ثانیه)، قیمت پایین (1-3 دلار برای هر IP در ماه)، ثبات دیسکورد به راحتی IP‌های دیتاسنتر را شناسایی می‌کند، خطر بالای مسدود شدن در صورت انجام اقدامات انبوه آزمایش، اتوماسیون آسان (1-2 ربات)، وظایف بدون درخواست‌های انبوه
پروکسی‌های مسکونی IP‌های واقعی کاربران خانگی، خطر حداقلی مسدود شدن، مجموعه بزرگ آدرس‌ها (میلیون‌ها IP) سرعت متوسط (پینگ 100-300 میلی‌ثانیه)، قیمت بالاتر (5-15 دلار برای هر گیگابایت ترافیک)، ناپایداری برخی IP‌ها ارسال انبوه، تحلیل سرورها، کار با 5+ ربات، پروژه‌های بلندمدت
پروکسی‌های موبایل IP‌های اپراتورهای موبایل (4G/5G)، حداکثر اعتماد دیسکورد، تغییر دینامیک IP قیمت بالا (50-150 دلار برای هر IP در ماه)، مجموعه کوچک‌تر آدرس‌ها، احتمال قطع اتصال حساب‌های حیاتی، دور زدن مسدودیت‌های سخت، کار با حساب‌های با ارزش بالا

توصیه‌ها برای انتخاب برای وظایف مختلف:

مدیریت و نظارت بر سرور (1-3 ربات): پروکسی‌های مسکونی با IP ثابت. یک ربات — یک IP، بدون چرخش. این یک پروفایل پایدار از اتصال ایجاد می‌کند که دیسکورد آن را به عنوان یک کاربر عادی-مدیر درک می‌کند.

ارسال انبوه و دعوتنامه‌ها (10+ ربات): پروکسی‌های مسکونی با چرخش هر 5-10 دقیقه. بار را توزیع کنید: حداکثر 20 اقدام در ساعت از یک IP. از مجموعه‌ای از 50+ آدرس IP برای 10 ربات استفاده کنید.

تحلیل اعضا و سرورها: پروکسی‌های مسکونی با چرخش سریع (هر 1-3 دقیقه) یا پروکسی‌های موبایل. تحلیل یکی از پرخطرترین فعالیت‌ها است، دیسکورد به راحتی الگوهای اسکن را شناسایی می‌کند. از تأخیرهای تصادفی بین درخواست‌ها (30-120 ثانیه) استفاده کنید.

آزمایش و توسعه: پروکسی‌های دیتاسنتر برای اشکال‌زدایی عملکرد کافی هستند. اما قبل از راه‌اندازی در تولید حتماً به پروکسی‌های مسکونی تغییر دهید — رفتار دیسکورد می‌تواند برای انواع مختلف IP به شدت متفاوت باشد.

نکته مهم: دیسکورد به طور خاص به آدرس‌های IP از کشورهای خاص و مناطق حساس است. IP‌های روسیه، چین، ویتنام و هند تحت بررسی‌های سخت‌گیرانه‌تری قرار می‌گیرند به دلیل فعالیت بالای اسپمرها. اگر مخاطب هدف شما در ایالات متحده یا اروپا است، از پروکسی‌های این مناطق استفاده کنید — این کار احتمال مسدود شدن را 40-60% کاهش می‌دهد.

چگونه می‌توان از محدودیت‌های نرخ دیسکورد از طریق پروکسی عبور کرد

محدودیت‌های نرخ در دیسکورد — محدودیت‌هایی برای تعداد درخواست‌ها به API در یک واحد زمان هستند. این محدودیت‌ها به دو نوع تقسیم می‌شوند: جهانی (برای کل برنامه) و per-route (برای نقاط پایانی خاص). پروکسی‌ها به توزیع بار بین IP‌های مختلف کمک می‌کنند، اما این به این معنا نیست که می‌توانید محدودیت‌ها را نادیده بگیرید — دیسکورد فعالیت‌ها را در سطح توکن ربات پیگیری می‌کند.

محدودیت‌های اصلی API دیسکورد:

  • ارسال پیام‌ها: 5 پیام در 5 ثانیه در یک کانال، 50 پیام در 10 ثانیه به طور کلی برای ربات
  • ایجاد/حذف کانال‌ها: 50 درخواست در 10 دقیقه
  • تغییر نقش‌های اعضا: 10 درخواست در 10 ثانیه
  • دریافت لیست اعضا: 1 درخواست در ثانیه (سخت‌ترین محدودیت)
  • ارسال DM (پیام‌های خصوصی): 5 DM در 5 ثانیه، مسدود شدن به دلیل ارسال انبوه به کاربران ناشناس

زمانی که شما از محدودیت تجاوز کنید، دیسکورد HTTP 429 (بسیاری از درخواست‌ها) را با هدر Retry-After باز می‌گرداند که زمان انتظار را به ثانیه‌ها نشان می‌دهد. پردازش صحیح این پاسخ به شدت مهم است.

استراتژی دور زدن محدودیت‌های نرخ با پروکسی:

# مثال در Python (discord.py) با چرخش پروکسی در هنگام محدودیت نرخ

import discord
from discord.ext import commands
import aiohttp
import asyncio
import random

class ProxyRotator:
    def __init__(self, proxy_list):
        self.proxies = proxy_list  # ['http://user:pass@ip:port', ...]
        self.current_index = 0
        self.failed_proxies = set()
    
    def get_next_proxy(self):
        # پروکسی‌های غیرعملکردی را رد می‌کنیم
        available = [p for p in self.proxies if p not in self.failed_proxies]
        if not available:
            self.failed_proxies.clear()  # ریست پس از یک چرخه کامل
            available = self.proxies
        
        proxy = available[self.current_index % len(available)]
        self.current_index += 1
        return proxy
    
    def mark_failed(self, proxy):
        self.failed_proxies.add(proxy)

# راه‌اندازی
proxy_rotator = ProxyRotator([
    'http://user1:pass1@192.168.1.1:8080',
    'http://user2:pass2@192.168.1.2:8080',
    # ... 10-20 پروکسی برای عملکرد پایدار اضافه کنید
])

intents = discord.Intents.default()
bot = commands.Bot(command_prefix='!', intents=intents)

async def send_with_retry(channel, message, max_retries=3):
    """ارسال پیام با پردازش خودکار محدودیت‌های نرخ"""
    for attempt in range(max_retries):
        try:
            # در هر تلاش یک پروکسی جدید دریافت می‌کنیم
            proxy = proxy_rotator.get_next_proxy()
            
            # Discord.py از aiohttp درون استفاده می‌کند، پروکسی را تنظیم می‌کنیم
            connector = aiohttp.TCPConnector()
            async with aiohttp.ClientSession(connector=connector) as session:
                bot.http.connector = connector
                bot.http.proxy = proxy
                
                await channel.send(message)
                return True
                
        except discord.HTTPException as e:
            if e.status == 429:  # محدودیت نرخ
                retry_after = e.retry_after if hasattr(e, 'retry_after') else 5
                print(f"محدودیت نرخ! منتظر {retry_after} ثانیه، تغییر پروکسی...")
                
                # پروکسی را به عنوان موقتا غیرقابل دسترس علامت‌گذاری می‌کنیم
                proxy_rotator.mark_failed(proxy)
                
                # تأخیر تصادفی اضافه کنید
                await asyncio.sleep(retry_after + random.uniform(1, 3))
            else:
                print(f"خطا در ارسال: {e}")
                await asyncio.sleep(2)
    
    return False

@bot.event
async def on_ready():
    print(f'ربات راه‌اندازی شد: {bot.user}')

# مثال استفاده
@bot.command()
async def массовая_рассылка(ctx):
    channels = ctx.guild.text_channels[:5]  # اولین 5 کانال
    
    for channel in channels:
        success = await send_with_retry(channel, "پیام آزمایشی")
        if success:
            print(f"ارسال شده در {channel.name}")
        
        # تأخیر تصادفی بین کانال‌ها
        await asyncio.sleep(random.uniform(3, 7))
    

اصول کلیدی دور زدن محدودیت‌های نرخ:

  • همیشه HTTP 429 را پردازش کنید: هدر Retry-After را نادیده نگیرید. دیسکورد زمان مسدودیت را در صورت نقض‌های مکرر افزایش می‌دهد (از 5 ثانیه به 60 و بیشتر).
  • تصادفی بودن را اضافه کنید: تأخیرها بین درخواست‌ها باید تصادفی باشند (به عنوان مثال، 2-5 ثانیه به جای 3 ثانیه ثابت). این رفتار انسانی را شبیه‌سازی می‌کند.
  • بار را توزیع کنید: اگر 10 ربات و 20 پروکسی دارید، به هر ربات 2 پروکسی برای چرخش اختصاص دهید. از یک پروکسی برای همه ربات‌ها استفاده نکنید.
  • کیفیت پروکسی‌ها را نظارت کنید: برخی IP‌ها ممکن است قبلاً توسط دیسکورد مسدود شده باشند. به طور خودکار پروکسی‌هایی را که به طور مداوم 403 یا 429 دریافت می‌کنند، حذف کنید.

استراتژی‌های چرخش IP برای وظایف مختلف

چرخش پروکسی — این فقط تغییر تصادفی IP هر N دقیقه نیست. استراتژی صحیح به نوع فعالیت ربات و الزامات دیسکورد برای ثبات اتصال بستگی دارد. چهار رویکرد اصلی را بررسی خواهیم کرد.

1. IP ثابت (بدون چرخش)

زمان استفاده: ربات‌های مدیریتی، ربات‌های مدیریت سرور، ربات‌های موسیقی، ربات‌هایی که به طور مداوم در سرور حضور دارند.

منطق: یک ربات = یک آدرس IP برای تمام مدت کار (هفته‌ها، ماه‌ها). دیسکورد این نوع اتصال را به عنوان یک کاربر عادی-مدیر درک می‌کند که همیشه از یک مکان وارد می‌شود.

تنظیم:

# Python (discord.py) - پروکسی ثابت
import discord
from discord.ext import commands

PROXY = 'http://username:password@192.168.1.100:8080'

intents = discord.Intents.default()
bot = commands.Bot(command_prefix='!', intents=intents, proxy=PROXY)

# پروکسی برای تمام درخواست‌های این ربات استفاده خواهد شد
bot.run('YOUR_BOT_TOKEN')
    

مزایا: حداکثر ثبات، حداقل خطر مسدود شدن به دلیل IP، تنظیم آسان.

معایب: اگر IP مسدود شود، باید پروکسی را به صورت دستی تغییر دهید و جلسه ربات را دوباره ایجاد کنید.

2. چرخش بر اساس زمان

زمان استفاده: ربات‌های ارسال، ربات‌های با فعالیت متوسط (10-50 اقدام در ساعت)، تحلیل داده‌ها با فرکانس پایین.

منطق: IP هر 5-15 دقیقه بر اساس تایمر تغییر می‌کند، صرف نظر از تعداد درخواست‌ها. این رفتار کاربری را شبیه‌سازی می‌کند که به اینترنت متصل می‌شود (به عنوان مثال، اینترنت موبایل با IP دینامیک).

فواصل پیشنهادی:

  • فعالیت پایین (5-10 اقدام در ساعت): چرخش هر 10-15 دقیقه
  • فعالیت متوسط (20-40 اقدام در ساعت): چرخش هر 5-7 دقیقه
  • فعالیت بالا (50+ اقدام در ساعت): چرخش هر 2-3 دقیقه + چرخش اضافی در صورت محدودیت نرخ
# JavaScript (discord.js) - چرخش بر اساس زمان
const { Client, GatewayIntentBits } = require('discord.js');
const HttpsProxyAgent = require('https-proxy-agent');

const proxies = [
    'http://user1:pass1@ip1:port',
    'http://user2:pass2@ip2:port',
    'http://user3:pass3@ip3:port',
];

let currentProxyIndex = 0;

function getProxyAgent() {
    const proxy = proxies[currentProxyIndex];
    currentProxyIndex = (currentProxyIndex + 1) % proxies.length;
    return new HttpsProxyAgent(proxy);
}

const client = new Client({
    intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],
    rest: { agent: getProxyAgent() }
});

// چرخش هر 5 دقیقه
setInterval(() => {
    console.log('تغییر پروکسی...');
    client.rest.setAgent(getProxyAgent());
}, 5 * 60 * 1000);

client.login('YOUR_BOT_TOKEN');
    

3. چرخش بر اساس تعداد درخواست‌ها

زمان استفاده: تحلیل انبوه، اسکرپینگ اعضای سرورها، دعوت‌های خودکار.

منطق: IP پس از N درخواست انجام شده تغییر می‌کند (به عنوان مثال، هر 20-50 درخواست). این کار به توزیع بار به طور یکنواخت کمک می‌کند و از تجاوز به محدودیت‌های نامرئی دیسکورد در تعداد اقدامات از یک IP جلوگیری می‌کند.

مقادیر پیشنهادی N:

  • تحلیل اعضا: 30-50 درخواست در IP (برای جلوگیری از شناسایی الگوی اسکن)
  • ارسال DM: 10-15 پیام در IP (دیسکورد به ویژه نسبت به DM‌های انبوه سخت‌گیر است)
  • ایجاد دعوتنامه‌ها: 20-30 دعوتنامه در IP

4. چرخش تطبیقی (در صورت خطا)

زمان استفاده: ربات‌های حیاتی، کار با حساب‌های با ارزش بالا، دور زدن مسدودیت‌های سخت.

منطق: IP به طور خودکار در صورت دریافت خطاهای 429 (محدودیت نرخ)، 403 (ممنوع) یا تایم‌اوت‌ها تغییر می‌کند. سیستم IP‌های "بد" را به خاطر می‌سپارد و به طور موقت آن‌ها را از چرخش حذف می‌کند.

# Python - چرخش تطبیقی با لیست سیاه
import time
from collections import defaultdict

class AdaptiveProxyRotator:
    def __init__(self, proxies):
        self.proxies = proxies
        self.current = 0
        self.error_count = defaultdict(int)
        self.blacklist_until = {}  # {proxy: timestamp}
    
    def get_proxy(self):
        now = time.time()
        
        # پروکسی‌ها را در لیست سیاه فیلتر می‌کنیم
        available = [
            p for p in self.proxies 
            if p not in self.blacklist_until or self.blacklist_until[p] < now
        ]
        
        if not available:
            # اگر همه در لیست سیاه هستند، ریست کرده و منتظر می‌مانیم
            print("همه پروکسی‌ها در لیست سیاه هستند، منتظر 60 ثانیه...")
            time.sleep(60)
            self.blacklist_until.clear()
            available = self.proxies
        
        proxy = available[self.current % len(available)]
        self.current += 1
        return proxy
    
    def report_error(self, proxy, error_type):
        self.error_count[proxy] += 1
        
        # مسدودیت موقتی در صورت خطاهای مکرر
        if self.error_count[proxy] >= 3:
            blacklist_duration = 300  # 5 دقیقه
            self.blacklist_until[proxy] = time.time() + blacklist_duration
            print(f"پروکسی {proxy} به مدت {blacklist_duration} ثانیه در لیست سیاه است")
            self.error_count[proxy] = 0  # ریست شمارنده
    
    def report_success(self, proxy):
        # درخواست موفق - ریست شمارنده خطاها
        if proxy in self.error_count:
            self.error_count[proxy] = max(0, self.error_count[proxy] - 1)
    

رویکرد ترکیبی (توصیه می‌شود): از چرخش پایه‌ای بر اساس زمان (هر 5-10 دقیقه) + چرخش تطبیقی در صورت خطا استفاده کنید. این کار ثبات و واکنش سریع به مشکلات را تضمین می‌کند.

تنظیم پروکسی در کتابخانه‌های محبوب: discord.py و discord.js

تنظیم پروکسی را به صورت گام به گام در دو کتابخانه محبوب برای ایجاد ربات‌های دیسکورد بررسی خواهیم کرد. این مثال‌ها برای اکثر وظایف مناسب هستند و به راحتی می‌توانند به نیازهای شما سازگار شوند.

Discord.py (Python)

Discord.py از aiohttp برای درخواست‌های HTTP استفاده می‌کند. پروکسی از طریق پارامتر proxy در هنگام ایجاد مشتری یا از طریق تنظیم مستقیم جلسه HTTP تنظیم می‌شود.

گام 1: نصب وابستگی‌ها

pip install discord.py aiohttp aiohttp-socks
# aiohttp-socks برای پروکسی SOCKS5 نیاز است، برای HTTP/HTTPS الزامی نیست
    

گام 2: تنظیم پایه با یک پروکسی

import discord
from discord.ext import commands

# فرمت پروکسی: protocol://username:password@ip:port
PROXY = 'http://user:pass@192.168.1.100:8080'

intents = discord.Intents.default()
intents.message_content = True  # برای خواندن پیام‌ها

bot = commands.Bot(
    command_prefix='!',
    intents=intents,
    proxy=PROXY  # پروکسی برای تمام درخواست‌های HTTP
)

@bot.event
async def on_ready():
    print(f'ربات {bot.user} از طریق پروکسی متصل شد!')

@bot.command()
async def ping(ctx):
    await ctx.send(f'پونگ! تأخیر: {round(bot.latency * 1000)}ms')

bot.run('YOUR_BOT_TOKEN')
    

گام 3: تنظیم با چرخش پروکسی

import discord
from discord.ext import commands, tasks
import aiohttp
import random

PROXIES = [
    'http://user1:pass1@ip1:port',
    'http://user2:pass2@ip2:port',
    'http://user3:pass3@ip3:port',
]

class ProxyBot(commands.Bot):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.current_proxy = random.choice(PROXIES)
        self.proxy_rotation.start()
    
    @tasks.loop(minutes=5)  # چرخش هر 5 دقیقه
    async def proxy_rotation(self):
        old_proxy = self.current_proxy
        self.current_proxy = random.choice([p for p in PROXIES if p != old_proxy])
        
        # جلسه HTTP را با پروکسی جدید دوباره ایجاد می‌کنیم
        await self.http.close()
        connector = aiohttp.TCPConnector(limit=0)
        self.http.connector = connector
        self.http.__session = aiohttp.ClientSession(connector=connector)
        
        print(f'پروکسی تغییر کرد: {old_proxy} -> {self.current_proxy}')
    
    async def close(self):
        self.proxy_rotation.cancel()
        await super().close()

intents = discord.Intents.default()
bot = ProxyBot(command_prefix='!', intents=intents)

bot.run('YOUR_BOT_TOKEN')
    

Discord.js (Node.js)

Discord.js پشتیبانی داخلی از پروکسی ندارد، بنابراین از کتابخانه https-proxy-agent یا socks-proxy-agent استفاده می‌شود.

گام 1: نصب وابستگی‌ها

npm install discord.js https-proxy-agent
# برای SOCKS5: npm install socks-proxy-agent
    

گام 2: تنظیم پایه

const { Client, GatewayIntentBits } = require('discord.js');
const { HttpsProxyAgent } = require('https-proxy-agent');

const PROXY = 'http://user:pass@192.168.1.100:8080';
const agent = new HttpsProxyAgent(PROXY);

const client = new Client({
    intents: [
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMessages,
        GatewayIntentBits.MessageContent
    ],
    rest: { agent: agent }  // پروکسی برای درخواست‌های REST API
});

client.on('ready', () => {
    console.log(`ربات ${client.user.tag} از طریق پروکسی متصل شد!`);
});

client.on('messageCreate', async (message) => {
    if (message.content === '!ping') {
        await message.reply(`پونگ! تأخیر WebSocket: ${client.ws.ping}ms`);
    }
});

client.login('YOUR_BOT_TOKEN');
    

گام 3: چرخش پروکسی

const { Client, GatewayIntentBits } = require('discord.js');
const { HttpsProxyAgent } = require('https-proxy-agent');

const PROXIES = [
    'http://user1:pass1@ip1:port',
    'http://user2:pass2@ip2:port',
    'http://user3:pass3@ip3:port',
];

let currentProxyIndex = 0;

function getNextProxy() {
    const proxy = PROXIES[currentProxyIndex];
    currentProxyIndex = (currentProxyIndex + 1) % PROXIES.length;
    return new HttpsProxyAgent(proxy);
}

const client = new Client({
    intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],
    rest: { agent: getNextProxy() }
});

// چرخش هر 10 دقیقه
setInterval(() => {
    const newAgent = getNextProxy();
    client.rest.setAgent(newAgent);
    console.log('پروکسی تغییر کرد');
}, 10 * 60 * 1000);

client.on('ready', () => {
    console.log(`ربات ${client.user.tag} راه‌اندازی شد`);
});

client.login('YOUR_BOT_TOKEN');
    

مهم: اتصال WebSocket (برای دریافت رویدادها در زمان واقعی) همیشه از پروکسی پشتیبانی نمی‌کند. اگر با اتصال از طریق WebSocket مشکل دارید، فقط از پروکسی HTTP برای درخواست‌های REST API استفاده کنید و WebSocket را بدون پروکسی بگذارید. برای موارد حیاتی، استفاده از VPN به جای پروکسی برای اتصال WebSocket را در نظر بگیرید.

اشتباهات متداول و چگونه می‌توان از آن‌ها جلوگیری کرد

حتی با پروکسی‌های به درستی تنظیم شده، ممکن است با مسدودیت مواجه شوید اگر اشتباهات رایج را مرتکب شوید. بیایید به بررسی بحرانی‌ترین آن‌ها و راه‌حل‌های آن‌ها بپردازیم.

اشتباه 1: استفاده از یک پروکسی برای همه ربات‌ها

مشکل: شما 5-10 ربات را از طریق یک آدرس IP راه‌اندازی می‌کنید. دیسکورد فعالیت همزمان چندین حساب کاربری را از یک IP مشاهده می‌کند و همه حساب‌ها + خود IP را مسدود می‌کند.

راه‌حل: قانون "یک ربات — یک IP منحصر به فرد" برای عملکرد پایدار. اگر 10 ربات دارید، حداقل از 10 پروکسی مختلف استفاده کنید. برای پروژه‌های حیاتی، 50-100% ذخیره (15-20 پروکسی برای 10 ربات) برای چرخش اضافه کنید.

اشتباه 2: چرخش IP بسیار سریع

مشکل: شما هر 30-60 ثانیه IP را تغییر می‌دهید، فکر می‌کنید که این کار شما را از مسدود شدن محافظت می‌کند. در واقع، دیسکورد تغییر مکرر IP را به عنوان فعالیت مشکوک درک می‌کند — یک کاربر عادی هر دقیقه به اینترنت متصل نمی‌شود.

راه‌حل: حداقل فاصله چرخش — 3-5 دقیقه. بهینه — 5-15 دقیقه بسته به شدت درخواست‌ها. استثنا — چرخش تطبیقی در صورت دریافت محدودیت نرخ (429).

اشتباه 3: نادیده گرفتن جغرافیای پروکسی

مشکل: ربات شما "در" سروری در ایالات متحده زندگی می‌کند، اما از پروکسی‌ای از روسیه، چین یا هند استفاده می‌کند. دیسکورد عدم تطابق بین مکان اعلام شده سرور و آدرس IP را مشاهده می‌کند که مشکوکیت را افزایش می‌دهد.

راه‌حل: از پروکسی‌هایی استفاده کنید که در همان کشور/منطقه‌ای قرار دارند که سرور دیسکورد یا مخاطب هدف شما قرار دارد. برای پروژه‌های بین‌المللی، پروکسی‌هایی از ایالات متحده یا اروپا انتخاب کنید — آن‌ها در دیسکورد شهرت بهتری دارند.

اشتباه 4: عدم پردازش خطاها

مشکل: ربات HTTP 429 (محدودیت نرخ) دریافت می‌کند و به ارسال درخواست‌ها ادامه می‌دهد و وضعیت را بدتر می‌کند. دیسکورد با هر تلاش زمان مسدودیت را افزایش می‌دهد.

راه‌حل: همیشه کدهای خطا را پردازش کنید:

  • 429 (بسیاری از درخواست‌ها): هدر Retry-After را بخوانید و زمان مشخص شده + 1-3 ثانیه منتظر بمانید. پروکسی را تغییر دهید.
  • 403 (ممنوع): IP یا توکن مسدود شده است. پروکسی را تغییر دهید، اعتبار توکن را بررسی کنید.
  • 401 (غیرمجاز): توکن ربات نامعتبر است. توکن را در Discord Developer Portal بررسی کنید.
  • 502/504 (خطاهای دروازه): مشکلات با پروکسی یا API دیسکورد. 10-30 ثانیه منتظر بمانید، پروکسی را تغییر دهید.

اشتباه 5: استفاده از پروکسی‌های عمومی یا ارزان

مشکل: پروکسی‌های رایگان یا ارزان (0.5-1 دلار برای هر IP) معمولاً قبلاً توسط دیسکورد مسدود شده‌اند، زیرا هزاران ربات و اسپمر دیگر از آن‌ها استفاده کرده‌اند.

راه‌حل: در پروکسی‌های مسکونی با کیفیت از ارائه‌دهندگان معتبر سرمایه‌گذاری کنید. قبل از استفاده از اعتبار IP‌ها را بررسی کنید (سرویس‌هایی مانند AbuseIPDB، IPQualityScore). یک پروکسی با کیفیت به قیمت 5-10 دلار بهتر از 10 پروکسی مسدود شده به قیمت 1 دلار است.

اشتباه 6: استفاده از User-Agent یکسان برای همه ربات‌ها

مشکل: همه ربات‌های شما از User-Agent استاندارد کتابخانه استفاده می‌کنند (به عنوان مثال، "DiscordBot (discord.py 2.0)"). دیسکورد به راحتی این اتصالات را گروه‌بندی کرده و اتوماسیون انبوه را شناسایی می‌کند.

راه‌حل: User-Agent را بین ربات‌ها متغیر کنید. از مقادیر واقعی استفاده کنید:

# Python - User-Agent سفارشی
import discord

class CustomBot(discord.Client):
    async def request(self, *args, **kwargs):
        # User-Agent را بازنویسی می‌کنیم
        if 'headers' not in kwargs:
            kwargs['headers'] = {}
        kwargs['headers']['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Discord/1.0.9015'
        return await super().request(*args, **kwargs)
    

نظارت بر عملکرد ربات‌ها و پردازش خطاها

نظارت صحیح به شناسایی مشکلات قبل از اینکه منجر به مسدودیت‌های انبوه شود، کمک می‌کند. بیایید به بررسی معیارهای کلیدی و ابزارهای نظارت بر عملکرد ربات‌های دیسکورد از طریق پروکسی بپردازیم.

معیارها برای نظارت

معیار چه چیزی را نظارت کنیم مقادیر بحرانی
فرکانس خطاهای 429 تعداد خطاهای محدودیت نرخ در ساعت >10 در ساعت — استراتژی درخواست‌ها را بررسی کنید
فرکانس خطاهای 403 مسدودیت‌های IP یا توکن‌ها >3 در روز — پروکسی به خطر افتاده است
تأخیر (latency) زمان پاسخ پروکسی + API دیسکورد >1000ms — پروکسی کند، آن را تغییر دهید
موفقیت درخواست‌ها درصد درخواست‌های موفق (HTTP 200-299) <85% — مشکلات با پروکسی یا منطق ربات
زمان کار پروکسی چقدر طولانی پروکسی بدون مشکل استفاده شده است <24 ساعت — ممکن است IP مسدود شده باشد

مثال سیستم لاگ‌گذاری

# Python - لاگ‌گذاری پیشرفته با معیارها
import logging
import time
from collections import defaultdict
import json

class BotMonitor:
    def __init__(self):
        self.metrics = {
            'requests_total': 0,
            'requests_success': 0,
            'errors_429': 0,
            'errors_403': 0,
            'errors_other': 0,
            'proxy_switches': 0,
            'avg_latency': []
        }
        self.proxy_stats = defaultdict(lambda: {
            'requests': 0,
            'errors': 0,
            'last_error': None
        })
        
        # تنظیم لاگر
        logging.basicConfig(
            level=logging.INFO,
            format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
            handlers=[
                logging.FileHandler('bot_monitor.log'),
                logging.StreamHandler()
            ]
        )
        self.logger = logging.getLogger('BotMonitor')
    
    def log_request(self, proxy, status_code, latency):
        self.metrics['requests_total'] += 1
        self.metrics['avg_latency'].append(latency)
        self.proxy_stats[proxy]['requests'] += 1
        
        if 200 <= status_code < 300:
            self.metrics['requests_success'] += 1
        elif status_code == 429:
            self.metrics['errors_429'] += 1
            self.proxy_stats[proxy]['errors'] += 1
            self.logger.warning(f'محدودیت نرخ در پروکسی {proxy}')
        elif status_code == 403:
            self.metrics['errors_403'] += 1
            self.proxy_stats[proxy]['errors'] += 1
            self.proxy_stats[proxy]['last_error'] = time.time()
            self.logger.error(f'پروکسی {proxy} مسدود شده است (403)')
        else:
            self.metrics['errors_other'] += 1
            self.logger.error(f'خطا {status_code} در پروکسی {proxy}')
    
    def log_proxy_switch(self, old_proxy, new_proxy):
        self.metrics['proxy_switches'] += 1
        self.logger.info(f'تغییر پروکسی: {old_proxy} -> {new_proxy}')
    
    def get_report(self):
        total = self.metrics['requests_total']
        if total == 0:
            return "داده‌ای وجود ندارد"
        
        success_rate = (self.metrics['requests_success'] / total) * 100
        avg_latency = sum(self.metrics['avg_latency']) / len(self.metrics['avg_latency'])
        
        report = f"""
=== گزارش نظارت ربات ===
تعداد کل درخواست‌ها: {total}
موفق: {self.metrics['requests_success']} ({success_rate:.1f}%)
خطاهای 429 (محدودیت نرخ): {self.metrics['errors_429']}
خطاهای 403 (مسدودیت): {self.metrics['errors_403']}
سایر خطاها: {self.metrics['errors_other']}
میانگین تأخیر: {avg_latency:.0f}ms
تغییر پروکسی: {self.metrics['proxy_switches']}

=== آمار پروکسی ===
"""
        for proxy, stats in self.proxy_stats.items():
            error_rate = (stats['errors'] / stats['requests'] * 100) if stats['requests'] > 0 else 0
            report += f"{proxy}: {stats['requests']} درخواست، {stats['errors']} خطا ({error_rate:.1f}%)\n"
        return report
    

با توجه به تمام موارد فوق، می‌توان نتیجه گرفت که استفاده از پروکسی‌های مناسب و تنظیم صحیح آن‌ها می‌تواند به شما در جلوگیری از مسدود شدن در دیسکورد کمک کند. با رعایت نکات و استراتژی‌های مطرح شده، می‌توانید از ربات‌های خود به طور مؤثری استفاده کنید و از مشکلات احتمالی جلوگیری کنید.

```