package com.soundcloud.api.examples; import com.soundcloud.api.ApiWrapper; import com.soundcloud.api.CloudAPI; import com.soundcloud.api.Endpoints; import com.soundcloud.api.Token; import java.awt.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.net.ServerSocket; import java.net.Socket; import java.net.URI; import java.net.URLDecoder; import java.util.HashMap; import java.util.Map; /** * This example shows how to get an API token by logging in w/ Facebook. */ public class FacebookConnect { // http://sandbox-soundcloud.com/you/apps/java-api-wrapper-test-app // user: api-testing //https://skitch.com/jberkel/ggb18/edit-java-api-wrapper-test-app-on-soundcloud-create-record-and-share-your-sounds-for-free static final String CLIENT_ID = "yH1Jv2C5fhIbZfGTpKtujQ"; static final String CLIENT_SECRET = "C6o8jc517b6PIw0RKtcfQsbOK3BjGpxWFLg977UiguY"; static final URI REDIRECT_URI = URI.create("http://localhost:8000"); public static void main(String[] args) throws IOException { final ApiWrapper wrapper = new ApiWrapper( CLIENT_ID, CLIENT_SECRET, REDIRECT_URI, null /* token */); // generate the URL the user needs to open in the browser URI url = wrapper.authorizationCodeUrl(Endpoints.FACEBOOK_CONNECT, Token.SCOPE_NON_EXPIRING); if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { Desktop.getDesktop().browse(url); } else { System.err.println("open \"" + url + "\" in a browser"); } // start a web server to get the redirect information startServer(wrapper); // note: on Android you would use a WebView instead and override 'shouldOverrideUrlLoading': /* WebView webView = (WebView) findViewById(R.id.webview); webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(final WebView view, String url) { if (url.startsWith(REDIRECT_URI)) { Uri result = Uri.parse(url); String error = result.getQueryParameter("error"); String code = result.getQueryParameter("code"); } return true; } }); webView.loadUrl(wrapper.authorizationCodeUrl(Endpoints.FACEBOOK_CONNECT, ...); */ } static void startServer(ApiWrapper wrapper) throws IOException { ServerSocket socket = new ServerSocket(8000); for (;;) { final Socket client = socket.accept(); try { InputStream is = client.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is), 8192); PrintStream out = new PrintStream(client.getOutputStream()); String line = reader.readLine(); if (line == null) throw new IOException("client closed connection without a request."); final String[] request = line.split(" ", 3); if (request.length != 3) throw new IOException("invalid request:" + line); if (!"GET".equals(request[0])) throw new IOException("invalid method:" + line); Map<String, String> params = parseParameters(request[1]); if (params.containsKey("error")) { // error logging in, redirect mismatch etc. reply(out, "Error: " + params.get("error_description")); } else if (params.containsKey("code")) { // we got a code back, try to exchange it for a token try { Token token = wrapper.authorizationCode(params.get("code")); reply(out, "Got token: " + token); } catch (CloudAPI.InvalidTokenException e) { reply(out, e.getMessage()); } } else { // unexpected redirect reply(out, "invalid request:"+request[1]); } break; } catch (IOException e) { e.printStackTrace(); } finally { try { client.close(); } catch (IOException ignored) { } } } } static void reply(PrintStream out, String text) { System.out.println(text); out.println("HTTP/1.1 200 OK"); out.println("Content-Type: text/plain"); out.println(); out.println(text); out.flush(); } static Map<String, String> parseParameters(String request) { Map<String, String> params = new HashMap<String, String>(); if (request.contains("?")) { String query = request.substring(Math.min(request.length(), request.indexOf("?") + 1), request.length()); for (String s : query.split("&")) { String[] kv = s.split("=", 2); if (kv != null && kv.length == 2) { try { params.put(URLDecoder.decode(kv[0], "UTF-8"), URLDecoder.decode(kv[1], "UTF-8")); } catch (UnsupportedEncodingException ignored) { } } } } return params; } }