読者です 読者をやめる 読者になる 読者になる

clock-up-blog

go-mi-tech

C# による Twitter 簡易ボット

ボット・クローラー Advent Calendar 2016 3日目の記事です。


Windowsクライアント上で動作する Twitter の簡易ボットを作ってみます。

今回のサンプルコード

プロジェクトごと以下にあげてあります。(APIキー情報は書き換えて使ってください)

CoreTweet

C# から Twitter 機能を利用するためのライブラリ。かなり使いやすいです。

C# プロジェクトにおいて Package Manager Console で

Install-Package CoreTweet

ってやると導入できます。

ソースコード

とりあえず実装済みのソースコード(ちっちゃいです)はここ↑を見てもらうとして、以下、詳細を解説していきます。

TwitterアプリのAPIキーの入手

https://apps.twitter.com/ にて Create New App でアプリを作り、
API Key, API Secret を入手します。(手順はいろんなサイトが解説してるので省略)
f:id:kobake:20161130162549p:plain:w500

認証画面を開く

using CoreTweet;
using System.Diagnostics;
...
var session = OAuth.Authorize("入手した api_key", "入手した api_secret");
Process.Start(session.AuthorizeUri.AbsoluteUri);

ブラウザ経由で認証の確認画面が開きます。
f:id:kobake:20161130162925p:plain:w500

認証を進めると PINCODE が表示されます。
f:id:kobake:20161130163037p:plain:w500

PINCODE によりアクセストークン取得

// PINCODE入力
Console.Write("PINCODE> ");
var pincode = Console.ReadLine();

// トークン取得
var tokens = OAuth.GetTokens(session, pincode);
Console.WriteLine(tokens);

Console.ReadLine(); により PINCODE 入力を受け付け、前処理で取得済みの session と合わせてアクセストークン tokens を取得します。

ツイート

取得できたアクセストークンを用いて、以下のようにツイートを行うことができます。

try
{
    tokens.Statuses.Update(status => "hogehoge");
}
catch(Exception ex)
{
    Console.WriteLine("Error: " + ex.Message);
}

ランダムなツイート

サンプルでは以下のように while ループで一定時間ウェイトをかけながらひたすらランダムに発言を繰り返します。

var r = new Random();
while (true)
{
    // 発言内容
    string[] table = { "🍣", "🍤", "🍜", "🍙", "🍛", "♨", "🐬", "👍", "👎", "🍮", "🍵" };
    string body = table[r.Next(table.Length)];

    // 発言
    Console.WriteLine("Tweet " + body);
    try
    {
        tokens.Statuses.Update(status => body);
    }
    catch(Exception ex)
    {
        Console.WriteLine("Error: " + ex.Message);
    }

    // 次の発言は1時間後
    Thread.Sleep(1000 * 60 * 60);
}

実行結果

実験用アカウントで実行してみたサンプルです。(タイミングは1時間より短くしてある)
f:id:kobake:20161130164706p:plain:w500

おしまい

実用的かというと微妙ですがサンプルとしてはこのくらい簡易なものが程よく感じます。

LL 系のボットはけっこうたくさん見かけますが個人的にはやっぱり C# 等の静的な型のある言語でプログラムは組んでいきたいですね。ボットみたいな雑なものも含めて。

});