スポンサーリンク

Twitterizerを使ってTwitterに投稿

9/1の静岡Developers勉強会の宿題の準備をしているわけですが、その宿題に使用するTwitterのボットクライアントもどきをTwitterizerで作ったので、簡単にまとめます。(宿題自体はこのプログラムそのものではありません)

 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);
                }
            }

        }

        
    }
}

コメント

タイトルとURLをコピーしました