2009年10月29日 星期四

Facebook API Template Bundle - 發佈到個人塗鴉牆的樣版設定教學

今早打算編寫新的 Template 時,在 Tools 頁面發現以下訊息:


Facebook will deprecate template bundles and their related API calls December 20, 2009.
Please start using stream attachments with stream.publish, FB.Connect.streamPublish, and Facebook.streamPublish instead.


這個衝擊說大不大說小不小!影響不大是因為我還沒很善用它,但我已經有點彈性疲乏啦,因為準備要塞進 Template 的資料,弄得很疲憊。不過,該做的正事還是要完成。


目的:


在 FBML 模式下,以 FBJS 達成過去 Facebook.showFeedDialog 的效果。


解法:


使用 Facebook.streamPublish 來代替,而原先的 template 部份將變成在 Code 裡。好處是可以少一次跟 Facebook Server 要資料吧。或許這也是 template 佔用資源而被拿掉的可能性??


除此之外,還需要用到 attachment 概念,就是以前寫在 template 上的資訊


程式碼:


<script type="text/javascript">
function do_post()
{
        var attachment = {
                'name':'Quiz',
                'href':'http://apps.facebook.com/your_apps/',
                'description':'good!',
                'caption':'{*actor*} is very smart!',
                'media':[
                                {
                                        'type':'image',
                                        'src':'http://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Facebook.svg/200px-Facebook.svg.png',
                                        'href':'http://zh.wikipedia.org/wiki/Facebook'
                                }
                ]
        };
        Facebook.streamPublish( ''  , attachment , null , null , 'Message:' , null , false  );
}
</script>


接著在適當地地方呼叫 do_post(); 吧!



  1. 以 click 呼叫

    • <a href="#" onclick="do_post();return false;">Click Here!</a>



  2. 自動執行

    • <script type="text/javascript">
          do_post();
      </script>

    • 記得這段 code 要擺在 function() do_post{ ... } 後頭才用喔




收工。


參考資料:



相關文章



