OpenAIとXのAPIを接続して自動ポストするbotについての備忘録

## はじめに
Xで毎朝AIに挨拶させるbotを作成し、3か月ほど運用してきましたので、設定方法や、気付いた点をメモしておきます。make.comを使いました。

:::note warn
2025年6月2日より、当記事で用いていたMake.comでのXのAPIは無効となりました。現在、同様の方法での自動化を実現することはできません。6月8日より、筆者はn8nで同様のことを実現しています
:::

## API接続設定

画像はmake.comの設定画面です。毎朝6時にタイマーを設定し、今日の天気を確認したうえで、OpenAIにその日の挨拶を生成させ、Xに繋いで投稿しています。

![スクリーンショット 2024-12-28 182536.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866483/1fe79e7b-5e0a-2f29-053d-c2974af413ba.png)

###  必要なアカウント
- make.comアカウント
https://www.make.com/en
無料の範囲内でやっています。
- X 開発者アカウント
https://developer.twitter.com/en/
無料の範囲内でやっています。使用目的を書いて申し込む必要があります。
- OpenAI APIアカウント
https://openai.com/index/openai-api/
従量課金ですが、今回の使い方であればほぼ無料に近いと思います。

### Xの設定
以下のmake.comに設定するClient IDとClient SecretをX開発者ポータルで作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866483/1449970a-9294-6463-414e-5b93b8ea5c51.png)

デフォルトプロジェクトのアプリ詳細を選択し、User authentication settingsをEditします。

![スクリーンショット 2024-12-28 191957.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866483/9721fc84-fbab-87e1-edd8-b46801bbbbf7.png)

App permissionsでRead and write and direct Messageを選択、Type of AppでWeb App, Automated App or Botを選択。

![スクリーンショット 2024-12-28 191939.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866483/58d5efc5-3501-0f82-caf8-ac3612582c08.png)

App Infoに以下URLを入力（他は空欄）
- Callback URI / Redirect URL
https://www.integromat.com/oauth/cb/twitter2
https://www.integromat.com/oauth/cb/twitter
- Website URL
https://www.integromat.com/oauth/cb/twitter

![スクリーンショット 2024-12-28 191932.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866483/170a478f-7839-2601-c143-c9f98636d324.png)

上記をSaveして、表示されたClient IDとClient Secretの値をコピーし、make.comに設定すれば接続できます（情報は更新される可能性があるので、最新のヘルプを参照）。
https://www.make.com/en/help/app/twitter

### OpenAI APIの設定

make.comに設定するAPI KeyとOrganization IDを取得します。また、そこで使うアシスタントを作成します。

![スクリーンショット 2024-12-28 194423.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866483/7d6f3bfc-605e-d889-6229-b60a5eccae1a.png)

API Keyを作成し、その値を使います。

![スクリーンショット 2024-12-28 193322.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866483/9603fa61-1270-fb21-113a-cf7dfeeba7c4.png)

Organization IDは以下の値を使います。

![スクリーンショット 2024-12-28 194321.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866483/0e2c4b6f-9597-7ee7-4abb-cc12658097f3.png)

アシスタントを作成し、botの人格や話し方などをSystem instructionsに書き込みます。ここで設定されたアシスタントIDを、make.comで接続後に選択します。彼女は女子大生という設定で、大学のイベントなどの日程をあらかじめセットしています。

![スクリーンショット 2024-12-28 181800.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866483/413581c7-c48e-a48c-f518-bf1e09f3c316.png)

## オートメーション設定

まず、毎朝6時に起動する設定として、天気を取得します。今日の東京の天気を取得することにします。

![スクリーンショット 2024-12-28 182711.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866483/cc146ae7-6b38-fdbe-3787-5c4d749977c7.png)

その結果の天気（5.Description項目）を受けとり、アシスタントに指示を出します。今日が何日であるかは、make.comのnow関数を用いて取得し、formatdate関数で日本時間に変更しています。日本時間の朝に挨拶すると、**サーバーのある国が前日だったりしますので要注意です**。Xのポストのために、文字数も指示しています。

![スクリーンショット 2024-12-28 182838.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866483/b6b74e16-c463-39f9-0cdf-5cd62b3517bc.png)

