Twitterクライアント作成メモ

Advanced[es]上で動くTwitterクライアントで理想的なのが無いけど、自分たちで作るしかないのかなぁ?という話がIRCで出てたので、ちょっとテストってみた。処理的にめんどそうなのは読み書き・遅延処理・ログ管理程度なので、BASIC認証さえ越えられれば大丈夫だろ。.NET Compact Framewok 2.0で初めてまともなコード書いた。ま、問題なくVC#のままいけた(ついったん鯖の奴ね)ので、最初のエミュ設定の方がよっぽど詰まりまくったほど。このへんはMSの頑張っているところだなと素直に思う。

大体の準備はん・ぱか工房でおk。っつーか、まともに日本語でまとまったサイトはここだけ。MIDPのときといい、お世話になり過ぎ。自分の場合はVS2005環境でやってますけど、ものっそいエミュが重い以外は書かれている内容そのままなぞるだけ。ただ通信する段階になると、エミュが完全にOSエミュレートなので、エミュそのものの通信デバイスを設定してやらにゃならんっぽ。どっかからの転載になるが、

  1. VisualStudioの「ツール」から「デバイスエミュレータ」を起動
  2. 使用する仮想デバイス構成を選んで、「操作」メニューの「クレードルに接続」
  3. これでパソコンへ擬似端末が接続された状態になるので、通常のドエスと同じようにActiveSyncで接続する
  4. 繋がったかどうかを、エミュ内のIEでサイト開けるなどして確認する。

なんかよくわからんのだが、ActiveSyncで繋げると、エミュ側でネットにも繋がったことになるらしい。モデム代わり?

んで、実際のソースですけど、

private void hoge(object sender, EventArgs e)
{
	//定数部分
	const String userid = "hogehoge";
	const String password = "hoge1234";
	const String upUrl = "http://twitter.com/statuses/update.xml";
	
	//投げ込む内容
	string auth = System.Convert.ToBase64String(Encoding.UTF8.GetBytes(userid + ";" + password));
	
	string pr = "status=" + UrlEncode(textBox.Text);
	byte[] prData = Encoding.ASCII.GetBytes(pr);
	
	//BASIC認証込みで投げ込む
	HttpWebRequest req = WebRequest.Create(upUrl) as HttpWebRequest;
	req.Method = "POST";
	req.Headers.Add("Authorization", "Basic" + auth);
	req.ContentType = "application/x-www-form-urlencoded";
	req.ContentLength = prData.Length;
	
	Stream reqStream = req.GetRequestStream();
	
	reqStream.Write(prData, 0, prData.Length);
	reqStream.Close();
}

//CompactだとSystem.Web.HttpUtility.UrlEncodeが参照出来ない
public static String UrlEncode(String s)
{
	StringBuilder sb = new StringBuilder();
	Byte[] bytes = Encoding.UTF8.GetBytes(s);
	foreach (Byte b in bytes)
	{
		sb.AppendFormat(null, "%{0:x2}", b);
	}
	
        return sb.ToString();
}

で大体あってるはず。この大体っていうのは、動かなかったってこと。(笑)
しかも貼り付け用にひとまとめにしてる上、エラー処理も抜いたから、そのままは使えませんけど、参考にはなるよね。読み込みの方は認証入らない分簡単かと。System.XMLも使えるみたいなんで、苦労はしないと思われます。
いや、マジ眠いんだって。(投稿時刻参照) 起きたらやりたいとは思うが、何よりもうちの環境でデバッグ用のエミュが重すぎて涙でそうだったので、起きたら情熱薄れてそう。誰かこれを参考になんとか作ってください。