📜 ⬆️ ⬇️

Using the Facebook Graph API in Java

Good afternoon, Habrozhiteli!

Today I will tell you the story of your own bike.
Before me was the task of working with the Facebook Graph API in Java, I was interested in 3 functions: login, getting information about the user, publishing a message on the wall.
I did not find a working library in Java (or I was looking badly), so I had to reinvent my own bike.
After reading about the Graph API, I started looking for libraries that will help me in taming this API,
After a few minutes of tormenting Google, I found the open-source HtmlUnit library.

So let's get started. What do we need in order to login to Facebook under your account:
')
1) We need to create applications in Facebook, whose App ID we will use to login and get AccessToken.
2) HtmlUnit, for filling out forms.

Creating an application on Facebook


We follow the link and click on the " Create a new application " button.
Fill in the " App Display Name " field, agree with the " Platform Privacy Policy " and click the " Continue " button.
In the loaded page, click " Save Changes " and save the App ID .

Next, proceed to writing a Java application.


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(); } } 


Checking what we did.

 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", "!")); } } 


Go to your page and see the following:


PS
I will listen and take note of any criticism. I would be very happy if this article helps someone.

Source: https://habr.com/ru/post/129614/


All Articles