フォトアルバム

他のアカウント

更新ブログ

Powered by Six Apart
Member since 03/2005

« Twitter API 通信部位 | メイン | Twitter API 仕様書 »

ステータス取得

たぶん、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>&lt;a href="http://mobile.twitter.com" rel="nofollow"&gt;mobile web&lt;/a&gt;</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 とか検索しやすくなるかなぁ???

ま、また適当に考えてみて書いてみます。

コメント

コメントを投稿