23 則留言:

  1. 謝謝分享~ 我之前的問題改用 pubilc ip 的機器就試出來了!
    template 我還沒深入研究,就要廢掉了? 那不用研究了...XD

    版主回覆:(11/02/2009 06:30:54 AM)


    我也才剛玩 3~4 個禮拜而已 Orz 沒想到昨天想去用新的 template 就...

    恭喜你解決問題囉 :)

    回覆刪除
  2. 再請問一下,因為這個檔案,會存成.php的對嗎?
    而裡面有php和javascript,我該如何去呼叫do_post();呢!

    版主回覆:(10/30/2009 03:36:13 AM)


    這個程式片段算是 HTML 跟 Javascript 而已,但是你還要處理原先 PHP 的 Sample 檔案,比較簡單的方式就是把這段都貼到 sample code 的最下方囉,這樣應該就 ok 吧

    關於這篇教學,這部分需要懂一點 javascript, 最簡單的用法就是貼上上述的程式後, 再額外補貼一段:

    <script type="text/javascript">
    do_post();
    </script>

    這樣就算是呼叫囉

    回覆刪除
  3. "而原先的 template 部份將變成在 Code 裡"
    可否示範或解釋一下

    版主回覆:(11/01/2009 04:23:21 AM)


    以前是要拿已註冊過而得到的 template id 跟等待輸入的資料去跟 server 要樣版結果,現在則是使用上就全部寫在程式中了。

    若你沒使用過去那種要靠 template id 與資料去取樣版結果的經驗,那就可以略過這段

    現在就只要把上述的程式修修改改擺在自己的程式中,就可以發佈具格式化的訊息到塗鴉牆上囉

    回覆刪除
  4. 感謝分享!
    不好意思請問一下我把上面的code貼進去test.html
    然後有去呼叫do_post();也有改成自己的 'href':'http://apps.facebook.com/your_apps/',
    按F12左下角會出現三角形驚嘆號!點開來看會出現錯誤訊息:'FaceBook 未被定義'
    請問一下是我少做了什麼嗎?謝謝
    Nash

    版主回覆:(11/02/2009 03:50:32 PM)


    Hm....我剛找了兩個瀏覽器來測試, 一個是 IE8 , 一個是 Firefox 3.5, 倒都沒發現這個問題 @_@, 請問你呼叫 do_post() 有比定義 function do_post(){ ... } 晚嗎, 另外也可以試試 click 的方式呼叫看看 <a href="#" onclick="do_post();return false;">Click Here!</a>

    另外,也需要留意你塞給 attachment 資料的正確性喔, 像 src, href 有錯那也可能不會有反應喔

    回覆刪除
  5. 感謝大大的回答!
    我有將do_post() 放在後面!也有試了<a href="#" onclick="do_post();return false;">Click Here!</a> 這個方法。
    但他的錯誤還是在。
    後來我把 Facebook.streamPublish( '' , attachment , null , null , 'Message:' , null , false ); 註解掉!就沒有錯誤!但這行是最重要的阿!
    我在想我是不是要载入什麻類別或是什麼。
    我這邊只有開一個空的HTML然後把大大的CODE貼上去!
    是不是我要去下載什麼?
    在麻煩大大幫我看一下謝謝。

    版主回覆:(11/11/2009 12:57:42 AM)


    喔喔, 我可能猜的到了

    請問你有用 http://apps.facebook.com/your_apps/test.html 去連嗎?
    我寫的這篇是 FBML 模式, 除了你要先找一台有機器擺 code 外, 之後的測試都必需從 http://apps.facebook.com/your_apps/ 去連, 而不是直接連到你的機器上測

    回覆刪除
  6. 嗯嗯!有的!我有放到上面去測試!
    但我是用IFrame的模式,所以有可能是這個關係!Orz...
    所以這個Code沒辦法用在IFrame上嗎?
    嗚~找好久只有你有分享!!
    不過還是謝謝大大你的分享及回答!^^
    ~不知道您知道IFrame的寫法嗎?


    版主回覆:(11/11/2009 02:45:45 AM)


    的確, 這 code 只適用 FBML 模式唷

    至於 iframe 我沒試過, 我印象中要去 include 一些 lib , 還要處理跨網域等問題, 應該有些文件有寫, 我目前也沒時間嘗試, 先說聲抱歉啦

    回覆刪除
  7. 嗯嗯~沒關係!
    謝謝你的回答~大大的文章分享的很棒唷~^^~


    版主回覆:(11/11/2009 04:49:18 AM)


    我只是筆記一下, 以免自己也忘掉
    謝謝你的稱讚 :D

    回覆刪除
  8. 這是雙向的留言板,請問如果要發佈到自己或是朋友的話呢??
    是否有哪些參數值? 可否請大大告知呢?

    版主回覆:(11/11/2009 06:03:20 AM)


    請參考 http://wiki.developers.facebook.com/index.php/Facebook.streamPublish

    target_id: The ID of the user, Page, group, or event where you are publishing the content. If you specify a target_id, the post appears on the Wall of the target profile, Page, group, or event, not on the Wall of the user who published the post. This mimics the action of posting on a friend's Wall on Facebook itself.

    回覆刪除
  9. 所以Facebook.streamPublish( '' , attachment , null , null , 'Message:' , null , false );
    完全沒有指定到target_id囉??

    版主回覆:(11/30/2009 02:17:30 PM)


    是啊, 我使用例子的 target_id 是 null 的, 你要的功能應該可以用 target_id 實做出來, 不過我沒有需要, 所以並沒有嘗試過囉

    回覆刪除
  10. 嗯嗯,小弟非常的感謝您,謝謝^^
    阿不知道這位大大,之不知道評分的API或是有什麼方法可以對APP評分@@"

    不好意思問那麼多問題,打擾您了。

    版主回覆:(11/30/2009 04:03:12 PM)


    我只知道 http://apps.facebook.com/your_apps/ 接近瀏覽器上頭會出現 5 顆星的評分選項, 至於有沒有 API 我就不清楚囉

    回覆刪除
  11. 再請問一下....如果要發送給多個好友呢??

    一直都搞不定說...

    版主回覆:(11/30/2009 11:23:16 PM)


    我看到的範例都是送給一個人而已, 雖然 target_id 在 http://wiki.developers.facebook.com/index.php/Facebook.streamPublish 上敘述的型別是 string , 但在 http://wiki.developers.facebook.com/index.php/Facebook.showFeedDialog 這個舊式的定義是一個 int, 感覺就只是送到一個目的而已

    另外, Facebook.streamPublish 上頭有提到可以是一個 group, 或許這就是用在多人的吧

    目前我沒環境可測, 提供這些給你參考囉

    回覆刪除
  12. 我照這樣寫出來的,會發佈給一個好友 Publish to: ABC(好友名稱)

    我看到其他的範例不會顯示這部份說><"

    真害...

    版主回覆:(12/01/2009 02:14:37 PM)


    其實我還是看不太懂你迷惑的地方, 理論上發佈到塗鴉牆的行為就是這樣啊, 只發佈到一個 target_id, 而這個 target_id 可以是一個人, 一個粉絲專頁, 等等的, 需要多了解這些 API 能做的事, 再決定想要做的事吧 :D

    http://wiki.developers.facebook.com/index.php/Facebook.streamPublish

    target_id :

    The ID of the user, Page, group, or event where you are publishing the content. If you specify a target_id, the post appears on the Wall of the target profile, Page, group, or event, not on the Wall of the user who published the post. This mimics the action of posting on a friend's Wall on Facebook itself.
    Note: If you specify a Page ID as the actor_id, you cannot specify a target_id. Pages cannot write on other users' Walls.

    回覆刪除
  13. 該如何發佈到粉絲專頁呢????

    版主回覆:(02/16/2010 03:34:39 AM)


    我試了一下 FB.Connect.streamPublish, 只要把 target_id 填成粉絲專頁的 id, ex:
    http://www.facebook.com/apps/application.php?id=number
    後面那個 number, 如此一來完成第一步的設定

    接著, 想要發表到粉絲專頁的, 還需要依照粉絲專業所設定的權限當作依據, 看起來至少必須加入粉絲才可以, 而創立粉絲專頁的管理者, 也可以把它調成粉絲不能貼文等等的限制, 這部分你就需要自己留意一下吧

    其他可參考的資料:
    http://developers.facebook.com/docs/?u=facebook.jslib.FB.Connect.streamPublish
    http://wiki.developers.facebook.com/index.php/Facebook.streamPublish

    回覆刪除
  14. 我想寫像plurk可以轉發到Facebook的功能,我可以抓到我的個人資料、朋友的資料,但是使用stream_publish()卻發生The user hasn't authorized the application to perform this action,API也顯示我沒有stream_publish()的權限,想請問一下這跟我Facebook上的設定有關嗎,我是寫java的,可以麻煩大大們幫幫我解惑嗎,我真的搞不定Orz

    版主回覆:(02/16/2010 03:31:48 AM)


    這個頁面或許可以幫助到你 http://wiki.developers.facebook.com/index.php/Extended_permissions

    Plurk 一開始也會顯示要你同意它可以幫你更新狀態等權限, 你可以去看他的 Javascript 原始碼來參考看看, 但我不太清楚在 Java 上該怎樣使用

    回覆刪除
  15. 大大 感謝你的提醒 我已經做出一些樣子了 另外請教一下facebook是可以直接帶mail跟pwd就登入嗎(不經過FB自己的login page)

    版主回覆:(02/16/2010 03:10:24 AM)


    http://wiki.developers.facebook.com/index.php/API 上頭有 Login/Auth Methods 可能有機會, 不過我沒看到完整的範例教學, 倒是看到不少解法都還是導到 facebook 的 login page

    理論上關於帳號的互動應該是要留給 Facebook 的 login page , 這樣使用者也才不會有帳號密碼被第三者記錄的安全疑慮, 但如果 API 真的沒有提供, 你又真的想做的話, 那你再去看看 cURL 吧, 他有提供 cookie 相關的紀錄, 透過程式可以模擬瀏覽器去做帳號登入的流程, 但缺點就是要自行去了解登入流程, 並且當對方改變登入流程時, 你必須跟著改才行, 不然之前寫的程式就等於白費囉

    回覆刪除
  16. 好吧 我放棄自己寫login這件事 太累人了 另外想請教一下FacebookJaxbRestClient跟FacebookJsonRestClient究竟是差在哪 還有當我們要new這兩個物件時 他們跟facebook是怎麼樣連線的 像是如果要順利使用 我的防火牆到底要開通哪些才可以使用 不好意思 我問題很多 麻煩你了 謝謝

    版主回覆:(02/24/2010 02:19:12 PM)


    目前我還沒有時間嘗試, 所以你得自己摸索看看 :D

    回覆刪除
  17. 看過很多個app,在選擇推薦好友那頁時,自動會將訊息貼到塗鴉牆,請問這是怎麼做到的呢?
    謝謝

    版主回覆:(02/24/2010 03:15:00 PM)


    這我沒試過, 但應該不會太難, 你就在 server site 上去呼叫 stream.publish 送訊息吧

    你可以參考這篇 Facebook API Stream.publish 與 Extended permissions 應用 - 同步發文至個人塗鴉牆( http://changyy.pixnet.net/blog/post/25823408 ), 只要權限 OK 後, 就算對方離線也可以發表訊息, 但我還沒空去嘗試, 我猜, 或許使用者在線上時, 預設的權限 server site 已經可以去發怖到使用者的塗鴉牆上吧?!


    除此之外, 我覺得你比較像在問邀請好友去玩遊戲的樣子, 那個不需要弄到塗鴉牆上, 但說真的, 我本身對那種自動發訊給朋友的程式有點感冒 :P 表面上看起來在等你選朋友去邀請, 實際上它早就在背景幫你送完邀請函了, 說穿了也是另一種 SPAM Mail 啊啊, 至於技術面你可能要去找看看, 我還沒研究囉

    回覆刪除
  18. 大大 我想請問 為何我設定了Canvas Callback URL之後 不管我程式中如何寫next=http://xxx.xx.xx都不會導向我要的url 通通跑到Canvas 而且聯外通網址到底什麼時候會跑進去 設定了都沒用哩

    版主回覆:(02/25/2010 04:41:26 AM)


    我沒試過你說的東西, 尚不清楚情況, 但撇開 Facebook 開發的部分

    若把 url 當作參數使用時, 你很可能需要將 url 先進行處理, 在 javascript 上, 依需要可使用 encodeURI / encodeURIComponent / escape ; php 部份則可以用 http_build_query 處理

    相關資料請查看
    http://www.w3schools.com/jsref/jsref_escape.asp
    http://www.w3schools.com/jsref/jsref_encodeURI.asp
    http://www.w3schools.com/jsref/jsref_encodeuricomponent.asp

    http://php.net/manual/en/function.http-build-query.php

    聯外通的部分, 你需要先了解他的架構, 他是用在你想要在某個額外的網站做一些跟 Facebook 溝通時用的, 細節要去看看 wiki 囉

    http://wiki.developers.facebook.com/index.php/Facebook_Connect

    回覆刪除
  19. <script type="text/javascript">
    do_post();
    </script>
    上面是大大您所寫的自動執行語法 我放在iFrame架構下可以執行 , 但是在FBML下 就無法執行
    如果要在FBML下執行 , 是否可行 謝謝

    版主回覆:(03/05/2010 03:51:30 PM)


    這個我最早之前是在 FBML 上實作的, 你看看能不能定義完 function do_post 後馬上呼叫看看, 我之前是這樣弄是 ok 啦, 但已經有一陣子沒用了, ex:

    <script type="text/javascript">
    function do_post(){ ... }
    do_post();
    </script>

    後來我比較偏向按了某個按鈕才去做事啦, 所以已不確定上述行不行了

    <button onclick="do_post();return false;">按我</button>

    回覆刪除
  20. 我想請問 有人登入m.facebook.com/tos.php之後 要繼續往http://www.facebook.com/connect/prompt_permissions.php 卻一直被facebook說我沒有登入 我反覆申裝了自己的API很多次 facebook會因此把我鎖起來嗎 不將cookie寫入我的手機 會這樣嗎 大大

    版主回覆:(03/13/2010 03:12:08 AM)


    我還法去測試, 所以不能幫你解答, 但我在 PC 上, 已登入 Facebook 後, 直接去連 http://www.facebook.com/connect/prompt_permissions.php 只會顯示 "The application must ask for a valid extended permission." , 之前我倒是曾用過類似的, 但位置是 'http://www.facebook.com/connect/prompt_permissions.php?api_key='.$appapikey.'&ext_perm='.$perm.'&next=yes.php&cancel=no.php&display=wap' , 倒沒有碰到被問說沒登入

    相關文章: Facebook API Stream.publish 與 Extended permissions 應用 - 同步發文至個人塗鴉牆 http://changyy.pixnet.net/blog/post/25823408

    回覆刪除
  21. 大大 我測出來的結果是 將手機上的連線由mms apn換成internet就可以連進去了 我是直接去m.facebook.com去實驗 mms apn一直說我沒有登入 internet輸入帳密碼上就登入成功了 這到底為什麼 我被facebook搞糊塗了 唉

    版主回覆:(03/31/2010 05:49:01 AM)


    呵呵, 我也只用過 internet 而已耶, 我對手機部分的知識很薄弱, 因為我只用最便宜的手機 orz 這部份就幫不到你了

    回覆刪除
  22. 大大 我在請問一下 假如說 我先登入了facebook 在到自己的網站 我有什麼方法抓取到我在facebook的uid 我試了很多方法就是抓不到 Orz

    版主回覆:(04/01/2010 03:35:20 AM)


    真巧, 我也玩過了 :D

    Facebook Connect 搭配 API 提供帳號管控教學
    http://changyy.pixnet.net/blog/post/25784660

    回覆刪除
  23. 真糟糕 我不會php我用jsp+javascript 另外問一下 大大有玩過新的API https://graph.facebook.com/oauth/authorize嗎

    版主回覆:(05/03/2010 09:20:40 AM)


    目前還沒有空 Orz 不過 PHP 跟 JSP 應該不會差很多, 若有需要你在參考看看, 只是那些都算是舊的方式, 或許該看看新的 Open Graph API 囉

    回覆刪除