Skip to content
Advanced / 1 min read

ChangeMyIP روی Linux: پایپ‌لاین پیشرفته ردیابی رتبه به تفکیک کشور

یک پایپ‌لاین زمان‌بندی‌شده و بازار‌به‌بازار برای بررسی رتبه روی Linux بسازید که IPهای خروجی ChangeMyIP را می‌چرخاند، در هر بررسی کشور خروج را تأیید می‌کند، و نتایج قابل مقایسه‌ای را ثبت می‌کند که می‌توانید به آن اعتماد کنید.

لینوکس HTTP(S) پایش سئو سایر

نمای کلی

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

این آموزش یک پایپ‌لاین پیشرفته و زمان‌بندی‌شده برای بررسی رتبه روی Linux می‌سازد که از IPهای خروجی ChangeMyIP برای هر بازار استفاده می‌کند. شما:

  • نقطه پایانی پروکسی و هویت خروج را پیش از هر دسته تأیید کنید،
  • درخواست‌ها را از طریق HTTP/HTTPS یا SOCKS5 با تلاش مجدد، jitter و مدیریت timeout ارسال کنید،
  • پاسخ‌هایی را که از کشور مورد انتظار خارج نشده‌اند رد کنید،
  • نتایج را به یک لاگ JSONL قابل مقایسه اضافه کنید و کار را با cron زمان‌بندی کنید،
  • اعتبارنامه‌ها را خارج از اسکریپت‌ها و دور از کنترل نسخه نگه دارید.

ChangeMyIP پروکسی‌های اختصاصی و اشتراکی دیتاسنتر و پروکسی‌های مسکونی چرخشی را از طریق HTTP، SOCKS5، Shadowsocks، Trojan، DNS و WireGuard ارائه می‌دهد، که بیش از ۴۰ کشور، بیش از ۳۰۰ شهر و بیش از ۱۰۰۰ زیرشبکه را در بر می‌گیرد و بر پایه صورت‌حساب ماهانه ثابت ارائه می‌شود، که آن را به یک لایه خروجی عملی برای خزنده بازاری‌به‌بازار و تکرارشونده تبدیل می‌کند.

پیش‌نیازها

  • یک میزبان Linux با دسترسی شبکه خروجی (Debian/Ubuntu، Fedora یا مشابه).
  • Python 3.9 یا جدیدتر همراه با کتابخانه requests.
  • curl و jq برای تأیید دستی سریع.
  • یک اشتراک فعال ChangeMyIP، به‌همراه میزبان gateway، پورت پروتکل، نام کاربری و رمز عبوری که در داشبورد نشان داده شده است.
  • فهرستی از بازارهای هدف (برای مثال us، gb، de، jp، br) و صفحه‌هایی که می‌خواهید ردیابی کنید.

انتخاب بین خروجی دیتاسنتر و مسکونی

  • دیتاسنتر (اختصاصی یا اشتراکی) — سریع‌ترین و اقتصادی‌ترین گزینه برای هر بررسی. از آن برای بررسی‌های ثانویه با حجم بالا، پیمایش sitemap، و بازارهایی که شخصی‌سازی نتایج در آن‌ها موضوعیت ندارد استفاده کنید.
  • مسکونی (چرخشی) — آدرس‌های ISP مصرف‌کننده. از آن زمانی استفاده کنید که یک صفحه یا مجموعه نتایج باید مانند یک بازدیدکننده محلی واقعی به نظر برسد، و زمانی که محدوده‌های دیتاسنتر به چالش کشیده می‌شوند یا با محتوای تنزل‌یافته پاسخ داده می‌شوند.
  • مسیریابی ترکیبی — بازارهای حساس به جغرافیا را از طریق خروجی مسکونی بفرستید و دنباله بلند را روی دیتاسنتر نگه دارید. چون ChangeMyIP صورت‌حساب ماهانه ثابت دارد، افزودن حجم زمان‌بندی‌شده برای بودجه‌بندی آسان است.

هر گزینه‌ای را که انتخاب می‌کنید، کشور خروج را تأیید کنید، نه اینکه آن را فرض بگیرید.

مراحل

۱. جزئیات نقطه پایانی را جمع‌آوری و به‌صورت امن ذخیره کنید

وارد داشبورد ChangeMyIP شوید و میزبان gateway، پورت پروتکلی که استفاده می‌کنید (HTTP/HTTPS یا SOCKS5)، نام کاربری و رمز عبور خود را کپی کنید. آن‌ها را در یک فایل محیطی قابل‌خواندن فقط توسط root نگه دارید، نه داخل اسکریپت‌هایتان:

sudo install -d -m 700 /etc/cmip
sudo tee /etc/cmip/env >/dev/null <<'EOF'
CMIP_HOST=gateway-host-from-dashboard
CMIP_PORT=port-from-dashboard
CMIP_USER=your-username
CMIP_PASS=your-password
CMIP_SCHEME=http
EOF
sudo chmod 600 /etc/cmip/env

