3

直接のニックネーム/パスワード接続を使用してプログラムでfbapiにアクセスすることは可能ですか?そうでない場合は、真のクライアントアプリケーション(サーバーがどこにも実行されていない)を維持しながらAPIに接続する他の方法はありますか?

4

2 に答える 2

1

いいえ; サポートされている OAuthログインフローのいずれかを使用する必要がありますが、デスクトップ アプリと互換性のあるフローがあり、ここに例があります: https://developers.facebook.com/docs/howtos/login/login-for-desktop/

于 2012-10-31T18:52:17.937 に答える
1

これは機能します :) これは醜いハックであり、 http://developers.facebook.com/docs/reference/api/ページのコンテンツに依存しますが、機能します。では、なぜそれを行うための標準化された方法がないのでしょうか?

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;

import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomNode;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;

public class Main {

    public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException,
        URISyntaxException {

    Main m = new Main();
    m.dosth();
}

public void dosth() throws FailingHttpStatusCodeException, MalformedURLException, IOException, URISyntaxException {
    String accessToken = login(Credentials.username, Credentials.password);

    System.out.println(accessToken);

}

/**
 * @param username
 * @param password
 * @return facebook access token
 * @throws IOException
 * @throws MalformedURLException
 * @throws FailingHttpStatusCodeException
 * @throws URISyntaxException
 */
public String login(String username, String password) throws FailingHttpStatusCodeException, MalformedURLException,
        IOException, URISyntaxException {
    WebClient wc = new WebClient();
    wc.setCssEnabled(false);
    wc.setJavaScriptEnabled(false);
    HtmlPage page = wc.getPage("https://www.facebook.com");
    HtmlForm form = (HtmlForm) page.getElementById("login_form");
    form.getInputByName("email").setValueAttribute(username);
    form.getInputByName("pass").setValueAttribute(password);
    HtmlPage home = null;
    for (DomNode node : form.getDescendants()) {
        if (node instanceof HtmlSubmitInput) {
            home = ((HtmlSubmitInput) node).click();
            break;
        }
    }

    // assume log in worked out

    HtmlPage api = wc.getPage("https://developers.facebook.com/docs/reference/api/");
    HtmlAnchor a = api.getAnchorByText("https://graph.facebook.com/me/friends?access_token=...");
    URI href = new URI(a.getHrefAttribute());
    List<NameValuePair> params = URLEncodedUtils.parse(href, "utf-8");
    for (NameValuePair pair : params) {
        if (pair.getName().equals("access_token")) {
            return pair.getValue();
        }
    }
    return null;
}
}

「開発者」アプリに権限を付与した後にのみこのトークンを取得できるため、これは実際には私が思ったようには機能しません。

于 2012-11-03T23:15:48.530 に答える