eBay через IPv6 прокси: отслеживание лотов и снайпинг аукционов
Содержание
Почему eBay душит по IP
eBay смотрит на IP-адрес клиента. Не только на аккаунт. Система антифрода eBay (внутри называется "Risk Console") анализирует сотни сигналов при каждом запросе: IP, ASN, геолокация, поведение сессии, TLS fingerprint, HTTP/2-фреймы.
Один IP — одна сессия. При попытке открыть десять параллельных сессий с одного адреса начинаются проблемы. Сначала капча. Потом "Please verify your identity". Дальше — блокировка аккаунта без объяснений.
IPv6 меняет расклад. Провайдеры выдают /64 подсети, а часто /56 или /48. Это 2^64 адресов в одном /64. Даже если eBay забанит конкретный адрес — у тебя ещё 18 квинтиллионов.
Анатомия запроса к eBay
Каждый GET к лоту идёт через цепочку проверок. eBay видит:
- IP и ASN (по GeoIP-базе MaxMind)
- Accept-Language и часовой пояс
- User-Agent и его соответствие TLS-отпечатку
- Cookie `ebay`, `dp1`, `s` — сессионные маркеры
- Заголовок `X-Forwarded-For`, если идёшь через прокси
- Скорость запросов и паттерн навигации
Прокси на IPv6 решает первую проблему — IP. Остальные сигналы нужно подделывать самому. Прокси не сделает за тебя консистентный User-Agent.
```bash
curl -6 -x "http://user:pass@[2a01:4f8:c17:1234::1]:8080" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
-H "Accept-Language: en-US,en;q=0.9" \
-H "Accept: text/html,application/xhtml+xml" \
-s "https://www.ebay.com/itm/123456789012" -o lot.html
```
Флаг `-6` заставляет curl использовать IPv6. Без него curl пойдёт по IPv4, если DNS вернёт A-запись первой. Прокси в квадратных скобках — обязательный синтаксис для IPv6 в URL.
Отслеживание лотов без бана
Мониторинг лота — это периодический GET. Раз в минуту, раз в 30 секунд. eBay терпит такие запросы с одного IP, если их немного. Но у тебя не один лот. Их сто, двести, тысяча.
Тут начинается зоопарк. Тысяча лотов × опрос раз в 30 секунд = 2000 запросов в минуту. С одного IPv6-адреса это гарантированный бан через 5-10 минут. Нужна ротация адресов.
Схема простая: пул IPv6-адресов, round-robin по запросам, sticky-сессия на 10-20 запросов к одному адресу. eBay видит разные IP с одного /64 — это нормально, так делают мобильные операторы и корпоративные NAT.
```python
import requests
from itertools import cycle
from time import sleep
PROXIES = [
"http://user:pass@[2a01:4f8:c17:1234::1]:8080",
"http://user:pass@[2a01:4f8:c17:1234::2]:8080",
"http://user:pass@[2a01:4f8:c17:1234::3]:8080",
]
pool = cycle(PROXIES)
def fetch_lot(item_id, session):
proxy = next(pool)
url = f"https://www.ebay.com/itm/{item_id}"
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
"AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15",
"Accept-Language": "en-US,en;q=0.9",
}
r = session.get(url, headers=headers, proxies={"https": proxy}, timeout=15)
return r.status_code, len(r.text)
s = requests.Session()
for item in ["123456789012", "987654321098", "555666777888"]:
code, size = fetch_lot(item, s)
print(f"{item}: {code}, {size} bytes")
sleep(2)
```
Важный момент: `requests.Session` переиспользует TCP-соединение. С IPv6-прокси это плохо — keep-alive привязывает тебя к одному адресу. Либо отключай keep-alive, либо создавай новую сессию на каждый прокси. В примере выше сессия одна, но прокси меняется — соединения всё равно переиспользуются по хосту. Для честной ротации нужен `session.close()` между запросами.
Снайпинг: где решается исход
Снайпинг — ставка за 3-5 секунд до закрытия лота. eBay использует soft close: если ставка приходит в последние секунды, таймер продлевается. Но только если ставка валидна и принята сервером.
Задержка критична. Разложим по полочкам:
| Этап | Типичная задержка |
|------|-------------------|
| TCP handshake до прокси | 5-30 мс |
| TLS handshake (1.3) | 10-40 мс |
| Запрос через прокси к eBay | 20-80 мс |
| Обработка на стороне eBay | 50-200 мс |
| Ответ обратно | 20-80 мс |
Итого 100-400 мс от твоего сервера до eBay. Если прокси в Франкфурте, а eBay-датацентр в США — добавь 80-120 мс трансатлантики. Хреново, когда конкурент сидит на VPS в том же датацентре, что и eBay.
IPv6-прокси рядом с датацентром eBay даёт преимущество в 50-100 мс. Это разница между выигрышем и проигрышем на горячем лоте.
Синхронизация времени
Твой сервер должен знать точное время eBay. NTP с дефолтными настройками даёт точность ±50 мс. Этого мало. Нужен chrony с агрессивной синхронизацией или PTP.
```bash
chronyd -q 'server time.ebay.com iburst'
chronyc tracking
```
`chronyc tracking` покажет offset в микросекундах. Если больше 10 мс — снайпер промахнётся. eBay закрывает лот по своему таймеру, не по твоему.
Ставка через API vs веб-форма
eBay имеет Trading API и Browse API. Ставка через `PlaceOffer` в Trading API работает, но требует OAuth-токена и привязана к аккаунту. Прокси тут помогает только от геоблока — сам API не так чувствителен к IP, как веб.
Веб-форма ставки — другое дело. Тут каждый запрос проходит через Risk Console. Нужны валидные cookies, `X-CSRF-Token`, правильный `Referer`. Собрать это программно — та ещё задача.
```python
def place_bid(session, item_id, amount, proxy, csrf, cookies):
url = f"https://www.ebay.com/bfl/viewbids/{item_id}"
headers = {
"X-CSRF-Token": csrf,
"Referer": f"https://www.ebay.com/itm/{item_id}",
"Content-Type": "application/json",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
}
payload = {"bidAmount": {"value": amount, "currency": "USD"}}
r = session.post(url, json=payload, headers=headers,
proxies={"https": proxy},
cookies=cookies, timeout=10)
return r.json()
```
CSRF-токен живёт минуты. Его нужно обновлять перед каждой ставкой. Cookies — тоже. Снайпер за 3 секунды до конца не успеет сходить за токеном. Значит, токен добывается заранее, за 30-60 секунд, и держится в памяти.
Геолокация и ASN
eBay фильтрует по стране. Российские IP видят одни цены, американские — другие. Некоторые лоты вообще недоступны для шиппинга за пределы США. IPv6-прокси с американским ASN решает это.
Но ASN тоже проверяется. Residential IPv6 из Comcast или Verizon выглядит натуральнее, чем /64 из Hetzner. eBay знает диапазоны хостингов. Если твой IPv6 из датацентра — риск выше.
На практике: datacenter IPv6 проходит для просмотра лотов. Для ставок лучше residential. Разница в цене — в разы. Residential IPv6 от \$3-5 за адрес в месяц, datacenter — центы.
Ротация и лимиты
Сколько запросов держит один IPv6-адрес? Эмпирика:
- Просмотр лотов: 200-500 запросов/час без капчи
- Поиск: 50-100 запросов/час
- Ставки: 5-10/час с одного адреса
- Логин: 1-2/час, дальше верификация
Превышение — капча. Дальше — бан адреса на 24-48 часов. IPv6-адрес банится целиком, но /64 остаётся доступен. Меняешь адрес — работаешь дальше.
Пул из 50-100 IPv6-адресов держит мониторинг 1000 лотов с опросом раз в минуту. Каждый адрес получает 10-20 запросов в минуту — в пределах нормы.
Прокси-цепочка через lexic.ml
Когда нужна ротация по странам и ASN, удобно использовать готовый пул. Сервис вроде lexic.ml даёт IPv6-адреса в разных подсетях и геозонах, что снимает головную боль с самостоятельным развёртыванием /64 на VPS.
Схема: получаешь список прокси, грузишь в свой пул, ротируешь по алгоритму. Sticky-сессии обычно держатся 1-10 минут. Для снайпинга нужна фиксация адреса за 5 минут до ставки — чтобы eBay не увидел смену IP в момент ставки.
Обработка капчи
Капча от eBay — это либо PerimeterX, либо внутренняя. PerimeterX отдаёт JS-челлендж, который решается в headless-браузере. Чистый HTTP-клиент не пройдёт.
Варианты:
- Playwright + stealth-плагины
- Решение капчи через сервис (2captcha, anti-captcha)
- Смена IP и повтор запроса
Третий вариант дешевле. Если капча появилась — адрес уже помечен. Меняй и не мучайся. Первые два нужны, когда аккаунт ценный и IP менять нельзя.
Логирование и отладка
Без логов снайпер — чёрный ящик. Логируй каждый запрос: timestamp с миллисекундами, IP прокси, статус, размер ответа, время ответа.
```bash
curl -6 -x "http://user:pass@[2a01:4f8:c17:1234::1]:8080" \
-w "%{time_total} %{time_connect} %{time_starttransfer} %{http_code}\n" \
-o /dev/null -s "https://www.ebay.com/itm/123456789012"
```
`time_connect` покажет TCP-хендшейк, `time_starttransfer` — время до первого байта. Если `time_connect` вырос с 20 до 200 мс — прокси деградировал, меняй.
Что убивает снайпер
Классические грабли:
- Часы на сервере ушли на 200 мс — ставка пришла после закрытия
- Прокси сменился в момент ставки — eBay увидел новый IP, потребовал верификацию
- CSRF-токен протух — ставка не прошла
- eBay продлил таймер из-за ставки конкурента — ты ставил на старый дедлайн
- Твой IP попал в чёрный список из-за соседа по /64
Последнее особенно неприятно. Если кто-то на соседнем адресе в твоём /64 занимался ерундой, весь /64 может быть помечен. Поэтому лучше брать адреса из разных /64, а не пачку из одной подсети.
Итого
IPv6-прокси для eBay — необходимость при массовом мониторинге и снайпинге. Один адрес не выдержит нагрузку. Пул из 50-100 адресов решает. Ключевые точки: ротация без разрыва сессии в момент ставки, синхронизация часов до 10 мс, валидные CSRF-токены и cookies, геолокация под целевой рынок.
Снайпинг — это не про скорость интернета. Это про задержку до сервера eBay, точность часов и отсутствие палева по IP. Прокси закрывает треть задачи. Остальное — твой код и дисциплина.