たぶん、status って言うのが、一個の投稿アイテムだと思います。
タイムラインの取得をすると、XML のデータが送られてきます。
※"http://twitter.com/statuses/friends_timeline.xml" から取得すればXML
それを解析すると・・・
<ststus>から</ststus> までが一つのメッセージで、内容が、
'<created_at>Tue Mar 09 05:15:03 +0000 2010</created_at>
'<id>102071*****</id>
'<text>**************</text>
'<source><a href="http://mobile.twitter.com" rel="nofollow">mobile web</a></source>
'<truncated>false</truncated>
'<in_reply_to_status_id>102071******</in_reply_to_status_id>
'<in_reply_to_user_id>592*****</in_reply_to_user_id>
'<favorited>false</favorited>
'<in_reply_to_screen_name>LivingForDemi</in_reply_to_screen_name>
こんなん書かれてます。
また、この中に、<user> </user> の階層?もありました。
'<id>914******</id>
'<name>**************</name>
'<screen_name>**************</screen_name>
'<location>Earth</location>
'<description>**************</description>
'<profile_image_url>**************_normal.jpg</profile_image_url>
'<url></url>
'<protected>false</protected>
'<followers_count>468</followers_count>
'<profile_background_color>352726</profile_background_color>
'<profile_text_color>3E4415</profile_text_color>
'<profile_link_color>D02B55</profile_link_color>
'<profile_sidebar_fill_color>99CC33</profile_sidebar_fill_color>
'<profile_sidebar_border_color>829D5E</profile_sidebar_border_color>
'<friends_count>101</friends_count>
'<created_at>Sat Nov 21 03:01:16 +0000 2009</created_at>
'<favourites_count>124</favourites_count>
'<utc_offset>-32400</utc_offset>
'<time_zone>Alaska</time_zone>
'<profile_background_image_url**************bg.gif</profile_background_image_url>
'<profile_background_tile>false</profile_background_tile>
'<notifications></notifications>
'<geo_enabled>false</geo_enabled>
'<verified>false</verified>
'<following></following>
'<statuses_count>6667</statuses_count>
'<lang>en</lang>
'<contributors_enabled>false</contributors_enabled>
こんな感じで、ユーザーのデータが載ってます。
一個の投稿の中には、
<status>
<id> </id>
・・・ 投稿情報、省略
<user>
<id> </id>
・・・ ユーザー情報、省略
</user>
</status>
ってなってると思います。
たぶん・・・
送られてきたデータを見るからには、こんな感じでした。
なんで、後はタグ毎に必要なデータをピックアップするだけ。
手順的には、
前回の通信関数からByRef で戻って来るHttpWebResponse から System.IO.Stream を取得する。
Stream = _WebResponce.GetResponseStream
そこからByte データを取得する。
Do
result = Stream.ReadByte()
If result = -1 Then Exit Do ' ReadByte returns -1 at EOF.
DownDataAL.Add(CByte(result))
Loop
コレで、データ取り込みは完了。
Byte 配列のデータをエンコードし、 System.Xml.Linq.XElement データにする。
AllStatusXElement = System.Xml.Linq.XElement.Parse(System.Text.Encoding.UTF8.GetString(DownData))
コレで、プログラム内で、statusがXElement で利用可能になる。
私の場合は、XElement ではいまいちピンとこない為、
※使い方も良く解らんし、意味すら分からないから・・・
このデータをクラス化して、一つのstatus をクラスに分割してます。
TwitterStatusAL.Clear()
For Each StatusXElement As XElement In AllStatusXElement...<status>
TwitterStatusAL.Add(New clsTwitterStatus(StatusXElement))
Next
※StatusXElement が一つのstatus のXElement
AllStatusXElement...<status> コレで、分けてる。
コレで作ったclsTwitterStatus の配列を、ListBox 等に表示すれば、とりあえずタイムラインは表示できます。
If _TeitterCom.GetTimeline(TwitterStatus) Then
For ii = 0 To TwitterStatus.Length - 1
ListBox.Items.Add(TwitterStatus(ii).User.Name & " , " & _
TwitterStatus(ii).Text & " , " & _
TwitterStatus(ii).CreatedAt)
Next
End If
では、ソース・・・
Ststus Class と、User Class
#Region "Status Class"
Public Class clsTwitterStatus
Private _StatusXElement As XElement
Private _User As clsTwitterUser
Public Sub New(ByVal __XElement As XElement)
_StatusXElement = __XElement
_User = New clsTwitterUser(UserXElement)
End Sub
Public Function StatusXElement() As XElement
Return _StatusXElement
End Function
Public Function UserXElement() As XElement
Return _StatusXElement.Element("user")
End Function
Public Function User() As clsTwitterUser
Return _User
End Function
Public ReadOnly Property CreatedAt() As String
Get
Return _StatusXElement...<created_at>.Value.ToString()
End Get
End Property
Public ReadOnly Property StatusID() As String
Get
Return _StatusXElement...<id>.Value.ToString()
End Get
End Property
Public ReadOnly Property Text() As String
Get
Return _StatusXElement...<text>.Value.ToString()
End Get
End Property
Public ReadOnly Property InReplyToStatusId() As String
Get
Return _StatusXElement...<in_reply_to_status_id>.Value.ToString()
End Get
End Property
Public ReadOnly Property InReplyToUserId() As String
Get
Return _StatusXElement...<in_reply_to_user_id>.Value.ToString()
End Get
End Property
End Class
#End Region
#Region "User Class"
Public Class clsTwitterUser
Private _UserXElement As XElement
Public Sub New(ByVal __XElement As XElement)
_UserXElement = __XElement
End Sub
Public Function UserXElement() As XElement
Return _UserXElement
End Function
Public ReadOnly Property UserID() As String
Get
Return _UserXElement...<id>.Value.ToString()
End Get
End Property
Public ReadOnly Property Name() As String
Get
Return _UserXElement...<name>.Value.ToString()
End Get
End Property
Public ReadOnly Property ScreenName() As String
Get
Return _UserXElement...<screen_name>.Value.ToString()
End Get
End Property
Public ReadOnly Property Location() As String
Get
Return _UserXElement...<location>.Value.ToString()
End Get
End Property
Public ReadOnly Property ProfileImageUrl() As String
Get
Return _UserXElement...<profile_image_url>.Value.ToString()
End Get
End Property
End Class
#End Region
ステータスを受信・解析する関数
Private Function ReciveStatus(ByVal _WebResponce As System.Net.HttpWebResponse) As clsTwitterStatus()
Dim Stream As System.IO.Stream
Dim result As Integer
Dim DownDataAL As ArrayList
Dim DownData As Byte()
Dim AllStatusXElement As System.Xml.Linq.XElement
Dim TwitterStatusAL As ArrayList
Dim TwitterStatus As clsTwitterStatus()
If _WebResponce Is Nothing Then
Return Nothing
End If
Try
Stream = _WebResponce.GetResponseStream
If Stream Is Nothing Then
Return Nothing
End If
DownDataAL = New ArrayList
DownDataAL.Clear()
Do
result = Stream.ReadByte()
If result = -1 Then Exit Do ' ReadByte returns -1 at EOF.
DownDataAL.Add(CByte(result))
Loop
ReDim DownData(DownDataAL.Count - 1)
Array.Copy(DownDataAL.ToArray, DownData, DownDataAL.Count)
AllStatusXElement = System.Xml.Linq.XElement.Parse(System.Text.Encoding.UTF8.GetString(DownData))
TwitterStatusAL = New ArrayList
TwitterStatusAL.Clear()
For Each StatusXElement As XElement In AllStatusXElement...<status>
TwitterStatusAL.Add(New clsTwitterStatus(StatusXElement))
Next
ReDim TwitterStatus(TwitterStatusAL.Count - 1)
Array.Copy(TwitterStatusAL.ToArray, TwitterStatus, TwitterStatusAL.Count)
Return TwitterStatus
Catch ex As Exception
Return Nothing
End Try
End Function
通信関数と、ステータス受信関数を合わせて、タイムラインの取得を行う為の関数。
Public Function GetTimeline(ByRef _TwitterStatus As clsTwitterStatus()) As Boolean
Dim WebResponce As System.Net.HttpWebResponse
If TwitterComm(__Friends_Timeline_URL, enumHttpReqMode.HTRM_GET, WebResponce) Then
_TwitterStatus = ReciveStatus(WebResponce)
If _TwitterStatus Is Nothing Then
Return False
End If
Return True
Else
Return False
End If
Return False
End Function
ソレの利用法(フォームのボタンでListBox にタイムラインを表示させる)
Private Sub btnRefersh_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRefersh.Click
Dim TwitterStatus As clsTwitterStatus()
Dim ii As Integer
If _TeitterCom.GetTimeline(TwitterStatus) Then
For ii = 0 To TwitterStatus.Length - 1
ListBox.Items.Add(TwitterStatus(ii).User.Name & " , " & _
TwitterStatus(ii).Text & " , " & _
TwitterStatus(ii).CreatedAt)
Next
End If
End Sub
とりあえず、こんな感じでTwitter API からのデータ取得は出来ると思います。
私はデータをクラスにしましたが、本来はそのままXElement で使っても良いと思いますが、
いかんせん、XML なんて使った事無いんでクラスにしました。
また、クラス化すると、コーディング時にプロパティやメソッドが選択出来るようになるので楽ですよね。
後は、このクラスをどうやって保存しておくか・・・
データベースに入れればUser のID とか、Status ID とか検索しやすくなるかなぁ???
ま、また適当に考えてみて書いてみます。
最近のコメント