From 69fff5b2c4a6e66cb02c611ee99f0ebe11d951d2 Mon Sep 17 00:00:00 2001 From: George Cao Date: Sat, 25 Feb 2012 21:13:10 +0800 Subject: [PATCH] Added Kaixin2, Renren and SinaWeibo2 Apis and examples. --- changelog.txt | 1 + .../org/scribe/builder/api/KaixinApi20.java | 41 +++++++ .../org/scribe/builder/api/RenrenApi.java | 40 +++++++ .../scribe/builder/api/SinaWeiboApi20.java | 46 ++++++++ .../org/scribe/examples/Kaixin20Example.java | 63 ++++++++++ .../org/scribe/examples/RenrenExample.java | 108 ++++++++++++++++++ .../scribe/examples/SinaWeibo2Example.java | 63 ++++++++++ 7 files changed, 362 insertions(+) create mode 100644 src/main/java/org/scribe/builder/api/KaixinApi20.java create mode 100644 src/main/java/org/scribe/builder/api/RenrenApi.java create mode 100644 src/main/java/org/scribe/builder/api/SinaWeiboApi20.java create mode 100644 src/test/java/org/scribe/examples/Kaixin20Example.java create mode 100644 src/test/java/org/scribe/examples/RenrenExample.java create mode 100644 src/test/java/org/scribe/examples/SinaWeibo2Example.java diff --git a/changelog.txt b/changelog.txt index 5752d1d..40250f0 100644 --- a/changelog.txt +++ b/changelog.txt @@ -79,3 +79,4 @@ [1.3.1] * FEATURE: Meetup.com Api * FEATURE: NetProspex Api + * FEATURE: Kaixin2, SinaWeibo2 and Renren Apis diff --git a/src/main/java/org/scribe/builder/api/KaixinApi20.java b/src/main/java/org/scribe/builder/api/KaixinApi20.java new file mode 100644 index 0000000..9e27bcb --- /dev/null +++ b/src/main/java/org/scribe/builder/api/KaixinApi20.java @@ -0,0 +1,41 @@ +package org.scribe.builder.api; + +import org.scribe.extractors.*; +import org.scribe.model.*; +import org.scribe.utils.*; + +/** + * Kaixin(http://www.kaixin001.com/) open platform api based on OAuth 2.0. + */ +public class KaixinApi20 extends DefaultApi20 +{ + + private static final String AUTHORIZE_URL = "http://api.kaixin001.com/oauth2/authorize?client_id=%s&redirect_uri=%s&response_type=code"; + private static final String SCOPED_AUTHORIZE_URL = AUTHORIZE_URL + "&scope=%s"; + + @Override + public AccessTokenExtractor getAccessTokenExtractor() + { + return new JsonTokenExtractor(); + } + + @Override + public String getAccessTokenEndpoint() + { + return "https://api.kaixin001.com/oauth2/access_token?grant_type=authorization_code"; + } + + @Override + public String getAuthorizationUrl(OAuthConfig config) + { + // Append scope if present + if (config.hasScope()) + { + return String.format(SCOPED_AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback()), OAuthEncoder.encode(config.getScope())); + } + else + { + return String.format(AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback())); + } + } +} diff --git a/src/main/java/org/scribe/builder/api/RenrenApi.java b/src/main/java/org/scribe/builder/api/RenrenApi.java new file mode 100644 index 0000000..b31337b --- /dev/null +++ b/src/main/java/org/scribe/builder/api/RenrenApi.java @@ -0,0 +1,40 @@ +package org.scribe.builder.api; + +import org.scribe.extractors.*; +import org.scribe.model.*; +import org.scribe.utils.*; + +/** + * Renren(http://www.renren.com/) OAuth 2.0 based api. + */ +public class RenrenApi extends DefaultApi20 +{ + private static final String AUTHORIZE_URL = "https://graph.renren.com/oauth/authorize?client_id=%s&redirect_uri=%s&response_type=code"; + private static final String SCOPED_AUTHORIZE_URL = AUTHORIZE_URL + "&scope=%s"; + + @Override + public AccessTokenExtractor getAccessTokenExtractor() + { + return new JsonTokenExtractor(); + } + + @Override + public String getAccessTokenEndpoint() + { + return "https://graph.renren.com/oauth/token?grant_type=authorization_code"; + } + + @Override + public String getAuthorizationUrl(OAuthConfig config) + { + // Append scope if present + if (config.hasScope()) + { + return String.format(SCOPED_AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback()), OAuthEncoder.encode(config.getScope())); + } + else + { + return String.format(AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback())); + } + } +} diff --git a/src/main/java/org/scribe/builder/api/SinaWeiboApi20.java b/src/main/java/org/scribe/builder/api/SinaWeiboApi20.java new file mode 100644 index 0000000..e0744c4 --- /dev/null +++ b/src/main/java/org/scribe/builder/api/SinaWeiboApi20.java @@ -0,0 +1,46 @@ +package org.scribe.builder.api; + +import org.scribe.extractors.*; +import org.scribe.model.*; +import org.scribe.utils.*; + +/** + * SinaWeibo OAuth 2.0 api. + */ +public class SinaWeiboApi20 extends DefaultApi20 +{ + private static final String AUTHORIZE_URL = "https://api.weibo.com/oauth2/authorize?client_id=%s&redirect_uri=%s&response_type=code"; + private static final String SCOPED_AUTHORIZE_URL = AUTHORIZE_URL + "&scope=%s"; + + @Override + public Verb getAccessTokenVerb() + { + return Verb.POST; + } + + @Override + public AccessTokenExtractor getAccessTokenExtractor() + { + return new JsonTokenExtractor(); + } + + @Override + public String getAccessTokenEndpoint() + { + return "https://api.weibo.com/oauth2/access_token?grant_type=authorization_code"; + } + + @Override + public String getAuthorizationUrl(OAuthConfig config) + { + // Append scope if present + if (config.hasScope()) + { + return String.format(SCOPED_AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback()), OAuthEncoder.encode(config.getScope())); + } + else + { + return String.format(AUTHORIZE_URL, config.getApiKey(), OAuthEncoder.encode(config.getCallback())); + } + } +} diff --git a/src/test/java/org/scribe/examples/Kaixin20Example.java b/src/test/java/org/scribe/examples/Kaixin20Example.java new file mode 100644 index 0000000..b3e9d66 --- /dev/null +++ b/src/test/java/org/scribe/examples/Kaixin20Example.java @@ -0,0 +1,63 @@ +package org.scribe.examples; + +import org.scribe.builder.*; +import org.scribe.builder.api.*; +import org.scribe.model.*; +import org.scribe.oauth.*; +import java.util.*; + +public class Kaixin20Example +{ + private static final String NETWORK_NAME = "Kaixin"; + private static final String PROTECTED_RESOURCE_URL = "https://api.kaixin001.com/users/me.json"; + private static final Token EMPTY_TOKEN = null; + + public static void main(String[] args) + { + // Replace these with your own api key and secret + String apiKey = "your api key"; + String apiSecret = "your api secret"; + OAuthService service = new ServiceBuilder() + .provider(KaixinApi20.class) + .apiKey(apiKey) + .apiSecret(apiSecret) + .callback("http://your.domain.com/handle") + .build(); + Scanner in = new Scanner(System.in); + + System.out.println("=== " + NETWORK_NAME + "'s OAuth Workflow ==="); + System.out.println(); + + // Obtain the Authorization URL + System.out.println("Fetching the Authorization URL..."); + String authorizationUrl = service.getAuthorizationUrl(EMPTY_TOKEN); + System.out.println("Got the Authorization URL!"); + System.out.println("Now go and authorize Scribe here:"); + System.out.println(authorizationUrl); + System.out.println("And paste the authorization code here"); + System.out.print(">>"); + Verifier verifier = new Verifier(in.nextLine()); + System.out.println(); + + // Trade the Request Token and Verifier for the Access Token + System.out.println("Trading the Request Token for an Access Token..."); + Token accessToken = service.getAccessToken(EMPTY_TOKEN, verifier); + System.out.println("Got the Access Token!"); + System.out.println("(if your curious it looks like this: " + accessToken + " )"); + System.out.println(); + + // Now let's go and ask for a protected resource! + System.out.println("Now we're going to access a protected resource..."); + OAuthRequest request = new OAuthRequest(Verb.GET, PROTECTED_RESOURCE_URL); + service.signRequest(accessToken, request); + Response response = request.send(); + System.out.println("Got it! Lets see what we found..."); + System.out.println(); + System.out.println(response.getCode()); + System.out.println(response.getBody()); + + System.out.println(); + System.out.println("Thats it man! Go and build something awesome with Scribe! :)"); + + } +} diff --git a/src/test/java/org/scribe/examples/RenrenExample.java b/src/test/java/org/scribe/examples/RenrenExample.java new file mode 100644 index 0000000..ae13375 --- /dev/null +++ b/src/test/java/org/scribe/examples/RenrenExample.java @@ -0,0 +1,108 @@ +package org.scribe.examples; + +import org.scribe.builder.*; +import org.scribe.builder.api.*; +import org.scribe.model.*; +import org.scribe.oauth.*; +import java.nio.charset.*; +import java.security.*; +import java.util.*; + +public class RenrenExample +{ + private static final String NETWORK_NAME = "Renren"; + private static final String PROTECTED_RESOURCE_URL = "http://api.renren.com/restserver.do"; + private static final Token EMPTY_TOKEN = null; + + public static void main(String[] args) + { + // Replace these with your own api key and secret + String apiKey = "your api key"; + String apiSecret = "your api secret"; + OAuthService service = new ServiceBuilder() + .provider(RenrenApi.class) + .apiKey(apiKey) + .apiSecret(apiSecret) + .scope("status_update publish_feed") + .callback("http://your.doman.com/oauth/renren") + .build(); + Scanner in = new Scanner(System.in); + + System.out.println("=== " + NETWORK_NAME + "'s OAuth Workflow ==="); + System.out.println(); + + // Obtain the Authorization URL + System.out.println("Fetching the Authorization URL..."); + String authorizationUrl = service.getAuthorizationUrl(EMPTY_TOKEN); + System.out.println("Got the Authorization URL!"); + System.out.println("Now go and authorize Scribe here:"); + System.out.println(authorizationUrl); + System.out.println("And paste the authorization code here"); + System.out.print(">>"); + Verifier verifier = new Verifier(in.nextLine()); + System.out.println(); + + // Trade the Request Token and Verfier for the Access Token + System.out.println("Trading the Request Token for an Access Token..."); + Token accessToken = service.getAccessToken(EMPTY_TOKEN, verifier); + System.out.println("Got the Access Token!"); + System.out.println("(if your curious it looks like this: " + accessToken + " )"); + System.out.println(); + + // Now let's go and ask for a protected resource! + System.out.println("Now we're going to access a protected resource..."); + OAuthRequest request = new OAuthRequest(Verb.POST, PROTECTED_RESOURCE_URL); + Map parameters = new HashMap(); + parameters.put("method", "users.getInfo"); + parameters.put("format", "json"); + parameters.put("v", "1.0"); + + List sigString = new ArrayList(parameters.size() + 1); + for (Map.Entry entry : parameters.entrySet()) + { + request.addQuerystringParameter(entry.getKey(), entry.getValue()); + sigString.add(String.format("%s=%s", entry.getKey(), entry.getValue())); + } + sigString.add(String.format("%s=%s", OAuthConstants.ACCESS_TOKEN, accessToken.getToken())); + Collections.sort(sigString); + StringBuilder b = new StringBuilder(); + for (String param : sigString) + { + b.append(param); + } + b.append(apiSecret); + System.out.println("Sig string: " + b.toString()); + request.addQuerystringParameter("sig", md5(b.toString())); + service.signRequest(accessToken, request); + Response response = request.send(); + System.out.println("Got it! Lets see what we found..."); + System.out.println(); + System.out.println(response.getCode()); + System.out.println(response.getBody()); + + System.out.println(); + System.out.println("Thats it man! Go and build something awesome with Scribe! :)"); + + } + + public static String md5(String orgString) + { + try + { + java.security.MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] array = md.digest(orgString.getBytes(Charset.forName("UTF-8"))); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < array.length; ++i) + { + sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1, 3)); + } + return sb.toString(); + } + catch (NoSuchAlgorithmException e) + { + e.printStackTrace(); + } + return null; + } + +} diff --git a/src/test/java/org/scribe/examples/SinaWeibo2Example.java b/src/test/java/org/scribe/examples/SinaWeibo2Example.java new file mode 100644 index 0000000..683efe5 --- /dev/null +++ b/src/test/java/org/scribe/examples/SinaWeibo2Example.java @@ -0,0 +1,63 @@ +package org.scribe.examples; + +import org.scribe.builder.*; +import org.scribe.builder.api.*; +import org.scribe.model.*; +import org.scribe.oauth.*; +import java.util.*; + +public class SinaWeibo2Example +{ + private static final String NETWORK_NAME = "SinaWeibo"; + private static final String PROTECTED_RESOURCE_URL = "https://api.weibo.com/2/account/get_uid.json"; + private static final Token EMPTY_TOKEN = null; + + public static void main(String[] args) + { + // Replace these with your own api key and secret + String apiKey = "342348223"; + String apiSecret = "cfdf672e166a4bc954c0e33f03cf0d1b"; + OAuthService service = new ServiceBuilder() + .provider(SinaWeiboApi20.class) + .apiKey(apiKey) + .apiSecret(apiSecret) + .callback("http://www.dajie.com/oauth/sina") + .build(); + Scanner in = new Scanner(System.in); + + System.out.println("=== " + NETWORK_NAME + "'s OAuth Workflow ==="); + System.out.println(); + + // Obtain the Authorization URL + System.out.println("Fetching the Authorization URL..."); + String authorizationUrl = service.getAuthorizationUrl(EMPTY_TOKEN); + System.out.println("Got the Authorization URL!"); + System.out.println("Now go and authorize Scribe here:"); + System.out.println(authorizationUrl); + System.out.println("And paste the authorization code here"); + System.out.print(">>"); + Verifier verifier = new Verifier(in.nextLine()); + System.out.println(); + + // Trade the Request Token and Verifier for the Access Token + System.out.println("Trading the Request Token for an Access Token..."); + Token accessToken = service.getAccessToken(EMPTY_TOKEN, verifier); + System.out.println("Got the Access Token!"); + System.out.println("(if your curious it looks like this: " + accessToken + " )"); + System.out.println(); + + // Now let's go and ask for a protected resource! + System.out.println("Now we're going to access a protected resource..."); + OAuthRequest request = new OAuthRequest(Verb.GET, PROTECTED_RESOURCE_URL); + service.signRequest(accessToken, request); + Response response = request.send(); + System.out.println("Got it! Lets see what we found..."); + System.out.println(); + System.out.println(response.getCode()); + System.out.println(response.getBody()); + + System.out.println(); + System.out.println("Thats it man! Go and build something awesome with Scribe! :)"); + + } +}