Twitter API v2を使いこなそう!


みなさん、こんにちは!

以前からこの記事でちょくちょく出てきていたX APIを使って自動投稿などですが、、、
ツイートの確認をした時に「あれ、ツイートされてない。」ということでLambdaのログを確認すると、、、

twitter: 453 You currently have Essential access which includes access to Twitter API v2 endpoints only.
If you need access to this endpoint, you’ll need to apply for Elevated access via the Developer Portal.

というエラーになって全然投稿されない。。。みたいなことがありました。

今回は、このエラーの原因と対処法について、備忘録的に書いていきます!


今回の原因

ずばり、、、今回の原因は、、、

Twitter APIのV1を使っていたからです。
エラーに書いていますね。。。

でも自分の中では「V1を使っているはずがない。」と思い込んでいたのです。

対処法

今まで使っていたPythonでは、

#TwitterAPIの情報を入れる。
api_key = os.environ['API_KEY']
api_secret_key = os.environ['API_SECRET']
access_token = os.environ['token']
access_secret_token = os.environ['secret_token']

dt = datetime.now()
# 認証を行う
auth = tweepy.OAuthHandler(api_key, api_secret_key)
auth.set_access_token(access_token, access_secret_token)
def lambda_handler(event,context):
<中略>
    api = tweepy.API(auth)
    test = api.update_status(out)

という感じで、access_tokenやaccess_seacret_tokenを使っていて、側から見ると、V2を使っているのですが、、、それでもエラーが出てきました。

参考という名のパクリまくったものを自分で読み直したところ、、、

api.update_status

こいつが、、、V1になっていたのが原因でした。
V2になって変わっていたことに気づきませんでした。
ドキュメントまじで大事。

ということで、せっかくなら認証周りもブラッシュアップしよう!ということで、以下のようになりました。

#TwitterAPIの情報を入れる。
api_key = os.environ['API_KEY']
api_secret_key = os.environ['API_SECRET']
access_token = os.environ['token']
access_secret_token = os.environ['secret_token']
client = tweepy.Client(consumer_key=api_key, consumer_secret=api_secret_key, access_token=access_token, access_token_secret=access_secret_token)

def lambda_handler(event,context):
<中略>
    client.create_tweet(text=out)

今まではAPIのところで2行に分かれていかかれていた認証部分をひとまとめにして、clientを引数にして、ツイートのところでtext="hoge"みたいにしてあげれば、すべてV2でできる!というわけでした。

使用例

最後に使用例的な感じです。

AWS Lambdaを使うことを想定としていて、設定のところに環境変数でAPIの情報を入れて運用する形です。

import json
from datetime import datetime, timedelta, timezone
import os
import tweepy

#TwitterAPIの情報
api_key = os.environ['API_KEY']
api_secret_key = os.environ['API_SECRET']
access_token = os.environ['token']
access_secret_token = os.environ['secret_token']
client = tweepy.Client(consumer_key=api_key, consumer_secret=api_secret_key, access_token=access_token, access_token_secret=access_secret_token)

dt = datetime.now()
def lambda_handler(event,context):
    JST = timezone(timedelta(hours=+9), 'JST')
    dt_jst = datetime.now(JST)
    client.create_tweet(text=dt_jst)
    print(out)
    
    print("===End===") # for debug


この記事が気に入ったらサポートをしてみませんか?