OlegYurchik / pyInstagram

This is a simple and easy-to-use library for interacting with the Instagram. The library works through the web interface of the Instagram and does not depend on the official API
MIT License
232 stars 49 forks source link

{"message": "rate limited", "status": "fail"} после 20 запросов #15

Closed DronPop closed 6 years ago

DronPop commented 6 years ago

Начинаю выполнять запросы на получения списка подписчиков пользователя. Между запросами ставлю лимит от 2 до 5 секунд (генерируется рандом) После того как выполняется ровно 20 запросов на получения списка подписчиков приходит следующий response:

URL: https://www.instagram.com/graphql/query/?variables=%7B%22id%22:%20%22173560420%22,%22first%22:%2050,%20%22after%22:%20%22AQACNoprgVo3RSN3mRE1foncGhn4jwjw9KBpd36fxO4jrJUvnIVZGGldCO2zDKxkI1ke-rxTsq7TRQog9vmusPjzpeN4s9hhyUYsbE1PWn3_pg%22%7D&query_hash=7dd9a7e2160524fd85f50317462cff9f } { Status Code: 429, Headers {
    "Cache-Control" =     (
        "private, no-cache, no-store, must-revalidate"
    );
    "Content-Language" =     (
        en
    );
    "Content-Length" =     (
        45
    );
    "Content-Type" =     (
        "application/json"
    );
    Date =     (
        "Sat, 11 Aug 2018 20:11:21 GMT"
    );
    Expires =     (
        "Sat, 01 Jan 2000 00:00:00 GMT"
    );
    Pragma =     (
        "no-cache"
    );
    "Set-Cookie" =     (
        "csrftoken=bSdgZZBMiNXLxHVcJbzvJCUksyuK4Bcu; Domain=.instagram.com; expires=Sat, 10 Aug 2019 20:11:21 GMT; Max-Age=31449600; Path=/; Secure",
        "rur=ATN; Domain=.instagram.com; Path=/",
        "urlgen=\"{\\\"time\\\": 1534018235}:1foaEL:0MicuwUpk6mGYyY8-ImUKpCcf80\"; Domain=.instagram.com; Path=/"
    );
    "Strict-Transport-Security" =     (
        "max-age=60"
    );
    Vary =     (
        "Cookie, Accept-Language"
    );
    "x-frame-options" =     (
        SAMEORIGIN
    );
} }

Таким образом мне удаётся загрузить всего 1000 подписчиков. Самое забавное, что я сразу открываю браузер и начинаю там скролить подписчиков какого нибудь популярного человека (Cristiano например). И там всё окей Хотя запросы выполняются чаще. В Chrome, в консоли разработчика помимо запросов на получения подписчиков также раз в какое то время посылается logging_client_events. Думаю дело в этом. Но недавно где то читал, что если включить Add Block, то он блокирует запрос logging_client_events, но при этом всё равно всё отлично работает. Есть какие нибудь идеи как Инстаграм понимает, что к нему обращает не web-версия и как это можно обойти?

OlegYurchik commented 6 years ago

Это странно, так как у меня всё работает хорошо и 429 выскакивает только после значительного числа запросов. Вы используете последнюю версию библиотеки? Та, что в ветке мастер? И не могли бы вы попробовать запустить тесты и выложить их результаты?

DronPop commented 6 years ago

Пишу аналогичную библиотеку под Swift. Я помимо заголовков, которые добавляете вы, добавлял ещё следующие: ''' urlRequest.addValue("XMLHttpRequest", forHTTPHeaderField: "X-Requested-With") urlRequest.addValue(csrfToken, forHTTPHeaderField: "x-csrftoken") ''' В этом случае лимит запросов сокращается с 200 до 20, но при этом появляется получать список лайков без авторизации.

OlegYurchik commented 6 years ago

Просмотрел запросы в веб-версии, странно, так как веб-версия не добавляет заголовок x-csrftoken в запросы, но X-Requested-With добавлю на всякий случай, лишним не будет, думаю. Спасибо)