初心者向け）TwitterのAPIサービスが変わってbotが動かなくなったときに読むと役に立つかも

追加報告の修正）

Bardで検索したTweepyをつかったTwitterへの投稿は、どうやらv1.1を使用したものらしかったとおもわれるので、修正したやつに対してTweepyがgithubに公開していたサンプルコードをパクって、もう一度修正してみました。

~~~
import tweepy

consumer_key = "XXXXXXXXXX"
consumer_secret =  "XXXXXXXXXX"
access_token = "XXXXXXXXXX"
access_token_secret = "XXXXXXXXXX"

def post_main():
    client = tweepy.Client(
        consumer_key=consumer_key, consumer_secret=consumer_secret,
        access_token=access_token, access_token_secret=access_token_secret
        )

    meigen = 'Twitterから投稿するぜ！'　# 実際にはここで溜め込んだ文章からランダムに選んだやつをmeigenにセットしています。


    client.create_tweet(text=meigen)

if __name__ == "__main__":
    post_main()
~~~

Tweepyがgithubで公開している、私が写経した元のコードはこちら

https://github.com/tweepy/tweepy/blob/master/examples/API_v2/create_tweet.py

ということで、以下Bardが提示したソースは、まだまだそのまま信用できない部分がありますね。

---------------------------------------------------------------------------
追加報告）
本記事を投稿したあとに、v2に対応しようとtwitterがgithubに公開しているサンプルコードを参照したりしてソース書き直してたけど、　結局のところv2の認証関連部分がよく分からなかったので、Tweepyをつかって投稿するbotに変更しました。

ちなみにこのソースは、Googleがベータ版として公開したAIサービス「Bard」に「tweepyを使ったbotのサンプルコード」と質問したら返ってきたものを基本にして、ちょっとだけ直したものです。


ソースコード例は以下の通り
~~~
import tweepy

yourapi_key = "XXXXXXXXXX"
yourapi_secret =  "XXXXXXXXXX"
youraccess_token = "XXXXXXXXXX"
youraccess_token_secret = "XXXXXXXXXX"

def main():
    auth = tweepy.OAuth1UserHandler(
    yourapi_key, yourapi_secret, youraccess_token, youraccess_token_secret
    )

    api = tweepy.API(auth)

    meigen = 'Twitterから投稿するぜ！'

    api.update_status(meigen)

if __name__ == "__main__":
    main()
~~~

本来であればTweet後のステータスを確認して、エラー発生の場合の処理など丁寧に対応すべきなのでしょうがとりあえず動けば良く、ときどきTweetを確認して今回のように投稿されていないのを確認してからやおら対処を考える式の気楽なやり口なので、そこんところは見逃してください。

ちなみにv2になって、全く同じ内容を連投すると、エラーが返ってきます。
（以下のエラーはGoogle Colaboからテストでスクリプトを実行したときに表示されたものです）

~~~
Forbidden: 403 Forbidden
187 - Status is a duplicate.
~~~

yourapi_key と yourapi_secret　は Consummer Keys で　youraccess_token と　　youraccess_token_secretは Authentication Tokens の Access Token and Secret がそれにあたります。

以下の画面から確認できますが、再表示することはできず、無効化あるいは再発行となります。再発行時にはこれまで使っていたキーは書き換える必要がありますので注意が必要です。

![スクリーンショット 2023-05-28 21.04.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739706/6bae08b2-fd32-24d0-a230-d83f0eb3947f.png)

で、もひとつ。
私はgithub actionsを使ってbotを実行していますが、ymlにtweepyのインストールするための記述(pip install tweepy)の追加し忘れたため最初はエラーが発生して動かず。そこで気づいたけれど、どこでライブラリを環境にinstallするんだっけ？ってしばらく考え込みました。１年さわってないと忘れるよ。

ymlファイルのここらあたりの記述ですね。

~~~
        run: |
          # pip更新
          python -m pip install --upgrade pip
          # 必要なパッケージインストール
          pip install requests tweepy 
          # 別で管理しているbotの元ネタを参照するためrequestsも使ってます。
