Twitter API V2 を使用して、Power BI でツイートデータを可視化する (1) データ取得編

# はじめに
Twitter のツイートデータを Power BI で可視化するシナリオはいくつかあるのですが、今回は、Twitter API V2 に Power BI から直接接続して可視化する手順をご紹介します。

Twitter API に接続するには、Twitter Developer アカウントが必要になりますが、V1.1の時代は、英語で申請して Twitter 社と何回かやり取りする必要があるなど、ハードルがやや高い感じでした。しかし、V2 では、Essential access アカウントであれば、登録するだけで利用できるようになり、とても簡単に利用できるようになっています。API 接続部分はちょっとテクニカルな感じですが、データ取得後はいつもの Power BI なので、興味がある方はぜひチャレンジしてみてください。

# 必要なもの
- Twitter Developer アカウント

※ Twitter Developer アカウントの取得方法は[こちら](https://ent-plus.com/twitter-api-request/)のサイトがとても分かりやすかったです。

# 大まかな手順
大まかな手順は以下の通りです。
1. Twitter API の Bearer Token をコピー
2. Power Query でツイートを取得するためのクエリを生成する
2-1. Power Query で検索キーワードとトークンのパラメーターを作成する
2-2. Power Query で Twitter API へ接続してクエリ実行し、データを取得する
1. Power Query で データ整形する
1. Power BI Desktop 上でビジュアルを作成する


## 1. Twitter API の Bearer token をコピー
Bearer token の内容をコピーしておきます。(Power Query のパラメーターとして利用)
※ アカウントの取得の過程で Bearer token は取得できますが、コピーを忘れた場合は、Twitter Developer ポータル画面で、Regenerate (再生成) することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/4ad320f7-f2aa-d04e-0a4e-1ca079579829.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/b0cd0178-2833-e0b0-05fe-301b458d9cd1.png)




## 2. Power Query でツイートを取得するためのクエリを生成する

Twitter API は様々な検索をすることができるのですが、今回は**特定のキーワードでツイートを取得**することにします。
Twitter API V2 でツイート検索時に使用するのは、[GET /2/tweets/search/recent](https://developer.twitter.com/en/docs/twitter-api/tweets/search/api-reference/get-tweets-search-recent) です。様々なクエリパラメーターと Bearer token を渡して URL を組み立てて、ツイートを検索するクエリを実行する流れになります。

※ Twitter API の仕様で、1リクエストにつき取得できるツイートは最大100件で、過去7日間分が範囲となります。
※ 15分ごとに180リクエストの制限があるので過度な要求はさけるようにしましょう。

### ※Twitter のクエリ仕様について解説
クエリの基本構造は以下のような形です。

```
"https://api.twitter.com/2/tweets/search/recent?query=[検索ワード(必須)]&[ツイート日時ユーザー情報など取得したい情報や取得したい件数などを'&'でつなぐ（任意）]" -H "Authorization: Bearer [Bearer token]"
```
- ツイート検索に使用する API [tweets/search/recent] を Url で記述
`"https://api.twitter.com/2/tweets/search/recent?"`
- 引数(クエリパラメーター)
?につづけてに引数を&でつないで追加していきます
列挙型のものは、取りたい項目を空白無しの,でつないでいきます
※ Twitter API の仕様は[こちら](https://developer.twitter.com/en/docs/twitter-api/tweets/search/api-reference/get-tweets-search-recent)

今回は基本的な項目(ツイート内容とツイートしたユーザーの情報)のみを使います。使うクエリパラメーターは以下の通りです。
(以下はクエリパラメーター全項目ではなく、今回使うものだけをあげています)
|引数名||必須|型|内容|
|:--|:--|:-:|:--|:--|
|query||〇|テキスト|検索したいキーワード|
|expansions|author_id|||user.fields を取得するときに指定必要|
|max_results|||数字|クエリで取得する件数|
|tweet.fields|id(default)||テキスト|ツイートのID|
||text(default)||テキスト|ツイートの本文|
||edit_history_tweet_ids(default)||オブジェクト|ツイートの全バージョンを示す一意の識別子。編集履歴のないツイートは1つのID、編集履歴のあるツイートは複数のIDが存在|
||author_id||テキスト|ユーザーID|
||created_at||日付(ISO 8601)|ツイートの投稿時間(UTC)|
||lang||テキスト|ツイートの言語|
||public_metrics||オブジェクト|ツイートの公開エンゲージメント指標 (リプライ数・いいね数・リツイート数)|
||source||テキスト|ツイートしたアプリ名|
|user.fields|id(default)||テキスト|ユーザーID|
||name(default)||テキスト|ユーザーがプロフィールで定義した名前|
||username(default)||テキスト|ユーザーが自らを識別するための Twitter スクリーンネーム、ハンドルネーム|
||created_at||日付(ISO 8601)|ユーザーアカウント作成日時(UTC)|
||description||テキスト|ユーザー説明|
||location||テキスト|ユーザプロファイルで指定された場所(自由形式)|
||profile_image_url||テキスト|ユーザープロフィール画像URL|
||public_metrics||オブジェクト|ユーザーのアクティビティに関する詳細(フォロワー数、フォロー数、ツイート数、リスト数)|
||url||テキスト|ユーザープロフィールURL|

## 2-1. Power Query でパラメーターを作成する
Twitter API を実行するために、2つの Power Query パラメーターを作成します。
- 検索キーワード
- トークン

1. Power BI Desktop を起動し、「データの変換」-> 「データの変換」をクリックして、Power Query エディタを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/6a7fa9e6-5694-e1bf-008b-f37027611260.png)

2. Power Query エディタで、「パラメーターの管理」->「新しいパラメーター」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/a9ec1a6d-8cb1-f580-221e-5e1ce191729e.png)

