requests と標準ライブラリだけを使って書いてみた。
パラメータの指定、特に oauth_signature の作成がシンドイ。
Authorization の指定も。
from random import getrandbits
from time import time
import hmac
import hashlib
import urllib
import urlparse
import requests
CONSUMER_KEY = "your consumer_key"
CONSUMER_SECRET = "your consumer_secret"
ACCESS_TOKEN_URL = "access token url"
WEB_API_URL = "web api url"
USERNAME = "your user name"
PASSWORD = "your password"
def escape(s):
if not isinstance(s, bytes):
s = s.encode("utf-8")
return urllib.quote(s, safe="~")
payload = {
"oauth_consumer_key": CONSUMER_KEY,
"oauth_signature_method": "HMAC-SHA1",
"oauth_timestamp": str(int(time())),
"oauth_nonce": str(getrandbits(64)),
"oauth_version": "1.0",
"x_auth_mode": "client_auth",
"x_auth_username": USERNAME,
"x_auth_password": PASSWORD,
}
payload["oauth_signature"] = hmac.new(
"%s&%s" % (CONSUMER_SECRET, ""),
"&".join([
"POST",
escape(ACCESS_TOKEN_URL),
escape("&".join(["%s=%s" % (escape(x), escape(payload[x]))
for x in sorted(payload)]))
]),
hashlib.sha1).digest().encode("base64").strip()
r = requests.post(ACCESS_TOKEN_URL, params=payload)
print r.text
token = urlparse.parse_qs(r.text)
oauth_token = token["oauth_token"][0]
oauth_token_secret = token["oauth_token_secret"][0]
payload = {
"oauth_consumer_key": CONSUMER_KEY,
"oauth_signature_method": "HMAC-SHA1",
"oauth_timestamp": str(int(time())),
"oauth_nonce": str(getrandbits(64)),
"oauth_version": "1.0",
"oauth_token": oauth_token,
}
payload["oauth_signature"] = hmac.new(
"%s&%s" % (CONSUMER_SECRET, oauth_token_secret),
"&".join([
"GET",
escape(WEB_API_URL),
escape("&".join(["%s=%s" % (escape(x), escape(payload[x]))
for x in sorted(payload)]))
]),
hashlib.sha1).digest().encode("base64").strip()
headers = {
"Authorization": "OAuth %s" % escape(",".join(
['%s="%s"' % (escape(x), escape(payload[x])) for x in payload]))
}
r = requests.get(WEB_API_URL, params=payload, headers=headers)
print r.text