Cookies: urlgen, mid. Как Instagram палит меня под proxy?
Привет!
Написал скрипт на Python для парсинга инста-аккаунтов. Для того, чтобы сбор информации не затягивался надолго, распараллелил запросы, а для каждого потока стал использовать отдельный публичный прокси (подтягиваю их пачками из библиотеки proxy).
И вдруг выяснилось, что инстаграму пофигу на прокси, он всё равно понимает, что я это я.. (разумеется, скрипт работает без авторизации)
В результате исследования удалось обнаружить, что Инстаграм просто-напросто присылает каждому потоку Cookies со следующими интересными параметрами:
1. Cookie mid= (здесь какой-то хэш, абсолютно одинаковый для каждого потока)
2. Cookie urlgen={а вот здесь пара мой_реальный_IP: порт}
Уважаемые знатоки, вопрос:
как, чёрт возьми, Инстаграм понимает, что "вот этот вот запрос из Эфиопии на самом деле - Вася Пупкин из Бибирево"?! Я ведь не логинюсь! Ожидается, что для инсты это неопознаный запрос от неавторизованного юзера.
Я использую либу requests, создаю объект session и через session.proxies.update докидываю туда свежий прокси, после чего выполняю анонимный (как оказалось - нет) запрос. WTF?! Как такое может быть?
Пользуюсь вот этой либой https://pypi.org/project/py-proxy/
Просто получаю прокси и в формате {"http": "http://ip:port"} складываю в session.proxies (session - инстанс requests.Session)
После выполняю запрос.
thereisnonickname, так ты сессию создаешь))) сделай обычные reqiests.get или под каждую группу запросов делай свой объект(для каждого объекта свой прокси)
thereisnonickname, так ты пытаешься http-прокси применить к https протоколу, тебе нужны https или socks прокси. Дока.
Словарь с прокси должен выглядеть так {"https": "https://ip:port"}
AlexBoss, всё правильно. Я для каждого треда я создаю сессию, в хидеры помещаю индивидуальный User Agent, через session.proxies.update добавляю прокси. Я тоже сначала подумал, что каждый тред использует одинаковый инстанс - подебажил через print(id(session)) - объекты, разумеется, разные.
З.Ы. Через requests.get с проксями та же песня - как только инста банит один тред, остальные тут же уходят в нокаут, а значит, разницы, между использованием session.get и requests.get в моём кейсе нет.
Я уже всю камасутру перепробовал, чтобы инсту нагнуть, но пока наоборот..
AWEme, хммм... Вот оно что! То есть, requests вместо того, чтобы сказать мне "Чувак, твой прокси невалиден для данного запроса" просто молча идёт на сервер под моим реальным айпи?!
Премного благодарен! Проверю..
AlexBoss, так ведь меня бы устроило сохранение куков, если бы там не было моего реального айпишника, а был прокси. Беда то не в том, что они сейвятся. Бан я получаю и без сессии.
Там выше подсказали, что я прокси с неверной схемой использую: http, вместо https. Вполне вероятно, моя проблема возникает из-за этого.
Что удалось выяснить на данный момент:
1) Действительно, схема была не верной
2) Публичные прокси не годятся для парсинга инсты: из пачки бесплатных прокси (~120 штук), только 5-6 может получить респонс постучавшись на https://www.instagram.com, да и те все\почти все уже забанены.
Очевидно, что не все зависит от прокси. Возможно, что он распознает ваше устройство.
ID компьютера — это индивидуальный номер, выраженный в шестнадцатеричной системе счисления и напрямую привязанный к сетевой карте. Именно под этим номером, вне зависимости от того, использует юзер Windows, Linux или macOS, устройство видно в сети — и именно по ID, в отличие от IP, его реально найти.
Так что копайте в этом направлении. Короче, вам нужно менять данные устройства. Одним прокси не обойдешься.
Нет, дело не в MAC-адресе.
У инсты в данном случае вообще доступа к маку нет.
Всё оказалось несколько проще: я не обратил внимание на то, добавляю прокси для http схемы, хотя должен был для https (так как шёл я на https://www.instagram.com), поэтому библиотека requests, не обнаружив прокси с нужной схемой, просто выполняла запрос с моего реального IP.
urlgen="{\"194.34.***.***\": 35048} мне он присылает прокси, которое использую, только на другом порте. Работает на всех моих прокси, со всеми акками, очевидно твой косяк.