Java模拟新浪和腾讯自动登录并发送微博_java

Java模拟新浪和腾讯自动登录并发送微博功能分享给大家,供大家参考,具体内容如下

1.准备工作
只是登录无需申请新浪和腾迅的开发者账号,如果需要发送微博功能,需要申请一个新浪和腾迅的开发者账号,并添加一个测试应用。 

过程请参考官方帮助文档,申请地址:新浪:http://open.weibo.com    腾迅:http://dev.t.qq.com/ 

我们需要的是App Key和App Secre及redirect_URI,源代码中已经包含了我申请的测试key,但由于限制直接用我的key你们的账号是无法登录成功的。 

2.注意事项
 1)、需要注意的是应用的App Key和App Secre及redirect_URI,对应项目根目录下的config.properties配置文件中的
client_ID=1745656892
client_SERCRET=66056719c1d8ca7bcaf36f411217cefa
redirect_URI=www.baidu.com
redirect_URI由于只是测试用并没有直接的回调页面,所以这里随便填写一个地址就行了,但要注意与应用-高级设置里的“回调页面”一致。 
2)、代码中的测试账号需要要自己添加测试账号,新浪的在“应用信息-测试账号”;腾迅的在“权限控制-创建白名单”中。当然直接用 开发者账号也可以。
3)、发送微博引用了新浪的weibo4j-oauth2-beta2.1.1.zip,腾迅的Java_SDK_v1.2.1.7z。核心类在util包下。

3.关键代码
1)、新浪 

package org.utils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.http.HttpException;
import org.core.weibo.sina.Oauth;
import org.core.weibo.sina.Timeline;
import org.core.weibo.sina.http.AccessToken;
import org.core.weibo.sina.model.WeiboException;
import org.core.weibo.sina.weibo4j.util.WeiboConfig;
/***
 * 模拟自动登录并发微博
 * @author zdw
 *
 */
public class Sina {
 /***
 * 模拟登录并得到登录后的Token
 * @param username 用户名
 * @param password 密码
 * @return
 * @throws HttpException
 * @throws IOException
 */
 public static AccessToken getToken(String username,String password) throws HttpException, IOException
 {
  String clientId = WeiboConfig.getValue("client_ID") ;
  String redirectURI = WeiboConfig.getValue("redirect_URI") ;
  String url = WeiboConfig.getValue("authorizeURL");

  PostMethod postMethod = new PostMethod(url);
  //应用的App Key
  postMethod.addParameter("client_id",clientId);
  //应用的重定向页面
  postMethod.addParameter("redirect_uri",redirectURI);
  //模拟登录参数
  //开发者或测试账号的用户名和密码
  postMethod.addParameter("userId", username);
  postMethod.addParameter("passwd", password);
  postMethod.addParameter("isLoginSina", "0");
  postMethod.addParameter("action", "submit");
  postMethod.addParameter("response_type","code");
  HttpMethodParams param = postMethod.getParams();
  param.setContentCharset("UTF-8");
  //添加头信息
  List<Header> headers = new ArrayList<Header>();
  headers.add(new Header("Referer", "https://api.weibo.com/oauth2/authorize?client_id="+clientId+"&redirect_uri="+redirectURI+"&from=sina&response_type=code"));
  headers.add(new Header("Host", "api.weibo.com"));
  headers.add(new Header("User-Agent","Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0"));
  HttpClient client = new HttpClient();
  client.getHostConfiguration().getParams().setParameter("http.default-headers", headers);
  client.executeMethod(postMethod);
  int status = postMethod.getStatusCode();
  System.out.println(status);
  if (status != 302)
  {
  System.out.println("token刷新失败");
  return null;
  }
  //解析Token
  Header location = postMethod.getResponseHeader("Location");
  if (location != null)
  {
  String retUrl = location.getValue();
  int begin = retUrl.indexOf("code=");
  if (begin != -1) {
   int end = retUrl.indexOf("&", begin);
   if (end == -1)
   end = retUrl.length();
   String code = retUrl.substring(begin + 5, end);
   if (code != null) {
   Oauth oauth = new Oauth();
   try{
    AccessToken token = oauth.getAccessTokenByCode(code);
    return token;
   }catch(Exception e){
    e.printStackTrace();
   }
   }
  }
  }
 return null;
 }
 /**
 * 发微博
 * @param token 认证Token
 * @param content 微博内容
 * @return
 * @throws Exception
 */
 public static boolean sinaSendWeibo(String token,String content) throws Exception {
 boolean flag = false ;
 Timeline timeline = new Timeline();
 timeline.client.setToken(token);
 try
 {
  timeline.UpdateStatus(content);
  flag = true ;
 }
 catch (WeiboException e)
 {
  flag = false ;
  System.out.println(e.getErrorCode());
 }
 return flag;
 }

