如何在不提示用户的情况下使用我自己的box.com帐户

时间:2013-11-05 14:48:08

标签: box-api

我有一个Windows应用程序,可以将文件收集到一个zip文件中。 我希望我的应用程序将此zip文件上传到我的box.com帐户。

有没有办法在不提示用户的情况下获取授权代码? 我的用户没有(甚至不知道)box.com和 我已经有了我的app键,client_id和client_secret。

1 个答案:

答案 0 :(得分:1)

你可以使用这样的webclient构建一个workarround:

import java.io.IOException;
import java.net.URL;
import java.util.concurrent.ExecutionException;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.ElementNotFoundException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlButton;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;

public class BoxAuth {

private String key;
private String email;
private String password;
private String redirectUrl;
private final String AUTH_URL;

public BoxAuth(String key, String email, String password, String redirectUrl) {
    super();
    this.key = key;
    this.email = email;
    this.password = password;
    this.redirectUrl = redirectUrl;
    this.AUTH_URL = "https://www.box.com/api/oauth2/authorize?response_type=code&client_id=" + key + "&redirect_uri=" + this.redirectUrl;
}

public String authorize() throws IOException, InterruptedException, ExecutionException {

    System.out.println("AUTHORIZING: " + AUTH_URL);

    final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17);

    HtmlPage loginPage = webClient.getPage(AUTH_URL);
    final HtmlPage grantAccessePage = this.authorizeLogin(loginPage);
    return this.authorizeGrantAccess(grantAccessePage);

}

private HtmlPage authorizeLogin(HtmlPage page) throws IOException {

    final HtmlForm loginForm = page.getFormByName("login_form");
    loginForm.getInputByName("password");
    final HtmlTextInput emailField = (HtmlTextInput) loginForm.getInputByName("login");
    emailField.setValueAttribute(this.email);
    final HtmlPasswordInput passwordField = (HtmlPasswordInput) loginForm.getInputByName("password");
    passwordField.setValueAttribute(this.password);
    final HtmlSubmitInput loginButton = loginForm.getInputByName("login_submit");

    final HtmlPage result = loginButton.click();
    try {
        final HtmlForm test = result.getFormByName("login_form");
        throw new Exception("BoxAPI: Wrong login data!!!");
    } catch (ElementNotFoundException e) {
    }

    return result;
}

private String authorizeGrantAccess(HtmlPage grantAccessePage) throws IOException, InterruptedException, ExecutionException {
    final HtmlForm grantAccessForm = grantAccessePage.getHtmlElementById("consent_form");
    final HtmlButton grantAccess = grantAccessForm.getButtonByName("consent_accept");

    final HtmlPage codePage = grantAccess.click();

    URL url = codePage.getUrl();
    String result = "";

    if (url.toString().contains("&code=")) {
        result = url.toString().substring(url.toString().indexOf("&code="));
        result = result.replace("&code=", "");
    }

    return result;
}

}

as redirect_url你可以使用“https://app.box.com/services/yourservice

之类的东西