9/1の静岡Developers勉強会の宿題の準備をしているわけですが、その宿題に使用するTwitterのボットクライアントもどきをTwitterizerで作ったので、簡単にまとめます。(宿題自体はこのプログラムそのものではありません)
Twitterizerの入手
これは今となってはNuGetが最短コースなので、NuGetを使って関連コンポーネントごと自動で入れてもらうのが吉です。依存関係手動でどうこうするのはもはやトラブルの元。
PM> Install-Package twitterizer
Guiを使う場合にはtwiiterizerで検索をしてください。
Twitterizerの使い方
まずはOAuthのオブジェクトを作ります。
private OAuthTokens tokens;
public FormMain() {
InitializeComponent();
tokens = new OAuthTokens();
tokens.AccessToken = "xxx";
tokens.AccessTokenSecret = "xxx";
tokens.ConsumerKey = "xxx";
tokens.ConsumerSecret = "xxx";
}
XXXのところにはTwitterのサイト(https://dev.twitter.com/)から入手したコードを入力してください。
実際に書き込みます。
//同期でのやり方 //TwitterResponse tweetRespose = TwitterStatus.Update(tokens, tweetMessage); //if (tweetRespose.Result == RequestResult.Success) { // label1.Text = "StatusUpdate Success!! " + DateTime.Now.ToString(); //} //else { // label1.Text = "StatusUpdate Abnormal!!" + res.Result.ToString() + " " + DateTime.Now.ToString(); //} //非同期でのやり方 var option = new StatusUpdateOptions(); option.UseSSL = false; var result = TwitterStatusAsync.Update(tokens, tweetMessage, option, new TimeSpan(0, 1, 0), res => { if (res.Result == RequestResult.Success) { BeginInvoke(new Action(() => { label1.Text = "StatusUpdate Success!! " + DateTime.Now.ToString(); })); } else { BeginInvoke(new Action(() => { label1.Text = "StatusUpdate Abnormal!!" + res.Result.ToString() + " " + DateTime.Now.ToString(); })); } });
同期、非同期でのやり方を併記しています。同期の場合にはTwitterStatus.Updateで引数に先ほど作成したOAuthのオブジェクトとメッセージをとっています。非同期であればTwitterStatusAsync.Updateで投稿が出来ます。非同期の場合には待ち時間設定と、動作終了時のコールバックメソッドの引数が増えています。
ということで、Twitterizerを使うとOAuth周りとか、JSONの処理とか面倒な部分はTwitterizerが吸収してくれますのでだいぶ簡単にTwitterを使うことが出来ますね。
全体コード:ボタン2個、ラベル1個のべたべたなWinFormアプルケーションです。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Twitterizer;
using Twitterizer.Core;
using Twitterizer.Entities;
using Twitterizer.Streaming;
namespace ShizudevBotTest
{
public partial class FormMain : Form
{
private OAuthTokens tokens;
private List Messages;
private int messageCount;
public FormMain() {
InitializeComponent();
tokens = new OAuthTokens();
tokens.AccessToken = "XXX";
tokens.AccessTokenSecret = "XXX";
tokens.ConsumerKey = "XXX";
tokens.ConsumerSecret = "XXX";
messageCount = 0;
}
private void button1_Click(object sender, EventArgs e) {
SendTwitterMessage();
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e) {
SendTwitterMessage();
}
private void SendTwitterMessage() {
if (messageCount >= Messages.Count) {
messageCount = 0;
}
//100文字以上の文字列は80文字で切る。80文字のカウントはサロゲートペアを考慮する。
var si = new System.Globalization.StringInfo(Messages[messageCount]);
string tweetMessage;
const int MaxLength = 80;
if (si.LengthInTextElements > MaxLength) {
tweetMessage = si.SubstringByTextElements(0, MaxLength);
}
else {
tweetMessage = si.String;
}
messageCount++;
label1.Text = "Now Tweeting!";
//同期でのやり方
//TwitterResponse tweetRespose = TwitterStatus.Update(tokens, tweetMessage);
//if (tweetRespose.Result == RequestResult.Success) {
// label1.Text = "StatusUpdate Success!! " + DateTime.Now.ToString();
//}
//else {
// label1.Text = "StatusUpdate Abnormal!!" + res.Result.ToString() + " " + DateTime.Now.ToString();
//}
//非同期でのやり方
var option = new StatusUpdateOptions();
option.UseSSL = false;
var result = TwitterStatusAsync.Update(tokens, tweetMessage, option, new TimeSpan(0, 1, 0), res => {
if (res.Result == RequestResult.Success) {
BeginInvoke(new Action(() => {
label1.Text = "StatusUpdate Success!! " + DateTime.Now.ToString();
}));
}
else {
BeginInvoke(new Action(() => {
label1.Text = "StatusUpdate Abnormal!!" + res.Result.ToString() + " " + DateTime.Now.ToString();
}));
}
});
}
private void button2_Click(object sender, EventArgs e) {
timer1.Stop();
label1.Text = "";
}
private void FormMain_Load(object sender, EventArgs e) {
Messages = new List();
var reader = new System.IO.StreamReader(@"Message.txt", Encoding.GetEncoding("utf-8"));
while (reader.Peek() > -1) {
// メッセージの先頭が#だったらコメントと見なして読み飛ばす。
var commentChar = "#";
var line = reader.ReadLine();
if (line.IndexOf(commentChar) != 0) {
Messages.Add(line);
}
}
}
}
}
コメント