 public static void main(String[] args) throws Exception
 {
 AccessToken at = getToken("xxxx","xxx");
 sinaSendWeibo(at.getAccessToken(),"测试呢");
 }
}

 

2)、腾迅 

package org.utils;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.util.Scanner;

import net.sf.json.JSONObject;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.core.weibo.tencent.api.UserAPI;
import org.core.weibo.tencent.oauthv2.OAuthV2;
import org.core.weibo.tencent.oauthv2.OAuthV2Client;

/***
 * 腾迅自动登录并获取个人信息
 * @author zdw
 *
 */
public class Tencent
{
 public static final String HEXSTRING = "0123456789ABCDEF";
 public static OAuthV2 oAuth = new OAuthV2();
 private static HttpClient client = new DefaultHttpClient();
 // 初始oAuth应用信息
 public static void init(OAuthV2 oAuth)
 {
 oAuth.setClientId("801216331");
 oAuth.setClientSecret("ea71b26b0cbe5778cdd1c09ad17553a3");
 oAuth.setRedirectUri("http://www.tencent.com/zh-cn/index.shtml");
 }
 /**
 *
 * @param qq
 *      http://check.ptlogin2.qq.com/check?uin={0}&appid=15000101&r={1 }
 *      返回的第三个值
 * @param password
 *      QQ密码
 * @param verifycode
 *      验证码
 * @return 加密后的密码
 * @throws UnsupportedEncodingException
 * @throws Exception
 *
 */
 public static String GetPassword(String qq, String password,
  String verifycode) throws Exception
 {
 String P = hexchar2bin(md5(password));
 String U = md5(P + hexchar2bin(qq.replace("\\x", "").toUpperCase()));
 String V = md5(U + verifycode.toUpperCase());
 return V;
 }

 public static String md5(String originalText) throws Exception
 {
 byte buf[] = originalText.getBytes("ISO-8859-1");
 StringBuffer hexString = new StringBuffer();
 String result = "";
 String digit = "";
 try
 {
  MessageDigest algorithm = MessageDigest.getInstance("MD5");
  algorithm.reset();
  algorithm.update(buf);
  byte[] digest = algorithm.digest();
  for (int i = 0; i < digest.length; i++)
  {
  digit = Integer.toHexString(0xFF & digest[i]);
  if (digit.length() == 1)
  {
   digit = "0" + digit;
  }
  hexString.append(digit);
  }
  result = hexString.toString();
 }
 catch (Exception ex)
 {
  result = "";
 }
 return result.toUpperCase();
 }

