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

前端技术 2023/09/03 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.phpstudy.net/201607/yuanma/sinaAndTencent(phpstudy.net).rar

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

本文地址:https://www.stayed.cn/item/8185

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。