[講座] Twitter Stream API を使って Azure でデータ分析 - Step1 (Sampled Stream V2 API)

こんにちは。ドクです。
久しぶりに Twitter API を使って、データ分析をしてみようと思います。前回は、第二次安倍内閣が誕生する前の衆議院選挙時に、Twitter API を使いましたが、面白い傾向が見てとれました。かなり昔ですね。。。

#講座の最終目標
Twitter のツイート データを Azure Data Lake Storage Gen2 (ADLS Gen2) に Parquet 形式のファイルとして自動的に蓄積し、Azure Synapse Analytics (Serverless SQL / Apach Spark) を使って分析できるようにします。ツイート データの継続的な取得と ADLS Gen2 へのデータ蓄積には、Azure Functions を利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166299/30c24b2a-3903-f9eb-86f9-b18e41f4f29a.png)

#Step1 の目標
2021 年 5 月現在、プレビューである Twitter - **Sampled Stream V2 API** を C# から扱えるようにすることです。このステップでは、Azure は関係なく、ローカル環境に単純なコンソール アプリケーションを作成し、動作させます。

#Twitter API
Twitter の開発者向けプログラムを通して提供される [API](https://developer.twitter.com/en "Twitter Developer Home") です。各 API では要求に対するレート制限が設定されており、Stream API の一般的な無償利用の場合、50 万ツイート/月の取得制限が入ります。今回は、Twitter 社によってサンプリングされたツイートをリアルタイムに受け取れる Sampled Stream V2 API を利用します。

#開発環境 (OSS)
開発には、以下を利用します。OSS (無償) かつ クロス プラットフォームとなりますので、Windows / Mac / Linux などお好きな OS/デバイスをご利用ください。

- ツール ： [Visual Studio 2019 Community](https://visualstudio.microsoft.com/ja/vs/community/ "Visual Studio 2019 Community") or [VS Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/ "VS Code")
- ランタイム ： .NET 5 or .NET Core 3.1
- 言語 ： C#

#Twitter API 環境の整備
##1. Twitter アカウントの作成
API 用の Twitter アカウントを作成します。携帯電話番号やメールアドレスなどを正しく登録してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166299/3fc7e7c3-ac8d-be94-886d-b2d05ceef0b5.png)

##2. Twitter API の利用登録
###手順 (1) 
[Twitter Developer サイト](https://developer.twitter.com/en "Twitter Developer サイト") の右上にある 「**Apply**」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166299/322f6432-176c-567a-cf14-76ef54980a0c.png)

###手順 (2) 
以下ページの「**Apply for a developer account**」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166299/cfb2681e-a424-79f5-82d6-03082c959570.png)

###手順 (3)
ログイン後、開発者属性を選択します。個人による一般的な無償利用の場合、「**Hobbyist**」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166299/ee78cafa-77e6-6584-85e0-93765b1b7a6d.png)

###手順 (4)
利用目的や利用内容を入力します。以下は、Stream API を利用する上で回答が必要な最低限の項目となります。英語での記述となりますが、最低文字数をクリアしていれば、通常は問題なく承認されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166299/13b8c74a-ddb8-7d34-ba0c-e0c96ae02082.png)
 <<回答を入力します>>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166299/8e9cf5fc-f8d3-3366-21f5-9df641a84fc0.png)
 <<回答を入力します>>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166299/25275a57-bd0f-c1bf-5980-c03473963b64.png)
 <<回答を入力します>>

###手順 (5)
登録/承認が上手く行くと、以下のような Developer ポータルの画面になります。登録中に API Key / API Secret が表示され、書き留めておく必要がありますが、書き留めておくのを忘れた場合、PROJECT APP の右側の**鍵マーク**をクリックして、再生成 (**Regenerate**) することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166299/1066b45e-15bf-f6b8-e3ea-e18718cd08b0.png)

###手順 (6)
手順 5 の画面の PROJECT APP の右側の**鍵マーク**をクリックして、Authentication Token を作成しておく必要があります。アプリ認証 (V2 API) では **API Key** / **API Secret** / **Bearer Token** が必要で、ユーザー認証 (v1 API) では **API Key** / **API Secret** / **Access Token** / **Access Token Secret** が必要になりますので、すべて書き留めておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166299/9255c763-fb4e-6e68-716b-51b5a2f514f7.png)


#Twitter API を呼び出す C# コードの開発
今回の手順では、Visual Studio 2019 を利用します。

##1. Visual Studio 新規プロジェクトの作成
Visual Studio 2019 を起動し、「新しいプロジェクトの作成」で「**C# コンソール アプリケーション**」を選択してください。「**C# コンソール アプリケーション (.NET Framework)**」は**選択しない**ように注意してください。.NET Core および .NET 5 以降は、クロス プラットフォームの OSS ランタイムとなりますが、.NET Framework は Windows 専用の商用版ランタイムで、4.8.x が最終バージョンとなり、新規開発は行われないものとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166299/9f05917f-fbbe-5259-e042-8d1efe6f53ef.png)

##2. Twitter API SDK 用 Nuget パッケージの取得
Visual Studio の「Nuget パッケージの管理」機能を使って、Twitter API 用の SDK ([TweetinviAPI](https://www.nuget.org/packages/TweetinviAPI)) を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166299/77712b03-8f97-e021-ecea-17026f9f48c0.png)

##3. using ディレクティブの追加（コード）
Twitter API を扱うのに必要なライブラリ分を追加します。

```c#
using System;
using System.Threading.Tasks;
using Tweetinvi;
```

##4. 認証とストリームの作成（コード）
以下は、Sampled Stream V2 API を利用するのに必要なアプリ認証、および、ストリーム作成のコードとなります。事前に控えておいた **API Key** / **API Secret** / **Bearer Token** の値で、以下のパラメーターを置き換えてください。

```c#
var bearerToken = "<your Bearer Token>";
var client = new TwitterClient("<your API Key>", "<your API Secret>", bearerToken);
var stream = client.StreamsV2.CreateSampleStream();
```

##5. イベントハンドラーと処理内容の記述（コード）
以下は、ストリームからツイートを１件読み取る度に呼ばれる **TweetReceived** に処理内容を記述しています。**args.Tweet.Lang** を利用して、日本語のツイートだけを表示するようにします。 

```c#
stream.TweetReceived += (sender, args) =>
{
    var lang = args.Tweet.Lang;
    if (lang.ToLower() == "ja")  // Display only Japanese tweets
    {
        Console.WriteLine($"** Text : {args.Tweet.Text}");
    }
    ++counter;
    if (counter >= maxCount)
    {
        stream.StopStream();
    }
};
```

##6. ストリーム読み取りの開始（コード）
以下は、ストリームの読み取り開始となります。ストリームは一度開始すると、レート制限などに掛からない限り終了しない為、手順 5 では **StopStream()** を使って、読み取り件数に応じてストリームを終了するようにしています。

```c#
await stream.StartAsync();
```

##7. コード全体
上記で主要なコードについて説明しましたが、以下はコード全体となります。[GitHub](https://github.com/seijim/Data-analysis-with-Twitter-API) にも各ステップのコードを共有しています。

```c#:Program.cs
using System;
using System.Threading.Tasks;
using Tweetinvi;

namespace TwitterStreamApiConsole
{
    class Program
    {
        private static readonly int maxCount = 100;
        private static int counter;

        static void Main(string[] args)
        {
            counter = 0;

            // Start Twitter Stream reading with Sampled Stream V2 API
            StartSampledStreamV2().Wait();

            Console.ReadLine();
        }

        /// <summary>
        /// Twitter Sampled Stream V2 API
        /// Nuget Package : Tweetinvi
        /// https://linvi.github.io/tweetinvi/dist/intro/basic-concepts.html#twitterclient
        /// </summary>
        private static async Task StartSampledStreamV2()
        {
            Console.WriteLine($"***** Stream started. {DateTime.UtcNow}");

            // Application client & stream
            var bearerToken = "<your Bearer Token>";
            var client = new TwitterClient("<your API Key>", "<your API Secret>", bearerToken);
            var stream = client.StreamsV2.CreateSampleStream();

            // Read stream
            stream.TweetReceived += (sender, args) =>
            {
                var lang = args.Tweet.Lang;
                if (lang.ToLower() == "ja")  // Display only Japanese tweets
                {
                    Console.WriteLine("----------------------------------------------------------------------");
                    Console.WriteLine($"** CreatedAt : {args.Tweet.CreatedAt}");
                    Console.WriteLine($"** Source    : {args.Tweet.Source}");
                    Console.WriteLine($"** Text      : {args.Tweet.Text}");
                }
                ++counter;
                if (counter >= maxCount)
                {
                    stream.StopStream();
                }
            };
            await stream.StartAsync();

            Console.WriteLine();
            Console.WriteLine($"***** Stream stopped. {DateTime.UtcNow} (counter : {counter})");
        }
    }
}
```

##8. デバッグ実行
デバッグ実行して、以下のようにツイートがリアルタイムに表示されれば、成功です。お疲れ様でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166299/94d7b82c-7c29-19fc-d49e-589d23e776f1.png)


#次のステップへ
[Step2](https://qiita.com/dokums/items/fd4053dec59344405504) では、キーワードでストリームをフィルタリング可能な **Filtered Stream (V1.1) API** のコードを作成します。


#参照
[C# 向け Twitter API SDK (TweetinviAPI) Nuget Package サイト](https://www.nuget.org/packages/TweetinviAPI)
[TweetinviAPI - Sampled Stream API リファレンス](https://linvi.github.io/tweetinvi/dist/streams-v2/sample-stream.html)
[クロス プラットフォーム .NET 概要](https://docs.microsoft.com/ja-jp/dotnet/core/introduction)
[Twitter 開発者向けサイト](https://developer.twitter.com/en)
[Twitter API サイト](https://developer.twitter.com/en/products/twitter-api)
[Visual Studio 2019 Community サイト](https://visualstudio.microsoft.com/ja/vs/community/)
[Visual Studio Code のサイト](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)