lisz-works

技術系だけど関係ないこと多い系ブログ

Pythonからユーザ認証→ツイートしてみた!Twythonとoauth2ライブラリ

【スポンサーリンク】

Python ロゴ

Twythonを使ってのスタートアップ的なことを色々してきましたが……

www.lisz-works.com

www.lisz-works.com

今回は、よくあるTwitterクライアントアプリのように、アプリから認証を行ってツイート!

という流れの中身を作ってみました!

OAuthの棲み分け

OAuthは2種類あって、それぞれできる範囲が違ってくるようです。

  1. OAuth1:通常利用(R/W)
  2. OAuth2:一時的利用(Read-only)

という扱い。

なのでOAuth1を使わないとツイートはできない訳ですね。

OAuth1で必要なもの

OAuth1で、最低限必要なものは

  1. App key(consumer key)
  2. App secret(consumer secret)
  3. Access Token

Access Tokenは、自身の開発アカウントの場合、devサイトで取れるので、自前で設定が可能となる。

そうでない場合(他ユーザが認証して、使用する場合=通常のアプリと同じ動き)

  1. App keyとApp secretを使って、OAuth認証を行う。
  2. ユーザにログイン(認証)してもらう
  3. Access Tokenをゲット

のような流れの模様。

今回こちらのURLを参考にしました。

ikautimituaki.hatenablog.com

大変助かりました。ありがとうございました。

準備

まずは準備です。
必要なものをインポートします。

# -*- coding: utf-8 -*-
import oauth2
import webbrowser as web
from twython import Twython, TwythonError

ざっくりとした説明です。

import 概要
oauth2 OAuth認証に使うヤツ
webbrowser WEBブラウザを開くのに使うヤツ
Twython Twitter操作に使うヤツ
TwythonError Twythonのエラーに関するヤツ(のはず)

フェーズ1:認証用ページ

流れとしてはこんな感じ。

  1. App keyを使ってToken取得のリクエストを出す
  2. 取得したTokenを分解(解析)する
  3. 取得Tokenを使って認証用ページのURLを作成し開く
  4. 認証(アプリ許可)して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入力から認証へ

もうちょっとです!

ココでの流れはこんな。

  1. 取得したPINコードをセット
  2. フェーズ1のTokenを使ってリクエスト
  3. 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回目のリクエストをします。

必要なのは

  1. 取得したPINコード
  2. oauth_token(フェーズ1で取得したやつ)
  3. oauth_token_secret(フェーズ1で取得したやつ)

フェーズ3:取得したTokenでツイート!

最後に取得したTokenでツイートしてみました!

ココでの流れは

  1. フェーズ2で取得した情報(Token)を分解
  2. Tokenを使ってTwythonオブジェクトを生成
  3. ツイート!
#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)

あとがき

いかがでしたでしょうか?