koudenpaのブログ

趣味のブログです。株式会社はてなでWebアプリケーションエンジニアをやっています。職業柄IT関連の記事が多いと思います。

.NET で Twitter Bot につぶやかせるにあたっての備忘

Twitter APIは迷走していて、v2がリリースされた後もv1.1にしかない機能がまだまだあったり、とりあえずプログラムにつぶやかせるのがまぁまぁ面倒臭かったり、とても難しい。

ので、少し最近触った結果の整理をまとめておく。

登場人物

  • APIのバージョン v1.1 と v2
  • 認証(OAuth)のバージョン v1.0a と v2.0
  • Twitterアカウント と プロジェクト と アプリケーション

ガッツリドキュメントを眺めていないから分かっていないだけかもしれないけれど、これらの関係性が難しい。

合ってるかは確信がないが、ざっくり以下のようにとらえている。

  • APIのバージョンと認証のバージョンは別
    • なのでAPI v2と認証v1.1aを組み合わせられる
  • アプリケーションはアカウントそのものではないため権限が面倒くさい
    • 結果としてOAuth 2.0の認証ではアプリケーションが自分のアカウントに関する権限を得るのが面倒くさくなっていると理解している

Bot につぶやかせる場合の認証

v1.0a を使うのが平易なようだ。

何かしらのライブラリに認証情報を設定する際に、コンシューマキーとそのシークレット、アクセスキーとそのシークレットを使うパターンを選べばよい。

Tweetinvi + 未実装のAPI v2

2022年4月現在では.NETのTwitterクライアントAPI v2対応が十分ではない。

自分はTweetinviが使いやすいなぁ、と思っているのだけれどv2のTweet管理機能はまだ実装されていない。

しかしOAuth 1.0aは使うのがすこぶる面倒くさいのでその認証部分はライブラリに頼りたい。そんな場合は以下のようにするとTweetinviのリクエスト部分を呼び出せる。便利。

// Tweetinvi初期化、コンシューマキーとそのシークレット、アクセスキーとそのシークレットを使う
var twitterClient = new TwitterClient(consumerKey, consumerSecret, accessKey, accessSecret);

// Poll(アンケート)は v2 でしか提供されていない
// ペイロードはどう構築してもいいが、ここではOpenAPI仕様から自動生成した型を使っている
// (設定している内容の構築は省略している)
// https://api.twitter.com/2/openapi.json
// https://docs.microsoft.com/en-us/aspnet/core/web-api/microsoft.dotnet-openapi?view=aspnetcore-6.0
var pollPayload = new TwitterApiV2.Body4()
{
    Text = tweetText,
    Reply = new TwitterApiV2.Reply()
    {
        In_reply_to_tweet_id = questionTweet.IdStr,
    },
    Poll = new TwitterApiV2.Poll2()
    {
        Options = pollOptions,
        Duration_minutes = 60 * 24,
    },
};
// ペイロードのJSON文字列を作る
var pollPayloadJson = JsonConvert.SerializeObject(pollPayload);
// ペイロードを作る、Twitter API v2 は application/json を受け付ける
var pollContent = new StringContent(pollPayloadJson, Encoding.UTF8, "application/json");
// Tweetinviの内部APIでいい感じに認証設定してリクエストする
var pollTweet = await twitterClient.Execute.RequestAsync(pollRequest =>
{
    pollRequest.Url = "https://api.twitter.com/2/tweets";
    pollRequest.HttpMethod = Tweetinvi.Models.HttpMethod.POST;
    pollRequest.HttpContent = pollContent;
});

がんばれイーロン

冒頭にも書いた通りTwitterのDXは下がるばかりなのだけれど、そんなところに個人が大株主になって役員に就任するというアグレッシブなニュースが飛び込んできた。

DX方面もいい感じにテコ入れされるといいなぁ。

ホビーでTwitter周りの開発がしやすくなることを願ってやまない。