Adsense_top

2009年7月15日水曜日

Twitter API 汎用性.の記事、間違えていました。

前のエントリー「C# Twitter API 汎用性...」の「Execute」メソッド間違えていました。

private string Execute(string url, HttpMethod method,
string user, string pass, params string[] parameters)
{
��
}

とあるのは、正しくは

private string Execute(string url, HttpMethod method,
string user, string pass, string[] parameters)
{
��
}

です。
最後の引数に「params」がつけていましたが不要です。このままでは動きません。
失礼しました。


C# Twitter API 汎用性を上げて、検索をしてみる

前回などに使ったAPIの実行部分を、使い回しが利くように変更しました。

//
// APIを使用し応答を返す
//
private string Execute(string url, HttpMethod method,
string user, string pass, params string[] parameters)
{
StringBuilder paramBuilder = new StringBuilder();
if (parameters != null)
{
foreach (string param in parameters)
{
if (paramBuilder.Length > 0)
paramBuilder.Append("&");
paramBuilder.Append(param);
}
}
HttpWebRequest request =
(HttpWebRequest)HttpWebRequest.Create(url);
request.Method =
Enum.GetName(typeof(HttpMethod), method);
request.Credentials =
new NetworkCredential(user, pass);
request.ContentType = "application/x-www-form-urlencoded";
//request.UserAgent = "arayan's Twitter Client";
request.Timeout = 10000;
ServicePointManager.Expect100Continue = false;
StreamWriter writer =
new StreamWriter(request.GetRequestStream());
if(paramBuilder.Length > 0)
writer.Write(paramBuilder.ToString());
writer.Close();
WebResponse response = request.GetResponse();
StreamReader reader =
new StreamReader(response.GetResponseStream());
string result = reader.ReadToEnd();
reader.Close();
response.Close();
return result;
}

private enum HttpMethod
{
POST,
GET,
DELETE
}

以下のように呼び出します。
例は「search」APIで「C#」を含む「日本語」の投稿を取得します。
「userid」「password」には、認証に使用するユーザーIDとパスワードを設定ます。

string[] parameters = new string[]{
"q=" + HttpUtility.UrlEncode("C#", Encoding.UTF8)),
"lang=" + HttpUtility.UrlEncode("ja", Encoding.UTF8))
};
string result =
Execute("http://search.twitter.com/search.json",
HttpMethod.GET, userid, password, parameters);


このエントリーの「Execute」メソッドが間違えていました。詳細は次のエントリーをご覧下さい。

2009年7月9日木曜日

C# Twitter API でつぶやいてみた。

今日はTwitter APIを使って、つぶやいて(投稿)みました
今回は、前回と違い認証を行う必要があります。殆どAPIで認証が必要ですので、他のAPIの雛形になる思います。
投稿に使うAPIは「statuses/update」です。


今回も画面がないと淋しいので、前回にと同じく一応画面ありです。


フォームにアカウント名を指定する「userTextBox」とパスワードを指定する「passTextBox」、メッセージを入力する「mesTextBox」()受信したXMLを表示する「resTextBox」、「button1」を配置しました。
「mesTextBox」のMaxLengthは、160文字以内におさめる必要があり、ただし、140文字を超えた部分は表示される保証がないため「140」にします。

using System;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Web;

public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private string PostData(string url, string user,
string pass, string mes)
{
// 投稿内容をURLエンコードする。
string encMes = System.Web.HttpUtility.UrlEncode(mes);

HttpWebRequest request =
(HttpWebRequest)HttpWebRequest.Create(url);
request.Method = "POST";
// 認証情報を設定
request.Credentials =
new NetworkCredential(user, pass);
// Content-typeヘッダを設定
request.ContentType =
"application/x-www-form-urlencoded";
// request.UserAgent = "Twitter API Tester"; 無くても大丈夫
request.Timeout = 10000; // 規定値は100,000(100秒)
// Twitterのサーバーが「100-Continue 」ヘッダを
// サポートしていないので、これを設定しないと
// 「417」ステータスコードが返ってくるらしい
System.Net.ServicePointManager.Expect100Continue = false;
// 書き込む
StreamWriter writer =
new StreamWriter(request.GetRequestStream());
writer.Write("status={0}", encMes);
writer.Close();
// 読み込む
WebResponse response = request.GetResponse();
StreamReader reader =
new StreamReader(response.GetResponseStream());
string result = reader.ReadToEnd();
// 後処理
reader.Close();
response.Close();

return result;
}

