Добрый день, Хаброжители!
Сегодня я расскажу Вам историю собственного велосипеда.
Передо мной стала задача работы с Facebook Graph API в Java, меня интересовали 3 функции: логин, получение информации о пользователе, публикация сообщения на стене.
Работающей библиотеки на Java я не нашёл (или плохо искал), поэтому пришлось изобретать собственный велосипед.
Прочитав о Graph API я начал искать библиотеки, которые мне помогут в укрощении данной API,
пару минут помучив Google я нашёл open-source библиотеку HtmlUnit.
Итак, приступим. Что нам понадобиться для того, чтобы залогиниться на Facebook под своим аккаунтом:
1) Нам необходимо создать приложения в Facebook, App ID которого мы будем использоваться для логина и получения AccessToken.
2) HtmlUnit, для заполнения форм.
Проходим по ссылке и нажимаем на кноп��у "Создать новое приложение".
Заполняем поле "App Display Name", соглашаемся с "политикой конфиденциальности платформы" и жмём кнопку "Продолжить".
В загрузившейся странице нажимаем "Сохранить изменения" и сохраняем у себя App ID.
Проверяем, что у нас получилось.
Заходим на свою страницу и видим следующее:

P.S.
Выслушаю и приму на заметку любую критику. Буду очень рад, если кому-то поможет данная статья.
Сегодня я расскажу Вам историю собственного велосипеда.
Передо мной стала задача работы с Facebook Graph API в Java, меня интересовали 3 функции: логин, получение информации о пользователе, публикация сообщения на стене.
Работающей библиотеки на Java я не нашёл (или плохо искал), поэтому пришлось изобретать собственный велосипед.
Прочитав о Graph API я начал искать библиотеки, которые мне помогут в укрощении данной API,
пару минут помучив Google я нашёл open-source библиотеку HtmlUnit.
Итак, приступим. Что нам понадобиться для того, чтобы залогиниться на Facebook под своим аккаунтом:
1) Нам необходимо создать приложения в Facebook, App ID которого мы будем использоваться для логина и получения AccessToken.
2) HtmlUnit, для заполнения форм.
Создание приложения на Facebook
Проходим по ссылке и нажимаем на кноп��у "Создать новое приложение".
Заполняем поле "App Display Name", соглашаемся с "политикой конфиденциальности платформы" и жмём кнопку "Продолжить".
В загрузившейся странице нажимаем "Сохранить изменения" и сохраняем у себя App ID.
Далее переходим к написанию Java приложения
public class Facebook { /* App ID */ private static final String API_KEY = "1"; /* Ссылка на страницу, куда перенаправят нас при удачном логине. */ private static final String REDIRECT_URL = "https://www.facebook.com/connect/login_success.html"; /* ID логин формы. */ private static final String LOGIN_FORM_ID = "login_form"; /* Имя e-mail формы. */ private static final String INPUT_EMAIL_NAME = "email"; /* Имя password формы. */ private static final String INPUT_PASSWORD_NAME = "pass"; /* Имя кнопки "Войти". */ private static final String INPUT_LOGIN_NAME = "login"; /* Имя формы управления правами приложения. */ private static final String ACCESS_FORM_ID = "uiserver_form"; /* Имя кнопки "Разрешить". */ private static final String INPUT_ALLOW_NAME = "grant_clicked"; /* Ссылка на Graph API. */ private static final String GRAPH_URL = "https://graph.facebook.com/"; /* HtmlUnit Веб-клиент. */ private WebClient webClient; /* Полученный AccessToken. */ private String accessToken; public Facebook() { initWebClient(); } /** * Логинимся в Facebook используя данные email и password. */ public void login(String email, String password) { try { /* Получаем логин форму. */ HtmlForm loginForm = getForm(LOGIN_FORM_ID); if (loginForm != null) { /* Заполняем поле email. */ loginForm.getInputByName(INPUT_EMAIL_NAME).setValueAttribute(email); /* Заполняем поле password. */ loginForm.getInputByName(INPUT_PASSWORD_NAME).setValueAttribute(password); /* Нажимаем кнопку "Войти" и получаем страницу, на которую нас перенаправит Facebook. */ HtmlPage page = loginForm.getInputByName(INPUT_LOGIN_NAME).click(); /* Получаем форму управления правами приложения. */ HtmlForm accessForm = getForm(page, ACCESS_FORM_ID); if (accessForm != null) { /* Нажимаем на кнопку "Разрешить" и получаем страницу, на которую нас перенаправит Facebook. */ page = accessForm.getInputByName(INPUT_ALLOW_NAME).click(); } /* Проверяем, увеналась ли удачей наша попытка логина. */ if (page.getBody().getTextContent().trim().equalsIgnoreCase("success")) { /* Извлекаем AccessToken. */ getAccessToken(page.getUrl()); } } } catch (Exception e) { e.printStackTrace(); } } public String getAccessToken() { return this.accessToken; } /** * Получаем информацию о пользователе. */ public String getUserInfo(String id) { /* Генерируем ссылку запроса. */ String requestURL = GRAPH_URL + id + "?access_token=" + accessToken; /* Посылаем запрос. */ return sendRequest(requestURL); } /** * Публикуем сообщения на стене пользователя. */ public String writeInWall(String id, String msg) { /* Генерируем ссылку публикации. */ String requestURL = GRAPH_URL + id + "?access_token=" + accessToken + "&message=" + encodeMsg(msg); /* Публикуем сообщение на стене пользователя. */ return publish(requestURL); } /** * Инициализируем WebClient. */ private void initWebClient() { webClient = new WebClient(); /* Отключаем CSS. */ webClient.setCssEnabled(false); /* Отключаем JavaScript. */ webClient.setJavaScriptEnabled(false); } /** * Получаем форму по formID. */ private HtmlForm getForm(String formID) { HtmlForm form = null; try { HtmlPage page = webClient.getPage(getLoginURL()); form = getForm(page, formID); } catch (Exception e) { e.printStackTrace(); } return form; } /** * Получаем форму по formID со страницы page. */ private HtmlForm getForm(HtmlPage page, String formID) { HtmlForm form = null; List<HtmlForm> forms = page.getForms(); for (HtmlForm tForm : forms) { if (tForm.getId().equalsIgnoreCase(formID)) { form = tForm; break; } } return form; } /** * Извлекаем AccessToken из полученной ссылки link. */ private void getAccessToken(URL link) { String ref = link.getRef(); String token = "access_token="; String expires = "&expires"; int startIndex = ref.indexOf(token); int endIndex = ref.indexOf(expires); if (startIndex != -1 && endIndex != -1) { accessToken = ref.substring(startIndex + token.length(), endIndex); } } /** * Посылаем запрос. */ private String sendRequest(String request) { String result = null; try { HttpGet get = new HttpGet(request); DefaultHttpClient client = new DefaultHttpClient(); HttpResponse response = client.execute(get); result = EntityUtils.toString(response.getEntity()); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return result; } /** * Посылаем post запрос. */ private String publish(String request) { String result = null; try { HttpPost post = new HttpPost(request); DefaultHttpClient client = new DefaultHttpClient(); HttpResponse response = client.execute(post); result = EntityUtils.toString(response.getEntity()); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return result; } /* Кодируем текст сообщения. */ private String encodeMsg(String msg) { try { msg = URLEncoder.encode(msg, HTTP.UTF_8); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return msg; } /* Формируем ссылку логина. */ private String getLoginURL() { return "https://www.facebook.com/dialog/oauth?client_id=" + API_KEY + "&redirect_uri=" + REDIRECT_URL + "&scope=" + getPermissions() + "&response_type=token"; } /* Формируем перечень прав приложения. */ private String getPermissions() { StringBuilder permissions = new StringBuilder(); permissions.append("read_stream,"); permissions.append("user_birthday,"); permissions.append("user_religion_politics,"); permissions.append("user_relationships,"); permissions.append("user_relationship_details,"); permissions.append("user_hometown,"); permissions.append("user_location,"); permissions.append("user_likes,"); permissions.append("user_activities,"); permissions.append("user_interests,"); permissions.append("user_education_history,"); permissions.append("user_work_history,"); permissions.append("user_online_presence,"); permissions.append("user_website,"); permissions.append("user_groups,"); permissions.append("user_events,"); permissions.append("user_photos,"); permissions.append("user_videos,"); permissions.append("user_photo_video_tags,"); permissions.append("user_notes,"); permissions.append("user_about_me,"); permissions.append("user_status,"); permissions.append("friends_birthday,"); permissions.append("friends_religion_politics,"); permissions.append("friends_relationships,"); permissions.append("friends_relationship_details,"); permissions.append("friends_hometown,"); permissions.append("friends_location,"); permissions.append("friends_likes,"); permissions.append("friends_activities,"); permissions.append("friends_interests,"); permissions.append("friends_education_history,"); permissions.append("friends_work_history,"); permissions.append("friends_online_presence,"); permissions.append("friends_website,"); permissions.append("friends_groups,"); permissions.append("friends_events,"); permissions.append("friends_photos,"); permissions.append("friends_videos,"); permissions.append("friends_photo_video_tags,"); permissions.append("friends_notes,"); permissions.append("friends_about_me,"); permissions.append("friends_status,"); permissions.append("publish_stream,"); permissions.append("create_event,"); permissions.append("rsvp_event,"); permissions.append("sms,"); permissions.append("offline_access,"); permissions.append("publish_checkins,"); permissions.append("manage_friendlists,"); permissions.append("manage_pages"); return permissions.toString(); } }
Проверяем, что у нас получилось.
public class Test { public static void main(String[] args) { Facebook facebook = new Facebook(); /* Логинимся. */ facebook.login("email", "pass"); /* Получаем пользовательскую информацию. */ System.out.println(facebook.getUserInfo("me/feed")); /* Публикуем на стене. */ System.out.println(facebook.writeInWall("me/feed", "Проверка!")); } }
Заходим на свою страницу и видим следующее:

P.S.
Выслушаю и приму на заметку любую критику. Буду очень рад, если кому-то поможет данная статья.
