如何使用django和instagram api实时更新POST?

时间:2015-01-20 12:37:55

标签: python django real-time instagram instagram-api

我尝试使用python-instagram来获取实时Instagram的媒体。

我将api.create_subscription与标签一起使用。我的回调网址是远程网络服务器上的django网页。 我的python脚本(我在本地计算机上运行):

api = InstagramAPI(client_id='my_id', client_secret='my_secret')
sub = api.create_subscription(object='tag', object_id='test', aspect='media', callback_url=my_url/insta)
print sub

while 1:
    pass

我的django视图通过回调网址调用(我在远程网络服务器上运行):

def getInstagramPicture(request):
    if request.method == "GET":
        mode         = request.GET.get("hub.mode")
        challenge    = request.GET.get("hub.challenge")
        verify_token = request.GET.get("hub.verify_token")
        return HttpResponse(challenge)
    if request.method == "POST":
        print "post"

我认为订阅效果很好。 Web服务器终端日志:

[20/Jan/2015 13:30:11] "GET /insta?hub.challenge=1aed90578d1743a3afb865cc2a6b69cc&hub.mode=subscribe HTTP/1.1" 301 0
[20/Jan/2015 13:30:11] "GET /insta/?hub.challenge=1aed90578d1743a3afb865cc2a6b69cc&hub.mode=subscribe HTTP/1.1" 200 32

本地终端日志:

sub {'meta': {'code': 200}, 'data': {'object': 'tag', 'object_id': 'test', 'aspect': 'media', 'callback_url': 'my_url/insta', 'type': 'subscription', 'id': '15738925'}}

但我的问题是,当我尝试在Instagram上发布带有“test”标签的图片时,我认为这不是电话,而是我的网络服务器终端:

[20/Jan/2015 13:31:24] "POST /insta HTTP/1.1" 500 65563

为什么我在发布Instagram图片时看不到我的视图?

3 个答案:

答案 0 :(得分:2)

您需要更正回调网址以匹配您的urlconf中定义的内容。你现在告诉Instagram你的回调网址是<server>/insta,但是从请求日志中你的urlconf似乎期待<server>/insta/(带有斜杠)

这适用于GET请求,如下所示

[20/Jan/2015 13:30:11] "GET /insta?hub.challenge=1aed90578d1743a3afb865cc2a6b69cc&hub.mode=subscribe HTTP/1.1" 301 0
[20/Jan/2015 13:30:11] "GET /insta/?hub.challenge=1aed90578d1743a3afb865cc2a6b69cc&hub.mode=subscribe HTTP/1.1" 200 32

(注意第一行是301重定向)

Django的默认APPEND_SLASH设置可确保/insta的请求自动重定向到您已定义的/insta/视图。

然而,Django无法为POST请求执行此操作... HTTP重定向始终是GET请求,因此POST数据将丢失。这就是当您对不存在的URL /insta发出POST请求时,日志中出现500错误的原因:

[20/Jan/2015 13:31:24] "POST /insta HTTP/1.1" 500 65563

另请参阅:https://stackoverflow.com/a/9739046/202168

答案 1 :(得分:0)

显示的代码似乎根本不处理POST请求。它只打印出“post”并且不返回任何内容。

Web服务器日志显示HTTP 500错误(内部服务器错误)和64KiB错误页面,可能会告诉您确切原因。

你需要为POST请求实现一个处理程序,这个处理程序可能类似于你已经拥有的GET处理程序。

答案 2 :(得分:-1)

似乎Instagram使用POST方法来访问您的回调网址。

试试这个:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def getInstagramPicture(request):
    if request.method == "GET":
        mode         = request.GET.get("hub.mode")
        challenge    = request.GET.get("hub.challenge")
        verify_token = request.GET.get("hub.verify_token")
        return HttpResponse(challenge)
    if request.method == "POST":
        mode         = request.POST.get("hub.mode")
        challenge    = request.POST.get("hub.challenge")
        verify_token = request.POST.get("hub.verify_token")
        return HttpResponse(challenge)