No description, website, or topics provided.
JavaScript CSS C# Other
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
.vs/config
myBot.Test
myBot
.gitignore
README.md
myBot.sln

README.md

myBot

概要

技術・実装のデモンストレーションとして作成した、.NET Framewok 上で動作する Twitter Bot の習作です。

Microsoft のクラウドサービス Microsoft Azure の Web Apps 上で稼働させることを想定して実装しています。
Free プランでの実行も可能です。


特徴

技術デモであり、.NET Framework 上に実装しているということで、単に定期ツイートするだけではなく、"Iron系" 処理系による拡張スクリプトを Web のコントロールパネルから入力・設定してやることで、これを実行する機能が特徴です。

現時点では、下記の言語(処理系)で拡張スクリプトを記述できます。

  • IronPython (Python)
  • IronRuby (Ruby)
  • IronJint (JavaScript)

注意

定期ツイートする程度なら用は足りますが、それ以上のことをしようとするとたいしたことはできません。

例えば現在の実装では、ボットに対してメンション飛ばしても、何の反応もすることができません。

構想としては「メンション飛んで来たら実行する拡張スクリプトはこれ」というように拡張スクリプトで応答できるようにしたいところですが、実現に至ってはいません。

また、ついうっかり(?)、SaaS っぽく使えるように、つまりマルチアカウントで使える仕様で実装しており、実際に Azure 上にとある URL で稼働中です。

しかし、さっぱりスケールしない実装になっているため、先述の URL は公開・宣伝していません。

ご興味のある方は、ご自身の Azure アカウント上に本ボットを設置することをお勧めいたします。


自分で設置するには

Twitter の consumer key と consumer secret

ご自身の Azure アカウント上に本ボットを設置する場合は、別途、Twitter の開発者ページにて本ボット用のアプリを新規作成し、consumer key と consumer secret をご用意ください。

そしてアプリケーション構成に、"Key.Twitter" というエントリ名で、{consumerKey:'...', consumerSecret:'...'} という JSON 書式で consumer key と consumer secret を設定してください。

定期的に外部から起動

設置したら、https://<設置したホスト名>/Bot/TweetScheduledMessage という URL に対し、定期的 (最小で5分間隔) に HTTP GET を実行するように何か実施してください。
同じ Azure 上のスケジューラサービスや、setCronJob といった SaaS の利用がおすすめです。

使用するデータベースについて

このボットアプリは、各種設定内容等を保存するのに、Entity Framework "Code First" を経由した、RDBMS を使用します。

但し、既定でローカルファイルシステムを利用した、本ボットのコードに同梱してある SQL Server CE 4.0 を使用するように構成してあるため、Azure Web Apps に本ボットをデプロイするぶんには、データベースに関してとくに追加の構成や作業の必要はありません。

もちろん、Azure Web Apps の永続化ストレージと SQL Server CE を使っている限り、処理速度は望めなく、また、複数インスタンスの使用もできません。
幸い、データベースへのアクセスには Entity Framework を介しているため、SQL Database Service を使用することも、データベース接続文字列を設定してやるだけで可能なはずです(但し未確認)。


拡張スクリプト

先に「特徴」のところで述べたとおり、本ボットアプリは、コントロールパネル上からスクリプトを入力・設定してやることで、動作をプログラムできます。

拡張スクリプトが実行されるタイミング

拡張スクリプトは、そのボットについてコントロールパネル上で設定されたツイートタイミング (何時から何時までの間・何分間隔で) に従い、ツイートタイミングがやってきたら、ツイートする直前に実行されます。

ツイートする直前に拡張スクリプトが実行されるため、ツイートする前に、ツイートするメッセージを拡張スクリプトで加工することが可能です。

アプリケーションオブジェクトモデル

以下では、拡張スクリプト内でどんなオブジェクトが使えるかを説明します。

theBot オブジェクト

拡張スクリプト内でグローバルに参照できるオブジェクトで、Twitter への投稿メッセージの制御を司ります。

プロパティ
プロパティ名と型 説明
Messages: Message[] コントロールパネル上で設定されている、このボットのツイートメッセージ群を配列で取得します。コントロールパネル上での表示順 (ツイート順) と同じ並び (すなわち、後述の Message.Order プロパティの昇順) に並べ替え済みです。
MessageToNextTweet: Message 拡張スクリプトの実行後に、ツイートされるメッセージを取得または設定します。このプロパティに、Messages プロパティに含まれる別のメッセージを設定すれば、次につぶやくメッセージを差し替えできます。また、このプロパティに null を設定すると、このツイートタイミングでのツイートはキャンセル(何も呟かない)されます。
メソッド
メソッド名と型 説明
Tweet(text: string): void 引数に指定された文字列をツイートします。
ArchiveMessage(message: Message): void 引数に指定されたメッセージをアーカイブします。
RestoreMessage(message: Message): void 引数に指定されたメッセージをアーカイブから戻します。