وقتی پورتی که به شما داده شده با SOCKS5 کار می‌کند و می‌خواهید DNS در پروکسی حل شود نه روی میزبان خودتان، CMIP_SCHEME را روی socks5h تنظیم کنید.

۲. ابزارهای موردنیاز را نصب کنید

sudo apt update
sudo apt install -y curl jq python3 python3-pip
python3 -m pip install --user requests

۳. یک درخواست واحد را از طریق پروکسی تأیید کنید

set -a; . /etc/cmip/env; set +a

curl -sS --max-time 20 \
  --proxy "${CMIP_SCHEME}://${CMIP_USER}:${CMIP_PASS}@${CMIP_HOST}:${CMIP_PORT}" \
  https://ipinfo.io/json | jq '{ip, city, region, country, org}'

آن را سه یا چهار بار اجرا کنید. در یک طرح چرخشی، IP خروج باید بین اجراها تغییر کند و هرگز نباید با آدرس ISP خودتان مطابقت داشته باشد. اگر خروجی اتصال خودتان است، پروکسی اصلاً اعمال نشده است.

۴. بازارها و هدف‌هایتان را در یک فایل توصیف کنید

{
  "markets": {
    "us": ["https://example.com/pricing"],
    "gb": ["https://example.com/pricing"],
    "de": ["https://example.com/pricing"]
  }
}

آن را به‌عنوان /etc/cmip/targets.json ذخیره کنید و کدهای بازار را طوری تنظیم کنید که با نقاط پایانی کشوری موجود در داشبورد ChangeMyIP شما مطابقت داشته باشند.

۵. پایپ‌لاین را با تأیید جغرافیایی در هر بررسی بنویسید

#!/usr/bin/env python3
'''Per-market rank checks through ChangeMyIP rotating proxies.'''
import json
import os
import random
import time
from pathlib import Path

import requests

HOST = os.environ['CMIP_HOST']
PORT = os.environ['CMIP_PORT']
USER = os.environ['CMIP_USER']
PASS = os.environ['CMIP_PASS']
SCHEME = os.environ.get('CMIP_SCHEME', 'http')

TARGETS = json.loads(Path('/etc/cmip/targets.json').read_text())
OUT = Path('/var/log/cmip/rank-checks.jsonl')
OUT.parent.mkdir(parents=True, exist_ok=True)


def proxy_url():
    return f'{SCHEME}://{USER}:{PASS}@{HOST}:{PORT}'


def get(session, url, retries=4):
    last = None
    for attempt in range(1, retries + 1):
        try:
            resp = session.get(url, timeout=25)
            resp.raise_for_status()
            return resp.text
        except requests.RequestException as exc:
            last = exc
            time.sleep(min(2 ** attempt + random.random(), 30))
    raise last


def run():
    for market, urls in TARGETS['markets'].items():
        session = requests.Session()
        session.proxies = {'http': proxy_url(), 'https': proxy_url()}
        session.headers['User-Agent'] = (
            'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 '
            '(KHTML, like Gecko) Chrome/124.0 Safari/537.36'
        )

        try:
            geo = json.loads(get(session, 'https://ipinfo.io/json'))
            exit_country = (geo.get('country') or '').lower()
        except (requests.RequestException, json.JSONDecodeError) as exc:
            print(f'{market}: geo check failed: {exc}')
            continue

        for url in urls:
            record = {
                'ts': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()),
                'market': market,
                'url': url,
                'exit_ip': geo.get('ip'),
                'exit_country': exit_country,
                'country_ok': exit_country == market,
            }
            try:
                body = get(session, url)
                record['bytes'] = len(body)
                record['status'] = 'ok'
            except requests.RequestException as exc:
                record['status'] = type(exc).__name__
            with OUT.open('a') as fh:
                fh.write(json.dumps(record) + '\n')
            print(record)


if __name__ == '__main__':
    run()

آن را به‌عنوان /opt/cmip/rank_check.py ذخیره کنید. پرچم country_ok همان چیزی است که گزارش‌دهی شما را صادق نگه می‌دارد: بررسی‌ای که از کشور اشتباه خارج شده همچنان ثبت می‌شود، اما می‌توانید آن را در ادامه کنار بگذارید.

چون یک طرح چرخشی می‌تواند به هر درخواست IP خروج متفاوتی بدهد، بررسی جغرافیایی و واکشی صفحه ممکن است از آدرس‌های متفاوتی خارج شوند. اگر داشبورد ChangeMyIP شما کنترل‌های نشست یا چرخش را ارائه می‌دهد، مانند طول نشست یا توکن نشست چسبان، برای هر بررسی یک IP خروج را پین کنید تا هر دو درخواست یک آدرس مشترک داشته باشند؛ در غیر این صورت country_ok را به‌عنوان یک سیگنال قوی برای دسته در نظر بگیرید، نه تضمینی برای هر واکشی منفرد.

۶. آن را یک بار در پیش‌زمینه اجرا کنید

set -a; . /etc/cmip/env; set +a
python3 /opt/cmip/rank_check.py

پیش از زمان‌بندی هر چیزی، لاگ را بررسی کنید:

