Есть ли способ публикации на стене страницы facebook? Из учебников показано, как получить информацию о странице. Я не смог опубликовать на публичной странице (не мой, а тот, у которого у клиента есть права администратора).
Я также попытался использовать приложение, и я успешно получил OAuthAppAccessToken, но этого недостаточно.
An active access token must be used to query information about the current user.
Есть ли какой-то учебник? потому что большинство людей просто хотят получить и комментарии со страниц.
Вариант 1 (получить токен через инструменты)
Этот параметр требует ручного ввода и копирования сгенерированных токенов с помощью инструментов графического api. Я не собираюсь освещать этот вариант, потому что эти две ссылки, получающие токен доступа к странице Facebook, используют 4-ступенчатую программу и Post to Facebook Page wall, используя RestFB api, достаточно хорошо ее покрывают.
Вариант 2 (одно решение кнопки)
Теперь это довольно автоматизированное решение, которое (если вы похожи на меня) вы хотите. Поскольку я не мог сказать своему клиенту: "Иди сюда, скопируй это, дай мне это и прочее...". Мне нужно было сделать большинство удобных для пользователя решений. В конце я внедрил кнопку входа в FB и простой вызов ajax, который получит долговечный токен доступа к странице. С помощью этого токена наше приложение может публиковать на своей странице автоматически при возникновении какого-либо события. Используя доступ к токенам доступа к странице Facebook, вы найдете следующее решение:
<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();
}
}
PROFIT: с этим токеном мы можем опубликовать на желаемой странице:
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.