Urllib - 没有消息的HTTP 403错误(Facebook通知)

时间:2013-07-30 20:31:19

标签: python facebook urllib2 urllib http-status-code-403

我已成功使用以下Python代码,在localhost上的Google App Engine服务器上运行,向我自己发送Facebook通知。我使用Facebook通知的template功能将Facebook用户ID扩展为通知文本中的粗体名称:

url = 'https://graph.facebook.com/'+myOwnID+'/notifications'

values = {'access_token' : 426547656256546|4fhe34FJdeV3WvfF6SNfehs7GfW
                  'href' : 'http://localhost:8080/', 
              'template' : '@['+myOwnID+'] says hi.'}

req = urllib2.Request(url, urllib.urlencode(values))
urllib2.urlopen(req)

请注意,应用访问令牌已组成,但格式与真实令牌相同。

当我将模板的ID更改为我的一个朋友的ID时:

url = 'https://graph.facebook.com/'+myOwnID+'/notifications'

values = {'access_token' : 426547656256546|4fhe34FJdeV3WvfF6SNfehs7GfW
                  'href' : 'http://localhost:8080/', 
              'template' : '@['+myFriendID+'] says hi.'}

req = urllib2.Request(url, urllib.urlencode(values))
urllib2.urlopen(req)

我收到错误

HTTP Error 403: Forbidden

即使我将ID硬编码到模板中,它也是一样的,所以这不是一个不正确的变量值的问题。

为什么第二种情况不起作用?我该如何解决?

2 个答案:

答案 0 :(得分:2)

我没有意识到urllib2可以打印比状态代码更详细的错误消息,将最后一行替换为:

try:
    urllib2.urlopen(req)
except urllib2.HTTPError, error:
    logging.info(error.read()) # or "print error.read()"

这给出了明确的错误消息:

{"error":{"message":"(#200) Cannot tag users who have not installed the app","type":"OAuthException","code":200}}

有关使用403状态代码更全面地讨论urllib2的行为,请参阅123

答案 1 :(得分:1)

根据您的错误消息,您的朋友必须安装您的应用才能向您发送通知。你没办法解决这个问题。