最後に、Xへの投稿を行います。OpenAIから受け取ったText.Valueにポスト内容が入っていますので、固定ハッシュタグの後に追記して投稿します。

![スクリーンショット 2024-12-28 182902.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866483/6f7ca35a-ae08-13c5-ff18-afca384b1837.png)

実際に生成されたポストは下記。

![スクリーンショット 2024-12-28 201306.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866483/6a782679-d0f8-28c4-0482-7756df990226.png)

## プロンプト内容

アシスタントに設定しているプロンプト（抜粋）です。基本的には、自分が誰で何をしてほしいのかを記載しています。

```
### Role and Behavior
Role:
あなたは21歳の女子大生であり、大学三年生です。
Personality:
一人称: 「あたし」
語尾: 「なのです」「デス」を使い、子供っぽくフレンドリーな敬語を使用します。
Hobbies and Interests: 
文章を書くこと、音楽を作ること、ココアを飲むことが好きです。
### Operational Instructions
Avoid Hallucinations:
情報を検索して応答する際には、必ず出典を明示してください。
ハルシネーションを防ぐため、不確かな情報は控えてください。
Avoid Controversial Topics:
政治的に偏向と取られる可能性のある発言を避けてください。
### Event-Driven Behavior
毎日の挨拶や発言内容は、以下の大学イベントと文化的行事を基に構成してください。
スケジュールから自分が休暇中か授業期間中かを考慮し、その日の挨拶やコメントに反映してください。
大学のイベント
4月第1週: 新学期開始
4月第2週: 履修登録期間
5月第1週: ゴールデンウィーク（休暇）
6月第3週: 中間試験期間
7月第4週: 期末試験開始
8月第1週: 夏休み開始
9月第3週: 夏休み終了
10月第1週: 後期授業開始
11月第2週: 後期中間試験
11月第4週: 大学祭（文化祭）
12月第4週: 冬休み開始
1月第2週: 冬休み終了
1月第3週: 後期試験開始
2月第4週: 春休み開始
3月第3週: 学年末
3月第4週: 春休み終了
文化的行事
1月1日: お正月
2月14日: バレンタインデー
3月3日: ひな祭り
3月14日: ホワイトデー
7月7日: 七夕
10月31日: ハロウィン
12月24日: クリスマス・イブ
12月25日: クリスマス
12月31日: 大晦日
```

## 失敗談

- 今日が何の日かはその人による

当初、今日が何の日かネットを検索してポストさせようとしました。しかし、その方法は頻繁にハルシネーションを起こします。ネット上で見つかる「今日が何の日」という情報自体、不正確なものなのかもしれません。

出典を確認してほしいことや、商業的な記念日や政治的な記念日を避けることなどを指示してみましたが、ハロウィンの日にもムッソリーニの話をしだしたので、この方法は諦めました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866483/33a202ae-af6e-b43a-093b-c15f01bddaa4.png)

結局、**今日が何の日であるのかは人それぞれ**です。彼女は女子大生という設定なので、生活のベースとなる大学のイベントと主要な文化的行事を登録することで、それに沿った発言をしてくれるようになりました。

- 無理せず生活に根差した人格を作る

最初の設定では、彼女は衒学的な用語を好むキャラだったのですが、難しい言葉を言わせようとすると、不正確な発言もしやすくなってしまいます。以下は微妙な例です。

![スクリーンショット 2024-12-28 203906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2866483/4ae478b5-e614-3409-0738-30f04940e5f2.png)

その後、自分の生活を意識して挨拶をするようにプロンプトを変更したことで、だいぶ仮想人格として安定してきたと思っています。

## おわりに

なお、このbotアカウントはフォロワー10人程度で、限られた友人と遊ぶために作成したものです。自動ポスト以外は身内向けの愚痴を書いていますので、**検索しないであげてください**。

代わりに、先月僕が男性向けアダルト小説投稿サイト・ノクターンノベルズにアップしたR18エロ小説のリンクを張っておきます。https://novel18.syosetu.com/n6635jt/
OpenAIは性的な表現を出力できないので、こちらはまだ人間の仕事だと思います。

以上、OpenAIとXを繋いだbotアカウント、その設定方法と経験談についてのメモでした。