公司要求做一个东西,点击一个图片,弹出一个框,填好图片信息直接推到twitter上。
这就需要通过第三方应用。我是用Java的,所以用了jar包twitter4j,这个jar包可以在https://dev.twitter.com/docs/twitter-libraries下载。
当然,在做这个之前,你首先要申请一个twitter帐号,然后再申请一个API Key(consumerkey & consumerkeysecret)。
1. 通过http://127.0.0.1:8080/toAuth.action,得到request token, 并跳转到授权页面
private static RequestToken requestToken;
private static Map<String,Object> userMap=new HashMap<String, Object>();
public synchronized void toAuth(){
ActionContext actx = ActionContext.getContext();
HttpServletRequest request = (HttpServletRequest) actx
.get(ServletActionContext.HTTP_REQUEST);
User user=(User)request.getSession().getAttribute("loginUser"); String consumerKey="consumerKey";
String consumerSecret="consumerSecret";
TwitterFactory tf = new TwitterFactory();
Twitter twitter=tf.getInstance();
twitter.setOAuthConsumer(consumerKey, consumerSecret);
String callbackUrl="http://127.0.0.1:8080/authUser.action
try {
requestToken = twitter.getOAuthRequestToken(PropertiesUtil.pps.getProperty("callbackUrl")); //这个callbackUrl必须是一个你能接收的url,
} catch (TwitterException e1) {
// TODO Auto-generated catch block
logger.info("toAuth: "+e1.getMessage());
}
String token=requestToken.getToken();
userMap.put(token, user);
Map<String,String> rMap=new HashMap<String, String>();
rMap.put("url", requestToken.getAuthorizationURL());
try {
this.setJsonResult(rMap);
} catch (IOException e) {
// TODO Auto-generated catch block
logger.info("toAuth: "+e.getMessage());
}
}
2. 跳转到授权页面后,会要求你输入twitter用户名和密码,意味着你要给第三方用户授权。然后twitter会返回一个url给你,这个url就是你之前定义的callbackUrl加上一些参数
http://127.0.0.1:8080/authUser.action?oauth_token=xxx&oauth_verifier=yyyyy. 再通过requestToken和oauth_verifier得到accessToken。
consumerkey & consumerkeysecret & accesstoken & accesstokensec就可以推图片了。
public synchronized void authUser(){
Map<String,String> para=this.getPara();
String consumerKey=PropertiesUtil.pps.getProperty("consumerKey");
String consumerKeySec=PropertiesUtil.pps.getProperty("consumerSecret");
TwitterFactory tf = new TwitterFactory();
Twitter twitter=tf.getInstance();
twitter.setOAuthConsumer(consumerKey, consumerKeySec);
AccessToken accessToken=null;
try {
accessToken=twitter.getOAuthAccessToken(requestToken,para.get("oauth_verifier"));
} catch (TwitterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
User user=(User)userMap.get(requestToken.getToken());
Map<String,String> rMap=new HashMap<String, String>();
String info="";
if(accessToken==null){
logger.info("authUser: accessToken is null");
info="try";
}else{
user.setConsumerKey(consumerKey);
user.setConsumerKeySec(consumerKeySec);
user.setTokenKey(accessToken.getToken());
user.setTokenKeySec(accessToken.getTokenSecret());
user.setTwitterUser(accessToken.getScreenName());
try {
rMap=this.getAdminService().upUserKey(user);
} catch (Exception e) {
// TODO Auto-generated catch block
logger.info("authUser:"+e.getMessage());
}
}
3. 推图片
public void twitterPic() throws Exception{
Map<String,String> para=this.getPara();
ActionContext actx = ActionContext.getContext();
HttpServletRequest request = (HttpServletRequest) actx
.get(ServletActionContext.HTTP_REQUEST);
User user=(User)request.getSession().getAttribute("loginUser");
String consumerKeyStr = user.getConsumerKey();
String consumerSecretStr = user.getConsumerKeySec();
String accessTokenStr = user.getTokenKey();
String accessTokenSecretStr = user.getTokenKeySec();
Map<String,String> rMap=new HashMap<String, String>();
if(null==consumerKeyStr||consumerKeyStr.equals("")||null==consumerSecretStr||consumerSecretStr.equals("")
||null==accessTokenStr||accessTokenStr.equals("")||null==accessTokenSecretStr||accessTokenSecretStr.equals("")){
rMap.put("info", "notAuth");
}else{
String picPath=PropertiesUtil.pps.getProperty("picPath");
String picInfo=para.get("picInfo")==null?"":para.get("picInfo");
ConfigurationBuilder cb=new ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey(consumerKeyStr)
.setOAuthConsumerSecret(consumerSecretStr)
.setOAuthAccessToken(accessTokenStr)
.setOAuthAccessTokenSecret(accessTokenSecretStr);
ImageUploadFactory imageFactory=new ImageUploadFactory(cb.build());
ImageUpload upload=imageFactory.getInstance(MediaProvider.TWITTER);
File file=new File(picPath+para.get("picname"));
upload.upload(file, picInfo);
rMap.put("info", "ok"+user.getTwitterUser());
}
this.setJsonResult(rMap);
}