В настоящее время я взаимодействую с Twitter API, используя протокол OAuth, и пишу код на Python. Как и большинство пользователей, я думаю, что самая трудная часть спецификаций связана с подписями.
После того, как я бродил по сети в поисках решения, я решил поискать свой собственный код, чтобы лучше понять, что происходит.
Ради других пользователей я публикую здесь очень простую и короткую реализацию спецификаций подписи SHA1 в Python:
import hmac
from hashlib import sha1
from urllib import quote, urlencode
from base64 import b64encode
from urlparse import urlparse
def sign_request_sha1(url,method,data,secret=""):
pu = urlparse(urlparse(url).geturl())
normUrl = "%s://%s%s%s" % (
pu.scheme,
pu.hostname,
"" if not pu.port or {"http":80,"https":443}[pu.scheme] == pu.port else ":%d" % pu.port,
pu.path,
)
names = data.keys()
names.sort()
sig = "%s&%s&%s" % (
method.upper(),
quote(normUrl,''),
quote("&".join(["%s=%s" % (k,quote(data[k].encode('utf-8'),'')) for k in names]),''),
)
key = "%s&%s" % (quote(CONSUMER_SECRET.encode('utf-8'),''),secret)
return b64encode(hmac.new(key,sig,sha1).digest())
Входные параметры для функции:
- url: URL, который вы собираетесь вызвать для конкретного запроса OAuth.
- метод: это должно быть "GET" или "POST" в зависимости от того, как вы собираетесь отправить запрос.
- data: словарь, содержащий все параметры запросов, включая любые пользовательские аргументы, но исключая "oauth_signature" (по понятным причинам).
- секрет: секретный токен, полученный вами на начальном этапе протокола.
Я протестировал его в Twitter, и он, кажется, работает, но я хотел бы получить некоторые комментарии об ошибках, улучшениях и т. Д.
Наконец, здесь вы найдете фрагмент кода, вызывающий код для начальной фазы «маркера запроса»:
from random import getrandbits
from base64 import b64encode
from time import time
def twitter_request_token(req,callback,errback):
req_url="http://twitter.com:80/oauth/request_token"
data = { \
"oauth_consumer_key" : CONSUMER_KEY,
"oauth_nonce" : b64encode("%0x" % getrandbits(256))[:32],
"oauth_timestamp" : str(int(time())),
"oauth_signature_method" : "HMAC-SHA1",
"oauth_version" : "1.0",
"oauth_callback" : "http://localhost:8080/",
}
data["oauth_signature"] = sign_request_sha1(req_url,"GET",data)
Спасибо.