13
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitHub ActionsからX(Twitter) APIを使って X にポストする

Last updated at Posted at 2024-09-29

はじめに

iOS Osushi というものを何人かで運営しており、iOS 関連のことをまとめて記事にしています。

この記事は毎週作成されており、X でもポストするようにしているのですが、これを 自動化したい! というので、取り組んでみました。

案外面倒だったのと、別でも使いたいと思ったので、ある程度テンプレート化したいと思い記事にしました。

前提

X(Twitter) API が有料化して、v1.1 が廃止になりました。

以前のものは curl コマンドでサクッと試す、みたいなことができたのですが、認証周りが少し厳しくなりました。OAuth 1.0 は使えなくなり、OAuth 1.0a または OAuth 2.0 を使う必要があります。

この辺をまるっと考えたくないので、Python のライブラリを使って実装していきます。

セットアップ

1. X Developer Portal への登録とキーの取得

API を使うには開発者登録の申請が必要です。
申請といっても、申し込んだらすぐ使えるので審査とかはないです。

登録方法は、こちらの記事によくまとまっているので、こちらを参照してください。

記事にある通り、7つのキーを取得できますが、今回は5つを使用します。

  • Consumer API Key
  • Consumer API Secret
  • Bearer Token
  • Access Token
  • Access Token Secret

これらをメモしておいてください。

1点注意点として、Access Token Secret の権限に write があることを確認してください。

これがないと権限不足で Xにポストされません

設定されていない場合は以下のように修正しましょう。

修正後は必ずトークンを再発行してください。

2. GitHub に環境変数を設定する

取得したキーを使うために、Actions を実行するリポジトリの設定画面で設定しましょう。

以下は登録例です。Name は GitHub Actions の yml から使用できるものなので、わかりやすいものを自分で設定しましょう。

リポジトリが非公開なのであれば、不正利用されたとしてもすぐにキーを再発行できるので、キーを直打ちでも大丈夫ですが、そんなに手間でもないのやっておくことをオススメします。

3. GitHub Actions の yml を設定する

とりあえず、最低限の動くものを置いておきます。

.yml
name: Create X Post

on:
  workflow_dispatch:

permissions:
  contents: read

jobs:
  tweet:
    runs-on: ubuntu-latest
    environment: X_Automation
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.x'

      - name: Install dependencies
        run: |
          pip install tweepy

      - name: Post article
        env:
          X_API_KEY: ${{ secrets.X_API_KEY }}
          X_API_KEY_SECRET: ${{ secrets.X_API_KEY_SECRET }}
          X_BEARER_TOKEN: ${{ secrets.X_BEARER_TOKEN }}
          X_ACCESS_TOKEN: ${{ secrets.X_ACCESS_TOKEN }}
          X_ACCESS_TOKEN_SECRET: ${{ secrets.X_ACCESS_TOKEN_SECRET }}
          X_POST_MESSAGE: "ポストする内容"
        run: python tweet.py

以下、いくつか解説しておきます。

- workflow_dispatch でのトリガーを設定

これにすることで手動でのテストができます。

実際は main に merge されたら、などをトリガーにすると思いますが、開発の段階ではこれが便利です。

- 環境変数からキーを取得して Python で参照する

.yml
- name: Post article
env:
  X_API_KEY: ${{ secrets.X_API_KEY }}
  X_API_KEY_SECRET: ${{ secrets.X_API_KEY_SECRET }}
  X_BEARER_TOKEN: ${{ secrets.X_BEARER_TOKEN }}
  X_ACCESS_TOKEN: ${{ secrets.X_ACCESS_TOKEN }}
  X_ACCESS_TOKEN_SECRET: ${{ secrets.X_ACCESS_TOKEN_SECRET }}
  X_POST_MESSAGE: "ポストする内容"
run: python tweet.py

実際にポストをする Python 側でキーが必要になるので、参照できるようにする必要があります。最後に run で Python を実行しています。

- 注意点

環境に関して

environment: X_Automation に関して

これは自身が GitHub 上で設定した環境名にすることを忘れないでください。

メッセージに関して

X_POST_MESSAGE に関して

GitHub Actions で取得した値を使いたいので、X_POST_MESSAGE というものを作って渡すようにしていますが、メッセージが固定なのであれば、これは特に必要ないです。

4. X へポストする Python コードの作成する

ネット上には、いろんな複雑なコードが載っていますが、最小限なものを記載しておきます。

tweet.py
import tweepy
import os

ck = os.environ['X_API_KEY']
cs = os.environ['X_API_KEY_SECRET']
bt = os.environ['X_BEARER_TOKEN']
at = os.environ['X_ACCESS_TOKEN']
ats = os.environ['X_ACCESS_TOKEN_SECRET']
content = os.getenv('X_POST_MESSAGE')

client = tweepy.Client(
    bearer_token=bt,
    consumer_key=ck,
    consumer_secret=cs,
    access_token=at,
    access_token_secret=ats
)
client.create_tweet(text=content)

やっていることはこれだけです。
 ① GitHub Actions からキーを取得してセットする
 ② X にポストする

tweepy が便利すぎてありがたい...Python がわからなくても簡単に理解できると思います。

ファイルはディレクトリのルートにおいてください。その他の場所に設置する場合は、実行時のパスを変えてください。

ちなみに Python じゃなくてもこれは使えますので、探してみてください。

終わりに

権限周りと認証で上手く実行できず、最初は苦労しましたが、完成してみると簡単すぎて感動しました!

自分のメモ程度に書いていますが、この情報が誰かの助けになれば幸いですmm

その他

オススメの記事を置いておきます

13
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?