~~~
----------------------------------------------------------

Twitterのbotを作ってみた時、以下のような投稿をしました。

https://qiita.com/tonytani37/items/3e82e89c7cdfd1353d01

で、今年からTwitterの提供サービスの形態が変わるというニュースは読んでいたものの、いつ切り替わるかがはっきり書いてないのでそのままほっといてたら、ある日突然Twitterへの投稿がされなくなっていることに気づきました。

なにぶん基本的な理解を欠いたままそこらへんに落ちてたソースを写経して作り、とりあえず動いた的な環境のbotだし、Twitterの説明文はほぼ英語だしでもういっぺん環境を理解しなおしてソース読むのもめんどくさいなぁなんて思いつつも、ようやく重い腰を上げて対応に手を付けてみました。

そういえばちょうど投稿されなくなったその頃に、エラーが発生したとGithubから通知がきていたのを思い出して（上の投稿記事に書いてる通り、私のbotはgithub Action環境を使っています）そのときは特に何も考えず、もう一度同じ処理を実行（ActionsのRerun)してみたらGithub側では正常処理が完了したように見えたので、そのときはこれで復活するだろうとのんきに考えていましたが、改めてwitter投稿内容を確認するとやはりbotでの投稿ができておらず、そうなればgithub ActionsではなくTwitter側の環境が原因に違いないと考えました。

で、思いついたのがAPIの新しいバージョンへのなんらかの対応が必要なのかなということで、まずはDeveloper Portalを確認してみようとサイトにアクセスしてみると、Portal画面のある項目に赤い文字が表示されているのを発見しました。

![スクリーンショット 2023-05-27 10.43.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1739706/4a96b625-fd6c-0243-33f7-12c419ddbfbc.png)

画面の左真ん中辺りにある {} Products　という部分は、画像ではすでに緑のNEWマークで、その下がTwitter API v2になっていればオーケーですが（見えない場合は右側の下向き記号をクリックすると出てきます）、ここがAPI v1.1のままだとエラー発生状態で　[] Productsの右側が”discard”（だったかな？）と表示され機能が凍結してるよってカンジの状況となってます。

そこでともかくやってみようとv2の利用を登録設定してみました。


登録自体は簡単ですが、必須入力項目に何を入れておけばいいのか迷ったりしたので（英語だし）、具体的な方法は別の方が説明されているサイトのリンクを貼っときます。私が書くよりわかりやすいはず。

https://ent-plus.com/twitter-api-request/

上においたリンク先はAPIを使うための一からの方法が書かれていますが、わたしの場合「「User Authentication settings」でユーザー認証を編集しよう！」あたりを参考にしてました。

結果として、自分のPortal画面でそれが表示されていれば新しい利用形態に変更登録をする必要で、それが投稿できない原因だとわかりました。

botは毎日8:00-20:00くらいの間、１時間おき程度に投稿するので件数が多いわけじゃないため、1ヶ月1500投稿が上限でも無料のFreeで全然問題なしと考えFreeとして登録しました。

で、User Authentication settingsに必要な情報を登録すれば、ソースがv1.1を使ったままでも、これまで通り動きました。ってか、v2への登録をしたあと改めてソースを見直そうと思って一晩放ったらかしてたら、翌朝から動き始めてたのに気づいたというような結果オーライです。

ただしv1.1はそのうち廃止されると思われるので、近いうちにv2に移行したほうが良さそうな雰囲気ですね。

User Authentication settings登録後に表示されるCliant IDとClient keyは、V1.1のままでは特に使わなくてもオーケーでしたが、v2になれば多分使うことになるんじゃないかな。

v2への移行については、またやってその結果を報告したいと思います。

まあ色々なヒトたちが色々な使い方をしているだろうから、一気に切り替えは難しいとは思うけれど、もうちょっと具体的な期日を知らせた上で切り替えてほしかったな。メールが来ていたかもしれないけれど、英語だからしっかり読んでないし。　ってか、それは私の責任だけど、たのむよイーロン。極東の島国の端っこでちょこちょこやってるおっさんにも優しくしてね。