Skip to content
Advanced / 5 min read

ChangeMyIP di Linux: Pipeline Pelacakan Peringkat Lanjutan per Negara

Bangun pipeline pemeriksaan peringkat terjadwal per pasar di Linux yang merotasi IP egress ChangeMyIP, memverifikasi negara keluar pada setiap pemeriksaan, dan mencatat hasil yang dapat di-diff dan dapat dipercaya.

Linux HTTP(S) Pemantauan SEO Lainnya

Ringkasan

Pelacakan peringkat hanya sepercaya IP yang Anda gunakan untuk kueri. Ketika setiap pemeriksaan dalam kampanye multi-pasar keluar melalui satu alamat, endpoint pencarian dan analitik dapat mengembalikan respons yang di-cache, dipersonalisasi, atau dibatasi, dan angka yang Anda laporkan tidak lagi mencerminkan apa yang sebenarnya dilihat pengunjung lokal.

Tutorial ini membangun pipeline pemeriksaan peringkat lanjutan yang terjadwal di Linux yang menggunakan IP egress ChangeMyIP per pasar. Anda akan:

  • memastikan endpoint proxy dan identitas keluar sebelum setiap batch,
  • mengirim permintaan melalui HTTP/HTTPS atau SOCKS5 dengan penanganan retry, jitter, dan timeout,
  • menolak respons yang tidak keluar dari negara yang diharapkan,
  • menambahkan hasil ke log JSONL yang dapat di-diff dan menjadwalkan tugas dengan cron,
  • menjaga kredensial di luar skrip Anda dan di luar kontrol versi.

ChangeMyIP menyediakan proxy datacenter khusus dan bersama serta proxy residensial berotasi melalui HTTP, SOCKS5, Shadowsocks, Trojan, DNS, dan WireGuard, mencakup 40+ negara, 300+ kota, dan 1000+ subnet dengan penagihan bulanan tetap, yang menjadikannya lapisan egress praktis untuk crawler berulang per pasar.

Prasyarat

  • Host Linux dengan akses jaringan keluar (Debian/Ubuntu, Fedora, atau serupa).
  • Python 3.9 atau lebih baru dengan pustaka requests.
  • curl dan jq untuk verifikasi manual cepat.
  • Langganan ChangeMyIP yang aktif, plus host gateway, port protokol, nama pengguna, dan kata sandi yang ditampilkan di dashboard Anda.
  • Daftar pasar target (misalnya us, gb, de, jp, br) dan halaman yang ingin Anda lacak.

Memilih Antara Egress Datacenter dan Residensial

  • Datacenter (khusus atau bersama) — opsi tercepat dan paling ekonomis per pemeriksaan. Gunakan untuk pemeriksaan sekunder bervolume tinggi, polling sitemap, dan pasar di mana personalisasi hasil bukan tujuan utamanya.
  • Residensial (berotasi) — alamat ISP konsumen. Gunakan ketika halaman atau kumpulan hasil harus terlihat seperti pengunjung lokal asli, dan ketika rentang datacenter ditantang atau dijawab dengan konten yang menurun.
  • Perutean campuran — kirim pasar sensitif geografis melalui egress residensial dan pertahankan long tail di datacenter. Karena ChangeMyIP menagih bulanan tetap, menambahkan volume terjadwal mudah dianggarkan.

Apa pun yang Anda pilih, verifikasi negara keluar alih-alih mengasumsikannya.

Langkah-langkah

1. Kumpulkan detail endpoint dan simpan dengan aman

Masuk ke dashboard ChangeMyIP dan salin host gateway, port untuk protokol yang akan Anda gunakan (HTTP/HTTPS atau SOCKS5), nama pengguna, dan kata sandi Anda. Simpan dalam file environment yang dapat dibaca root, bukan di dalam skrip Anda:

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

Setel CMIP_SCHEME ke socks5h ketika port yang diberikan kepada Anda berbicara SOCKS5 dan Anda ingin DNS diselesaikan di proxy, bukan di host Anda.

2. Pasang toolchain

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

3. Verifikasi satu permintaan melalui proxy

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}'

Jalankan tiga atau empat kali. Pada paket berotasi, IP keluar harus berubah antar-jalankan, dan tidak boleh sama dengan alamat ISP Anda sendiri. Jika outputnya adalah koneksi Anda sendiri, proxy tidak diterapkan sama sekali.

4. Deskripsikan pasar dan target Anda dalam satu file

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

