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


# はじめに

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

https://ios-osushi.github.io/


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

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

## 前提

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

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

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

# セットアップ

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

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

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

https://qiita.com/neru-dev/items/857cc27fd69411496388



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

- Consumer API Key
- Consumer API Secret
- Bearer Token
- Access Token
- Access Token Secret

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

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

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/ec33f7ca-146c-ce21-08e6-0f2fdea1cd47.png)

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

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

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/cebdafa5-387c-b576-2e81-2247d2bbba51.png)

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

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

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

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

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/1b4e99d0-01e3-ef76-dd3f-fd0300626c9d.png)

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

## 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 でのトリガーを設定

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

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175242/6580d113-6aab-5aff-29de-1d88347d86cd.png)

実際は 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 を実行しています。

### - 注意点

#### 環境に関して

:::note warn
`environment: X_Automation` に関して

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


#### メッセージに関して

:::note warn
`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

## その他

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

https://www.ebisenttt.com/posts/githubactions_twitterapi_og_1