Как подключить фейсбук с настольным Java-приложением - PullRequest
5 голосов
/ 03 февраля 2011

Мне нужно подключиться и аутентифицировать пользователей из настольного Java-приложения. Я пробовал facebook-java-api с использованием facebookjsonclient и facebookRestclient, но не смог получить ключ сеанса Есть ли какие-либо изменения в Facebook, из-за которых мы не можем подключиться, или есть какой-либо другой лучший Java-API или пример, как подключиться. мой код

private static void getUserID(String email, String password){
        String session = null;
        try {

            HttpClient http = new HttpClient();

            http.getHostConfiguration().setHost("www.facebook.com");
            String api_key = "key";
            String secret = "sec";
            FacebookJaxbRestClient client = new FacebookJaxbRestClient(api_key, secret);
                System.out.println("====>"+client.isDesktop());

            String token = client.auth_createToken();
            System.out.println(" :::::::"+token);
            System.out.println(" :::::::::: "+token);
            PostMethod post = new PostMethod("/login.php?");

            post.addParameter("api_key", api_key);


            post.addParameter("email", email);
            post.addParameter("pass", password);


            int postStatus = http.executeMethod(post);
                System.out.println("url : " + post.getURI());
            System.out.println("Response : " + postStatus);
            for (Header h : post.getResponseHeaders()) {
                System.out.println(h);
            }
            session = client.auth_getSession(token); // Here I am getting error
            System.out.println("Session string: " + session);
            long userid = client.users_getLoggedInUser();
            //System.out.println("User Id is : " + userid);*/
        } catch (FacebookException fe) {

            fe.printStackTrace();

        }catch(Exception e){
            e.printStackTrace();
        }
    }

Ответы [ 3 ]

0 голосов
/ 03 мая 2012

AFAIK, на данный момент нет возможности напрямую подключиться к Facebook из "настольного приложения".Вы можете использовать клиентскую библиотеку Apache http для имитации браузера и выполнения этого.Но нельзя гарантировать, что он будет работать всегда. Я также пытался сделать это некоторое время с некоторыми библиотеками, но они кажутся сломанными.

0 голосов
/ 14 августа 2012

Я добился определенного успеха в этом. Мой подход состоял в том, чтобы использовать встроенный браузер для отображения аутентификации пользователю. Facebook обрабатывает аутентификацию и перенаправляет вас на страницу «успешный вход в систему» ​​с токеном доступа и временем истечения, привязанным к URL-адресу в качестве данных GET. Большая часть кода ниже предназначена для создания и отображения браузера с использованием библиотеки org.eclipse.sw t.

private static final String APP_ID = "###########";
private static final String PERMISSIONS =
        "COMMA SEPARATED LIST OF REQUESTED PERMISSIONS";
private String access_token;
private long expirationTimeMillis;
/**
 * Implements facebook's authentication flow to obtain an access token. This
 * method displays an embedded browser and defers to facebook to obtain the
 * user's credentials.
 * According to facebook, the request as we make it here should return a
 * token that is valid for 60 days. That means this method should be called
 * once every sixty days.
 */
private void authenticationFlow() {
    Display display = new Display();
    Shell shell = new Shell(display);
    final Browser browser;
    GridLayout gridLayout = new GridLayout();
    gridLayout.numColumns = 3;
    shell.setLayout(gridLayout);

    try {
        browser = new Browser(shell, SWT.NONE);
    } catch (SWTError e){
        System.err.println("Could not instantiate Browser: " + e.getMessage());
        display.dispose();
        display = null;
        return;
    }
    browser.setJavascriptEnabled(true);

    GridData data = new GridData();
    data.horizontalAlignment = GridData.FILL;
    data.verticalAlignment = GridData.FILL;
    data.horizontalSpan = 3;
    data.grabExcessHorizontalSpace = true;
    data.grabExcessVerticalSpace = true;
    browser.setLayoutData(data);

    final ProgressBar progressBar = new ProgressBar(shell, SWT.MOZILLA);
    data = new GridData();
    data.horizontalAlignment = GridData.END;
    progressBar.setLayoutData(data);

    /* Event Handling */
    browser.addProgressListener(new ProgressListener(){
        public void changed(ProgressEvent event){
            if(event.total == 0) return;
            int ratio = event.current * 100 / event.total;
            progressBar.setSelection(ratio);
        }
        public void completed(ProgressEvent event) {
            progressBar.setSelection(0);
        }
    });
    browser.addLocationListener(new LocationListener(){
        public void changed(LocationEvent e){
            // Grab the token if the browser has been redirected to
            // the login_success page
            String s = e.location;
            String token_identifier = "access_token=";
            if(s.contains("https://www.facebook.com/connect/login_success.html#access_token=")){
                access_token = s.substring(s.lastIndexOf(token_identifier)+token_identifier.length(),s.lastIndexOf('&'));
                String expires_in = s.substring(s.lastIndexOf('=')+1);
                expirationTimeMillis = System.currentTimeMillis() + (Integer.parseInt(expires_in) * 1000);
            }
        }
        public void changing(LocationEvent e){}
    });

    if(display != null){
        shell.open();
        browser.setUrl("https://www.facebook.com/dialog/oauth?"
                + "client_id=" + APP_ID
                + "&redirect_uri=https://www.facebook.com/connect/login_success.html"
                + "&scope=" + PERMISSIONS
                + "&response_type=token");
        while(!shell.isDisposed()) {
            if(!display.readAndDispatch()){
                display.sleep();
                if(access_token != null && !access_token.isEmpty()){
                    try{ Thread.sleep(3000);}catch(Exception e){}
                    shell.dispose();
                }
            }
        }
        display.dispose();
    }
}

Так что все, что вам нужно сделать, это выяснить, какие разрешения вам понадобятся для работы вашего приложения. Имейте в виду, что разрешения «второго диалога» могут быть выбраны пользователем, поэтому нет гарантии, что у вас действительно будут эти разрешения.

0 голосов
/ 18 марта 2012

Прежде всего, вам нужно получить access_token, а затем я бы порекомендовал использовать библиотеку restfb.Чтобы получить токен, я бы рекомендовал прочитать это: https://developers.facebook.com/docs/authentication/

Простое резюме:

  1. HTTP GET: https://www.facebook.com/dialog/oauth? client_id = YOUR_APP_ID & redirect_uri = YOUR_URL & scope = email, read_stream & response_type = token
  2. Используйте код, который вы получили сверху, а затем выполните: https://graph.facebook.com/oauth/access_token? client_id = YOUR_APP_ID & redirect_uri = YOUR_URL & client_secret = YOUR_APP_SECRET & code = THE_CODE_FROM_ABOVE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...