非常に簡単ですが 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 GetTwitterActivity8: 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 String14:15: Protected Overrides Function BeginExecute(ByVal context As System.Activities.AsyncCodeActivityContext, ByVal callback As System.AsyncCallback, ByVal state As Object) As System.IAsyncResult16: Dim targetUser = context.GetValue(Me.UserID)17: Dim asyncGetTweetDelegate = New asyncGetTweetDelegate(AddressOf GetTwitterTweetInPrivate)18: context.UserState = asyncGetTweetDelegate19:20: Return asyncGetTweetDelegate.BeginInvoke(targetUser, callback, state)
21: End Function22: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.Descendants31: Where x.Name = "text"
32: Select x.Value
33:34: If (resGetTweet IsNot Nothing) AndAlso35: (Not String.IsNullOrEmpty(resGetTweet.First)) Then36: returnValue = resGetTweet.First37: End If38: Catch ex As Exception39: End Try40:41: context.SetValue(Me.Results, returnValue)
42: End Sub43:44: Private Function GetTwitterTweetInPrivate(ByVal userID As String) As String45: Dim result = ""
46: Try
47: Using webCl As New WebClient48: '最新の発言のみを取得
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.ReadToEnd54: End Using55: End Using56: End Using57: Catch ex As Exception58: End Try59:60: Return result
61: End Function62:63: End Class
このような形で Twitter から UserID プロパティで指定したユーザーの発言直近 1 件を取得し、その発言内容だけを Result プロパティとして返却しています。
これをベースにしてもらえば web からのデータ取得はある程度対応できると思います。実際には特殊ケースがある(対象サイトが一定時間で JavaScript で遷移させるような挙動を用意している場合とか)のですが、そのような場合を除いてこのような形でさくっと拾って構わないと思います。
ちなみに上記レアケースでは WebBrowser コントロールを利用するしか今のところ対処はないんじゃないかな、と思っています・・・
0 件のコメント:
コメントを投稿