Доступ к пагинационным URL-адресам Instagram через CURL - PullRequest
0 голосов
/ 11 марта 2019

Я разрабатываю простую программу для очистки страницы общедоступного пользователя и получения всей его ленты. Идея состоит в том, чтобы хранить в файле много строк, каждая из которых содержит объект JSON, такой как возвращаемый при разбиении на страницы (что-то вроде {"data":{"user":{"edge_owner_to_timeline_media":{ ... }}}).

До сих пор мне удалось успешно запросить страницу пользователя и получить необходимые токены для создания следующего запроса:

  • GET-запрос на https://instagram.com/username/ для извлечения HTML.

  • При этом я сохраняю первую строку файла JSON, удаляя все в ответе между <script type=\"text/javascript\">window._sharedData = "; и ;</script>, где можно найти объект JS, в котором пользовательская информация вложена в несколько узлов ( ["entry_data"]["ProfilePage"][0]["graphql"]["user"]). Эта часть входит в строку, например, "{\"data\":"<< Json::writeString(builder, node["user"]) << "}" и сохраняется в первой строке моего файла JSON.

  • Из этого же узла я извлекаю идентификатор пользователя, который позже понадобится для нумерации страниц.

  • Из ответа я также извлекаю URL-адрес сценария /static/bundles/metro/ProfilePageContainer.js/UNIQUE_IDENTIFIER.js, который затем запрашиваю, чтобы я мог извлечь из него то, что найдено между s.pagination},queryId:".

  • Теперь у меня достаточно данных для создания запроса графика, который должен вернуть следующую страницу, путем построения следующего запроса:

string variables = "{\"id\":\"" + root["entry_data"]["ProfilePage"][0]["graphql"]["user"]["id"].asString() + "\",\"first\":50,\"after\":\"" + root["entry_data"]["ProfilePage"][0]["graphql"]["user"]["edge_owner_to_timeline_media"]["page_info"]["end_cursor"].asString() + "\"}";
string next_page = "https://www.instagram.com/graphql/query/?query_hash=" + queryIdFromScript + "&variables=" + curl_easy_escape(curl, variables.c_str(), variables.length());

Этот запрос возвращает 403.

Мне было интересно, как я могу обойти это.

Я не знаю, есть ли способ сделать этот запрос, как если бы он выполнялся с домашней страницы пользователя, что возможно с помощью dev-tools, или как мне использовать cookie-файлы или что-то для эмуляции что.

Любые советы и рекомендации приветствуются.

Спасибо!

...