Twitter APIを使ってツイートしてみた


## 背景

Node.jsを学び始め、APIを学び始め、
TwitterやQiita等でもアウトプットし始めた。

ということで、
これらを纏めて一緒に触ってみよう。と思った今日この頃。笑

## 前提
* Node.js(v16.14.2）
* Twitter開発者アカウント取得
１）Twitter画面右下の「・・・」の中にある「開発者」をクリック
![スクリーンショット 2022-06-18 130351.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627323/fc863426-fc35-643d-d12d-4191f30964b6.png)
２）Developer Portalで、sign upをクリック
３）名前、国、目的等を入力
![スクリーンショット 2022-06-18 131542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627323/506ef1a5-d04b-784e-caf5-3157eae010dc.png)
４）Agreement & policyに同意する
５）Verify your Twitter Developer Accountのメールが届くので、
　　Confirm your emailをクリック
６）ログインし、Success！が出たらオッケー。

## 【1】Twitterでプロジェクト登録をする
１）Project name, Use case, Project description, App nameを入力する。
２）API Key, API Key Secret, Bearer Tokenが表示されるので、コピーする。
　　※これらは一度しか表示されないようなので、
　　　忘れずにコピーしないといけない。
![スクリーンショット 2022-06-18 132617.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627323/85d9d1fa-8bd4-3a29-4dd5-b9c57dca7238.png)


## 【2】とりあえず、リクエストしてみよう。
Docsを読み始めてみると、make your first requestという気になるページを発見。
（https://developer.twitter.com/en/docs/twitter-api/getting-started/make-your-first-request）

その中に、Sample codeがあったので、試してみた。
```
curl "https://api.twitter.com/2/users/by/username/$USERNAME" -H "Authorization: Bearer $ACCESS_TOKEN"
```
USERNAMEはTwitterのID、ACCESS_TOKENは、【1】でコピーしたBearer Tokenの事。
リクエストしてみたところ、以下のようなレスポンスが返ってきた。

```
{"data":{"id":"********","name":"Kenny | エンジニア@コラボスタイル","username":"KennyITengineer"}}
```
・・・・とりあえずは、取得できた！！！（成功体験！　大事！笑）
## 【3】ツイートを取得してみよう。
上司からの以前からのアドバイスもあり、まずはDocsを確認。
なお、Docsの深いところは今回は読まない。笑

とりあえず、
Search Tweetsのところに、Quick Startがあったので、読んでみる。
https://developer.twitter.com/en/docs/twitter-api/tweets/search/quick-start/recent-search

以下のURLを使えとな。
```
https://api.twitter.com/2/tweets/search/recent?query=from:TwitterDev&tweet.fields=created_at&expansions=author_id&user.fields=created_at
```
読み解いてみると、
tweetsをsearchしますrecent分（1週間分）を。といった感じか。
queryで詳細を指定できるようで、
from誰（上記例でいうTwitterDevさん）で、以下Key Valueを取得する感じなのかな？
![スクリーンショット 2022-06-18 214238.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627323/775c1f06-b735-6f99-30a9-c0d7c046ce3d.png)

TwitterDevさんの取得しても面白くないので、
自分のIDを当てはめて取得してみることにした。
以下例
```
curl --request GET 'ここにhttps://api.twitter・・を入力' --header 'Authorization: Bearer $ACCESS_TOKEN'
``` 
上記例を参考に以下実行してみる。
```
curl --request GET 'https://api.twitter.com/2/tweets/search/
recent?query=from:KennyItengineer&tweet.fields=created_at&expansions=author_id&user.fields=created_at' --header 'Authorization: Bearer $ACCESS_TOKEN'
```
そうすると、以下取得できた！（成功体験！笑　大事！）
```
{
  "data":[
    {
      "text":"記事を投稿しました！ ノンビン塾～エンジニアとしての成長記録5～ [JavaScript] on #Qiita https://t.co/m0rVYdfJTt",
      "id":"1536714917276880897",
      "author_id":"*******",
      "created_at":"2022-06-14T14:19:21.000Z"
    },
    {
      "text":"記事を投稿しました！ Node.jsに初めて触れてみた on #Qiita https://t.co/8rI8NnghqV",
      "id":"1535989248448270337",
      "author_id":"*******",
      "created_at":"2022-06-12T14:15:48.000Z"
    },
    {
      "text":"記事を投稿しました！Botを使ってみた（Node.js + Bot Framework Emulator） https://t.co/rMcE9T6vHm #Qiita",
      "id":"1535647103741214720",
      "author_id":"*******",
      "created_at":"2022-06-11T15:36:15.000Z"
    }
  ],
  "includes":{
    "users":[
      {"username":"KennyITengineer",
        "created_at":"2022-05-20T14:08:53.000Z",
        "id":"*******",
        "name":"Kenny | エンジニア@コラボスタイル"
      }
    ]
  },
  "meta":{
    "newest_id":"1536714917276880897",
    "oldest_id":"1535647103741214720",
    "result_count":3
  }
}
```
嬉しいーーー！
取得できました。


## 【4】Node.jsからツイートしてみよう。
今度は、タイトルの通り、Node.jsでプログラムを書いてツイートしてみようと思う。

### 【前提】
Twitter API v2で、【Elevated】をApplyする。（承認まで１～２日かかる可能性有）
※【Essential】では、エラーが発生してツイートできなかった為。。
１）Applyをクリックする
![スクリーンショット 2022-06-18 225041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627323/954f7640-952e-f122-3baa-9090d1380fdd.png)
２）コーディングスキル等適当に入れて、Nextをクリック
![スクリーンショット 2022-06-18 225210.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627323/092f7858-46d9-2dd6-8cc4-5494147481b2.png)
３）TwitterAPIをどう利用するか等を英語で書いていく。。（面倒。。）
　　※私の場合、適当に書きすぎたことが原因で、
　　　Twitterと別途メールでの確認があり、
　　　英語で４～５往復やり取りを実施し、ようやく承認された。。
　　　適当過ぎずに、ある程度しっかり書かないと後が大変。。笑
４）Agreement&Policyを読んで、Submitする
５）以下のメールを受信したら完了
![twitter_approved.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627323/92236ec7-2d5d-df2e-9e2c-0496174d5c7c.png)

### １）ユーザー認証の設定を行う
この設定を行わずに、２）のTokenを生成すると、
Read Onlyとなり、ツイート投稿ができない設定となってしまう。
その為、ここではRead and Write permissionsの設定を行う。
（私は、最初Read Onlyになっている事に気づかずツイート実行してエラー。
　原因が分からず、１～２時間詰まってしまい、解決に苦労した。。）

まず、自分のプロジェクト > Settings > User authenication settings　でset upをクリック
「OAuth 1.0a」を有効にして、「Read and write」を選択。
「Callback URI/Redirect URL」と「Website URL」に自分のサイトURLを入力して保存。

### ２）Access Token and Secretを生成する
自分のプロジェクト > Keys and tokens > Authentication Tokens > Access Token and SecretでGenereteをクリック
※Tokenは一度しか表示されないので、きちんとコピーする。
![スクリーンショット 2022-06-18 222756.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627323/40a8348c-46c0-caff-ced0-a10e28793b8b.png)
Genereteできたら、念の為、Created with Read and Write permissionsとなっているか確認。
![スクリーンショット 2022-06-19 212244.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627323/a57c1ee9-6316-502c-c0df-8a36102cb55a.png)

### ３）npmでtwitterをインストール
VSCodeを立ち上げて、適当なディレクトリにて以下実行してみる

```
npm install --save twitter
```
現時点（'22/6月）では、Twitter APIはv1とv2があるようで、
上記はv1.7.1をインストールした。
※v2前提で進めたところ、エラー発生で未解決の為、記事化は次回以降に持ち越し。。

### ４）npm公式の以下コードを利用して実行してみる

https://www.npmjs.com/package/twitter

ディレクトリ配下にtest.jsファイルを作り、以下実装。

```test.js
var Twitter = require('twitter');
 
var client = new Twitter({
  consumer_key: '*****', //生成したAPI Keyを入れる
  consumer_secret: '*****', //生成したAPI Key Secretを入れる
  access_token_key: '*****', //生成したAccess Tokenを入れる
  access_token_secret: '*****' //生成したAccess Token Secretを入れる
});
 
var params = {screen_name: 'nodejs'};
client.post('statuses/update', {status: 'TwitterAPIを使っての初ツイート'},  function(error, tweet, response) {
    if(error) throw error;
    console.log(tweet);  // Tweet body.
    console.log(response);  // Raw response object.
});
```
twitterのライブラリをrequireし、
そのライブラリを利用して、clientにAPIKey等を代入する。
エンドポイントの'statuses/update'へpostをする。内容はstatusの中身。
といった感じなのかな。。

さー、ツイートしてみよう。

```
node test.js
```

ドーーーン
以下エラーで、投稿できず。
```
var Twitter = require('twitter');
              ^
ReferenceError: require is not defined in ES module scope, you can use import instead
This file is being treated as an ES module because it has a '.js' file extension and 'C:\develop\TwitterAPI\package.json' contains "type": 
"module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.
    at file:///C:/develop/TwitterAPI/test.js:1:15
    at ModuleJob.run (node:internal/modules/esm/module_job:197:25)
    at async Promise.all (index 0)
    at async ESMLoader.import (node:internal/modules/esm/loader:337:24)
    at async loadESM (node:internal/process/esm_loader:88:5)
    at async handleMainPromise (node:internal/modules/run_main:61:12)
```
詳細はまだ理解できていないが、拡張子をcjsに変えろとな。

ということで、test.js⇒test.cjsに変更し、再度実行してみた。
![スクリーンショット 2022-06-19 214239.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627323/ba77ad5f-54dc-08cb-77a6-db5c9aa1bcce.png)

やったーーー！


## 終わりに
今回目標としていたTwitter APIを使ってツイートする事はできた。
しかし、記事でも少し触れたが、
API-v2がまだあまり理解できずにいる為、ここは次回に持ち越し。

今はとりあえず、
APIに数多く触れる事が重要だと思うので、
これからもイジイジしてみようと思う。