Java模擬新浪和騰訊自動(dòng)登錄并發(fā)送微博
Java模擬新浪和騰訊自動(dòng)登錄并發(fā)送微博功能分享給大家,供大家參考,具體內(nèi)容如下
1.準(zhǔn)備工作
只是登錄無(wú)需申請(qǐng)新浪和騰迅的開(kāi)發(fā)者賬號(hào),如果需要發(fā)送微博功能,需要申請(qǐng)一個(gè)新浪和騰迅的開(kāi)發(fā)者賬號(hào),并添加一個(gè)測(cè)試應(yīng)用。
過(guò)程請(qǐng)參考官方幫助文檔,申請(qǐng)地址:新浪:http://open.weibo.com 騰迅:http://dev.t.qq.com/
我們需要的是App Key和App Secre及redirect_URI,源代碼中已經(jīng)包含了我申請(qǐng)的測(cè)試key,但由于限制直接用我的key你們的賬號(hào)是無(wú)法登錄成功的。
2.注意事項(xiàng)
1)、需要注意的是應(yīng)用的App Key和App Secre及redirect_URI,對(duì)應(yīng)項(xiàng)目根目錄下的config.properties配置文件中的
client_ID=1745656892
client_SERCRET=66056719c1d8ca7bcaf36f411217cefa
redirect_URI=www.baidu.com
redirect_URI由于只是測(cè)試用并沒(méi)有直接的回調(diào)頁(yè)面,所以這里隨便填寫(xiě)一個(gè)地址就行了,但要注意與應(yīng)用-高級(jí)設(shè)置里的“回調(diào)頁(yè)面”一致。
2)、代碼中的測(cè)試賬號(hào)需要要自己添加測(cè)試賬號(hào),新浪的在“應(yīng)用信息-測(cè)試賬號(hào)”;騰迅的在“權(quán)限控制-創(chuàng)建白名單”中。當(dāng)然直接用 開(kāi)發(fā)者賬號(hào)也可以。
3)、發(fā)送微博引用了新浪的weibo4j-oauth2-beta2.1.1.zip,騰迅的Java_SDK_v1.2.1.7z。核心類(lèi)在util包下。
3.關(guān)鍵代碼
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;
/***
* 模擬自動(dòng)登錄并發(fā)微博
* @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);
//應(yīng)用的App Key
postMethod.addParameter("client_id",clientId);
//應(yīng)用的重定向頁(yè)面
postMethod.addParameter("redirect_uri",redirectURI);
//模擬登錄參數(shù)
//開(kāi)發(fā)者或測(cè)試賬號(hào)的用戶名和密碼
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;
}
/**
* 發(fā)微博
* @param token 認(rèn)證Token
* @param content 微博內(nèi)容
* @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(),"測(cè)試呢");
}
}
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;
/***
* 騰迅自動(dòng)登錄并獲取個(gè)人信息
* @author zdw
*
*/
public class Tencent
{
public static final String HEXSTRING = "0123456789ABCDEF";
public static OAuthV2 oAuth = new OAuthV2();
private static HttpClient client = new DefaultHttpClient();
// 初始o(jì)Auth應(yīng)用信息
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 }
* 返回的第三個(gè)值
* @param password
* QQ密碼
* @param verifycode
* 驗(yàn)證碼
* @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號(hào)碼
* @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 = "";
// 獲取驗(yàn)證碼(如果有驗(yàn)證碼輸出到C:/code.jpg,查看后輸入可繼續(xù)執(zhí)行
if ("1".equals(checkNum[0]))
{
// uin為qq號(hào)或者微博用戶名
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);
}
/**
*
* 請(qǐng)求微博開(kāi)放平臺(tái)應(yīng)用 返回登錄授權(quán)頁(yè)面,但是如果沒(méi)有sessionKey的話永遠(yuǎn)登錄不成功 sessionKey
* 發(fā)現(xiàn)在返回的頁(yè)面中一個(gè)input標(biāo)簽里放的url中有,所以要取到這個(gè)sessionKey 其實(shí)直接訪問(wèn)標(biāo)簽中的url就可以跳轉(zhuǎn)
*
*/
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=\""));
}
/**
* 解析并設(shè)置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);
// 返回了最終跳轉(zhuǎn)的頁(yè)面URL,也就是回調(diào)頁(yè)redirect_uri,頁(yè)面地址上包含code openid openkey
// 需要將這三個(gè)值單獨(dú)取出來(lái)再拼接成 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);
}
/***
* 調(diào)用(騰迅開(kāi)放平臺(tái)賬戶接口)獲取一個(gè)人的信息
* @throws Exception
*/
public static void getInfo() throws Exception
{
//輸出Token,如果拿到了Token就代表登錄成功,并可以進(jìn)行下一步操作。
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.發(fā)送成功都有對(duì)應(yīng)的日志輸出
新浪(最后一行日志):
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":"測(cè)試呢","source":"...
騰迅:
登錄成功的日志標(biāo)志:
ptuiCB('0','0','https://open.t.qq.com/cgi-bin/oauth2/authorize?client_id=801216331&response_type=code&redirect_uri=http:','1','登錄成功!', 'ㄗs:ヤ淡 啶');查看個(gè)人信息成功后的日志標(biāo)志:
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":..
日志未全列出,只是作為參考。
源碼下載
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JavaWeb使用Cookie模擬實(shí)現(xiàn)自動(dòng)登錄功能(不需用戶名和密碼)
- java實(shí)現(xiàn)用戶自動(dòng)登錄
- JAVA爬蟲(chóng)實(shí)現(xiàn)自動(dòng)登錄淘寶
- java驗(yàn)證用戶是否已經(jīng)登錄 java實(shí)現(xiàn)自動(dòng)登錄
- Java傳入用戶名和密碼并自動(dòng)提交表單實(shí)現(xiàn)登錄到其他系統(tǒng)的實(shí)例代碼
- 詳解JavaEE使用過(guò)濾器實(shí)現(xiàn)登錄(用戶自動(dòng)登錄 安全登錄 取消自動(dòng)登錄黑用戶禁止登錄)
- java 驗(yàn)證用戶是否已經(jīng)登錄與實(shí)現(xiàn)自動(dòng)登錄方法詳解
- java web實(shí)現(xiàn)自動(dòng)登錄功能
- JavaWeb開(kāi)發(fā)使用Cookie創(chuàng)建-獲取-持久化、自動(dòng)登錄、購(gòu)物記錄、作用路徑
- java web實(shí)現(xiàn)自動(dòng)登錄
相關(guān)文章
Spring?Boot?3.1中整合Spring?Security和Keycloak的方法
本文介紹在最新的SpringBoot3.1版本之下,如何將Keycloak和Spring?Security一起跑起來(lái),文中結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-06-06
springmvc 中dao層和service層的區(qū)別說(shuō)明
這篇文章主要介紹了springmvc 中dao層和service層的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
MyBatis 添加元數(shù)據(jù)自定義元素標(biāo)簽的實(shí)現(xiàn)代碼
這篇文章主要介紹了MyBatis 添加元數(shù)據(jù)自定義元素標(biāo)簽的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
SpringBoot Application注解原理及代碼詳解
這篇文章主要介紹了SpringBoot Application注解原理及代碼詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Spring Cloud Feign接口返回流的實(shí)現(xiàn)
這篇文章主要介紹了Spring Cloud Feign接口返回流的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10

