Instagram:签名不匹配

时间:2015-12-23 19:32:06

标签: python instagram instagram-api

我正在尝试使用Instagram API,但我甚至无法进行简单的调用,因为我收到错误

{"code": 403, "error_type": "OAuthForbiddenException", "error_message": "Invalid signed-request: Signature does not match"}

我生成了access_token,其范围为likes+comments

这是我的网址: https://api.instagram.com/v1/media/search?lat=48.858844&lng=2.294351&access_token=ACCESS-TOKEN&sig=SIG

我使用Instagram开发者网站上的这个脚本生成了签名,因为它最初给了我

"Invalid signed-request: Missing required parameter 'sig'"

这是剧本:

    # -*- coding: UTF-8 -*-
import hmac
from hashlib import sha256

def generate_sig(endpoint, params, secret):
    sig = endpoint
    for key in sorted(params.keys()):
        sig += '|%s=%s' % (key, params[key])
    return hmac.new(secret, sig, sha256).hexdigest()

endpoint = 'media/search'
params = {
    'access_token': _______________,
    'count': 10,
}
secret = ______________________
sig = generate_sig(endpoint, params, secret)
print "sig is",sig

任何帮助表示赞赏! 感谢

1 个答案:

答案 0 :(得分:3)

来自docs:

  

启用后,Instagram将检查每个 sig 参数   请求并验证该值是否与使用您的计算的哈希值匹配   客户秘密。预期值是使用SHA256哈希的HMAC   所有请求参数和您的客户端密钥的算法。

您的签名生成器功能没问题,但不包括所有参数。它应该是:

params = {
    'access_token': _______________,
    'count': 10,
    'lat':  "<lat value>",
    'lng': "<long value>",
}

它应该运作良好。 此外,这里有一些有用的附加指南:
http://instagram-api.tumblr.com/post/120586735719/instagram-secure-api-requests

编辑:

这与我的完全一样:

# coding: utf-8

# My client_id, secret, access_token, etc...
import settings
from urllib import urlencode
import hmac
from hashlib import sha256

def generate_sig(endpoint, params, secret):
    sig = endpoint
    for key in sorted(params.keys()):
        sig += '|%s=%s' % (key, params[key])
    return hmac.new(secret, sig, sha256).hexdigest()


endpoint = '/media/search'
params = {
    'access_token': settings.ACCESS_TOKEN,
    'lat': '48.858844',
    'lng': '2.294351',
    'count': 10,
}
params.update({'sig': generate_sig(endpoint, params, settings.CLIENT_SECRET)})
url = 'https://api.instagram.com/v1' + endpoint + '?' + urlencode(params)

# Success!!!
print url

它应该给我们一个像这种格式的URL:

https://api.instagram.com/v1/media/search?access_token=XXX&lat=XXX&lng=XXX&sig=XXX&count=XXX