Python / Django使用python-instagram(400)APISubscriptionError-无法访问回调URL

时间:2013-11-14 04:18:13

标签: python django instagram

以前的工作。然后它偶尔开始工作,直到它完全停止工作。

以下是我的订阅代码:

def instagram_realtime_subscribe(event_slug, topic):
    api = InstagramAPI(client_id = CLIENT_ID, client_secret = CLIENT_SECRET)

    r = api.create_subscription(object = 'tag',
                            object_id = topic,
                            aspect = 'media',
                            callback_url = 'http://<domain>/event/%s/import/instagram/realtime'%(event_slug),
                            client_id = CLIENT_ID,
                            client_secret = CLIENT_SECRET
)

以下是我处理来自Instagram的GET和POST请求的观点:

def import_instagram_rt(request, slug):
    if request.method == "GET":
        mode = request.GET.get("hub.mode")
        challenge = request.GET.get("hub.challenge")
        verify_token = request.GET.get("hub.verify_token")
        if challenge:
            return HttpResponse(challenge, mimetype='text/html')
        else:
            return HttpResponse("test", mimetype='text/html')
    else:
        x_hub_signature=''
        if request.META.has_key('HTTP_X_HUB_SIGNATURE'):
            x_hub_signature = request.META['HTTP_X_HUB_SIGNATURE']
        raw_response = request.raw_post_data
        data = simplejson.loads(raw_response)
        for update in data:
            fetch_data(slug, update["object_id"])

以下是我的urls.py

url(r'^event/([-\w]+)/import/instagram/realtime$', import_instagram_rt),

这用于美妙地工作。然而,它已经停止工作两天了。每当调用订阅函数时,它都会抛出错误:

>>> instagram_realtime_subscribe("cats", "cats")
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/ubuntu/webapps/django-projects/imports/views.py", line 687, in instagram_realtime_subscribe
    client_secret = CLIENT_SECRET
  File "/home/ubuntu/webapps/django-projects/local/lib/python2.7/site-packages/instagram/bind.py", line 151, in _call
    return method.execute()
  File "/home/ubuntu/webapps/django-projects/local/lib/python2.7/site-packages/instagram/bind.py", line 143, in execute
    content, next = self._do_api_request(url, method, body, headers)
  File "/home/ubuntu/webapps/django-projects/local/lib/python2.7/site-packages/instagram/bind.py", line 124, in _do_api_request
    raise InstagramAPIError(status_code, content_obj['meta']['error_type'], content_obj['meta']['error_message'])
InstagramAPIError: (400) APISubscriptionError-Unable to reach callback URL "http://<domain>/event/cats/import/instagram/realtime".

我尝试手动点击回调URL并获得响应“test”,这是您对我编写的函数的期望。我在调用订阅函数之前手动对该url尝试了一个requests.get(),并返回了200响应。

当其他人都可以访问时,为什么Instagram找不到我的回调网址?

2 个答案:

答案 0 :(得分:2)

我认为import_instagram_rt未被调用,因为他们已经无法访问回调网址&#34;。

让我们分解尝试访问您的回调网址时发生的情况。

他们解析网址

您的网址是否格式正确? http://<domain>/event/cats/import/instagram/realtime不是,但我认为您正在隐藏真实的主机名。 ; - )

他们解析主机名

你的DNS好吗?您是否对区域进行了任何更新并搞砸了序列?主服务器和辅助服务器之间的区域传输是否正常运行? &#34;偶尔工作&#34;,可能意味着某些循环方案功能失调或某些DNS服务器提供错误的回复或超时。

他们在端口80

上为您的IP打开TCP套接字

你知道演习:SYN, SYN-ACK, ACK。如果你看到一些稍微偏离的东西,由于一些有趣的硬件异常,请考虑将其发送到 museum of broken packets

说真的......网络中的所有跃点是否路由这些数据包,或者是否有可能丢弃它们的防火墙?你有&#34;乐于助人&#34;有黑名单和零路线的ISP?

您机器上的进程处理连接

您是否有接受连接的流程?如果你使用gunicorn或类似的WSGI服务器服务......你是否run it behind a reverse proxy缓冲连接?否则,您的工作人员可能忙于为您的访问者instagram_realtime_subscribe,并阻止来自Instagram的回拨电话。

该过程以输出

响应

直到此时你的Django应用程序才开始发挥作用。如果import_instagram_rt正确无误,请将请求路由到urls.py

通过日志和tcpdumps快乐狩猎......

PS

为什么要从你的问题中删除这个?

  

我的heroku日志说了以下内容:

     

2013-11-13T11:30:28.766021 + 00:00 heroku [router]:at = error code = H12 desc =&#34; Request timeout&#34; method = GET path = / instag / realtime_callback /?hub.challenge = b81d6b83b6f14fbf86015670c58e6877&amp; hub.mode = subscribe host = ontodjangoyo.herokuapp.com fwd =&#34; 54.208.187.11&#34; dyno = web.1 connect = 1ms service = 30000ms status = 503 bytes = 0

状态503强烈表明您没有工作人员可以处理Instagram请求... 如果您有1名工作人员并且heroku代理没有缓冲请求,那么当您尝试手动点击回拨URL时#34;一名工人按预期回应。但是当你的django应用程序处理请求并调用instagram_realtime_subscribe时。然后你的工作人员一直阻塞,直到它收到来自Instagram的回复,这是没有得到的,因为Instagram正在等待你的工作人员可以处理回调。这将相互等待,直到发生超时。代理可以缓存该503状态一段时间。

答案 1 :(得分:-1)

显然,这与代码部分无关。当我在两天后尝试完全相同的代码时,它工作得非常好。因此,我认为这个问题是由于某些原因被列入黑名单/速率限制而发生的。我不知道速率限制如何适用于Instagram Real Time API。我会将其作为一个新问题发布并链接到此处。