Не удается получить требуемый ответ с использованием параметров json в запросах получения - PullRequest
3 голосов
/ 27 мая 2020

Я пытаюсь получить ответ json с этой веб-страницы , используя следующий подход, но я получаю {"message": "Must provide valid one of: query_id, query_hash", "status": "fail"}. Я попытался распечатать URL-адрес ответа, например r.url во втором сценарии, чтобы проверить, соответствует ли он тому, который я пытался отправить, но я обнаружил, что он отличается по структуре.

Если я использую URL-адрес напрямую (взят из инструментов разработчика) в запросах я получаю необходимый контент:

import json
import requests

check_url = 'https://www.instagram.com/graphql/query/?query_hash=7dabc71d3e758b1ec19ffb85639e427b&variables=%7B%22tag_name%22%3A%22instagood%22%2C%22first%22%3A2%2C%22after%22%3A%22QVFDa3djMUFwM1BkRWJNTlEzRmxBYkRGdFBDVzViU2JoNVZPbWNQSmNCTE1HNDlhYWdsdi1EcE5ickhvYjhRWUhqUDhIcXE3YTE4M1JMbmdVN0lMSXM3ZA%3D%3D%22%7D'
r = requests.get(check_url)
print(r.json())

Но я не могу заставить его работать:

import json
import requests

url = 'https://www.instagram.com/explore/tags/instagood/'
query_url = 'https://www.instagram.com/graphql/query/?'

payload = {
    "query_hash": "7dabc71d3e758b1ec19ffb85639e427b",
    "variables": {"tag_name":"instagood","first":"2","after":"QVFDa3djMUFwM1BkRWJNTlEzRmxBYkRGdFBDVzViU2JoNVZPbWNQSmNCTE1HNDlhYWdsdi1EcE5ickhvYjhRWUhqUDhIcXE3YTE4M1JMbmdVN0lMSXM3ZA=="}
}

with requests.Session() as s:
    s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
    r = s.get(query_url,params=json.dumps(payload))
    print(r.content)

Как я могу сделать сценарий выше работает?

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Ваша проблема связана с тем, как вы кодируете параметры. Из check_url в вашем первом примере мы видим:

?query_hash=7dabc71d3e758b1ec19ffb85639e427b&variables=%7B%22tag_name%22%3A%22...

Этот URL-адрес имеет 2 параметра:

  1. query_hash - строка
  2. variables - выглядит как строка в кодировке URL, судя по escape-значениям (%7B%22).

Как вы правильно определили, %7B%22 соответствует {". Другими словами, второй параметр - это строка JSON с экранированием URL.

Отсюда мы можем получить представление о новом решении:

query_url = 'https://www.instagram.com/graphql/query/?'

variables = {"tag_name": "instagood", "first": "2",
             "after": "QVFDa3djMUFwM1BkRWJNTlEzRmxBYkRGdFBDVzViU2JoNVZPbWNQSmNCTE1HNDlhYWdsdi1EcE5ickhvYjhRWUhqUDhIcXE3YTE4M1JMbmdVN0lMSXM3ZA=="}
payload = {
    "query_hash": "7dabc71d3e758b1ec19ffb85639e427b",
    "variables": json.dumps(variables)
}

with requests.Session() as s:
    s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) ' + \
                              'Chrome/81.0.4044.138 Safari/537.36'
    r = s.get(query_url, params=payload)
    print(r.content)

Как видите, params, переданное методу requests.get, является dict с двумя ключами. Это будет преобразовано в ?query_hash=value1&variables=value2.

Чтобы получить правильное значение для variables, мы просто выгружаем JSON в строку. Библиотека запросов позаботится об экранировании URL-адресов всех символов, таких как { и ", в строке.

0 голосов
/ 29 мая 2020

Во время выполнения кода URL-адрес, который формируется после вызова API, содержит ненужные escape-символы. Это то, что портит вызов API.

here Не рекомендуется отправлять полезные данные при использовании get. Быстрое решение этой проблемы - использовать вместо него запрос post. Работало нормально!

import json
import requests

url = 'https://www.instagram.com/explore/tags/instagood/'
query_url = 'https://www.instagram.com/graphql/query/?'

payload = {
    "query_hash": "7dabc71d3e758b1ec19ffb85639e427b",
    "variables": {"tag_name":"instagood","first":"2","after":"QVFDa3djMUFwM1BkRWJNTlEzRmxBYkRGdFBDVzViU2JoNVZPbWNQSmNCTE1HNDlhYWdsdi1EcE5ickhvYjhRWUhqUDhIcXE3YTE4M1JMbmdVN0lMSXM3ZA=="}
}

with requests.Session() as s:
    s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
    r = s.post(query_url,params=json.dumps(payload))
    print(r.content)
...