欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-31 21:05:52
java模拟新浪和腾讯自动登录并发送微博功能分享给大家,供大家参考,具体内容如下 1.准备工作 只是登录无需申请新浪和腾迅的开发者账号,如果需要发送微博功能,需要申请一...

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

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

过程请参考官方帮助文档,申请地址:新浪:http://open.weibo.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

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