3. 「パラメーターの管理」 画面で、新しいパラメーター **検索キーワード** を作成します。
[種類]に **テキスト** を指定し、[現在の値]に **任意の値(例:"日本マイクロソフト")** を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/7a887259-5742-0cfa-4a45-1fde012691ac.png)


4. 同じく、「パラメーターの管理」 画面で、新しいパラメーター **トークン** を作成します。
[種類]に **テキスト** を指定し、[現在の値]にあらかじめコピーしておいた、Twitter API V2 の **Bearer Token** を貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/2c45c8d2-2f7d-82ed-a266-338516ae0c35.png)

これで Power Query パラメーターは作成完了です。

## 2-2. Power Query でTwitter API へ接続し、クエリを実行するコードを記述する
Power Query で空のクエリを作成し、詳細エディタに M言語でコードを記述していきます。

1. Power Query エディタで「新しいソース」-> 「空のクエリ」をクリックし、空のクエリを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/9599532e-7e26-1979-c909-bdfc8b5f19ca.png)

2. 空のクエリの名前を わかりやすい名前 (例：twitter_analysis_base) へ変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/23d30bd5-534d-12bb-56b6-7cc064523a7b.png)

3. 「詳細エディタ」をクリックして、詳細エディタを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/983ce6a6-e693-a33d-592b-f07a47ae44fc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/b606f670-cc20-825b-3424-bf9d58b31773.png)

4. 以下のソースを貼り付け、完了ボタンを押下
    ```:Twitter API
    let
        // AccessTokenHeader を作成
        AccessToken = トークン,
        AccessTokenHeader = "bearer " & AccessToken,
        
        // bearer token を使用して、Twitter GET /2/tweets/search/recent メソッドを実行
        GetJsonQuery = Web.Contents("https://api.twitter.com/2/tweets/search/recent?max_results=100&expansions=author_id&tweet.fields=author_id,created_at,lang,public_metrics,source&user.fields=created_at,description,location,profile_image_url,public_metrics,url&query=" & #"検索キーワード",
            [
                Headers = [#"Authorization"=AccessTokenHeader]
            ]    
        ),
      
        FormatAsJsonQuery = Json.Document(GetJsonQuery)
    in
        FormatAsJsonQuery
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/81dd46f8-aaad-4bdc-c6d6-537f5ec30c9e.png)

    ※ 上記ソースをざっくり説明すると、組み立てた URL を Web.Contents 実行して、戻ってきた値を Json.Document で見られるようにしています。

5. 以下の通り、[data]、[includes]、[meta] が取得できていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642886/2cdb0305-35c4-179b-8c03-cad2d5a56531.png)

    ※ Twitter API V2 では、[data] と [includes] に分かれて、要求した項目が格納されて返ってきます。

今回はここまでです。
次回は取得したデータ[data]、[include]の中にある、ツイート内容やユーザー情報を Power Query でデータ整形していきます。