OAuth с Twitter-скриптом на Python не работает - PullRequest
4 голосов
/ 11 февраля 2010

Я пишу скрипт OAuth на Python.

Для тестирования я использую Twitter API. Но это не работает хорошо.

def test():
    params = {
            "oauth_consumer_key": TWITTER_OAUTH_CONSUMER_KEY,
            "oauth_nonce": "".join(random.choice(string.digits + string.letters) for i in xrange(7)),
            "oauth_signature_method": "HMAC-SHA1",
            "oauth_timestamp": str(int(time.time())),
            "oauth_token": res_dict["oauth_token"],
            "oauth_version": "1.0",
            }
    status = {"status": u"Always_look_on_the_bright_side_of_life".encode("UTF-8")}
    print status
    params.update(status)
    url = "http://twitter.com/statuses/update.xml"
    key = "&".join([TWITTER_OAUTH_CONSUMER_SECRET, res_dict["oauth_token_secret"]])
    msg = "&".join(["POST", urllib.quote(url,""),
                    urllib.quote("&".join([k+"="+params[k] for k in sorted(params)]), "-._~")])
    print msg
    signature = hmac.new(key, msg, hashlib.sha1).digest().encode("base64").strip()
    params["oauth_signature"] = signature
    req = urllib2.Request(url,
          headers={"Authorization":"OAuth", "Content-type":"application/x-www-form-urlencoded"})
    req.add_data("&".join([k+"="+urllib.quote(params[k], "-._~") for k in params]))
    print req.get_data()
    res = urllib2.urlopen(req).read()
    print res

Этот скрипт (status = "Always_look_on_the_bright_side_of_life") работает.

Но, если статус «Всегда смотри на светлую сторону жизни» (заменен подчеркиванием на пробел), он не работает (возвращает ошибку HTTP 401: неавторизовано).

Я ссылался на этот вопрос , но не смог.

Пожалуйста, дайте мне несколько советов. Спасибо.

Ответы [ 2 ]

1 голос
/ 15 февраля 2010

У меня такая же проблема была в OAuth с FaceBook некоторое время назад. Проблема в том, что проверка подписи на стороне сервера не удалась. Смотрите код генерации вашей подписи здесь:

msg = "&".join(["POST", urllib.quote(url,""),
                urllib.quote("&".join([k+"="+params[k] for k in sorted(params)]), "-._~")])
print msg
signature = hmac.new(key, msg, hashlib.sha1).digest().encode("base64").strip()

Используется необработанная (некодированная) форма строки для генерации подписи. Однако на стороне сервера генерируется проверка подписи по отношению к строке URL в кавычках:

req.add_data("&".join([k+"="+urllib.quote(params[k], "-._~") for k in params]))

Чтобы исправить код, вам нужно исправить эту строку, создав сигнатуру из параметра, закодированного в URL:

msg = "&".join(["POST", urllib.quote(url,""),
                urllib.quote("&".join([k+"="+urllib.quote(params[k], "-._~") for k in sorted(params)]), "-._~")])
0 голосов
/ 12 февраля 2010

Самый простой способ это исправить - добавить status = urllib.quote(status) после status = {"status": u"Always_look_on_the_bright_side_of_life".encode("UTF-8")}. Это позволит избежать пробелов и других специальных символов по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...