Twitterクライアントに学ぶASP.NETアプリ 2008.09.20 初音 玲
index Twitter API Linq to XML WEBアプリ Twitter APIの弱点対策案
index Twitter API Linq to XML WEBアプリ Twitter APIの弱点対策案
取得フォーマットはXML前提 Twitter 必要なAPIのみ説明 json,rss,atomの説明はなし Twitterクライアント 今日の前提 取得フォーマットはXML前提 json,rss,atomの説明はなし 必要なAPIのみ説明 例)IM関連の説明はなし Twitterクライアント Twitter BASIC認証 http http (XML)
Status :ステータス関連 User :ユーザ関連 Direct Message :DM関連 Friendship :フレンド関連 Twitter API Status :ステータス関連 User :ユーザ関連 Direct Message :DM関連 Friendship :フレンド関連 Account :アカウント関連 Favorite :お気に入り関連 Notification :IM関連 Block :ブロック関連 Help :補助関連
public_timeline friends_timeline user_timeline show update replies ステータス関連 public_timeline friends_timeline http://twitter.com/statuses/friends_timeline.xml ?since=日時?page=ページ user_timeline show update http://twitter.com/statuses/update.xml?status=・・・・ replies destroy
friends followers friendsと featured followersは違う show friends ↓ ユーザ情報関連 friends followers featured show friendsと followersは違う friends ↓ 新しい用語「following」
direct_messages sent new ダイレクトメッセージ(DM)関連 direct_messages http://twitter.com/direct_messages.xml ?since=日時?page=ページ sent http://twitter.com/direct_messages/sent.xml ?since=日時?page=ページ new http://twitter.com/direct_messages/new.xml ?user=宛先?text=本文
フレンド関連 create destroy exists
update_delivery_device rate_limit_status アカウント関連 verify_credentials end_session archive update_location update_delivery_device rate_limit_status
create favorites destroy http://twitter.com/favorites.xml?page=ページ お気に入り関連 favorites http://twitter.com/favorites.xml?page=ページ create http://twitter.com/favorites/create/id.xml destroy http://twitter.com/favorites/destroy/id.xml
IM関連 ブロック関連 補助関連 follow leave create destroy test downtime_schedule その他 IM関連 follow leave ブロック関連 create destroy 補助関連 test downtime_schedule
index Twitter API Linq to XML WEBアプリ Twitter APIの弱点対策案
DEMO ステータス(発言)を取得
xml = XElement.Parse(client.DownloadString(url)) ステータス(発言)を取得 Dim culture As New CultureInfo("en-us", True) Dim client As New System.Net.WebClient client.Credentials = _ New NetworkCredential("hogeID","hogePass") client.Encoding = System.Text.Encoding.UTF8 url = _ "http://twitter.com/statuses/friends_timeline.xml" & _ "&since=" & _ System.Uri.EscapeUriString(( _ Now.AddHours(-24)).ToString( _ "ddd, dd MMM yyyy HH:mm:ss +0900", culture)) xml = XElement.Parse(client.DownloadString(url))
<statuses type="array"> <status> <created_at>Sat Sep 13 04:03:14 +0000 2008</created_at> <id>919769975</id> <text>ぜっぺりあのお肉~♪</text> <source><a href="・・・・・・">Tween</a></source> <truncated>false</truncated> <in_reply_to_status_id/> <in_reply_to_user_id/> <favorited>false</favorited> <user> <id>14565539</id> <name>はつね</name> <screen_name>hatsune_</screen_name> <location>Tokyo, Japan</location> <description>初音玲は・・・・・・・</description> <profile_image_url>・・・・・・・</profile_image_url> <url>http://blogs.wankuma.com/hatsune/</url> <protected>false</protected> <followers_count>224</followers_count> </user> </status> </statuses> ステータス取得結果(xml)
ステータス取得結果の解析(Linq to XML) Dim usr = _ From status In xml.Descendants("status") _ Order By status.Element("id").Value Descending _ Select New TStatus With { _ .ID = status.Element("id").Value, _ .ScreenName = status.Element("user"). _ Descendants("screen_name").Value, _ .Text = status.Element("text").Value, _ .Published = DateTime.ParseExact( _ status.Element("created_at").Value, _ "ddd MMM dd HH:mm:ss +0000 yyyy", _ culture.DateTimeFormat).AddHours(9), _ .Favorited = (status.Element("favorited").Value = "true")}
DEMO 発言(ステータス更新)
発言(ステータス更新) Dim client As New System.Net.WebClient client.Credentials = _ New NetworkCredential("hogeID","hogePass") Dim byt As Byte() = client.UploadData( _ "http://twitter.com/statuses/update.xml" & _ "?status=" & _ System.Uri.EscapeDataString("やほー"), _ "POST", _ System.Text.Encoding.Default.GetBytes("")) ・どの発言(status-id)に対する発言なのかを指定するパラメタがない。 ・誰に対する返信なのかは、@id指定 ・どの発言(status-id)に対する発言なのかを指定するパラメタ in_reply_to_status_id
ダイレクトメッセージ関連(受信DMと送信DMを合成) http://twitter.com/direct_messages.xml 送信したDMの取得 http://twitter.com/direct_messages/sent.xml 合成 Dim res = From status In ・・・・ Dim req = From status In ・・・・ message = res.Concat(req).ToList
API制限状況を取得 Dim url As String = _ "http://twitter.com/account/rate_limit_status.xml" Dim client As New System.Net.WebClient Dim xml As System.Xml.Linq.XElement client.Credentials = _ New NetworkCredential("hogeID","hogePass") client.Encoding = System.Text.Encoding.UTF8 xml = XElement.Parse(client.DownloadString(url)) remainigHits = _ xml.Descendants("remaining-hits").Value
index Twitter API Linq to XML WEBアプリ Twitter APIの弱点対策案
Webアプリ ブラウザ Twitter Webアプリ FW
URLパラメタ Session 画面間の情報の受け渡し方法の検討 情報はURLとして記録 ログイン ログイン処理 タイムライン URLパラメタ 情報はURLとして記録 URLの一部なので、refererで記録される危険性 Session 情報はサーバーに記録 Session IDのみCookieに記録 Cookie使えない場合、SessionIDをURLパラメタを利用 セッション情報の有効期間
DEMO htmlエンコード
htmlエンコード/htmlデコードの徹底 TextBoxコントロール Labelコントロール
Visual Studio 2008におけるMobileコントロールの問題 VS2005 携帯用のMobileコントロールがある UAごとにレンダリングするhtmlが変わる VS2008 携帯用のMobileコントロールがない! VS2005のコントロールを使う方法もあるけれど 標準的なhtmlをレンダリングするように注意してaspxファイルを作成
WebサイトとWebアプリ Webサイト VS2005以降で作成可能 [ファイル]-[新しいWebサイト]で新規作成 *.aspx.vbファイルを実行時ビルド可能 *.vbファイルはApp_Codeフォルダに配置 事前ビルドして配置も可能 Webアプリ VS2005以外で作成可能(VS2005SP1は可能) [ファイル]-[新しいプロジェクト]-[Web]-[ASP.NET Webアプリケーション]で新規作成 *.aspx.vbファイルは事前ビルドし、dllをbinフォルダに配置 *.vbファイルは事前ビルドし、dllをbinフォルダに配置
TwitterTimeline クラスライブラリ imoTwitのソリューション構造 imoTwit Webサイト Login.aspx Regist.aspx [MasterPage] Default.aspx Replies.aspx Direct.aspx binフォルダ TwitterTimeline クラスライブラリ App_Codeフォルダ TwitterRegist クラス
TwitterTimelineクラスライブラリ プロパティ SetFav UserAccount SetUpdate メソッド Dispose GetDirectMessageList GetFriendsTimelineList GetLimitStatus GetRepliesTimelineList IsLoginOK SetDeFav SetDirectMessage
TwitterTimelineクラスライブラリ DEMO TwitterTimelineクラスライブラリ
index Twitter API Linq to XML WEBアプリ Twitter APIの弱点対策案
Twitter APIの弱点(主にステータス関連) Repliesは、先頭に指定されたときのみ Friends_Timelineに取得回数制限がある 相手(@hogehoge)Timelineへの表示 No 自分のみの相手側表示 相手のみの 相手側表示 両想い @hogehoge こんにちは Repliesのみ Friends_Timelineのみ ○ @hogehoge @hoge こんにちは @hoge @hogehoge こんにちは × こんにちは、@hogehoge . @hogehoge こんにちは . @hogehoge @hoge こんにちは . @hoge @hogehoge こんにちは 対策は?
Repliesだけではなく、Friendsも必要 対策は? Repliesだけではなく、Friendsも必要 Linq To XMLで取得したIListをConcat message = replies.Concat(friends).ToList Friends_Timelineに取得回数制限がある APIを使わずにhtml解析
対策案:Webサービスの提供 Twitter Webサービス FW WMアプリ FW ブラウザ Webアプリ
http://blogs.wankuma.com/hatsune hatsune@wankuma.com Q&A http://blogs.wankuma.com/hatsune hatsune@wankuma.com