前回の反省を踏まえて、bit.ly は真面目にテストしつつやる。プログラマ根性というところ。
さて、bit.ly の API を使えることを知っていはいたものの、
APIドキュメントを見るのもしんどいし
http://code.google.com/p/bitly-api/
そんな訳で、検索して探すと、
bit.ly (短縮URL) API呼び出し (その1)
http://d.hatena.ne.jp/m-kawato/20090603/1244041369
があるので参照する。
- bit.ly で api key を取得する。
- .NETのWebClientを使うことに決定。
- クエリ呼び出しが楽なので、OpenReadメソッドを使う。
- テスト用のプロジェクトを作って、長いURLを渡して結果を返すところまで完成。
- デフォルトではJSONで返ってくるので、formatをxmlで指定。
- ストリームを XmlTextReader → XmlDocument に変換。
- 「shortUrl」を探して変換テスト
string transBitUrl(string longurl)
{
string query = "";
string shorturl = "";
WebClient web = new WebClient();
query = "http://api.bit.ly/shorten?format=xml&"
+ "version=2.0.1&longUrl=" + longurl
+ "&login=" + bitLogin + "&apiKey=" + bitApiKey;
Debug.Print(query);
Stream st = web.OpenRead(query);
XmlTextReader xr = new XmlTextReader(st);
XmlDocument doc = new XmlDocument();
doc.Load(xr);
var lst = doc.GetElementsByTagName("shortUrl");
if (lst != null && lst.Count > 0)
{
XmlElement el = lst[0] as XmlElement;
shorturl = el.InnerText;
}
st.Close();
return shorturl;
}
これがテストできたので、今度は文章中のURLを変換させる。
- IndexOfメソッドで変換しようと思ったが、面倒そう。
- 正規表現の Regex クラスを使うことに決定。
- 簡単のために”http://[^ ]+ “ のように、後ろに半角スペースで区切る。
実は、文章末の場合のチェックが必要なのだが、ここでは省く。 - 見つかった文字列を MatchCollection で受けて、Replace すれば OK。
- ローカルでチェックしてOKなので、これを先のアプリに組み込む。
string transShortUrl(string text)
{
Regex reg = new Regex("http://[^ ]+ ");
MatchCollection mc = reg.Matches(text);
if (mc == null || mc.Count == 0)
{
return text;
} foreach (Match m in mc)
{
string lurl = m.Value;
if (!lurl.StartsWith(http://bit.ly))
{ string surl = transBitUrl(lurl);
if (surl != "")
{
text = text.Replace(lurl, surl+" ");
}
}
}
return text;
}
Bitボタンを付けて、
な状態から、Bitボタンを押せば、
な状態へ。ここまでは1時間半程度、まずまずか。
