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