localTime オブジェクト

拡張スクリプト内でグローバルに参照できるオブジェクトで、拡張スクリプト実行時点のローカル日時を表す文字列です。

書式は "yyyy/MM/dd HH:mm:ss" で、すなわち、2016年3月31日午後2時9分32秒であれば、"2016/03/31 14:09:32" という文字列になります。

"ローカル" 日時であるわけですが、どこの "ローカル" かというと、そのボットについてツイートタイミングの設定画面で指定されたタイムゾーンの "ローカル" 日時となります。

Message 型

theBot オブジェクトの Messages プロパティや MessageToNextTweet プロパティで取得または設定するオブジェクトの型です。

拡張スクリプト中でこれら Message 型のオブジェクトに対し施した変更は永続化されます。

プロパティ
プロパティ名と型 説明
Text: string ツイートする文言(テキスト)を取得または設定します。
Order: number ツイート順を意味する数値を取得または設定します。定期ツイートは、この Order プロパティの値を昇順で並べ替えした順序で行われます。
IsArchived: boolean このメッセージがアーカイブ済みか否かを取得します。このプロパティは読み取り専用です。メッセージをアーカイブしたりアーカイブから戻したりするには、tehBot オブジェクトの ArchiveMessage() メソッド並びに RestoreMessage() メソッドを使ってください。

拡張スクリプトの試験実行

Web のコントロールパネルにおける、拡張スクリプトの入力・設定ページにて、「TEST RUN」ボタンをクリックすることで、入力中の拡張スクリプトの試験実行ができます。

試験実行中の変更はすべてテンポラリ

この試験実行中は、拡張スクリプトによって変更された内容は永続化せずに破棄され、また、ツイートは実際に Twitter 上には流されません。
拡張スクリプト中で (Tweet() メソッドによって) ツイートされた内容は、試験実行の結果欄に表示されるのみです。

"printf" デバッグ

デバッグ用コンソールの類は用意されていません。
代わりに、theBot.Tweet("...") をもってして、printf デバッグの代用としてしのいでください。


拡張スクリプトの例

時報

以下の拡張スクリプトを設定し、1時間に1回つぶやくようツイートタイミングを設定すれば、時報になります。

// IronJint (JavaScript) での実装例
theBot.Tweet('現在の時刻は '+ (new Date(localTime)).toTimeString()+' です。')

毎朝、ツイートするメッセージを一つ目のメッセージにリセットする

本ボットアプリは、前回ツイート成功したメッセージの次のメッセージを、次回ツイートするのみです。

そのため、毎朝「おはよう!」とボットに呟かせようとしても、1日の途中でアプリの不具合等でツイートに失敗すると順序がずれてしまいます。

そこで下記のような拡張スクリプトを設定しておくことで、毎朝 7時より前のツイートをする前に、登録済みメッセージの一つ目を呟かせるようにすることでリセットできます。

// IronJint (JavaScript) での実装例
if (localTime.substring(11) < '07:00:00') {
    theBot.MessageToNextTweet = theBot.Messages[0];
}

指定の日時を過ぎたら、指定のハッシュタグを含むメッセージをアーカイブする

// IronJint (JavaScript) での実装例
var hashTag = '#foo';
var tweetUntil = '2016/03/31 09:00:00'

if (tweetUntil < localTime)
{
  theBot.Messages
    .filter(function(msg){ return msg.Text.indexOf(hashTag) != -1;})
    .forEach(function(msg){ theBot.ArchiveMessage(msg); });
}

要望・バグ報告・開発に参加するには

要望やバグ報告は、このリポジトリの Issue に投稿ください。
ただし、すみませんが、いつ対応できるかはわかりません :)

開発への関与については、もちろん pull request は大歓迎です。
また、fork 後、こちらに pull request することなくとも独自に大進化させていただくのも結構です。
ただその場合も、有用な情報は共有・拡散したいので、このリポジトリの Issue などに一言お知らせいただけると嬉しいです。

なお、コミットログやコード中のコメントが英語 (但し多分に怪しい...) になっていますが、これは当初の作者がワールドワイドなオープンソースのライブラリを GitHub 上で開発・保守てたときのくせで、なんとなく似非英語でログ/コメントしてしまっただけなので、あまり気にしないでください。

日本語でのコード中のコメントやコミットログによるプルリクエスト、大歓迎です :)


ライセンス

GNU General Public License v3