2011年4月22日金曜日

Twitter から最新ツイートを取得するアクティビティ

非常に簡単ですが Web からデータを取得するアクティビティのサンプルです。この類は原則非同期アクティビティ ( AsyncCodeActivity とか) で実装する必要があるのを除けば、本当に単純なロジックとなっています。

1: Imports System.Activities
2: Imports System.Net
3: Imports System.Text
4: Imports System.IO
5: Imports System.Xml
6: 
7: Public Class GetTwitterActivity
8:     Inherits AsyncCodeActivity
9: 
10:     Public Property UserID As InArgument(Of String)
11:     Public Property Results As OutArgument(Of String)
12: 
13:     Private Delegate Function asyncGetTweetDelegate(ByVal userID As String) As String
14: 
15:     Protected Overrides Function BeginExecute(ByVal context As System.Activities.AsyncCodeActivityContext, ByVal callback As System.AsyncCallback, ByVal state As Object) As System.IAsyncResult
16:         Dim targetUser = context.GetValue(Me.UserID)
17:         Dim asyncGetTweetDelegate = New asyncGetTweetDelegate(AddressOf GetTwitterTweetInPrivate)
18:         context.UserState = asyncGetTweetDelegate
19: 
20:         Return asyncGetTweetDelegate.BeginInvoke(targetUser, callback, state)
21:     End Function
22: 
23:     Protected Overrides Sub EndExecute(ByVal context As System.Activities.AsyncCodeActivityContext, ByVal result As System.IAsyncResult)
24:         Dim asyncGetTweetDelegate = TryCast(context.UserState, asyncGetTweetDelegate)
25:         Dim resultStrings = asyncGetTweetDelegate.EndInvoke(result)
26:         Dim returnValue = ""
27:         Try
28:             'LINQ to XML で発言のみを抽出
29:             Dim resultXDoc = XDocument.Parse(resultStrings)
30:             Dim resGetTweet = From x In resultXDoc.Descendants
31:                               Where x.Name = "text"
32:                               Select x.Value
33: 
34:             If (resGetTweet IsNot Nothing) AndAlso
35:                 (Not String.IsNullOrEmpty(resGetTweet.First)) Then
36:                 returnValue = resGetTweet.First
37:             End If
38:         Catch ex As Exception
39:         End Try
40: 
41:         context.SetValue(Me.Results, returnValue)
42:     End Sub
43: 
44:     Private Function GetTwitterTweetInPrivate(ByVal userID As String) As String
45:         Dim result = ""
46:         Try
47:             Using webCl As New WebClient
48:                 '最新の発言のみを取得
49:                 Dim targetSite As String = "http://twitter.com/statuses/user_timeline/" + userID + ".xml?count=1"
50:                 Using resStream = webCl.OpenRead(targetSite)
51:                     Dim enc = Encoding.GetEncoding("UTF-8")
52:                     Using xmlStream = New StreamReader(resStream, enc)
53:                         result = xmlStream.ReadToEnd
54:                     End Using
55:                 End Using
56:             End Using
57:         Catch ex As Exception
58:         End Try
59: 
60:         Return result
61:     End Function
62: 
63: End Class

このような形で Twitter から UserID プロパティで指定したユーザーの発言直近 1 件を取得し、その発言内容だけを Result プロパティとして返却しています。

これをベースにしてもらえば web からのデータ取得はある程度対応できると思います。実際には特殊ケースがある(対象サイトが一定時間で JavaScript で遷移させるような挙動を用意している場合とか)のですが、そのような場合を除いてこのような形でさくっと拾って構わないと思います。

ちなみに上記レアケースでは WebBrowser コントロールを利用するしか今のところ対処はないんじゃないかな、と思っています・・・

0 件のコメント:

コメントを投稿