2011年1月4日 星期二

Facebook ActionScript Graph API ( 3 ) FQL、Old REST API以及picture

這三個東西篇幅不大,因此放在一起講。我們繼續擴充這個測試App.,首先在使用者介面新增三個TextField與三個Button,個別用來呼叫這三個method,類似這樣:

而程式主要是使用Facebook.fqlQuery(),Facebook.callRestAPI(),以及Facebook.getImageUrl()。

Facebook.fqlQuery():
當Graph API找不到我們需要的資料,或者需要分好幾次查詢,就可以考慮找FQL,看看有沒有符合我們需要的Table。第0篇也提過,FQL的語法語SQL語法很相似,所以使用過資料庫的人應該很容易上手,沒用過的就請找一下資料了。在這個API裡面,用來呼叫FQL的就是Facebook.fqlQuery()這個method。這個method需要兩個參數,第一個就是query string,第二個是callback function,我們就沿用之前的requestHandler就可以了。我們使用fqlRequest_txt來輸入query string,而btnFql Click之後去執行:
Facebook.fqlQuery(fqlRequest_txt.text, requestHandler);
我們就在fqlRequest_txt輸入官方文件上有的一個範例:
SELECT uid, name, pic_square FROM user WHERE uid = me() OR uid IN (SELECT uid2 FROM friend WHERE uid1 = me())
這樣就可以撈出自己以及朋友的uid,姓名,以及50x50的頭像連結了。

Facebook.callRestAPI():
如同之前提過,Old REST API是比較混亂的部分,非必要盡量不要使用。Facebook.callRestAPI()有四個參數,第一個是要呼叫的method name,例如:friends.getAppUsers。第二個仍然是callback function,一樣沿用requestHandler,第三個是這個method需要傳參數時可以透過這個參數用一個Object來設定,第四個可以選擇GET或POST,預設是GET。因為這部分盡量不去用它,所以我就沒花時間去做輸入第三第四個參數的介面,有興趣可以參考前一篇的params_txt與method_cb的做法。我們只用oldRestRequest_txt來輸入method name,然後btnOldRest Click後執行:
//
Facebook.callRestAPI(oldRestRequest_txt.text, requestHandler);
//
例如輸入friends.getAppUsers就可以查出使用這個App.的朋友,不過如果你開的測試App.只有自己使用過,那就會回傳空的Array。

Facebook.getImageUrl():
這個算是Graph API漏掉的東西。第0篇有提到,我們可以透過
https://graph.facebook.com/{object_id}/picture?type=xxxx&access_token=xxxxxxxx
來取得擁有profile photo的圖片,例如user,page,group,event,album等。type有square(50x50),small(50寬,高看比例),large(200左右寬,高看比例)三種,屬於公開的資料就不用傳access_token,但像album就需要extended permission,並且需要傳albumaccess_token。Facebook.getImageUrl()就是用來幫我們組合出這個url的method。它有兩個參數:第一個就是object_id,第二個就是type。呼叫它就會回傳:
https://graph.facebook.com/{object_id}/picture?type=xxxx
可以發現沒有access_token,因此當想取得album的縮圖時就要自己加上去,之前有提到可以使用
Facebook.getSession().accessToken
來取得。我們使用picture_txt來輸入object_id,type就用預設的不輸入了,然後我們用一個myLoader(Loader)來讀取圖檔,btnPicture Click後執行:
myLoader.load(new URLRequest(Facebook.getImageUrl(picture_txt.text)+"?access_token="+Facebook.getSession().accessToken)));
這樣就可以讀到圖片了。試著輸入me試試看。而這樣讀進來的圖片因為會經過轉址,所以load時設定LoaderContext也沒有用,無法對這張圖做pixel級的更動,這點使用上要注意。

最後有一點提醒大家,FQL裡面有一堆uid,aid等等的ID,通常都不是Graph API的object_id,大概只有user id剛好兩個都一樣,所以拿FQL找到的id放到Graph API去查詢,或者反過來,常常會查不到東西。這一點請小心使用。

上一篇文章:Facebook ActionScript Graph API ( 2 ) Graph API的GET、POST與DELETE
下一篇文章:Facebook ActionScript Graph API ( 4 ) Dialogs

7 則留言:

  1. 也可以用FQL查使用這個App的好友
    如下:
    SELECT uid, name, pic_square FROM user WHERE uid IN ( SELECT uid2 FROM friend WHERE uid1 = me()) AND is_app_user = 1

    回覆刪除
  2. To Sam:
    酷耶~~沒注意到user裡面有is_app_user這個欄位~~
    感謝!!!

    回覆刪除
  3. Gray老師,您好 :
    我想請問我點了一個顆按鈕執行了Facebook.fqlQuery(method,callback);

    並且在callback 執行 判斷相簿是否存在 有的話就不新增相簿,沒有的話就新增相簿 的這個動作。

    之後新增相簿的功能是有的。

    不過當我在按第二次時卻又新增了一個相簿。
    之後我trace出來看之後發現fqlQurey出來的result怎麼跟第一次query出來的一樣,沒有更新。

    這是不是有暫存的問題,還是我需要去哪邊設定呢,還是有非同步與不同部的問題呢?

    再請麻煩Gray老師解說一下了,感謝~

    回覆刪除
  4. To E佬:
    不用稱呼我老師啦~一起研究
    我猜是你使用Graph API開了相簿以後得到一個id,而這個id跟fql的aid不一樣,所以你找不到之前開的相簿。我的做法如下:
    1.使用Graph API呼叫/me/albums,使用POST傳遞name與message兩參數,分別是相簿名稱跟說明,這樣可以得到一個相簿id
    2.一樣使用Graph API呼叫/me/albums,用GET抓取資料,看裡面有沒有name或id是之前開的相簿,若沒有,開新相簿;若有,進行下一步
    過程中都沒使用到FQL,給你參考

    回覆刪除
  5. 附帶一提,每個App.可以自動開設一個相簿,直接上傳照片就會幫你開好,也不用另外去判斷是否已有相簿了

    回覆刪除
  6. Gray 您好:

    可是若要直接用Graph API的/me/photos方法上傳圖片的話,不是也要一組object_id嗎?如果沒有建立相簿的話(使用App自動開設相簿的功能),我如何得到一組objId呢?

    還有我記得以前如果用直接上傳照片的話,照片會亂跳相簿..所以如果要用您說的APP自動開設相簿的功能的話,我該如何做呢?

    不好意思,麻煩你了~也非常謝謝你清楚的回覆^^

    回覆刪除
  7. To E佬:
    呼叫/me/photos上傳照片完全不需要其他object_id,請參考:
    http://www.permadi.com/blog/2011/02/using-facebook-graph-api-in-flash-as3-to-post-to-photo-album/
    這篇寫得很清楚了,執行起來也沒問題,你可以試試看

    回覆刪除