簡體   English   中英

用facebook4j在頁面上發布

[英]Posting on Page with facebook4j

有沒有一種方法可以在Facebook頁面牆上發布? 從教程中只是顯示了如何獲取有關頁面的信息。 我希望能夠在公共頁面上發布(不是我自己的頁面,而是該客戶具有管理員權限的頁面)。

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

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

有教程嗎? 因為大多數人只想從頁面中獲得喜歡和評論。

選項1(通過工具獲取令牌)

此選項需要通過圖形API工具手動輸入和復制生成的令牌。 我將不討論這個選項,因為這兩個鏈接獲得了Facebook步驟訪問令牌的4步程序使用RestFB api發布到Facebook頁面的牆,都很好地覆蓋了該選項。


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

現在,這是一個非常自動化的解決方案,您需要(如果您像我一樣)。 由於我無法告訴我的客戶:“去這里,復制此內容,給我這個東西……”。 我需要做大多數用戶友好的解決方案。 最后,我實現了FB登錄按鈕和簡單的ajax調用,這些調用將獲得長壽命的頁面訪問令牌。 使用此令牌,當發生某些事件時,我們的應用程序可以自動在其頁面上發布。 使用獲取Facebook頁面訪問令牌的4步程序教程,這里是解決方案:

  1. 使您的應用程序為https://developers.facebook.com/apps/ (您可能需要添加網站平台並使之運行)。
  2. 在儀表板中檢索應用程序ID和應用程序密鑰。
  3. 在您的網站上實施登錄按鈕。 有關此方面的重要信息,請參見fb Web登錄 您需要的代碼片段只是用您的應用程序ID替換應用程序ID。
  4. 在登錄按鈕中添加范圍,這樣我們就可以獲得頁面以及具有執行發布操作的權限。

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

  1. 在登錄按鈕中,您可以看到每次調用登錄時都會調用的函數。 在此功能中,我們可以從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' ); }

  2. 下一步是服務器端。 目前我們收到令牌,我們需要將其轉換為壽命長的令牌。

      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"); 
  3. 現在,最后一步,我們需要獲取要發布到的頁面的訪問令牌。 從這一點開始,我們可以使用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(); } } 
  4. 利潤:使用此令牌,我們可以在所需的頁面上發布:

     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設置中進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM