Node.js + ExpressでTwitterBot作成 #1 『事前準備』

# はじめに

Node.jsとExpressを使ってツイッターのbotを作ってみたので作成手順をメモしておきます。
仕様等は以下の通りです。


### Botの仕様

- サッカーネタの100RT以上のツイートを自動でリツイートする
- 同一ソースで別ジャンル（野球、プログラミングなど）のBotも作成可能にする


### 開発理由
- サッカーやプログラミングなど、興味のある分野でバズっているツイートを見逃さないため


### BotのTwitterアカウント
https://twitter.com/foot_rt_bot (ジャンル：サッカー)


### 環境
- 言語： Node.js　(v18.12.1)
- フレームワーク： Express 
- DB： SQLite 
- ORM: Prisma
- Twitter操作用ライブラリ: node-twitter-api-v2
- IDE: VSCode

### ソース
https://github.com/tsubame/FootRTBot-NodeJs

　
# Node.jsのインストール

まずは公式サイトからNode.jsをダウンロードしてきてインストール。

https://nodejs.org/ja/

インストールが完了したら "node -v"でバージョンを確認。

```
node -v
>> v18.12.1
```

続いてExpressのフォルダ生成用のexpress-generatorをインストール。

```
sudo npm install express-generator -g
```

インストール後、プロジェクト用のフォルダを作成します。
オプションに"-e"を付けることでテンプレートエンジンにejsを使用できます。

```
npx express -e FootRTBot
```

以下のような構成でフォルダが作成されました。
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200881/a9dbcf22-3117-37f0-c59e-9ded116b66fb.png" width = "200" />

package.jsonを見ると以下のようになっています。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200881/601766d0-fd74-f2ce-e51e-c0b905f83bdd.png" width = "300" />

このライブラリをnpmでインストールします。
```
cd FootRTBot
npm install
```

インストール後、npm startでサーバが起動します。
```
npm start
```

ブラウザを起動し、localhost:3000 にアクセス。Expressのページが表示されることを確認します。

　
# Prismaをインストール

ORM用のライブラリ、Prismaをグローバル環境にインストールします。

```
sudo npm install prisma -g
```

プロジェクトのフォルダ内で以下コマンドを実行し、初期化処理を実行。
```
prisma init
```

プロジェクトフォルダ内に「prisma」フォルダとschema.prismaファイル、非表示ファイル「.env」が生成されました。

<img src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200881/60b5f111-4365-8f95-fd1e-1e53b077cb7c.png" width = "210" />

<img src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200881/9b2e1eb4-d6d0-40d2-63c7-bef8bb0e2f80.png" width = "500" />

このファイルにDB情報を記述していきます。
デフォルトではPostgreSQLを使用する設定になっているのでSQLite用に書き換え。

```.env
DATABASE_URL="file:./data.db"
```

```schema.prisma
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "sqlite"
  url      = env("DATABASE_URL")
}
```

DBのスキーマ情報もこのファイルに定義していくことになりますが、それは後ほど記載していきます。

　
# TwitterAPIの使用準備

続けてBotで使用するTwitterアカウントの用意に入ります。
TwitterAPIを使用する場合、以下の手順が必要です。

:::note warn 
<strong>TwitterAPI使用時の申請手順</strong>
- Twitterアカウントの作成
- プロフィールで電話番号の入力
- APIの申請
- キーを生成
- Elevated accessの申請（APIv1.1を使用する場合のみ）
:::

　
まずはTwitterアカウントを作成し、電話番号をアカウントに紐付けます。
その上で以下からサインアップし、APIを申請。

https://developer.twitter.com/en/docs/twitter-api/getting-started/getting-access-to-the-twitter-api

続けて、ProjectのDashboardに移動し、「User authentication settings」からEditを選択。

https://developer.twitter.com/en/portal/dashboard

以下のように入力。

- 「App permissions」 … "Read and Write"
- 「Type of App」 … "Web App, Automated App or Bot"
- 「CallbackURL、WebSiteURL」 … "https://twitter.com/" 

これでAPIに必要なClientID、ClientSecretが発行されるので忘れずにメモします。
続けて、Dashboardの「Keys And Tokens」から「Access Token and Secret」を生成し、メモしておきます。
APIv2を使用する場合はここまでの手順でOKです。

ただ、APIv1.1を使用したい場合は「Elevated access」の申請が必要です。
今回はTwitterのトレンドを取得したい処理があり、トレンド用のAPIはv1.1にしか用意されていないので申請します。
以下の手順を参考に申請させていただきました。

https://tensei-shinai.com/2022/04/27/twitter-api-elevated/

　
# node-twitter-api-v2をインストール

TwitterAPIをOAuthで直接叩くのは大変なので、ライブラリ「node-twitter-api-v2」を使用します。
こちらはTwitterAPI Ver1、Ver2の両方に対応しており、ドキュメントも充実しています。

https://github.com/PLhery/node-twitter-api-v2

以下コマンドでインストールを実行。

```
npm i twitter-api-v2
```
　
## log4jsのインストール

ログ出力用のライブラリ、log4jsをインストールします。

```
npm install log4js
```


　

これで事前準備が終わりました。
次に実装に移ります。