 public static String hexchar2bin(String md5str) throws UnsupportedEncodingException
 {
 ByteArrayOutputStream baos = new ByteArrayOutputStream(md5str.length() / 2);
 for (int i = 0; i < md5str.length(); i = i + 2)
 {
  baos.write((HEXSTRING.indexOf(md5str.charAt(i)) << 4 | HEXSTRING
   .indexOf(md5str.charAt(i + 1))));
 }
 return new String(baos.toByteArray(), "ISO-8859-1");
 }
 /***
 * 模拟登录
 * @param qq QQ号码
 * @param password QQ密码
 * @throws Exception
 */
 public static void login(String qq, String password) throws Exception
 {
 HttpGet get = new HttpGet("https://ssl.ptlogin2.qq.com/check?uin="+ qq + "&appid=46000101&ptlang=2052&js_type=2&js_ver=10009&r=0.7948186025712065");
 HttpResponse response = client.execute(get);
 String entity = EntityUtils.toString(response.getEntity());
 String[] checkNum = entity.substring(entity.indexOf("(") + 1,entity.lastIndexOf(")")).replace("'", "").split(",");
 String pass = "";
 String responseData = "";
 // 获取验证码(如果有验证码输出到C:/code.jpg,查看后输入可继续执行
 if ("1".equals(checkNum[0]))
 {
  // uin为qq号或者微博用户名
  HttpGet getimg = new HttpGet("http://captcha.qq.com/getimage?aid=46000101&r=0.3478789969909082&uin=" + qq + "&vc_type=" + checkNum[1] + "");
  HttpResponse response2 = client.execute(getimg);
  OutputStream os = new FileOutputStream("c:/code.jpg");
  byte[] b = EntityUtils.toByteArray(response2.getEntity());
  os.write(b, 0, b.length);
  os.close();
  Scanner in = new Scanner(System.in);
  responseData = in.nextLine();
  in.close();
 }
 else
 {
  responseData = checkNum[1];
 }
 /** *******************加密密码 ************************** */
 pass = GetPassword(checkNum[2], password, responseData);
 /** *********************** 登录 *************************** */
 HttpGet getimg = new HttpGet("https://ssl.ptlogin2.qq.com/login?ptlang=2052&u="+ qq+ "&p="+ pass+ "&verifycode="+ responseData+ "&aid=46000101&target=top&u1=https%3A%2F%2Fopen.t.qq.com%2Fcgi-bin%2Foauth2%2Fauthorize%3Fclient_id%3D"
   + oAuth.getClientId()+ "%26response_type%3Dcode%26redirect_uri="+ oAuth.getRedirectUri()+ "&ptredirect=1&h=1&from_ui=1&dumy=&qlogin_param=abbfew=ddd&wording=%E6%8E%88%E6%9D%83&fp=loginerroralert&action=8-13-240977&g=1&t=1&dummy=&js_type=2&js_ver=10009");
 HttpResponse response2 = client.execute(getimg);
 HttpEntity httpentity = response2.getEntity();
 String entityxc = EntityUtils.toString(httpentity);
 System.out.println(entityxc);
 }

