Я копался в Instagram GraphQL, пытаясь понять, как это работает.Я выяснил, откуда берутся переменные query_hash, id и after.От анализа профиля JSON и хэша от другого .js.
Пока все хорошо.
Но когда я пытаюсь собрать это вместе в качестве запроса, я получаю 403 выполнениеошибка назад.
variables = '{"id":"%s","first":12,"after":"%s"}' %(OwnerID, end_cursor)
encoded_vars = urllib.quote(variables, safe='"')
url = 'https://www.instagram.com/graphql/query/?query_hash=%s&variables=%s' % (QueryHash, encoded_vars)
print(url)
Исходя из того, что я могу сделать с браузером, это должно работать, насколько я могу разобрать.Поэтому в заголовках должно быть что-то не так.
Это не может быть аутентификация, потому что браузер, который не вошел в систему, может выполнять эти вызовы, и он будет работать нормально.Так что это что-то в заголовках, специфичных для этого сеанса.
Я попытался обернуть все в сеансе с помощью
with requests.Session() as session:
Первоначальный запрос к странице профиля, а затем запрос к url
сделано с той же сессии.Если я правильно понимаю, это должно иметь те же заголовки, что и браузер.
Я абсолютно ошарашен и 8 часов на него напортачу.Если бы кто-нибудь мог дать мне толчок в правильном направлении, я был бы признателен.
Обновление:
Хорошо, похоже, сессия не работает так, как я думал.Заголовки не соответствуют тому, что будет делать браузер.
Я выкинул session.headers
, и после того, как Googling вокруг для того, что там есть, добавил немного к заголовкам:
x_instagram_gis = hashlib.md5(rhx_gis.encode()).hexdigest()
session.headers.update({'x-instagram-gis': x_instagram_gis})
session.headers.update({'x-requested-with': 'XMLHttpRequest'})
session.headers.update({'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'})
Я разобрал ГИС и закодировал его.х-запрашиваемый-с совпадает с запросом браузера, а пользовательский агент просто кажется здравым смыслом.
Я действительно не знаю, что еще попробовать.Я знаю, что есть альтернативные способы сделать это, но я пытался понять, как работает API.
Обновление 2:
Хорошо, я понимаю, почему сеанс не работал.Конечно, это не сработало.Заголовок браузера устанавливается с помощью javascript, иначе мне не пришлось бы извлекать хеш и т. Д. Отдельно.Doi.
Теперь рассмотрим другие заголовки в Chrome.Там есть печенье и из того, что я собираю, которое обрабатывается сессией.Есть обычные вещи, такие как принятие кодировки и реферер.Есть заголовки, такие как: путь: и: авторитет: но здесь мое нечеткое понимание становится еще хуже.Я не могу отправить эти заголовки, если удаление двоеточий не приведет к тому же результату.
Так что же такое обратный инжиниринг?Черт тонны проб и ошибок?