2009年8月20日 星期四

Facebook Flash Application開發心得(3) - 由Flash Api從Facebook取得資料


當最煩人的session問題解決之後,就該試著跟Facebook要點資料來瞧瞧了。
這一篇會大概解說一下Flash api如何跟Facebook索取資料的動作。
基本上Facebook Flash api在這方面的流程很簡單,其實就是先產生一個「命令」然後把這個命令丟給Facebook類別往外post出去就好,要做什麼動作就去產生相對應的命令類別就可以了。
所有的命令類別都繼承com.facebook.net.FacebookCall,有興趣的人可以直接去說明文件看這個類別,它就有列出所有它的子類了。
說明文件在這邊:
http://facebook-actionscript-api.googlecode.com/svn/release/current/docs/index.html
幾乎所有的命令類別都是在com.facebook.command的package裡。

相對於發出命令的簡易,Facebook Flash api在接收資料時的繁複卻是不可思議到讓人惱怒。有時一個命令發出後,收到的資料型別居然要層層解析,動輒用到四五個類別,再加上說明文件的陽春,所以往往需要不斷的一直trace,最後才能得到你想要的資料。
這個部份待會的code就會見識到…。

接下來,我們繼續接著上一篇的去修改,Html的部份就不用動了,這次沒動到javascript,所以只改ActionScript。
我們這次要從Facebook取得自己的個人資料,因此在上次的connectHandler裡驗證成功後馬上執行這個動作:
使用到的是com.facebook.commands.users.GetInfo;這個類別。



GetInfo這個類別是用來跟Facebook索取會員資料用的,它可以允許一次索取很多人的,因此第一個參數是會員uid組成的Array。然後也可以指定要索取哪一些欄位,這些欄位的定義都在GetInfoFieldValues這個類別裡的靜態屬性,一樣是Array的形式,如果你要索取所有的欄位,那就直接帶入GetInfoFieldValues.ALL_VALUES就好,它本身就是一個Array型態。

接下來就是要處理事件回傳的結果:



開發Facebook application時,一直trace回傳的FacebookEvent會是一個好習慣…。FacebookEvent的形態基本上會是這樣:
[FacebookEvent type="complete" success=true data=[object GetInfoData] error=null]
type就不用講了,要注意的是success及data。
success就只有true或false,通常都是true,除非你跟Facebook之間的connection斷了,那success就會是false然後error會有東西。
data則是主要的資料,data會依照你命令的種類不同而有不同的資料型態,理論上命令的類別都是在com.facebook.command.xxxx的package裡,相對應的資料型態類別則會放在com.facebook.data.xxxx的package裡。
也就是送出命令時是去command裡找,接收到事件時就回來data這邊找。

這次的命令是com.facebook.command.users.GetInfo,收到的資料是com.facebook.data.users.GetInfoData。
但是其實討人厭的就在這邊,光一個GetInfoData還不夠,真的資料是存在GetInfoData類別裡的userCollection屬性 (com.facebook.data.users.FacebookUserCollection類別),所以只好不斷的轉型別把它轉成陣列,最後陣列裡儲存的是一個一個的com.facebook.data.users.FacebookUser型別的資料…。
因此光解析個人資料就要動用三個型別… 加上發出命令的類別的話一共是五個,老實說,說明文件夠好的話這都還ok,偏偏不是,所以開發Facebook application的話一直trace會是一個好習慣。
當熟悉它的運作方式後,十分建議自己寫一些類別來整合簡化這些步驟。


如果沒意外的話,當登入後就可以看到自己的名字跟照片顯示在畫面上了。

下一篇
Facebook Flash Application開發心得(4) – Iframe的架構下取得Session

