Skip to content

Instantly share code, notes, and snippets.

@prs-watch
Last active April 7, 2018 16:50
Show Gist options
  • Select an option

  • Save prs-watch/0fd9ff7d501b7e881c159f9abaf3f93d to your computer and use it in GitHub Desktop.

Select an option

Save prs-watch/0fd9ff7d501b7e881c159f9abaf3f93d to your computer and use it in GitHub Desktop.
import sys
import requests
from requests_oauthlib import OAuth1 as oauth
import webbrowser
class Settings:
"""
アプリケーションを登録すると取得出来る認証情報を保持するプロパティクラス。
"""
CLIENT_ID = 'XXX'
CLIENT_SECRET = 'YYY'
class Authenticater:
"""
認証器クラス。
access_tokenの発行を内部で実行した上、OAuth情報オブジェクトを返却する。
"""
# access_token発行時に用いる認証コード発行URL
AUTH_URL = 'https://api.login.yahoo.com/oauth2/request_auth'
# access_token発行URL
TOKEN_URL = 'https://api.login.yahoo.com/oauth2/get_token'
# リダイレクトURI。Out of Band設定。
REDIRECT_URI = 'oob'
# レスポンス形式。
RESPONSE_TYPE = 'code'
# 認証形式
GARNT_TYPE = 'authorization_code'
# httpパラメータ
params = {}
@classmethod
def _get_authorization_code(cls):
"""
認証コードを取得する。
ブラウザ画面を立ち上げた上認証を確認する手順を踏む形で実装。
"""
# パラメータを詰める
cls.params['client_id'] = Settings.CLIENT_ID
cls.params['redirect_uri'] = cls.REDIRECT_URI
cls.params['response_type'] = cls.RESPONSE_TYPE
# 認証コード発行URLにHTTP GET
res = requests.get(cls.AUTH_URL, params=cls.params, allow_redirects=False)
code = res.status_code
url = res.url
# ステータスコードが302の場合成功、それ以外は失敗として処理。
if code == 302:
webbrowser.open(url)
else:
print('Fail to redirect to {url}.Status Code is {code}'.format(url=url, code=code))
sys.exit()
@classmethod
def _get_token(cls):
"""
access_tokenを取得する。
input箇所では_get_authorization_code()で取得の認証コードを入力。
"""
# パラメータ詰め
code = input('Type authorization code >> ')
cls.params['client_secret'] = Settings.CLIENT_SECRET
cls.params['grant_type'] = cls.GARNT_TYPE
cls.params['code'] = code
access_token = requests.post(cls.TOKEN_URL, data=cls.params).json()['access_token']
# OAuth認証情報を返却
return oauth(Settings.CLIENT_ID, Settings.CLIENT_SECRET, access_token)
@classmethod
def execute(cls):
"""
実行用のパブリックメソッド。
"""
cls._get_authorization_code()
return cls._get_token()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment