こんにちは。ドクです。
久しぶりに Twitter API を使って、データ分析をしてみようと思います。前回は、第二次安倍内閣が誕生する前の衆議院選挙時に、Twitter API を使いましたが、面白い傾向が見てとれました。かなり昔ですね。。。
#講座の最終目標
Twitter のツイート データを Azure Data Lake Storage Gen2 (ADLS Gen2) に Parquet 形式のファイルとして自動的に蓄積し、Azure Synapse Analytics (Serverless SQL / Apach Spark) を使って分析できるようにします。ツイート データの継続的な取得と ADLS Gen2 へのデータ蓄積には、Azure Functions を利用します。
#Step1 の目標
2021 年 5 月現在、プレビューである Twitter - Sampled Stream V2 API を C# から扱えるようにすることです。このステップでは、Azure は関係なく、ローカル環境に単純なコンソール アプリケーションを作成し、動作させます。
#Twitter API
Twitter の開発者向けプログラムを通して提供される API です。各 API では要求に対するレート制限が設定されており、Stream API の一般的な無償利用の場合、50 万ツイート/月の取得制限が入ります。今回は、Twitter 社によってサンプリングされたツイートをリアルタイムに受け取れる Sampled Stream V2 API を利用します。
#開発環境 (OSS)
開発には、以下を利用します。OSS (無償) かつ クロス プラットフォームとなりますので、Windows / Mac / Linux などお好きな OS/デバイスをご利用ください。
- ツール : Visual Studio 2019 Community or VS Code
- ランタイム : .NET 5 or .NET Core 3.1
- 言語 : C#
#Twitter API 環境の整備
##1. Twitter アカウントの作成
API 用の Twitter アカウントを作成します。携帯電話番号やメールアドレスなどを正しく登録してください。
##2. Twitter API の利用登録
###手順 (1)
Twitter Developer サイト の右上にある 「Apply」をクリックします。
###手順 (2)
以下ページの「Apply for a developer account」ボタンをクリックします。
###手順 (3)
ログイン後、開発者属性を選択します。個人による一般的な無償利用の場合、「Hobbyist」を選択します。
###手順 (4)
利用目的や利用内容を入力します。以下は、Stream API を利用する上で回答が必要な最低限の項目となります。英語での記述となりますが、最低文字数をクリアしていれば、通常は問題なく承認されます。
<<回答を入力します>>
###手順 (5)
登録/承認が上手く行くと、以下のような Developer ポータルの画面になります。登録中に API Key / API Secret が表示され、書き留めておく必要がありますが、書き留めておくのを忘れた場合、PROJECT APP の右側の鍵マークをクリックして、再生成 (Regenerate) することもできます。
###手順 (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 が必要になりますので、すべて書き留めておいてください。
#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 が最終バージョンとなり、新規開発は行われないものとなります。
##2. Twitter API SDK 用 Nuget パッケージの取得
Visual Studio の「Nuget パッケージの管理」機能を使って、Twitter API 用の SDK (TweetinviAPI) を取得します。
##3. using ディレクティブの追加(コード)
Twitter API を扱うのに必要なライブラリ分を追加します。
using System;
using System.Threading.Tasks;
using Tweetinvi;
##4. 認証とストリームの作成(コード)
以下は、Sampled Stream V2 API を利用するのに必要なアプリ認証、および、ストリーム作成のコードとなります。事前に控えておいた API Key / API Secret / Bearer Token の値で、以下のパラメーターを置き換えてください。
var bearerToken = "<your Bearer Token>";
var client = new TwitterClient("<your API Key>", "<your API Secret>", bearerToken);
var stream = client.StreamsV2.CreateSampleStream();
##5. イベントハンドラーと処理内容の記述(コード)
以下は、ストリームからツイートを1件読み取る度に呼ばれる TweetReceived に処理内容を記述しています。args.Tweet.Lang を利用して、日本語のツイートだけを表示するようにします。
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() を使って、読み取り件数に応じてストリームを終了するようにしています。
await stream.StartAsync();
##7. コード全体
上記で主要なコードについて説明しましたが、以下はコード全体となります。GitHub にも各ステップのコードを共有しています。
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. デバッグ実行
デバッグ実行して、以下のようにツイートがリアルタイムに表示されれば、成功です。お疲れ様でした。
#次のステップへ
Step2 では、キーワードでストリームをフィルタリング可能な Filtered Stream (V1.1) API のコードを作成します。
#参照
C# 向け Twitter API SDK (TweetinviAPI) Nuget Package サイト
TweetinviAPI - Sampled Stream API リファレンス
クロス プラットフォーム .NET 概要
Twitter 開発者向けサイト
Twitter API サイト
Visual Studio 2019 Community サイト
Visual Studio Code のサイト