2015-02-11 55 views
1

有沒有如何在Facebook頁面牆上發帖的方法?從教程只是顯示如何獲取有關頁面的信息。我希望能夠發佈在公共頁面上(不是我自己的,但有一個客戶擁有管理權限)。用facebook4j在頁面上發帖

我也嘗試使用應用程序解決方案,併成功獲得了OAuthAppAccessToken,但這還不夠。

An active access token must be used to query information about the current user. 

有沒有一些教程?因爲大多數人只是想從網頁上得到喜歡和評論。

回答

2

選項1(經由工具獲得令牌)

此選項需要經由圖形API工具手工輸入和複製生成的令牌。我不會太多的掩蓋這個選擇,因爲這兩個鏈接 obtaining facebook page access token the 4 step programPost to Facebook Page wall using RestFB api覆蓋了它很好。


選項2(一個鍵式解決方案)

現在,這是非常自動化的,你想要的(如果你像我一樣)解決方案。因爲我不能告訴我的客戶:「去這裏,複製這個,給我這個和東西......」。我需要做最用戶友好的解決方案。最後,我實現了FB登錄按鈕和簡單的ajax調用,它將獲得長期存在的頁面訪問令牌。有了這個令牌,我們的應用可以在發生某些事件時自動在他的頁面上發佈。使用這裏的obtaining facebook page access token the 4 step program教程是解決方案:

  1. 讓您的應用程序https://developers.facebook.com/apps/(您可能需要添加網站平臺,並使其活)。
  2. 在儀表板中檢索應用程序ID和應用程序密鑰。
  3. 在您的網站上實施登錄按鈕。關於這方面的很好的信息可以在這裏找到fb login for web。代碼片段就是你需要的,只需用你的應用程序ID替換應用程序ID即可。
  4. 在登錄按鈕中添加範圍,以便我們可以獲取頁面以及執行發佈操作的權限。

<fb:login-button scope="public_profile,email,manage_pages,publish_actions" onlogin="checkLoginState();"> </fb:login-button>

  • 在登錄按鈕可以看到被稱爲每次被調用登錄信息時的功能。在這個函數中,我們可以從FB獲得我們需要關於用戶的令牌和信息的響應(在這種情況下,它實際上只是我們需要的令牌)。以下javascript代碼通過ajax將用戶令牌(短命)發送到我們的服務器。

    function checkLoginState() { FB.getLoginStatus(function (response) { statusChangeCallback(response); }); } function statusChangeCallback(response) { if (response.status === 'connected') { getLongLivedToken(response.authResponse.accessToken); } } function getLongLivedToken(access) { var data = { ${fbParam}: acces }; $.post( '${fbUrl}', data, function (INFO) { console.log("done"); }, 'text' ); }

  • 下一步是服務器側的一個。目前我們收到令牌,我們需要將其轉換爲長壽命的令牌。

    String url = "https://graph.facebook.com/oauth/access_token"; 
        String charset = "UTF-8"; 
        String grandType = "fb_exchange_token"; 
    
        String query = String.format("grant_type=%s&client_id=%s&client_secret=%s&fb_exchange_token=%s", 
          URLEncoder.encode(grandType, charset), 
          URLEncoder.encode(Constants.FACEBOOK_APP_ID, charset), 
          URLEncoder.encode(Constants.FACEBOOK_APP_SECRET, charset), 
          URLEncoder.encode(shortToken, charset)); 
        HttpsURLConnection con = (HttpsURLConnection) new URL(url + "?" + query).openConnection(); 
        InputStream ins = con.getInputStream(); 
        InputStreamReader isr = new InputStreamReader(ins); 
        BufferedReader in = new BufferedReader(isr); 
    
        String inputLine; 
        String result = ""; 
        while ((inputLine = in.readLine()) != null) { 
         System.out.println(inputLine); 
         result += inputLine; 
        } 
        in.close(); 
    
        String[] params = result.split("&"); 
        Map<String, String> map = new HashMap<String, String>(); 
        for (String param : params) { 
         String name = param.split("=")[0]; 
         String value = param.split("=")[1]; 
         map.put(name, value); 
        } 
        String longToken=map.get("access_token"); 
    
  • 現在我們需要獲取訪問令牌的最後一個步驟,我們要發佈頁面。從這一點上我們可以使用facebook4j。

    Facebook facebook = new FacebookFactory().getInstance(); 
        facebook.setOAuthAppId(Constants.FACEBOOK_APP_ID, Constants.FACEBOOK_APP_SECRET); 
    
        facebook.setOAuthAccessToken(new AccessToken(longToken)); 
        try { 
         String pageToken = null; 
         for (Account a : facebook.getAccounts()) { 
          if (a.getName().toLowerCase().contains("nameOfPage")) { 
           pageToken = a.getAccessToken(); 
          } 
         } 
    
  • 利潤:這個原因,我們可以張貼所需頁:

    PostUpdate post = new PostUpdate(new URL("http://priklad.sk")) 
           .picture(new URL("http://priklad.sk/obrazcok/testik.png")) 
           .name("priklad") 
           .caption("priklad") 
           .message("priklad") 
           .description("priklad"); 
    try { 
        if (pageToken != null) { 
         facebook.setOAuthAccessToken(new AccessToken(id)); 
         facebook.postFeed(post); 
         Input.addInfoAnnotation(req, "sysAdminTools.annotation.fb.ok"); 
              } 
         } catch (FacebookException ex) { 
         Logger.getLogger(EditAdPreviewServlet.class.getName()).log(Level.SEVERE, null, ex); 
         } 
    
  • 旁註:該解決方案是不是意味着作爲一個頁面垃圾郵件發送者。用戶需要被告知哪些事件會在他的頁面上觸發發佈。如果用戶想要減少/刪除他可以在FB設置中執行的權限。

    相關問題