だらだらやるよ。

こげつのIT技術メモ

TwitterConnector.cs修正しました。

ここの日記のコメントで指摘された点を修正しました。

  • Twitter側の仕様変更により接続できなかった部分
  • 例外処理が抜けてた部分

超ノーチェックなのでコンパイル通らなかったらごめんなさい。

TwitterConnector.cs

using System;

using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;

namespace Smartter
{
	class TwitterConnector
	{
		string _id = "";
		string _pass = "";
		string _clientName = "";
		
		public string Id {
			get { return _id; }
			set { _id = value; }
		}
		
		public string Pass {
			get { return _pass; }
			set { _pass = value; }
		}
		public TwitterConnector(string id,string pass) {
			_id = id;
			_pass = pass;
		}
		public TwitterConnector(string id,string pass,string clientName):this(id,pass) {
			_clientName = clientName;
		}
		/// <summary>
		/// 接続できるか確認する。
		/// </summary>
		/// <returns></returns>
		public bool CanConnect() {
			WebRequest req = CreateWebRequest("http://twitter.com/account/rate_limit_status.xml");
			req.Method = "GET";
			try {
				HttpWebResponse wr = (HttpWebResponse)req.GetResponse();
				HttpStatusCode ht = wr.StatusCode;
				wr.Close();
				return ht == HttpStatusCode.OK;
			} catch {
				return false;
			}
		}


		public void GetPublicTimeline(Action<string> xmlParseAction) {
			Get("http://twitter.com/statuses/friends_timeline.xml",xmlParseAction);
		}
		public void GetReplies(Action<string> xmlParseAction) {
			Get("http://twitter.com/statuses/replies.xml",xmlParseAction);
		}

		public void GetDirectMessage(Action<string> xmlParseAction) {
			Get("http://twitter.com/direct_messages.xml",xmlParseAction);
		}
	

		/// <summary>
		/// アドレスにアクセスし、取得したデータに対して処理を行う
		/// </summary>
		/// <param name="uri"></param>
		/// <param name="act"></param>
		private void Get(string uri,Action<string> xmlParseAction) {
			WebRequest req = CreateWebRequest(uri);
			req.Method = "GET";
			req.BeginGetResponse(delegate(IAsyncResult r) {
				WebResponse rps = null;
				try{
					req.EndGetResponse(r);
					using(StreamReader sr = new StreamReader(rps.GetResponseStream(),Encoding.UTF8)) {
						xmlParseAction(sr.ReadToEnd());
					}
				}
				catch{}
			},req);
		}



		/// <summary>
		/// 発言する
		/// </summary>
		/// <param name="status">発言内容</param>
		/// <returns>結果</returns>
		public bool UpdateStatus(string status) {
			byte[] postValue = CreatePostValue(status);
			WebRequest req = CreateWebRequest("http://twitter.com/statuses/update.xml");
			req.Method = "POST";
			req.ContentLength = postValue.Length;

			try {
				using(Stream strm = req.GetRequestStream()) {
					strm.Write(postValue,0,postValue.Length);
				}
			} catch(Exception ex) {
				Logger.Write(ex.Message);
				//接続エラー
				return false;
			}
			HttpWebResponse result = null;
			try {
				result = (HttpWebResponse)req.GetResponse();
				return result.StatusCode == HttpStatusCode.OK;
			} catch(WebException ex) {
				//認証のエラー
				Logger.Write(ex.Message);
				return false;
			} catch(Exception ex) {
				//それ以外のエラー
				Logger.Write(ex.Message);
				return false;
			}
		}


		/// <summary>
		/// urlからリクエストを作成する
		/// </summary>
		/// <param name="uri"></param>
		/// <returns></returns>
		private WebRequest CreateWebRequest(string uri) {
			WebRequest req = HttpWebRequest.Create(uri);
			req.Proxy = new WebProxy();
			ServicePointManager.FindServicePoint(uri,req.Proxy).Expect100Continue = false;
			req.ContentType = "application/x-www-form-urlencoded";
			req.Headers.Add(CreateAuthString());
			return req;
		}
		/// <summary>
		/// Basic認証用の文字列を作成する
		/// </summary>
		/// <returns></returns>
		private string CreateAuthString() {
			return "Authorization: Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(_id + ":" + _pass));
		}
		/// <summary>
		/// 発言する内容を作成する
		/// </summary>
		/// <param name="status"></param>
		/// <returns></returns>
		private byte[] CreatePostValue(string status) {
			return Encoding.ASCII.GetBytes("source=" + Uri.EscapeUriString(_clientName) + "&status=" + Uri.EscapeUriString(status));
		}
	}
}