21 則留言:

  1. Hi Jason,我是網基的葛瑞啦,爬文爬來了...
    你介紹的資訊我大概都有看過,但就是沒你研究那麼深入啊~~感謝分享

    回覆刪除
  2. Heloo, Gray, 你居然能爬到這邊來... 你google得還真深, 這個blog很少人知道
    關於facebook的東西我基本上是匯整一些查到的資料加上自己的測試寫的
    如果有任何錯誤希望你能指正一下(因為我也是摸了老半天感覺這樣應該ok才這麼做的, 但總覺得好像不是很確定)

    回覆刪除
  3. Jason大大你好!感謝你的文章!!真的幫助很大很大!
    因為我還接觸的不是很久~有個問題想要請教你!
    目前試到這個章節~都還很順利!
    不過我都是上傳到Server才知道有沒有成功!
    也沒辦法看FLASH Trace出來的值!
    請問
    1.我要如何在本機測試?(其實是想看flash 抓FB(trace)出來的資料或您trace出來的東西!!)
    哈哈不知道您懂不懂我的意思~~我問的有點差!!不好意思阿!
    再麻煩請你跟我說,感謝~^^~

    回覆刪除
  4. NashKao:
    你只要把appilcation secret寫入在flash裡就可以在本機上測試了.

    回覆刪除
  5. 感謝Jason大大的回覆!
    不好意思我有試了一下可是沒有成功,應該是我的方法錯了!
    可以麻煩請你看一下我那錯了,謝謝~^^~
    先去除在FBStep2()中的
    ExternalInterface.call("initFB");
    ExternalInterface.addCallback("fbConnected",fbConnected);
    然後增加一行呼叫fbConnected(pUid:String, pSecret:String,pSessionKey:String)這個function.
    然後pUid填入"API 金鑰",pSecret填入"Application Secret",但是我不知道pSessionKey填入什麼)
    還是說我加的方法寫錯了!!
    本機測是不是把跟網頁有關連的呼叫都刪掉!
    麻煩Jason大大跟我講一下要更改那邊!!
    謝謝
    Nash

    回覆刪除
  6. Nash:
    嗯,我剛剛測了一下,使用WebSession的話在本機端是真的挺麻煩的.
    因此如果你需要先在本機端開發的話, 我建議你在開發時先使用FacebookSessionUtil (請參考第四篇).
    FacebookSessionUtil可以很方便的在本機端運作, 只要在FacebookSessionUtil建構時的第二個參數帶入application secret時就可以了.

    然後等到你需要轉換成FBConnect架構時再改寫成WebSession就好.

    回覆刪除
  7. Jason 大大:
    那我試試FacebookSessionUtil(第四篇)
    謝謝您快速的回覆~^^~

    回覆刪除
  8. 哇~ 大大的fackbook application的研究真是厲害
    小弟我之前也花了些時間在學AS 和資料庫溝通的FLASH等等
    那時候是覺得架構還有點麻煩
    現在應該也不會簡單到那裡去

    說重點
    我很想要開發facebook的軟體
    運用他的資源
    開發一個互動強大的遊戲
    因為我覺得目前的遊戲都太小氣了
    系統太簡單
    沒有辦法長期留住人
    覺得潛力不只如此
    有很多想法想執行

    我目前在科技公司工作
    MSN: d9046965@knight.fcu.edu.tw
    真的很想幹出一些東西來
    ^^

    回覆刪除
  9. 我看不到照片...和名子,登入後...

    回覆刪除
  10. 理論上可以得到資訊,目前為止我都run得很ok,你可能要查一下你哪一個部份遺漏了

    回覆刪除
  11. Jason大哥,我試著用想把登入者的朋友name找出來,但是弄了好久就是沒辦法,我是先var一個_callfriends利用GetFriends(null,null)之後在fbevent.complete的function中利用GetFriendsData(e.data).friends.toArray()去抓朋友資料,再用FacebookUser去接,最後FacebookUser.name出來卻沒有字,但是如果我有試過GetFriendsData(e.data).friends.toArray().length是剛好有我朋友的數量,所以我在想應該快成功了= =,但是卻找不到方法,煩請Jason大哥解答一下,不好意思...。

    回覆刪除
  12. 我曾經遇過有些人的名字是空白的情況,不過那是在尚未登入時取得使用者資料時發生的.有的人名字正常,有的人就會是空白.
    但是因為你GetFriends都是帶null值,感覺好像你已經登入了,所以就不太清楚為什麼會發生這種事.也許你可以再針對是否已經登入這個面向去確認一下,畢竟我自己遇到的狀況是這樣.

    回覆刪除
  13. Jason大哥,我的問題解決了,原來GetFriends()對應出的GetFriendsData().friend 是[Object FacebookUser]
    所以是把得到的資料for each到一個FacebookUser 之後再用這個FacebookUser得到各個朋友的uid,帶入GetInfo()在post出去一次,最後再一次用facebookUser接,最後就得到所有朋友的資料了!!!

    謝謝Jason大哥這幾篇的教學!!我研究的很開心~

    回覆刪除
  14. 不好意思..Jason大哥,我想請問我取得到的朋友pic_small照片的大小怎麼設定?因為pic_samll出來的照片大小 每個人都不太一樣...

    回覆刪除
  15. pic_small的大小應該是facebook決定的了吧...
    通常我都是會再把它draw一次調整到我要的大小
    (你不說我還沒注意到每個人的pic_small大小不一樣...)

    回覆刪除
  16. 恩恩 了解 謝謝~

    回覆刪除
  17. 你好感謝你的文章指導
    我想請問怎麼發送 "發佈"
    這樣的訊息呢?

    回覆刪除
  18. 發佈到塗鴉牆的話, 你可以用FB.Connect.streamPublish

    回覆刪除
  19. 我是新手的開發者
    想請問Jason大哥 你有使用過facebook 提供給 android 的sdk 來取得聯絡人資料(姓名、朋友、興趣、愛好....)嗎?
    我有試過下列的範例
    http://www.ibm.com/developerworks/cn/xml/x-androidfacebookapi/index.html
    但似乎抓取不到資料

    有沒有相關的教學黨可以參考
    麻煩了:(((

    facebook所提供的開發文件看不太懂耶

    回覆刪除
  20. Android我還沒玩到fb喔,所以可能沒辦法幫你~

    回覆刪除
  21. hi , sorry ~ 打擾了 , 因為我在GOOGLE搜尋了好幾天的資料 , 關於 FB Comments 的部分 , 無意間瀏覽到您的部落格 , 想能否順便向您請教一下關於這方面的相關問題 ? 若您不嫌棄的話 .... 因為我找了好多資料但都是過去的資料 , 沒有幫助了 ...
    恩 .. 我先把問題PO出來好了 , 您若有空看能否幫個忙吧~^^" THANK YOU !!~
    第一個問題就是關於 FB Comments 的部分 , 我已申請好APP也將這外掛放在自己的網站上 , 這部分都沒問題 , 但是不管怎麼用就是無法出現 管理功能 的部分 ?
    第二個問題就是要如何在每一個 FB Comments 的留言板中只要有人留言或者回復都能夠收到通知呢 ?
    -----------------------------------------------
    如果造成困擾深感抱歉 !! 晚點再過來您部落格看看
    Email : devil-z@livemail.tw

    回覆刪除