5

过去的事情是有效的。然后它开始偶尔工作,直到它完全停止工作。

以下是我的订阅代码:

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 并得到响应“测试”,这是您对我编写的函数的期望。在调用订阅函数之前,我手动尝试了 requests.get() 到该 url,并返回了 200 响应。

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

4

2 回答 2

2

我认为import_instagram_rt没有被调用,因为它们“无法访问回调 URL”。

让我们分解当他们尝试访问您的回调 URL 时会发生什么。

他们解析 URL

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

他们解析主机名

你的DNS还好吗?您是否对您的区域进行了任何更新并弄乱了序列?您的主服务器和辅助服务器之间的区域传输是否正常运行?“偶尔工作”,可能意味着某些循环方案功能失调或某些 DNS 服务器给出错误的答复或超时。

他们在端口 80 上为您的 IP 打开一个 TCP 套接字

你知道练习:SYN、SYN-ACK、ACK。如果您发现由于某些有趣的硬件异常而略有偏差,请考虑将其发送到 破损数据包博物馆

说真的...您网络中的所有跃点是否都在路由这些数据包,或者是否有任何防火墙可能会丢弃它们?您是否有具有黑名单和空路由的“有用” ISP?

您机器上的一个进程处理连接

你有接受连接的过程吗?如果您使用 gunicorn 或类似的 WSGI 服务器服务...您是否在反向代理后面运行它,以缓冲连接?否则,您的工作人员可能会忙于处理instagram_realtime_subscribe您的访客,并阻止来自 Instagram 的回拨电话。

该过程以输出响应

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

愉快地通过日志和 tcpdumps 狩猎......

附言

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

我的heroku日志说如下:

2013-11-13T11:30:28.766021+00:00 heroku[路由器]: at=error code=H12 desc="Request timeout" method=GET path=/instag/realtime_callback/?hub.challenge=b81d6b83b6f14fbf86015670c58e6877&hub.mode=subscribe主机=ontodjangoyo.herokuapp.com fwd="54.208.187.11" dyno=web.1 连接=1ms 服务=30000ms 状态=503 字节=0

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

于 2014-04-09T20:30:56.943 回答
-1

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

于 2014-04-14T03:29:48.303 回答