以前的工作。然后它偶尔开始工作,直到它完全停止工作。
以下是我的订阅代码:
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找不到我的回调网址?
答案 0 :(得分:2)
我认为import_instagram_rt
未被调用,因为他们已经无法访问回调网址&#34;。
让我们分解尝试访问您的回调网址时发生的情况。
您的网址是否格式正确? http://<domain>/event/cats/import/instagram/realtime
不是,但我认为您正在隐藏真实的主机名。 ; - )
你的DNS好吗?您是否对区域进行了任何更新并搞砸了序列?主服务器和辅助服务器之间的区域传输是否正常运行? &#34;偶尔工作&#34;,可能意味着某些循环方案功能失调或某些DNS服务器提供错误的回复或超时。
你知道演习: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快乐狩猎......
为什么要从你的问题中删除这个?
我的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。我会将其作为一个新问题发布并链接到此处。