 /**
 *
 * 请求微博开放平台应用 返回登录授权页面,但是如果没有sessionKey的话永远登录不成功 sessionKey
 * 发现在返回的页面中一个input标签里放的url中有,所以要取到这个sessionKey 其实直接访问标签中的url就可以跳转
 *
 */
 public static String getUrl() throws ClientProtocolException, IOException
 {
 HttpGet getcode = new HttpGet("https://open.t.qq.com/cgi-bin/oauth2/authorize?client_id="+ oAuth.getClientId()+ "&response_type=code&redirect_uri="
     + oAuth.getRedirectUri()+ "&checkStatus=yes&appfrom=&g_tk&checkType=showAuth&state=");
 HttpResponse response3 = client.execute(getcode);
 HttpEntity entityqqq = response3.getEntity();
 String entityxcc = EntityUtils.toString(entityqqq);
 String form = entityxcc.substring(entityxcc.indexOf("<form"), entityxcc
  .indexOf("</form>"));
 String[] ss = form.split("/>");
 String input = "";
 for (int i = 0; i < ss.length; i++)
 {
  if (ss[i].indexOf("name=\"u1\"") > 0)
  {
  input = ss[i];
  }
  ;
 }
 return input.substring(input.indexOf("value=\"") + 7, input.indexOf("\" type=\""));
 }
 /**
 * 解析并设置Token
 * @param get
 * @throws Exception
 */
 public static void setToken(HttpGet get) throws Exception
 {
 HttpResponse response4 = client.execute(get);
 HttpEntity entityqqq1 = response4.getEntity();
 String getUrlcode = EntityUtils.toString(entityqqq1);
 // 返回了最终跳转的页面URL,也就是回调页redirect_uri,页面地址上包含code openid openkey
 // 需要将这三个值单独取出来再拼接成 code=xxxxx&openid=xxxxx&openkey=xxxxxx的形式
 String entity = getUrlcode.substring(getUrlcode.indexOf("url="),getUrlcode.indexOf("\">"));
 StringBuffer sb = new StringBuffer();
 String[] arr = entity.split("\\?")[1].split("&");
 for (int x = 0; x < arr.length; x++)
 {
  if (arr[x].indexOf("code") >= 0 || arr[x].indexOf("openid") >= 0
   || arr[x].indexOf("openkey") >= 0)
  {
  sb.append(arr[x] + "&");
  }
  ;
 }
 // 利用code获取accessToken
 OAuthV2Client.parseAuthorization(sb.substring(0, sb.length() - 1), oAuth);
 oAuth.setGrantType("authorize_code");
 OAuthV2Client.accessToken(oAuth);
 }
 /***
 * 调用(腾迅开放平台账户接口)获取一个人的信息
 * @throws Exception
 */
 public static void getInfo() throws Exception
 {
 //输出Token,如果拿到了Token就代表登录成功,并可以进行下一步操作。
 System.out.println("Token="+oAuth.getAccessToken());
 UserAPI getuser = new UserAPI(oAuth.getOauthVersion());
 String userJson = getuser.otherInfo(oAuth, "json", "", oAuth.getOpenid());
 JSONObject userJsonObject = JSONObject.fromObject(userJson);
 Integer errcode = (Integer) userJsonObject.get("errcode");
 if (errcode == 0)
 {
  JSONObject userdataJsonObject = (JSONObject) userJsonObject.get("data");
  System.out.println(userdataJsonObject.toString());
 }
 }

 public static void main(String[] args) throws Exception
 {
 init(oAuth);
 login("123145", "xxxx");
 HttpGet get = new HttpGet(getUrl());
 setToken(get);
 getInfo();
 }

}