private void button1_Click(object sender, EventArgs e)
{
const string EXP = "http://twitter.com/statuses/update.xml";
string user = userTextBox.Text;
string pass = passTextBox.Text;
string mes = mesTextBox.Text;
resTextBox.Text = PostData(EXP, user, pass, mes);
}
}

こんな感じです。ユーザー名とパスワードのところは隠しているため、汚らしくてすみません。


前回同様 XMLでの返答を受けますので、「statuses/update」に拡張子「xml」を付加しています。
やり始めたばかりなので、理解する意味もこめて前回同様に出来るだけ簡潔に最小のコードにするように努めました。
また、同一内容の投稿を連続してしようとした場合、最初の投稿以外は無視されますので、同じ内容を続けて投稿動作の可否テストとしは無駄になります。(レスポンス確認としては意味はありますが...)


今回もTwitter APIについては、「観測気球」様のTwitter API 仕様書 (日本語) [最新版]を参考にさせていただきました。


2009年7月7日火曜日

C# Twitter APIを使ってみた。

Twitterがメチャ盛り上がってきているようなので、Twitter API を使ってみようと思います。
今回は、認証が必要のない、一番簡単そうなAPI「statuses/user_timeline」を使って、指定したアカウントのタイムラインを読み込みリストに表示します。
Twitter APIについては、「観測気球」様のTwitter API 仕様書 (日本語) [最新版]を参考にさせていただきました。

コンソールに表示でも良かったのですが、画面がないと淋しいので、一応画面ありです。
フォームにアカウント名を指定する「textBox1」と受信したXMLを表示する「textBox2」、タイムラインをリストで表示する「listBox1」、「button1」を配置しました。
private const string EXP =
"http://twitter.com/statuses/user_timeline/{0}.xml";

public Form1()
{
InitializeComponent();
textBox1.Text = "twj";
}
//
// twitterサーバーからデータを取得します。
//
public string ReadData(string account)
{
// URL作成
string url = string.Format(EXP,account);

HttpWebRequest request =
(HttpWebRequest)HttpWebRequest.Create(url);
WebResponse response = request.GetResponse();
StreamReader reader =
new StreamReader(response.GetResponseStream());
string result = reader.ReadToEnd();
reader.Close();
response.Close();

// WebClientを使うなら、こんな感じ
// WebClient client = new WebClient();
// client.Encoding = Encoding.UTF8;
// byte[] data = client.DownloadData(url);
// string result =Encoding.UTF8.GetString(data);

return result;
}
private void button1_Click(object sender, EventArgs e)
{
string account = textBox1.Text;
string result = ReadData(account);
// 取得XML表示
textBox2.Text = result;
// XMLドキュメントを読み込む
XmlDocument doc = new XmlDocument();
doc.LoadXml(result);
//XPath式を使って[text]ノードのリストを抜き出す。
XmlNodeList nodes = doc.SelectNodes("//statuses/status/text");
// リストボックスに[text]を登録
foreach(XmlNode node in nodes)
{
listBox1.Items.Add(node.InnerText);
}
}

こんな感じになりました。

今回は出来るだけシンプルに短いソースを心がけましたので、他のAPIの使用を前提にした汎用性は持たせていません。
また、xml, json, rss, atomの形式のデータが取得できるようですが、馴染が深いxml形式を今回は使用しました。
rss, atom形式のAPIによっては使えないものがあるようです。
定数EXPは、「statuses/user_timeline」APIを用いて、URLの最後のファイル名にあたるところの「{0}.xml」({0}はstring.Formatを使って、アカウント名「twj」を挿入するプレスホルダです。)は、アカウント名のデータを「xml」形式で得することを指定しています。
サンプル画像で使用しているIDの「twj」はTwitter日本語ホームページ開発者(社?)のアカウントで、公式アカウントと一般的に言われているものを例として使わせていただきました。

2009年7月4日土曜日

DataGridView セルの結合仕切り直す事に。

DataGridViewでのセル結合をDataGridViewTextBoxColumnを拡張することにより、結合専用のセルを作成してきましたが、どうしても解決出来ない事や、実装できたとしても無理がある方法をとらざる得ない部分が幾つかある事が見えてきました。
このまま進めるか検討した結果、仕切り直す事にしました。多分ですがDatGridView自身の拡張する方法が正しい方法だと思います。また、WPFでする方法も考えれるのかと思います。
 どのようにするか、考えがまとまった時点で、このテーマを再開するつもりです。