Звонок с подписью в Instagram на Python

Я пытаюсь добиться подписанного вызова API Instagram в Python. В настоящее время мои заголовки выглядят так:

user_agent = 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7'
headers = {
    'User-Agent': user_agent,
    "Content-type": "application/x-www-form-urlencoded"
}

Я попробовал несколько перестановок по инструкциям, приведенным на этой странице (Restrict API Requests @ instagram), включая метод HMAC и включение "Принудительно подписанного заголовка" на моей странице настроек API.

Но я продолжаю получать ошибку headers not found или 403. Я просто не могу понять, как правильно кодировать X-Insta-Forwarded-For

Не могли бы вы помочь с тем, как передать подписанный вызов с заголовком в Python?
Большое спасибо...


person Andy Downs    schedule 26.03.2015    source источник


Ответы (1)


Это должно сделать это за вас. Вам также понадобится библиотека Crypto python.

import requests
from Crypto.Hash import HMAC, SHA256

#change these accordingly
client_secret = "mysecret"
client_ip = "127.0.0.1"

hmac = HMAC.new(client_secret, digestmod=SHA256)
hmac.update(client_ip)
signature = hmac.hexdigest()

header_string = "%s|%s" % (client_ip, signature)

headers = {
    "X-Insta-Forwarded-For" : header_string,
    #and the rest of your headers
}

#or use requests.post or del since that's the 
#only time that this header is used...just 
#conveying the concept
resp = requests.get(insta_url, headers=headers)

Если вы протестируете его на примере, указанном в указанной вами ссылке, вы можете убедиться, что вы получаете правильный хэш, используя этот метод.

ip = "200.15.1.1"
secret = "6dc1787668c64c939929c17683d7cb74"
hmac = HMAC.new(secret, digestmod=SHA256)
hmac.update(ip)
signature = hmac.hexdigest() 
# should be 7e3c45bc34f56fd8e762ee4590a53c8c2bbce27e967a85484712e5faa0191688

Согласно справочным документам: «Чтобы включить этот параметр, отредактируйте конфигурацию клиента OAuth и установите флажок Принудительно использовать подписанный заголовок». Так что убедитесь, что вы сделали это тоже

person Tommy    schedule 26.03.2015
comment
Здравствуйте! Большое спасибо за ответ... к сожалению, я получаю сообщение об ошибке NameError: имя 'insta_url' не определено. Если я уберу строку, то ограничения вступят в силу (30 лайков/час, 15 комментариев/час)... Как это обойти? Пожалуйста помоги... - person Andy Downs; 26.03.2015
comment
insta_url был просто для демонстрации. Он должен выглядеть примерно так: api.instagram.com/v1/media/‹media ID здесь›/лайки. Итак, если бы идентификатор носителя был 123456, я бы построил insta_url следующим образом: insta_url = "https://api.instagram.com/v1/media/123456/relationship" Обратите внимание, что я собираюсь использовать API отношений, который поддерживает только POSTing с подписанным заголовком, поэтому ваш запрос должен быть выполнен так requests.post(insta_url, headers=headers) - person Tommy; 26.03.2015
comment
взгляните на раздел «Применить подписанный заголовок» в документах API, которые вы опубликовали, чтобы увидеть доступные методы, поддерживающие подписанный заголовок. Ниже на странице есть больше демонстраций кода, и вы даже можете протестировать их с помощью curl. - person Tommy; 26.03.2015
comment
Спасибо за ответ... Теперь это работает хорошо... Вместо метода запросов я использовал urllib и urllib2 (просто не мог понять запросы!)... Критическая часть - включить ОБА флажка в Instagram Страница API, чтобы гарантировать успешное прохождение подписанных заголовков, чтобы воспользоваться преимуществами лимитов подписанных вызовов (которые больше, чем лимиты неподписанных вызовов)... ура :) - person Andy Downs; 27.03.2015
comment
Потрясающий! Рад это слышать. Не могли бы вы сделать мой пост ответом :) - person Tommy; 28.03.2015