DoboWiki
Top
> .NETプログラミング研究/96 をテンプレートにして作成
.NETプログラミング研究/96 をテンプレートにして作成
開始行:
#title(Twitter Streaming APIを使う 1)
#navi(.NETプログラミング研究)
#contents
*Twitter Streaming APIを使う 1 [#y5aa919d]
恥ずかしながら、私はツイッターをやっていません。しかし[[T...
私はツイッターの知識がほとんどないにもかかわらずこのよう...
なおTwitter APIを使用する場合は、必ずご自分でドキュメント...
**Twitter Streaming APIとは? [#ybda66ec]
ツイッターに投稿された発言(ステータス)をいち早くチェッ...
**とりあえずやってみる [#na5bdb15]
Twitter Streaming APIの使い方は非常に簡単で、HTTPで通常通...
よって、「[[ファイルをダウンロードし表示する>https://dobo...
まずは、これ以上ないという位簡単な例を示します。このコン...
#code(vbnet){{
Imports System.IO
Imports System.Net
Module TwitterStreamingApiTest
Sub Main()
'HttpWebRequestを作成する
Dim req As HttpWebRequest = DirectCast( _
WebRequest.Create("http://stream.twitter.com/...
HttpWebRequest)
'ユーザー名とパスワードを設定する
Dim nc As New NetworkCredential("username", "pass...
req.Credentials = nc
'サーバーからの応答を受信するためのHttpWebRespons...
Dim res As HttpWebResponse = DirectCast(req.GetRe...
'応答データを受信するためのStreamを取得する
Dim st As Stream = res.GetResponseStream()
Dim sr As New StreamReader(st)
'10秒間だけデータを取得する
Dim startTime As DateTime = DateTime.Now
While (DateTime.Now - startTime).TotalSeconds < 10
Console.WriteLine(sr.ReadLine())
End While
'こちらから接続を閉じる
req.Abort()
res.Close()
sr.Close()
Console.WriteLine("----- 終了しました! -----")
Console.ReadLine()
End Sub
End Module
}}
#code(csharp){{
using System;
using System.IO;
using System.Net;
class TwitterStreamingApiTest
{
static void Main()
{
//HttpWebRequestを作成する
HttpWebRequest req = (HttpWebRequest)WebRequest.C...
"http://stream.twitter.com/1/statuses/sample....
//ユーザー名とパスワードを設定する
NetworkCredential nc = new NetworkCredential("use...
req.Credentials = nc;
//サーバーからの応答を受信するためのHttpWebRespon...
HttpWebResponse res = (HttpWebResponse)req.GetRes...
//応答データを受信するためのStreamを取得する
Stream st = res.GetResponseStream();
StreamReader sr = new StreamReader(st);
//10秒間だけデータを取得する
DateTime startTime = DateTime.Now;
while ((DateTime.Now - startTime).TotalSeconds < ...
{
Console.WriteLine(sr.ReadLine());
}
//こちらから接続を閉じる
req.Abort();
res.Close();
sr.Close();
Console.WriteLine("----- 終了しました! -----");
Console.ReadLine();
}
}
}}
このコードを実行すると、止めどなく、ものすごい勢いで文字...
**5つのメソッド [#obb8f175]
上記で使用した"http://stream.twitter.com/1/statuses/sampl...
statuses/sampleは、すべてのパブリックなステータスの中から...
**データを解析する [#u08edf8f]
Twitter Streaming APIは、JSONとXMLの2つのフォーマットをサ...
Streaming APIは、1つのステータスを表すオブジェクトをJSON...
ここでは、受信した文字列をとりあえずバッファに保存してお...
1つのステータスオブジェクトとして切り出した文字列は、XmlD...
なお、送られてくるオブジェクトはステータスだけではありま...
また、オブジェクトとオブジェクトの間には空白の改行が送ら...
#code(vbnet){{
Imports System.IO
Imports System.Net
Imports System.Text
Imports System.Text.RegularExpressions
Imports System.Xml
Module TwitterStreamingApiTest
Sub Main()
'XMLを切り出すための正規表現
Dim xmlReg As New Regex( _
"<\?xml\s[^>]+>\s*<(?<root>[^\s>]+)[^>]*>(?:....
RegexOptions.Singleline Or RegexOptions.Compi...
'HttpWebRequestの作成
Dim req As HttpWebRequest = DirectCast( _
WebRequest.Create("http://stream.twitter.com/...
HttpWebRequest)
'ユーザー名とパスワードを設定する
Dim nc As New NetworkCredential("username", "pass...
req.Credentials = nc
'サーバーからの応答を受信するためのHttpWebRespons...
Dim res As HttpWebResponse = DirectCast(req.GetRe...
'応答データを受信するためのStreamを取得
Dim st As Stream = res.GetResponseStream()
Dim sr As New StreamReader(st)
'一時的にデータを保存しておくバッファ
Dim buffer As New StringBuilder()
'10秒間だけデータを取得する
Dim startTime As DateTime = DateTime.Now
While (DateTime.Now - startTime).TotalSeconds < 10
'一行取得
Dim line As String = sr.ReadLine()
If line Is Nothing Then
Exit While
End If
'空行の時は何もしない
If line.Length = 0 Then
Continue While
End If
'バッファに追加
buffer.AppendLine(line)
'正規表現と一致するか調べる
Dim m As Match = xmlReg.Match(buffer.ToString...
If m.Success Then
'XmlDocumentに読み込む
Dim xmlDoc As New XmlDocument()
xmlDoc.LoadXml(m.Value)
'ルートを取得
Dim rootElm As XmlElement = xmlDoc.Docume...
'情報の表示
If rootElm.Name = "status" Then
'statusの情報(textとuserのname)を表...
Console.WriteLine("[{1}] {0}", _
rootElm("text").InnerText, rootEl...
ElseIf rootElm.Name = "delete" Then
Console.WriteLine("[DELETE] {0}", _
rootElm("status")("id").InnerText)
Else
Console.WriteLine("[?] {0}", rootElm....
End If
'バッファをクリア
buffer.Length = 0
End If
End While
'閉じる
req.Abort()
res.Close()
sr.Close()
Console.WriteLine("----- 終了しました! -----")
Console.ReadLine()
End Sub
End Module
}}
#code(csharp){{
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml;
class TwitterStreamingApiTest
{
static void Main()
{
//XMLを切り出すための正規表現
Regex xmlReg = new Regex(
@"<\?xml\s[^>]+>\s*<(?<root>[^\s>]+)[^>]*>(?:...
RegexOptions.Singleline | RegexOptions.Compil...
//HttpWebRequestの作成
HttpWebRequest req = (HttpWebRequest)WebRequest.C...
"http://stream.twitter.com/1/statuses/sample....
//ユーザー名とパスワードを設定する
NetworkCredential nc = new NetworkCredential("use...
req.Credentials = nc;
//サーバーからの応答を受信するためのHttpWebRespon...
HttpWebResponse res = (HttpWebResponse)req.GetRes...
//応答データを受信するためのStreamを取得
Stream st = res.GetResponseStream();
StreamReader sr = new StreamReader(st);
//一時的にデータを保存しておくバッファ
StringBuilder buffer = new StringBuilder();
//10秒間だけデータを取得する
DateTime startTime = DateTime.Now;
while ((DateTime.Now - startTime).TotalSeconds < ...
{
//一行取得
string line = sr.ReadLine();
if (line == null)
break;
//空行の時は何もしない
if (line.Length == 0)
continue;
//バッファに追加
buffer.AppendLine(line);
//正規表現と一致するか調べる
Match m = xmlReg.Match(buffer.ToString());
if (m.Success)
{
//XmlDocumentに読み込む
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(m.Value);
//ルートを取得
XmlElement rootElm = xmlDoc.DocumentEleme...
//情報の表示
if (rootElm.Name == "status")
{
//statusの情報(textとuserのname)を...
Console.WriteLine("[{1}] {0}",
rootElm["text"].InnerText, rootEl...
}
else if (rootElm.Name == "delete")
{
Console.WriteLine("[DELETE] {0}", roo...
}
else
{
Console.WriteLine("[?] {0}", rootElm....
}
//バッファをクリア
buffer.Length = 0;
}
}
//閉じる
req.Abort();
res.Close();
sr.Close();
Console.WriteLine("----- 終了しました! -----");
Console.ReadLine();
}
}
}}
**delimitedパラメータを使う [#pee40e95]
上の例では正規表現を使ってオブジェクトを切り出しましたが...
以下にdelimitedパラメータを使った例を示します。ここでは、...
#code(vbnet){{
Imports System.IO
Imports System.Net
Imports System.Xml
Module TwitterStreamingApiTest
Sub Main()
'HttpWebRequestの作成
Dim req As HttpWebRequest = DirectCast(WebRequest...
"http://stream.twitter.com/1/statuses/sample....
HttpWebRequest)
Dim nc As New NetworkCredential("username", "pass...
req.Credentials = nc
Dim res As HttpWebResponse = DirectCast(req.GetRe...
Dim st As Stream = res.GetResponseStream()
Dim sr As New StreamReader(st)
'10秒間だけデータを取得する
Dim startTime As DateTime = DateTime.Now
While (DateTime.Now - startTime).TotalSeconds < 10
'一行取得
Dim line As String = sr.ReadLine()
If line Is Nothing Then
Exit While
End If
If line.Length = 0 Then
Continue While
End If
'数字に変換出来るか調べる
Dim xmlLen As Integer
If Integer.TryParse(line, xmlLen) Then
'指定されたバイト数だけ読み込む
Dim xmlChars As Char() = New Char(xmlLen ...
Dim len As Integer = sr.ReadBlock(xmlChar...
'取得したXML文字列をXmlDocumentに読み込む
Dim xmlDoc As New XmlDocument()
xmlDoc.LoadXml(New String(xmlChars))
'ルートを取得
Dim rootElm As XmlElement = xmlDoc.Docume...
'情報の表示
If rootElm.Name = "status" Then
'statusの情報(textとuserのname)を表...
Console.WriteLine("[{1}] {0}", _
rootElm("text").InnerText, rootEl...
ElseIf rootElm.Name = "delete" Then
Console.WriteLine("[DELETE] {0}", _
rootElm("status")("id").InnerText)
End If
End If
End While
'閉じる
req.Abort()
res.Close()
sr.Close()
Console.WriteLine("----- 終了しました! -----")
Console.ReadLine()
End Sub
End Module
}}
#code(csharp){{
using System;
using System.IO;
using System.Net;
using System.Xml;
class TwitterStreamingApiTest
{
static void Main()
{
//HttpWebRequestの作成
HttpWebRequest req = (HttpWebRequest)WebRequest.C...
"http://stream.twitter.com/1/statuses/sample....
NetworkCredential nc = new NetworkCredential("use...
req.Credentials = nc;
HttpWebResponse res = (HttpWebResponse)req.GetRes...
Stream st = res.GetResponseStream();
StreamReader sr = new StreamReader(st);
//10秒間だけデータを取得する
DateTime startTime = DateTime.Now;
while ((DateTime.Now - startTime).TotalSeconds < ...
{
//一行取得
string line = sr.ReadLine();
if (line == null)
break;
if (line.Length == 0)
continue;
//数字に変換出来るか調べる
int xmlLen;
if (int.TryParse(line, out xmlLen))
{
//指定されたバイト数だけ読み込む
char[] xmlChars = new char[xmlLen];
int len = sr.ReadBlock(xmlChars, 0, xmlCh...
//取得したXML文字列をXmlDocumentに読み込む
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(new string(xmlChars));
//ルートを取得
XmlElement rootElm = xmlDoc.DocumentEleme...
//情報の表示
if (rootElm.Name == "status")
{
//statusの情報(textとuserのname)を...
Console.WriteLine("[{1}] {0}",
rootElm["text"].InnerText, rootEl...
}
else if (rootElm.Name == "delete")
{
Console.WriteLine("[DELETE] {0}", roo...
}
}
}
//閉じる
req.Abort();
res.Close();
sr.Close();
Console.WriteLine("----- 終了しました! -----");
Console.ReadLine();
}
}
}}
**ステータスオブジェクトのフィールドと意味 [#kffb77c9]
上の例ではとりあえずtext(ステータスの本文)とユーザー名...
ステータスオブジェクトのフィールドとしてどのような名前の...
これらについて、「[[Twitter API Wiki / Return Values>http...
***statusオブジェクト [#r77360d5]
|名前|説明|例((ほとんどが[[Twitter API Wiki / Return Valu...
|created_at|ステータスが作成された日時(UTC)|Sat Jan 24 ...
|id|ステータスのID|1145445329|Int64 または String|
|text|ステータスの本文|I am eating oatmeal, The first tag...
|source|ステータスを送ったアプリケーション|web (Default),...
|truncated|ステータスが省略されたか|true, false|Boolean|
|in_reply_to_status_id|返信元のステータスのID|empty, 1047...
|in_reply_to_user_id|返信元のステータスを書いたユーザーの...
|favorited|認証ユーザーがステータスをお気に入りとしている...
|in_reply_to_screen_name|返信元のステータスを書いたユーザ...
|retweeted_status|リツイート元のステータス||status|
|user|投稿したユーザーの情報||user|
|geo|投稿された場所||geo|
|coordinates|?|||
|place|?|||
|contributors|ステータスの投稿に関わったユーザーのIDの配...
***userオブジェクト [#x1d31ba1]
|名前|説明|例((ほとんどが[[Twitter API Wiki / Return Valu...
|id|ユーザーのID|14198354|Int32 または String|
|name|ユーザーの名前|empty (Default), Twitter API Chatter...
|screen_name|ユーザーの表示名|tweetybird, dougw|String|
|location|ユーザーの現在地|empty (Default), California OR...
|description|ユーザーの自己紹介文|empty (Default), I like...
|profile_image_url|ユーザーのアイコンのURL|http://static....
|url|ユーザーのWeb(ホームページ)|empty, http://downfore...
|protected|ツイートを非公開にしているか|true, false|Boole...
|followers_count|ユーザーをフォローしている人の数|0, 4034...
|profile_background_color|ユーザーの背景色(RGB)|9ae4e8 ...
|profile_text_color|ユーザーの前景色(RGB)|000000 (Defau...
|profile_link_color|ユーザーのリンクの色(RGB)|0000ff (D...
|profile_sidebar_fill_color|ユーザーのサイドバーの色(RGB...
|profile_sidebar_border_color|ユーザーのサイドバーの輪郭...
|friends_count|ユーザーがフォローしている人の数|0, 221|In...
|created_at|作成日時(UTC)|Sat Jan 24 22:14:29 +0000 200...
|favourites_count|お気に入りの数|0, 451|Int32|
|utc_offset|ユーザーのタイムゾーンとUTCの秒数差|-21600 (D...
|time_zone|ユーザーのタイムゾーン|Central Time (US & Cana...
|profile_background_image_url|ユーザーの背景画像のURL|emp...
|profile_background_tile|ユーザーの背景画像がタイルされて...
|notifications|ユーザーのNotificationsが有効か|true, fals...
|geo_enabled|ユーザーがツイート位置情報を有効にしているか...
|verified|認証済みアカウントか|true, false|Boolean|
|following|ユーザーがログインしているユーザーをフォローし...
|statuses_count|ユーザーが投稿したステータスの数|0, 9423|...
|lang|ユーザーの言語|ja, en, fr|String|
|contributors_enabled|contributors accessが可能か|true, f...
**非同期でデータを受信する [#ye337dc5]
「[[WebRequest、WebResponseクラスを使ってファイルをダウン...
下の例では、エンターキーを押すまで受信をし続けます。ここ...
#code(vbnet){{
Imports System.IO
Imports System.Net
Imports System.Text
Imports System.Text.RegularExpressions
Imports System.Xml
Module TwitterStreamingApiTest
'受信したデータを入れるバッファ
Dim bufferData As Byte()
'受信した文字列を入れておくStringBuilder
Dim bufferString As StringBuilder
'XMLを切り出すための正規表現
Dim xmlReg As New Regex( _
"<\?xml\s[^>]+>\s*<(?<root>[^\s>]+)[^>]*>(?:.+?)<...
RegexOptions.Singleline Or RegexOptions.Compiled)
Sub Main()
'HttpWebRequestを作成する
Dim req As HttpWebRequest = DirectCast(System.Net...
"http://stream.twitter.com/1/statuses/sample....
'ユーザー名とパスワードを設定する
Dim nc As New NetworkCredential("username", "pass...
req.Credentials = nc
'非同期要求を開始
'状態オブジェクトとしてHttpWebRequestをわたす
Dim r As IAsyncResult = DirectCast(req.BeginGetRe...
New AsyncCallback(AddressOf ResponseCallback)...
'待機する
Console.ReadLine()
'閉じる
req.Abort()
Console.WriteLine("----- 終了しました! -----")
Console.ReadLine()
End Sub
'非同期要求が終了した時に呼び出されるコールバックメソ...
Sub ResponseCallback(ByVal ar As IAsyncResult)
'状態オブジェクトとしてわたされたHttpWebRequestを...
Dim req As HttpWebRequest = DirectCast(ar.AsyncSt...
'非同期要求を終了
Dim res As HttpWebResponse = Nothing
Try
res = DirectCast(req.EndGetResponse(ar), Http...
Catch ex As WebException
req.Abort()
Return
End Try
'Streamを取得
Dim st As Stream = res.GetResponseStream()
'データを読み込むための準備をする
bufferData = New Byte(5119) {}
bufferString = New StringBuilder()
'非同期でデータの読み込みを開始
'状態オブジェクトとしてStreamをわたす
Dim r As IAsyncResult = DirectCast( _
st.BeginRead(bufferData, _
0, _
bufferData.Length, _
New AsyncCallback(AddressOf Read...
IAsyncResult)
End Sub
'非同期読み込み完了時に呼び出されるコールバックメソッド
Sub ReadCallback(ByVal ar As IAsyncResult)
'状態オブジェクトとしてわたされたStreamを取得
Dim st As Stream = DirectCast(ar.AsyncState, Stre...
'データを読み込む
Dim readSize As Integer = st.EndRead(ar)
If readSize > 0 Then
'読み込んだデータを文字列に変換
Dim str As String = Encoding.ASCII.GetString(...
'バッファに追加する
bufferString.Append(str)
'正規表現と一致するか調べる
Dim mc As MatchCollection = xmlReg.Matches(bu...
For Each m As Match In mc
'XmlDocumentに読み込む
Dim xmlDoc As New XmlDocument()
xmlDoc.LoadXml(m.Value)
Dim rootElm As XmlElement = xmlDoc.Docume...
If rootElm.Name = "status" Then
Console.WriteLine("[{1}] {0}", _
rootElm("text").InnerText, rootEl...
End If
Next
'バッファを更新
If mc.Count > 0 Then
Dim m As Match = mc(mc.Count - 1)
bufferString.Remove(0, m.Index + m.Length)
End If
'再び非同期でデータを読み込む
Try
Dim r As IAsyncResult = DirectCast( _
st.BeginRead(bufferData, _
0, _
bufferData.Length, _
New AsyncCallback(Addres...
IAsyncResult)
Catch ex As WebException
st.Close()
Return
End Try
Else
'閉じる
st.Close()
Console.WriteLine("----- 切断されました -----")
End If
End Sub
End Module
}}
#code(csharp){{
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml;
class TwitterStreamingApiTest
{
//受信したデータを入れるバッファ
private static byte[] bufferData;
//受信した文字列を入れておくStringBuilder
private static StringBuilder bufferString;
//XMLを切り出すための正規表現
private static Regex xmlReg = new Regex(
@"<\?xml\s[^>]+>\s*<(?<root>[^\s>]+)[^>]*>(?:.+?)...
RegexOptions.Singleline | RegexOptions.Compiled);
static void Main()
{
//HttpWebRequestを作成する
HttpWebRequest req = (HttpWebRequest)System.Net.W...
"http://stream.twitter.com/1/statuses/sample....
//ユーザー名とパスワードを設定する
NetworkCredential nc = new NetworkCredential("use...
req.Credentials = nc;
//非同期要求を開始
//状態オブジェクトとしてHttpWebRequestをわたす
IAsyncResult r = (IAsyncResult)req.BeginGetRespon...
new AsyncCallback(ResponseCallback), req);
//待機する
Console.ReadLine();
//閉じる
req.Abort();
Console.WriteLine("----- 終了しました! -----");
Console.ReadLine();
}
//非同期要求が終了した時に呼び出されるコールバックメ...
private static void ResponseCallback(IAsyncResult ar)
{
//状態オブジェクトとしてわたされたHttpWebRequest...
HttpWebRequest req = (HttpWebRequest)ar.AsyncState;
//非同期要求を終了
HttpWebResponse res = null;
try
{
res = (HttpWebResponse)req.EndGetResponse(ar);
}
catch (WebException)
{
req.Abort();
return;
}
//Streamを取得
Stream st = res.GetResponseStream();
//データを読み込むための準備をする
bufferData = new byte[5120];
bufferString = new StringBuilder();
//非同期でデータの読み込みを開始
//状態オブジェクトとしてStreamをわたす
IAsyncResult r = (IAsyncResult)st.BeginRead(
bufferData,
0,
bufferData.Length,
new AsyncCallback(ReadCallback),
st);
}
//非同期読み込み完了時に呼び出されるコールバックメソ...
private static void ReadCallback(IAsyncResult ar)
{
//状態オブジェクトとしてわたされたStreamを取得
Stream st = (Stream)ar.AsyncState;
//データを読み込む
int readSize = st.EndRead(ar);
if (readSize > 0)
{
//読み込んだデータを文字列に変換
string str = Encoding.ASCII.GetString(bufferD...
//バッファに追加する
bufferString.Append(str);
//正規表現と一致するか調べる
MatchCollection mc = xmlReg.Matches(bufferStr...
foreach (Match m in mc)
{
//XmlDocumentに読み込む
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(m.Value);
XmlElement rootElm = xmlDoc.DocumentEleme...
if (rootElm.Name == "status")
{
Console.WriteLine("[{1}] {0}",
rootElm["text"].InnerText, rootEl...
}
}
//バッファを更新
if (mc.Count > 0)
{
Match m = mc[mc.Count - 1];
bufferString.Remove(0, m.Index + m.Length);
}
//再び非同期でデータを読み込む
try
{
IAsyncResult r = (IAsyncResult)st.BeginRe...
bufferData,
0,
bufferData.Length,
new AsyncCallback(ReadCallback),
st);
}
catch (WebException)
{
st.Close();
return;
}
}
else
{
//閉じる
st.Close();
Console.WriteLine("----- 切断されました -----...
}
}
}
}}
**次回予告 [#j94ee3e7]
長くなってしまいましたので、statuses/filterメソッドについ...
**履歴 [#b23fb4b9]
-2010/6/18 : 10秒の測り方の間違いを修正。
**コメント [#p216579f]
#comment
//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2010-06-09 (水) 02:53:12,DOB...
終了行:
#title(Twitter Streaming APIを使う 1)
#navi(.NETプログラミング研究)
#contents
*Twitter Streaming APIを使う 1 [#y5aa919d]
恥ずかしながら、私はツイッターをやっていません。しかし[[T...
私はツイッターの知識がほとんどないにもかかわらずこのよう...
なおTwitter APIを使用する場合は、必ずご自分でドキュメント...
**Twitter Streaming APIとは? [#ybda66ec]
ツイッターに投稿された発言(ステータス)をいち早くチェッ...
**とりあえずやってみる [#na5bdb15]
Twitter Streaming APIの使い方は非常に簡単で、HTTPで通常通...
よって、「[[ファイルをダウンロードし表示する>https://dobo...
まずは、これ以上ないという位簡単な例を示します。このコン...
#code(vbnet){{
Imports System.IO
Imports System.Net
Module TwitterStreamingApiTest
Sub Main()
'HttpWebRequestを作成する
Dim req As HttpWebRequest = DirectCast( _
WebRequest.Create("http://stream.twitter.com/...
HttpWebRequest)
'ユーザー名とパスワードを設定する
Dim nc As New NetworkCredential("username", "pass...
req.Credentials = nc
'サーバーからの応答を受信するためのHttpWebRespons...
Dim res As HttpWebResponse = DirectCast(req.GetRe...
'応答データを受信するためのStreamを取得する
Dim st As Stream = res.GetResponseStream()
Dim sr As New StreamReader(st)
'10秒間だけデータを取得する
Dim startTime As DateTime = DateTime.Now
While (DateTime.Now - startTime).TotalSeconds < 10
Console.WriteLine(sr.ReadLine())
End While
'こちらから接続を閉じる
req.Abort()
res.Close()
sr.Close()
Console.WriteLine("----- 終了しました! -----")
Console.ReadLine()
End Sub
End Module
}}
#code(csharp){{
using System;
using System.IO;
using System.Net;
class TwitterStreamingApiTest
{
static void Main()
{
//HttpWebRequestを作成する
HttpWebRequest req = (HttpWebRequest)WebRequest.C...
"http://stream.twitter.com/1/statuses/sample....
//ユーザー名とパスワードを設定する
NetworkCredential nc = new NetworkCredential("use...
req.Credentials = nc;
//サーバーからの応答を受信するためのHttpWebRespon...
HttpWebResponse res = (HttpWebResponse)req.GetRes...
//応答データを受信するためのStreamを取得する
Stream st = res.GetResponseStream();
StreamReader sr = new StreamReader(st);
//10秒間だけデータを取得する
DateTime startTime = DateTime.Now;
while ((DateTime.Now - startTime).TotalSeconds < ...
{
Console.WriteLine(sr.ReadLine());
}
//こちらから接続を閉じる
req.Abort();
res.Close();
sr.Close();
Console.WriteLine("----- 終了しました! -----");
Console.ReadLine();
}
}
}}
このコードを実行すると、止めどなく、ものすごい勢いで文字...
**5つのメソッド [#obb8f175]
上記で使用した"http://stream.twitter.com/1/statuses/sampl...
statuses/sampleは、すべてのパブリックなステータスの中から...
**データを解析する [#u08edf8f]
Twitter Streaming APIは、JSONとXMLの2つのフォーマットをサ...
Streaming APIは、1つのステータスを表すオブジェクトをJSON...
ここでは、受信した文字列をとりあえずバッファに保存してお...
1つのステータスオブジェクトとして切り出した文字列は、XmlD...
なお、送られてくるオブジェクトはステータスだけではありま...
また、オブジェクトとオブジェクトの間には空白の改行が送ら...
#code(vbnet){{
Imports System.IO
Imports System.Net
Imports System.Text
Imports System.Text.RegularExpressions
Imports System.Xml
Module TwitterStreamingApiTest
Sub Main()
'XMLを切り出すための正規表現
Dim xmlReg As New Regex( _
"<\?xml\s[^>]+>\s*<(?<root>[^\s>]+)[^>]*>(?:....
RegexOptions.Singleline Or RegexOptions.Compi...
'HttpWebRequestの作成
Dim req As HttpWebRequest = DirectCast( _
WebRequest.Create("http://stream.twitter.com/...
HttpWebRequest)
'ユーザー名とパスワードを設定する
Dim nc As New NetworkCredential("username", "pass...
req.Credentials = nc
'サーバーからの応答を受信するためのHttpWebRespons...
Dim res As HttpWebResponse = DirectCast(req.GetRe...
'応答データを受信するためのStreamを取得
Dim st As Stream = res.GetResponseStream()
Dim sr As New StreamReader(st)
'一時的にデータを保存しておくバッファ
Dim buffer As New StringBuilder()
'10秒間だけデータを取得する
Dim startTime As DateTime = DateTime.Now
While (DateTime.Now - startTime).TotalSeconds < 10
'一行取得
Dim line As String = sr.ReadLine()
If line Is Nothing Then
Exit While
End If
'空行の時は何もしない
If line.Length = 0 Then
Continue While
End If
'バッファに追加
buffer.AppendLine(line)
'正規表現と一致するか調べる
Dim m As Match = xmlReg.Match(buffer.ToString...
If m.Success Then
'XmlDocumentに読み込む
Dim xmlDoc As New XmlDocument()
xmlDoc.LoadXml(m.Value)
'ルートを取得
Dim rootElm As XmlElement = xmlDoc.Docume...
'情報の表示
If rootElm.Name = "status" Then
'statusの情報(textとuserのname)を表...
Console.WriteLine("[{1}] {0}", _
rootElm("text").InnerText, rootEl...
ElseIf rootElm.Name = "delete" Then
Console.WriteLine("[DELETE] {0}", _
rootElm("status")("id").InnerText)
Else
Console.WriteLine("[?] {0}", rootElm....
End If
'バッファをクリア
buffer.Length = 0
End If
End While
'閉じる
req.Abort()
res.Close()
sr.Close()
Console.WriteLine("----- 終了しました! -----")
Console.ReadLine()
End Sub
End Module
}}
#code(csharp){{
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml;
class TwitterStreamingApiTest
{
static void Main()
{
//XMLを切り出すための正規表現
Regex xmlReg = new Regex(
@"<\?xml\s[^>]+>\s*<(?<root>[^\s>]+)[^>]*>(?:...
RegexOptions.Singleline | RegexOptions.Compil...
//HttpWebRequestの作成
HttpWebRequest req = (HttpWebRequest)WebRequest.C...
"http://stream.twitter.com/1/statuses/sample....
//ユーザー名とパスワードを設定する
NetworkCredential nc = new NetworkCredential("use...
req.Credentials = nc;
//サーバーからの応答を受信するためのHttpWebRespon...
HttpWebResponse res = (HttpWebResponse)req.GetRes...
//応答データを受信するためのStreamを取得
Stream st = res.GetResponseStream();
StreamReader sr = new StreamReader(st);
//一時的にデータを保存しておくバッファ
StringBuilder buffer = new StringBuilder();
//10秒間だけデータを取得する
DateTime startTime = DateTime.Now;
while ((DateTime.Now - startTime).TotalSeconds < ...
{
//一行取得
string line = sr.ReadLine();
if (line == null)
break;
//空行の時は何もしない
if (line.Length == 0)
continue;
//バッファに追加
buffer.AppendLine(line);
//正規表現と一致するか調べる
Match m = xmlReg.Match(buffer.ToString());
if (m.Success)
{
//XmlDocumentに読み込む
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(m.Value);
//ルートを取得
XmlElement rootElm = xmlDoc.DocumentEleme...
//情報の表示
if (rootElm.Name == "status")
{
//statusの情報(textとuserのname)を...
Console.WriteLine("[{1}] {0}",
rootElm["text"].InnerText, rootEl...
}
else if (rootElm.Name == "delete")
{
Console.WriteLine("[DELETE] {0}", roo...
}
else
{
Console.WriteLine("[?] {0}", rootElm....
}
//バッファをクリア
buffer.Length = 0;
}
}
//閉じる
req.Abort();
res.Close();
sr.Close();
Console.WriteLine("----- 終了しました! -----");
Console.ReadLine();
}
}
}}
**delimitedパラメータを使う [#pee40e95]
上の例では正規表現を使ってオブジェクトを切り出しましたが...
以下にdelimitedパラメータを使った例を示します。ここでは、...
#code(vbnet){{
Imports System.IO
Imports System.Net
Imports System.Xml
Module TwitterStreamingApiTest
Sub Main()
'HttpWebRequestの作成
Dim req As HttpWebRequest = DirectCast(WebRequest...
"http://stream.twitter.com/1/statuses/sample....
HttpWebRequest)
Dim nc As New NetworkCredential("username", "pass...
req.Credentials = nc
Dim res As HttpWebResponse = DirectCast(req.GetRe...
Dim st As Stream = res.GetResponseStream()
Dim sr As New StreamReader(st)
'10秒間だけデータを取得する
Dim startTime As DateTime = DateTime.Now
While (DateTime.Now - startTime).TotalSeconds < 10
'一行取得
Dim line As String = sr.ReadLine()
If line Is Nothing Then
Exit While
End If
If line.Length = 0 Then
Continue While
End If
'数字に変換出来るか調べる
Dim xmlLen As Integer
If Integer.TryParse(line, xmlLen) Then
'指定されたバイト数だけ読み込む
Dim xmlChars As Char() = New Char(xmlLen ...
Dim len As Integer = sr.ReadBlock(xmlChar...
'取得したXML文字列をXmlDocumentに読み込む
Dim xmlDoc As New XmlDocument()
xmlDoc.LoadXml(New String(xmlChars))
'ルートを取得
Dim rootElm As XmlElement = xmlDoc.Docume...
'情報の表示
If rootElm.Name = "status" Then
'statusの情報(textとuserのname)を表...
Console.WriteLine("[{1}] {0}", _
rootElm("text").InnerText, rootEl...
ElseIf rootElm.Name = "delete" Then
Console.WriteLine("[DELETE] {0}", _
rootElm("status")("id").InnerText)
End If
End If
End While
'閉じる
req.Abort()
res.Close()
sr.Close()
Console.WriteLine("----- 終了しました! -----")
Console.ReadLine()
End Sub
End Module
}}
#code(csharp){{
using System;
using System.IO;
using System.Net;
using System.Xml;
class TwitterStreamingApiTest
{
static void Main()
{
//HttpWebRequestの作成
HttpWebRequest req = (HttpWebRequest)WebRequest.C...
"http://stream.twitter.com/1/statuses/sample....
NetworkCredential nc = new NetworkCredential("use...
req.Credentials = nc;
HttpWebResponse res = (HttpWebResponse)req.GetRes...
Stream st = res.GetResponseStream();
StreamReader sr = new StreamReader(st);
//10秒間だけデータを取得する
DateTime startTime = DateTime.Now;
while ((DateTime.Now - startTime).TotalSeconds < ...
{
//一行取得
string line = sr.ReadLine();
if (line == null)
break;
if (line.Length == 0)
continue;
//数字に変換出来るか調べる
int xmlLen;
if (int.TryParse(line, out xmlLen))
{
//指定されたバイト数だけ読み込む
char[] xmlChars = new char[xmlLen];
int len = sr.ReadBlock(xmlChars, 0, xmlCh...
//取得したXML文字列をXmlDocumentに読み込む
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(new string(xmlChars));
//ルートを取得
XmlElement rootElm = xmlDoc.DocumentEleme...
//情報の表示
if (rootElm.Name == "status")
{
//statusの情報(textとuserのname)を...
Console.WriteLine("[{1}] {0}",
rootElm["text"].InnerText, rootEl...
}
else if (rootElm.Name == "delete")
{
Console.WriteLine("[DELETE] {0}", roo...
}
}
}
//閉じる
req.Abort();
res.Close();
sr.Close();
Console.WriteLine("----- 終了しました! -----");
Console.ReadLine();
}
}
}}
**ステータスオブジェクトのフィールドと意味 [#kffb77c9]
上の例ではとりあえずtext(ステータスの本文)とユーザー名...
ステータスオブジェクトのフィールドとしてどのような名前の...
これらについて、「[[Twitter API Wiki / Return Values>http...
***statusオブジェクト [#r77360d5]
|名前|説明|例((ほとんどが[[Twitter API Wiki / Return Valu...
|created_at|ステータスが作成された日時(UTC)|Sat Jan 24 ...
|id|ステータスのID|1145445329|Int64 または String|
|text|ステータスの本文|I am eating oatmeal, The first tag...
|source|ステータスを送ったアプリケーション|web (Default),...
|truncated|ステータスが省略されたか|true, false|Boolean|
|in_reply_to_status_id|返信元のステータスのID|empty, 1047...
|in_reply_to_user_id|返信元のステータスを書いたユーザーの...
|favorited|認証ユーザーがステータスをお気に入りとしている...
|in_reply_to_screen_name|返信元のステータスを書いたユーザ...
|retweeted_status|リツイート元のステータス||status|
|user|投稿したユーザーの情報||user|
|geo|投稿された場所||geo|
|coordinates|?|||
|place|?|||
|contributors|ステータスの投稿に関わったユーザーのIDの配...
***userオブジェクト [#x1d31ba1]
|名前|説明|例((ほとんどが[[Twitter API Wiki / Return Valu...
|id|ユーザーのID|14198354|Int32 または String|
|name|ユーザーの名前|empty (Default), Twitter API Chatter...
|screen_name|ユーザーの表示名|tweetybird, dougw|String|
|location|ユーザーの現在地|empty (Default), California OR...
|description|ユーザーの自己紹介文|empty (Default), I like...
|profile_image_url|ユーザーのアイコンのURL|http://static....
|url|ユーザーのWeb(ホームページ)|empty, http://downfore...
|protected|ツイートを非公開にしているか|true, false|Boole...
|followers_count|ユーザーをフォローしている人の数|0, 4034...
|profile_background_color|ユーザーの背景色(RGB)|9ae4e8 ...
|profile_text_color|ユーザーの前景色(RGB)|000000 (Defau...
|profile_link_color|ユーザーのリンクの色(RGB)|0000ff (D...
|profile_sidebar_fill_color|ユーザーのサイドバーの色(RGB...
|profile_sidebar_border_color|ユーザーのサイドバーの輪郭...
|friends_count|ユーザーがフォローしている人の数|0, 221|In...
|created_at|作成日時(UTC)|Sat Jan 24 22:14:29 +0000 200...
|favourites_count|お気に入りの数|0, 451|Int32|
|utc_offset|ユーザーのタイムゾーンとUTCの秒数差|-21600 (D...
|time_zone|ユーザーのタイムゾーン|Central Time (US & Cana...
|profile_background_image_url|ユーザーの背景画像のURL|emp...
|profile_background_tile|ユーザーの背景画像がタイルされて...
|notifications|ユーザーのNotificationsが有効か|true, fals...
|geo_enabled|ユーザーがツイート位置情報を有効にしているか...
|verified|認証済みアカウントか|true, false|Boolean|
|following|ユーザーがログインしているユーザーをフォローし...
|statuses_count|ユーザーが投稿したステータスの数|0, 9423|...
|lang|ユーザーの言語|ja, en, fr|String|
|contributors_enabled|contributors accessが可能か|true, f...
**非同期でデータを受信する [#ye337dc5]
「[[WebRequest、WebResponseクラスを使ってファイルをダウン...
下の例では、エンターキーを押すまで受信をし続けます。ここ...
#code(vbnet){{
Imports System.IO
Imports System.Net
Imports System.Text
Imports System.Text.RegularExpressions
Imports System.Xml
Module TwitterStreamingApiTest
'受信したデータを入れるバッファ
Dim bufferData As Byte()
'受信した文字列を入れておくStringBuilder
Dim bufferString As StringBuilder
'XMLを切り出すための正規表現
Dim xmlReg As New Regex( _
"<\?xml\s[^>]+>\s*<(?<root>[^\s>]+)[^>]*>(?:.+?)<...
RegexOptions.Singleline Or RegexOptions.Compiled)
Sub Main()
'HttpWebRequestを作成する
Dim req As HttpWebRequest = DirectCast(System.Net...
"http://stream.twitter.com/1/statuses/sample....
'ユーザー名とパスワードを設定する
Dim nc As New NetworkCredential("username", "pass...
req.Credentials = nc
'非同期要求を開始
'状態オブジェクトとしてHttpWebRequestをわたす
Dim r As IAsyncResult = DirectCast(req.BeginGetRe...
New AsyncCallback(AddressOf ResponseCallback)...
'待機する
Console.ReadLine()
'閉じる
req.Abort()
Console.WriteLine("----- 終了しました! -----")
Console.ReadLine()
End Sub
'非同期要求が終了した時に呼び出されるコールバックメソ...
Sub ResponseCallback(ByVal ar As IAsyncResult)
'状態オブジェクトとしてわたされたHttpWebRequestを...
Dim req As HttpWebRequest = DirectCast(ar.AsyncSt...
'非同期要求を終了
Dim res As HttpWebResponse = Nothing
Try
res = DirectCast(req.EndGetResponse(ar), Http...
Catch ex As WebException
req.Abort()
Return
End Try
'Streamを取得
Dim st As Stream = res.GetResponseStream()
'データを読み込むための準備をする
bufferData = New Byte(5119) {}
bufferString = New StringBuilder()
'非同期でデータの読み込みを開始
'状態オブジェクトとしてStreamをわたす
Dim r As IAsyncResult = DirectCast( _
st.BeginRead(bufferData, _
0, _
bufferData.Length, _
New AsyncCallback(AddressOf Read...
IAsyncResult)
End Sub
'非同期読み込み完了時に呼び出されるコールバックメソッド
Sub ReadCallback(ByVal ar As IAsyncResult)
'状態オブジェクトとしてわたされたStreamを取得
Dim st As Stream = DirectCast(ar.AsyncState, Stre...
'データを読み込む
Dim readSize As Integer = st.EndRead(ar)
If readSize > 0 Then
'読み込んだデータを文字列に変換
Dim str As String = Encoding.ASCII.GetString(...
'バッファに追加する
bufferString.Append(str)
'正規表現と一致するか調べる
Dim mc As MatchCollection = xmlReg.Matches(bu...
For Each m As Match In mc
'XmlDocumentに読み込む
Dim xmlDoc As New XmlDocument()
xmlDoc.LoadXml(m.Value)
Dim rootElm As XmlElement = xmlDoc.Docume...
If rootElm.Name = "status" Then
Console.WriteLine("[{1}] {0}", _
rootElm("text").InnerText, rootEl...
End If
Next
'バッファを更新
If mc.Count > 0 Then
Dim m As Match = mc(mc.Count - 1)
bufferString.Remove(0, m.Index + m.Length)
End If
'再び非同期でデータを読み込む
Try
Dim r As IAsyncResult = DirectCast( _
st.BeginRead(bufferData, _
0, _
bufferData.Length, _
New AsyncCallback(Addres...
IAsyncResult)
Catch ex As WebException
st.Close()
Return
End Try
Else
'閉じる
st.Close()
Console.WriteLine("----- 切断されました -----")
End If
End Sub
End Module
}}
#code(csharp){{
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml;
class TwitterStreamingApiTest
{
//受信したデータを入れるバッファ
private static byte[] bufferData;
//受信した文字列を入れておくStringBuilder
private static StringBuilder bufferString;
//XMLを切り出すための正規表現
private static Regex xmlReg = new Regex(
@"<\?xml\s[^>]+>\s*<(?<root>[^\s>]+)[^>]*>(?:.+?)...
RegexOptions.Singleline | RegexOptions.Compiled);
static void Main()
{
//HttpWebRequestを作成する
HttpWebRequest req = (HttpWebRequest)System.Net.W...
"http://stream.twitter.com/1/statuses/sample....
//ユーザー名とパスワードを設定する
NetworkCredential nc = new NetworkCredential("use...
req.Credentials = nc;
//非同期要求を開始
//状態オブジェクトとしてHttpWebRequestをわたす
IAsyncResult r = (IAsyncResult)req.BeginGetRespon...
new AsyncCallback(ResponseCallback), req);
//待機する
Console.ReadLine();
//閉じる
req.Abort();
Console.WriteLine("----- 終了しました! -----");
Console.ReadLine();
}
//非同期要求が終了した時に呼び出されるコールバックメ...
private static void ResponseCallback(IAsyncResult ar)
{
//状態オブジェクトとしてわたされたHttpWebRequest...
HttpWebRequest req = (HttpWebRequest)ar.AsyncState;
//非同期要求を終了
HttpWebResponse res = null;
try
{
res = (HttpWebResponse)req.EndGetResponse(ar);
}
catch (WebException)
{
req.Abort();
return;
}
//Streamを取得
Stream st = res.GetResponseStream();
//データを読み込むための準備をする
bufferData = new byte[5120];
bufferString = new StringBuilder();
//非同期でデータの読み込みを開始
//状態オブジェクトとしてStreamをわたす
IAsyncResult r = (IAsyncResult)st.BeginRead(
bufferData,
0,
bufferData.Length,
new AsyncCallback(ReadCallback),
st);
}
//非同期読み込み完了時に呼び出されるコールバックメソ...
private static void ReadCallback(IAsyncResult ar)
{
//状態オブジェクトとしてわたされたStreamを取得
Stream st = (Stream)ar.AsyncState;
//データを読み込む
int readSize = st.EndRead(ar);
if (readSize > 0)
{
//読み込んだデータを文字列に変換
string str = Encoding.ASCII.GetString(bufferD...
//バッファに追加する
bufferString.Append(str);
//正規表現と一致するか調べる
MatchCollection mc = xmlReg.Matches(bufferStr...
foreach (Match m in mc)
{
//XmlDocumentに読み込む
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(m.Value);
XmlElement rootElm = xmlDoc.DocumentEleme...
if (rootElm.Name == "status")
{
Console.WriteLine("[{1}] {0}",
rootElm["text"].InnerText, rootEl...
}
}
//バッファを更新
if (mc.Count > 0)
{
Match m = mc[mc.Count - 1];
bufferString.Remove(0, m.Index + m.Length);
}
//再び非同期でデータを読み込む
try
{
IAsyncResult r = (IAsyncResult)st.BeginRe...
bufferData,
0,
bufferData.Length,
new AsyncCallback(ReadCallback),
st);
}
catch (WebException)
{
st.Close();
return;
}
}
else
{
//閉じる
st.Close();
Console.WriteLine("----- 切断されました -----...
}
}
}
}}
**次回予告 [#j94ee3e7]
長くなってしまいましたので、statuses/filterメソッドについ...
**履歴 [#b23fb4b9]
-2010/6/18 : 10秒の測り方の間違いを修正。
**コメント [#p216579f]
#comment
//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2010-06-09 (水) 02:53:12,DOB...
ページ名:
▲
▼
[
トップ
] [
新規
|
子ページ作成
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]