Simpan sebagai /etc/cmip/targets.json dan setel kode pasar agar cocok dengan endpoint negara yang tersedia di dashboard ChangeMyIP Anda.

5. Tulis pipeline dengan verifikasi geo per pemeriksaan

#!/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()

Simpan sebagai /opt/cmip/rank_check.py. Flag country_ok inilah yang menjaga pelaporan Anda jujur: pemeriksaan yang keluar dari negara yang salah tetap dicatat, tetapi Anda dapat mengecualikannya di hilir.

Karena paket berotasi dapat memberikan IP keluar yang berbeda untuk setiap permintaan, pemeriksaan geo dan pengambilan halaman mungkin keluar dari alamat yang berbeda. Jika dashboard ChangeMyIP Anda mengekspos kontrol sesi atau rotasi, seperti durasi sesi atau token sesi sticky, pin satu IP keluar per pemeriksaan agar kedua permintaan berbagi alamat; jika tidak, perlakukan country_ok sebagai sinyal kuat untuk batch, bukan jaminan untuk setiap pengambilan individual.

6. Jalankan sekali di foreground

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

Periksa log sebelum Anda menjadwalkan apa pun:

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

7. Jadwalkan tugas

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

Buat menitnya bertahap alih-alih menjalankan semuanya tepat pada jam, dan jaga total volume sesuai dengan kapasitas paket ChangeMyIP Anda.

8. Diff riwayat alih-alih membaca ulang satu kali jalan

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

Verifikasi IP Keluar untuk Setiap Endpoint Pasar

Ulangi blok ini sekali per endpoint negara yang ditampilkan di dashboard ChangeMyIP Anda, dengan mengekspor CMIP_SCHEME, CMIP_USER, CMIP_PASS, CMIP_HOST, dan CMIP_PORT yang sesuai untuk masing-masing:

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

Catat negara yang benar-benar Anda dapatkan. Itulah pasar yang dapat Anda laporkan dengan yakin.

Pemecahan Masalah

Gejala Kemungkinan penyebab Tindakan
407 Proxy Authentication Required Kredensial hilang, salah ketik, atau berisi karakter yang perlu pengodean URL Periksa kembali nilai dashboard dan persen-encode karakter reserved di kata sandi sebelum membangun URL proxy, misalnya @ menjadi %40
curl: (7) atau koneksi timeout Port salah, atau port HTTP digunakan dengan skema SOCKS5 Salin ulang port yang cocok dengan protokol yang Anda pilih
Negara keluar secara konsisten bukan pasar yang Anda minta Penargetan negara tidak diterapkan pada endpoint atau port tersebut, atau rotasi memilih wilayah lain Gunakan endpoint khusus negara yang tercantum di dashboard Anda dan pin sesi jika kontrol itu tersedia
429 atau 503 dari situs target Laju permintaan terlalu agresif Tingkatkan jeda antar-permintaan, tambahkan jitter, dan sebarkan pasar di seluruh jadwal
Kegagalan handshake TLS Ketidakcocokan skema dan port Coba skema socks5h terhadap port SOCKS5 yang cocok
Perilaku berbeda dari pemeriksaan browser manual Cookie, caching, atau user agent yang berbeda Gunakan kembali satu requests.Session per pasar dan jaga header konsisten antar-jalankan
DNS tampaknya diselesaikan secara lokal Skema proxy HTTP menyelesaikan nama di host Anda Beralih ke socks5h agar pencarian terjadi di proxy
File log tumbuh tanpa batas Tidak ada rotasi atau kebijakan retensi Tambahkan logrotate atau pangkas entri yang lebih lama dari jendela retensi Anda

Ringkasan

  • Pemeriksaan peringkat hanya valid ketika Anda tahu dari negara mana pemeriksaan itu keluar; verifikasi geo bukan opsional dalam skala besar.
  • Egress residensial berotasi ChangeMyIP cocok untuk pemeriksaan yang akurat per pasar, sedangkan egress datacenter khusus atau bersama cocok untuk pekerjaan bervolume; penagihan bulanan tetap membuat anggaran tetap terprediksi.
  • Jaga pipeline tetap jujur dengan mencatat country_ok per record dan memfilternya di hilir.
  • Verifikasi setiap endpoint negara secara manual sebelum mempercayai jadwal otomatis, dan jalankan ulang verifikasi itu setiap kali Anda menambahkan pasar.
  • Tingkatkan secara bertanggung jawab: pacing yang stabil, retry dengan jitter, dan satu sesi per pasar akan selalu mengalahkan brute force.