【问题标题】:Twitter Search API using urllib2使用 urllib2 的 Twitter 搜索 API
【发布时间】:2013-12-03 04:50:49
【问题描述】:

我是使用 python 调用 API(甚至只是 API 调用)的初学者。我正在尝试使用 Twitter API 进行基本调用。

我生成oauth_signature的代码如下:

def getSignature(query):
    key_dict['q'] = urllib.quote(query, '')
    finKey = ""
    for key in sorted(key_dict.keys()):
        finKey += key + "="+key_dict[key]+"&"
    finKey =  finKey[:-1]
    finKey = HTTP_METHOD + "&" + urllib.quote(BASE_URL, '') + "&" + urllib.quote(finKey, '')
    key = urllib.quote(CONSUMER_SECRET_KEY, '')+"&"+urllib.quote(ACCESS_TOKEN_SECRET, '')
    hashed = hmac.new(key, finKey, sha1)
    finKey = binascii.b2a_base64(hashed.digest())
    key_dict['oauth_signature'] = urllib.quote(finKey, '')

key_dict 存储所有键的位置:

key_dict = dict()
key_dict['oauth_consumer_key'] = urllib.quote(CONSUMER_KEY, '')
key_dict['oauth_nonce'] = urllib.quote("9ab59691142584g739134971f75aa986", '')
key_dict['oauth_signature_method'] = urllib.quote("HMAC-SHA1", '')
key_dict['oauth_timestamp'] = urllib.quote(str(int(time.time())), '')
key_dict['oauth_token'] = urllib.quote(ACCESS_TOKEN, '')
key_dict['oauth_version'] = urllib.quote(OAUTH_VERSION, '')
BASE_URL = "https://api.twitter.com/1.1/search/tweets.json?" + urllib.quote("q=delhi+elections", '')

我使用以下代码生成基本标头字符串:

def getHeaderString():
    ret = "OAuth "
    key_list =['oauth_consumer_key', 'oauth_nonce', 'oauth_signature', 'oauth_signature_method', 'oauth_timestamp', 'oauth_token', 'oauth_version']
    for key in key_list:
        ret = ret+key+"=\""+key_dict[key]+"\", "
    ret = ret[:-2]
    return ret

虽然当我打电话时,我得到:

urllib2.HTTPError: HTTP Error 401: Unauthorized

urllib2.URLError: <urlopen error [Errno 60] Operation timed out>

我的最终请求是使用以下内容提出的:

getSignature("delhi+elections")
headers = { 'Authorization' : getHeaderString()}
req = urllib2.Request(BASE_URL, headers= headers)
response = urllib2.urlopen(req)

我哪里错了?

【问题讨论】:

    标签: python api twitter urllib2


    【解决方案1】:

    应该在某处提到的几点:

    1. 方法:binascii.b2a_base64(hashed.digest()) 在字符串末尾追加一个新的换行符。这会导致 oauth_signature 无法通过身份验证。
    2. delhi+elections 实际上应该是delhi elections。这种不匹配再次导致 sha1 中的哈希值匹配失败。

    删除他们两个解决了这个问题。 最终代码:

    key_dict = dict()
    key_dict['oauth_consumer_key'] = urllib.quote(CONSUMER_KEY, '')
    key_dict['oauth_nonce'] = urllib.quote("9aa39691142584s7df134971375aa986", '')
    key_dict['oauth_signature_method'] = urllib.quote("HMAC-SHA1", '')
    key_dict['oauth_timestamp'] = urllib.quote(str(int(time.time())), '')
    key_dict['oauth_token'] = urllib.quote(ACCESS_TOKEN, '')
    key_dict['oauth_version'] = urllib.quote(OAUTH_VERSION, '')
    BASE_URL = "https://api.twitter.com/1.1/search/tweets.json"
    def getSignature(query):
        key_dict['q'] = urllib.quote(query, '')
        finKey = ""
        for key in sorted(key_dict.keys()):
            finKey += key + "="+key_dict[key]+"&"
        finKey =  finKey[:-1]
        finKey = HTTP_METHOD + "&" + urllib.quote(BASE_URL, '') + "&" + urllib.quote(finKey, '')
        key = urllib.quote(CONSUMER_SECRET_KEY, '')+"&"+urllib.quote(ACCESS_TOKEN_SECRET, '')
        hashed = hmac.new(key, finKey, sha1)
        finKey = binascii.b2a_base64(hashed.digest())[:-1]
        key_dict['oauth_signature'] = urllib.quote(finKey, '')
    
    def getHeaderString():
        ret = "OAuth "
        key_list =['oauth_consumer_key', 'oauth_nonce', 'oauth_signature', 'oauth_signature_method', 'oauth_timestamp', 'oauth_token', 'oauth_version']
        for key in key_list:
            ret = ret+key+"=\""+key_dict[key]+"\", "
        ret = ret[:-2]
        return ret
    
    url = BASE_URL
    getSignature("delhi elections")
    headers = { 'Authorization' : getHeaderString()}
    values = {'q':'delhi elections'}
    data = urllib.urlencode(values)
    req = urllib2.Request(url+"?"+data, headers= headers)
    response = urllib2.urlopen(req)
    the_page = response.read()
    print the_page
    

    【讨论】:

      【解决方案2】:

      您是否尝试过使用tweepy,而不是编写自己的客户端?对于使用此库的参考实现,您可以查看twitCheck 客户端。

      【讨论】:

      • 是的,我已经看到了外部库。甚至curl 命令也适用于相同的标头。但我试图避免外部依赖。
      猜你喜欢
      • 2016-03-08
      • 2012-09-26
      • 2015-08-15
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      相关资源
      最近更新 更多