Twythonを使ってのスタートアップ的なことを色々してきましたが……
今回は、よくあるTwitterクライアントアプリのように、アプリから認証を行ってツイート!
という流れの中身を作ってみました!
OAuthの棲み分け
OAuthは2種類あって、それぞれできる範囲が違ってくるようです。
- OAuth1:通常利用(R/W)
- OAuth2:一時的利用(Read-only)
という扱い。
なのでOAuth1を使わないとツイートはできない訳ですね。
OAuth1で必要なもの
OAuth1で、最低限必要なものは
- App key(consumer key)
- App secret(consumer secret)
- Access Token
Access Tokenは、自身の開発アカウントの場合、devサイトで取れるので、自前で設定が可能となる。
そうでない場合(他ユーザが認証して、使用する場合=通常のアプリと同じ動き)
- App keyとApp secretを使って、OAuth認証を行う。
- ユーザにログイン(認証)してもらう
- Access Tokenをゲット
のような流れの模様。
今回こちらのURLを参考にしました。
大変助かりました。ありがとうございました。
準備
まずは準備です。
必要なものをインポートします。
# -*- coding: utf-8 -*- import oauth2 import webbrowser as web from twython import Twython, TwythonError
ざっくりとした説明です。
import | 概要 |
---|---|
oauth2 | OAuth認証に使うヤツ |
webbrowser | WEBブラウザを開くのに使うヤツ |
Twython | Twitter操作に使うヤツ |
TwythonError | Twythonのエラーに関するヤツ(のはず) |
フェーズ1:認証用ページ
流れとしてはこんな感じ。
- App keyを使ってToken取得のリクエストを出す
- 取得したTokenを分解(解析)する
- 取得Tokenを使って認証用ページのURLを作成し開く
- 認証(アプリ許可)してPINコードをゲット!
# OAuth その1 consumer = oauth2.Consumer(key=APP_KEY, secret=APP_SECRET) client = oauth2.Client(consumer) resp, content = client.request("https://api.twitter.com/oauth/request_token", "GET") print("■取得したtoken") print(content) print("----") # Tokenを辞書型にセット str = content.decode('utf-8') list = [t.split() for t in str.split("&")] d = ({}) for t in list: a = t[0].split("=") d.update({ a[0] : a[1] }) # dの中身は文字列 print("■tokenを辞書化") print(d) print("----") #d = {'oauth_token': '5k04iwAAAAAA1OhDAAABXO9D4lk', 'oauth_token_secret': 'ITYIIQVh9Iga6ue4ox8jwjO0sml7RTJU', 'oauth_callback_confirmed': 'true'} # 認証用ページを開く url = "https://api.twitter.com/oauth/authorize?oauth_token=" + d['oauth_token'] web.open(url)
App keyについて
まずApp key(Consumer key)についてですね。
コレについては、自身で使用するアプリのモノを取得してきて設定してください。
Twitterの開発者ページから作成できます。
Token取得リクエスト
前述のApp keyを使って1発目のリクエストを行います。
するとこんな感じの値が取れます。
b'oauth_token=T-XXXXXXXXXXXXXXXXXXXXXXXXX&oauth_token_secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&oauth_callback_confirmed=true'
本物のデータは、XXXのところが、半角英数字の羅列です。
ちなみに「b'xxx'」というのは、バイト型を表すらしい。
python初めて間もないので、戸惑った……
なんせ文字列として扱おうとすると、エラーしますからね(笑)
取得したTokenを料理する
取得したTokenは、&で区切られているので、各要素を分解するとこんな感じ。
- oauth_token=T-XXXXXXXXXXXXXXXXXXXXXXXXX
- oauth_token_secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
- oauth_callback_confirmed=true
今回はコレを辞書型につっこんでみました。
ここから、認証用URLを生成します。
「"https://api.twitter.com/oauth/authorize?oauth_token=“」と「oauth_token」の値を結合します。
これを
web.open(url)
で、ブラウザで開いています。
開いたページで、ログイン→認証(アプリの許可)をすればOKです。
そこで出てきたPINコードをコピーします。
フェーズ2:PIN入力から認証へ
もうちょっとです!
ココでの流れはこんな。
- 取得したPINコードをセット
- フェーズ1のTokenを使ってリクエスト
- API使うようのTokenをゲット!
# 続きのやーつ pin = "0864703" otoken = d["oauth_token"].encode('utf-8') otsecret = d["oauth_token_secret"].encode('utf-8') print("■設定するやつ") print("・oauth token: ") print(otoken) print("・oauth token secret: ") print(otsecret) print("--") # Tokenを取得する token = oauth2.Token(otoken, otsecret) client = oauth2.Client(consumer, token) nresp, content = client.request("https://api.twitter.com/oauth/access_token", "POST", body="oauth_verifier={0}".format(pin)) print(content) print(resp)
まずはPINを設定
取得したPINコードを適当に変数に入れます。
今回分けて手動でやってるので、コレをユーザ入力とかすればいいと思います。
ユーザ認証からPINの取得まで自動化したいところですけどね……
2回目のリクエスト
次に2回目のリクエストをします。
必要なのは
- 取得したPINコード
- oauth_token(フェーズ1で取得したやつ)
- oauth_token_secret(フェーズ1で取得したやつ)
フェーズ3:取得したTokenでツイート!
最後に取得したTokenでツイートしてみました!
ココでの流れは
- フェーズ2で取得した情報(Token)を分解
- Tokenを使ってTwythonオブジェクトを生成
- ツイート!
#tokenBin = b'oauth_token=111281451-u8PTuoFbRwQw1DEAYw1ElOsMCw8Ar2OSx3PeMx0N&oauth_token_secret=oUpdrTWMnv97rxRlZgeg2I0jlYlgFTs0Gz0wlTX2rxB6d&user_id=111281451&screen_name=Y_Y_Y_Y_Y&x_auth_expires=0' #str = tokenBin.decode('utf-8') str = content.decode('utf-8') list = [t.split() for t in str.split("&")] oauthToken = ({}) for t in list: a = t[0].split("=") oauthToken.update({ a[0] : a[1] }) # dの中身は文字列 print(oauthToken) twitter = Twython(APP_KEY, APP_SECRET, oauthToken['oauth_token'], oauthToken['oauth_token_secret']) # ツイート try: twitter.update_status(status='from python') except TwythonError as e: print(e)
あとがき
いかがでしたでしょうか?