而程式主要是使用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
也可以用FQL查使用這個App的好友
回覆刪除如下:
SELECT uid, name, pic_square FROM user WHERE uid IN ( SELECT uid2 FROM friend WHERE uid1 = me()) AND is_app_user = 1
To Sam:
回覆刪除酷耶~~沒注意到user裡面有is_app_user這個欄位~~
感謝!!!
Gray老師,您好 :
回覆刪除我想請問我點了一個顆按鈕執行了Facebook.fqlQuery(method,callback);
並且在callback 執行 判斷相簿是否存在 有的話就不新增相簿,沒有的話就新增相簿 的這個動作。
之後新增相簿的功能是有的。
不過當我在按第二次時卻又新增了一個相簿。
之後我trace出來看之後發現fqlQurey出來的result怎麼跟第一次query出來的一樣,沒有更新。
這是不是有暫存的問題,還是我需要去哪邊設定呢,還是有非同步與不同部的問題呢?
再請麻煩Gray老師解說一下了,感謝~
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,給你參考
附帶一提,每個App.可以自動開設一個相簿,直接上傳照片就會幫你開好,也不用另外去判斷是否已有相簿了
回覆刪除Gray 您好:
回覆刪除可是若要直接用Graph API的/me/photos方法上傳圖片的話,不是也要一組object_id嗎?如果沒有建立相簿的話(使用App自動開設相簿的功能),我如何得到一組objId呢?
還有我記得以前如果用直接上傳照片的話,照片會亂跳相簿..所以如果要用您說的APP自動開設相簿的功能的話,我該如何做呢?
不好意思,麻煩你了~也非常謝謝你清楚的回覆^^
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/
這篇寫得很清楚了,執行起來也沒問題,你可以試試看