import requests
import secrets
import time
import hmac
import base64
from hashlib import sha1
from urllib.parse import quote_plus
from src.config import API_KEY, ACCESS_TOKEN, API_KEY_SECRET, ACCESS_TOKEN_SECRET
def get_oauth_params():
oauth_nonce = secrets.token_hex(16)
oauth_consumer_key = API_KEY
oauth_signature_method = "HMAC-SHA1"
oauth_timestamp = str(int(time.time()))
oauth_version = "1.0"
oauth_token = ACCESS_TOKEN
oauth_params = {
"oauth_nonce": oauth_nonce,
"oauth_consumer_key": oauth_consumer_key,
"oauth_signature_method": oauth_signature_method,
"oauth_timestamp": oauth_timestamp,
"oauth_version": oauth_version,
"oauth_token": oauth_token
}
return oauth_params
def get_signature(signature_base_string, signing_key):
signature_base_string_bytes = bytes(signature_base_string,'ascii')
signing_key_bytes = bytes(signing_key,'ascii')
hashed = hmac.new(signing_key_bytes, signature_base_string_bytes, sha1)
hashed_bytes = hashed.digest()
b64_bytes = base64.b64encode(hashed_bytes)
b64_signature = quote_plus(b64_bytes.decode('ascii')).rstrip("\n");
return b64_signature
def make_auth_request(url, callback_url):
oauth_params = get_oauth_params()
parameter_string = f"oauth_callback={callback_url}&oauth_consumer_key={oauth_params['oauth_consumer_key']}&oauth_nonce={oauth_params['oauth_nonce']}&oauth_signature_method={oauth_params['oauth_signature_method']}&oauth_timestamp={oauth_params['oauth_timestamp']}&oauth_token={oauth_params['oauth_token']}&oauth_version={oauth_params['oauth_version']}"
percent_encoded_parameter_string = quote_plus(parameter_string)
percent_encoded_url = quote_plus(url)
signature_base_string = f"POST&{percent_encoded_url}&{percent_encoded_parameter_string}"
signing_key = quote_plus(API_KEY_SECRET) + "&" + quote_plus(ACCESS_TOKEN_SECRET)
oauth_signature = get_signature(signature_base_string, signing_key)
percent_encoded_callback_url = quote_plus(callback_url)
headers = {
"Accept": "*/*",
"Connection": "close",
"Content-Type": "application/x-www-form-urlencoded",
"Authorization": f"OAuth oauth_callback=\"{percent_encoded_callback_url}\",oauth_consumer_key=\"{oauth_params['oauth_consumer_key']}\",oauth_nonce=\"{oauth_params['oauth_nonce']}\",oauth_signature=\"{oauth_signature}\",oauth_signature_method=\"{oauth_params['oauth_signature_method']}\",oauth_timestamp=\"{oauth_params['oauth_timestamp']}\",oauth_token=\"{oauth_params['oauth_token']}\",oauth_version=\"{oauth_params['oauth_version']}\"",
}
print(headers["Authorization"])
r = requests.post(url, headers=headers)
print(r.status_code)
r_json = r.json()
return r_json
if __name__ == '__main__':
r_json = make_auth_request("https://api.twitter.com/oauth/request_token", "https://crunchftw.github.io")
print(r_json)
我想用 twitter 实现登录,为此我首先必须通过带有 oauth 签名的 https://api.twitter.com/oauth/request_token POST 请求获取 oauth 令牌。我想我已经正确地实施了一切。 paramenter 字符串和 oauth 授权字符串按顺序排列。但是 Twitter 发回了一个错误
401 {'errors': [{'code': 32, 'message': 'Could not authenticate you.'}]}
有人可以帮忙吗?
我使用此 Twitter 网站创建签名 https://developer.twitter.com/en/docs/authentication/oauth-1-0a/creating-a-signature