jq -s 'group_by(.market) | map({market: .[0].market, checks: length, ok: (map(select(.country_ok)) | length)})' /var/log/cmip/rank-checks.jsonl

۷. کار را زمان‌بندی کنید

17 */6 * * * set -a; . /etc/cmip/env; set +a; /usr/bin/python3 /opt/cmip/rank_check.py >> /var/log/cmip/run.log 2>&1

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

۸. تاریخچه را مقایسه کنید به‌جای بازخوانی اجراهای تکی

jq -r 'select(.country_ok) | [.ts, .market, .url] | @tsv' /var/log/cmip/rank-checks.jsonl | tail -n 40

IP خروج را برای هر نقطه پایانی بازار تأیید کنید

این بلوک را برای هر نقطه پایانی کشوری که در داشبورد ChangeMyIP نمایش داده شده یک بار تکرار کنید، و CMIP_SCHEME، CMIP_USER، CMIP_PASS، CMIP_HOST و CMIP_PORT مربوطه را برای هر کدام export کنید:

set -a; . /etc/cmip/env; set +a

for attempt in 1 2 3; do
  curl -sS --max-time 20 \
    --proxy "${CMIP_SCHEME}://${CMIP_USER}:${CMIP_PASS}@${CMIP_HOST}:${CMIP_PORT}" \
    https://ipinfo.io/json | jq -r '[.country, .city, .ip, .org] | @tsv'
done

کشورهایی را که واقعاً به دست می‌آورید ثبت کنید. آن‌ها بازارهایی هستند که می‌توانید با اطمینان درباره‌شان گزارش دهید.

عیب‌یابی

نشانه علت احتمالی کاری که باید انجام دهید
407 Proxy Authentication Required اعتبارنامه‌ها گم شده‌اند، اشتباه تایپ شده‌اند، یا شامل کاراکترهایی هستند که نیاز به کدگذاری URL دارند مقادیر داشبورد را دوباره بررسی کنید و کاراکترهای رزروشده در رمز عبور را قبل از ساخت URL پروکسی به‌صورت درصدی کدگذاری کنید، برای مثال @ به %40 تبدیل می‌شود
curl: (7) یا پایان مهلت اتصال پورت اشتباه، یا استفاده از پورت HTTP با طرح SOCKS5 پورتی را که با پروتکل انتخاب‌شده مطابقت دارد دوباره کپی کنید
کشور خروج به‌طور مداوم بازار درخواستی شما نیست هدف‌گیری کشوری برای آن نقطه پایانی یا پورت اعمال نشده، یا چرخش منطقه دیگری را انتخاب کرده است از نقطه پایانی مخصوص کشور که در داشبورد فهرست شده استفاده کنید و اگر آن کنترل وجود دارد یک نشست را پین کنید
429 یا 503 از سایت هدف سرعت درخواست‌ها بیش از حد تهاجمی است فاصله بین درخواست‌ها را افزایش دهید، jitter اضافه کنید، و بازارها را در سراسر زمان‌بندی پخش کنید
شکست در دست‌دادن TLS عدم تطابق طرح و پورت طرح socks5h را روی پورت SOCKS5 متناظر امتحان کنید
رفتار با بررسی دستی مرورگر متفاوت است کوکی‌ها، کش، یا user agent متفاوت برای هر بازار یک requests.Session را دوباره استفاده کنید و هدرها را بین اجراها یکسان نگه دارید
DNS به نظر می‌رسد محلی حل می‌شود طرح پروکسی HTTP نام‌ها را روی میزبان شما حل می‌کند به socks5h سوئیچ کنید تا جستجوها در پروکسی انجام شوند
فایل لاگ بدون محدودیت رشد می‌کند سیاست چرخش یا نگهداری وجود ندارد logrotate را اضافه کنید یا ورودی‌های قدیمی‌تر از پنجره نگهداری خود را هرس کنید

خلاصه

  • یک بررسی رتبه تنها زمانی معتبر است که بدانید از کدام کشور خارج شده است؛ تأیید جغرافیایی در مقیاس بزرگ اختیاری نیست.
  • خروجی مسکونی چرخشی ChangeMyIP برای بررسی‌های دقیق از نظر بازار مناسب است، در حالی که خروجی دیتاسنتر اختصاصی یا اشتراکی برای کارهای حجمی مناسب است؛ صورت‌حساب ماهانه ثابت بودجه را قابل پیش‌بینی نگه می‌دارد.
  • پایپ‌لاین را با ثبت country_ok برای هر رکورد و فیلتر کردن بر اساس آن در ادامه، صادق نگه دارید.
  • هر نقطه پایانی کشوری را پیش از اعتماد به یک زمان‌بندی خودکار به‌صورت دستی تأیید کنید، و هر بار که بازاری اضافه می‌کنید آن تأیید را دوباره اجرا کنید.
  • با مسئولیت‌پذیری پیش بروید: سرعت یکنواخت، تلاش‌های مجدد با jitter، و یک نشست برای هر بازار، هر بار از زور خالص بهتر عمل می‌کند.