4.发送成功都有对应的日志输出
新浪(最后一行日志):

 2078 DEBUG [2013-03-14 16:35:29]  {"created_at":"Thu Mar 14 16:35:30 +0800 2013","id":3555791132949940,"mid":"3555791132949940","idstr":"3555791132949940","text":"测试呢","source":"...

腾迅:

登录成功的日志标志: 
ptuiCB('0','0','https://open.t.qq.com/cgi-bin/oauth2/authorize?client_id=801216331&response_type=code&redirect_uri=http:','1','登录成功!', 'ㄗs:ヤ淡 啶');查看个人信息成功后的日志标志: 

QHttpClient httpGet [3] Response = {"data":{"birth_day":26,"birth_month":8,"birth_year":2011,"city_code":"2","comp":null,"country_code":"1","edu":null,"email":"","exp":141,"fansnum":..

日志未全列出,只是作为参考。

源码下载:http://xiazai.jb51.net/201607/yuanma/sinaAndTencent(jb51.net).rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java模拟登录新浪
java模拟登录新浪微博、java新浪微博登录、java实现新浪微博登录、用java发送腾讯微博、java 发送登录请求,以便于您获取更多的相关知识。

时间: 2024-11-03 19:10:08

Java模拟新浪和腾讯自动登录并发送微博_java的相关文章

android dialog 模拟新浪、腾讯title弹框效果

http://blog.csdn.net/jj120522/article/details/7764183 首先我们看一下新浪微博的效果(其它就是一个dialog):                                                       点击title前                                                    点击title后  实现方式:      首先我们要自定义一个dialog     代码如下:     

新浪、腾讯、搜狐微博S60V3客户端体验

Twitter发展的甚是凶猛,短短三年跻身世界前排名20强位列第11位(2010.07.03).国内的互联网大佬不甘寂寞,走在时代潮流的屁股后面,建立起了自己的T字号性感军团.截至发稿前,新浪(t.sina.com.cn).搜狐(t.sohu.com).腾讯(t.qq.com).网易(t.163.com).人民网(t.people.com.cn).凤凰网(t.ifeng.com)等已纷纷博起.好不壮观,此时不博何时博!时至今日,以新浪为代表的T字军团跑马圈地,纷纷建立起来自己的根据地发展的如火如

java 往新浪云部署 一直连接不上数据库 用户名和密码都已经配置对了呀,求大神解决

问题描述 java 往新浪云部署 一直连接不上数据库 用户名和密码都已经配置对了呀,求大神解决 报错内容 Caused by: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC

java链接新浪sae的共享mysql数据库连接一直超时TAT

问题描述 java链接新浪sae的共享mysql数据库连接一直超时TAT 代码如下 解决方案 应该是 "jdbc:mysql://w.rdc.sae.sina.com.cn:3307/app_doctor12" 你写成r.rdc了

js实现将选中内容分享到新浪或腾讯微博_javascript技巧

微博如火如荼,大家都选择用微博带来社会化流量,顺便推广产品和网站,几乎所有的网站都有分享到代码,但是还有一种更快捷的分享方式,javascript就可以实现将选定内容轻松分享到新浪微博和腾讯微博,效果图如下: 将选中的内容分享到新浪微博,腾讯微博实现js代码如下: <STYLE> .img_sina_share { DISPLAY: none; CURSOR: pointer; POSITION: absolute } .img_qq_share { DISPLAY: none; CURSOR

java解析新浪天气接口json的例子

java解析新浪天气接口json的例子 新浪天气返回的json数据 [     {         "currentCity": "厦门",         "pm25": "64",         "index": [             {                 "title": "穿衣",                 "zs&quo

新浪、腾讯微博开战 草根站长成被争夺的香饽饽

中介交易 SEO诊断淘宝客 站长团购 云主机 技术大厅 4月30日0点59分,知名站长郭吉军在站长社区爱聚集里发了一篇标题为"我说怎么今天新浪这么多人加我,原来被推到名人堂了"的日志,并迅速获得站长们的关注. "我们都'被'认证了."站长之家的总编邱松在腾讯微博中写道.他之所以这么写,是因为很多站长都围着他问如何才能得到腾讯微博的实名认证. 五一假期前夜,看似平静无奇的互联网世界,悄然冒起了战场硝烟.新浪微博和腾讯微博这两家被互联网业内人士看好的门户型微博终于短兵相

用行动支持奥运 搜狐、新浪、腾讯背景大变色

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断淘宝客 站长团购 云主机 技术大厅 喜迎奥运,网站大变色. 没错,用的是中国传统的,最喜庆的主题色--红色.我们同时也看到各大门户(搜狐,新浪,腾讯等)也都采取了行动,2008年是中国年,奥运年,作为一名互联网工作者,我们也应该为奥运,为祖国,为北京,献出自已一点有限的力量. 前段时间中国人民团结一致,抗震救灾,中国各大门户,博客全站变灰;这次全国人民再次团结起来,一起

新浪vs腾讯:谁才是中国的微博之王 推荐

   在不同的时期,作为普通网民的我们,在上网时习惯性会打开的应用或者网页都会有所不同.如果说过去"开QQ"是我们打开电脑.连上网络之后会做的第一件事的话,现在恐怕很多人会直接打开微博,看看有没有新的回复和私信联络,或者别人的交谈当中有没有提到你.甚至于每天起床的第一件事,就是打开手机上的微博客户端--微博已然成为一种我们日常的生活方式,而选择谁家的微博服务,也就成为了一个话题.    新浪微博和腾讯微博之争成为话题      这是因为,中国的互联网用户规模巨大,而对于平台来说,有规模