تحاكي Java Sina و Tencent تسجيل الدخول تلقائيًا وترسل وظائف Weibo إلى الجميع للرجوع إليها. المحتوى المحدد كما يلي
1. التحضير
ما عليك سوى تسجيل الدخول دون التقدم بطلب للحصول على حساب مطور Sina و Tencent. إذا كنت بحاجة إلى إرسال وظيفة Weibo ، فيجب عليك التقدم بطلب للحصول على حساب مطور Sina و Tencent وإضافة تطبيق اختبار.
يرجى الرجوع إلى وثيقة المساعدة الرسمية لهذه العملية. عنوان التطبيق: sina: http://open.weibo.com tengxun: http://dev.t.qq.com/
ما نحتاجه هو مفتاح التطبيق ، App Secre و Redirect_uri. يحتوي الكود المصدري بالفعل على مفتاح الاختبار الذي تقدمت إليه ، ولكن بسبب القيود ، لا يمكن تسجيل حساب حسابك بنجاح باستخدام مفتاحي مباشرة.
2. أشياء يجب ملاحظتها
1) تجدر الإشارة إلى أن مفتاح تطبيق التطبيق والتطبيق SECRE و REDIRECT_URI موجودون في ملف تكوين config.properties في الدليل الجذر للمشروع.
Client_id = 1745656892
client_sercret = 66056719C1D8CA7BCAF36F411217CEFA
redirect_uri = www.baidu.com
نظرًا لأن Redirect_uri يستخدم فقط للاختبار وليس لديه صفحة رد اتصال مباشر ، يمكنك فقط ملء عنوان هنا ، ولكن كن حذرًا لتكون متسقة مع "صفحة رد الاتصال" في إعدادات التطبيق المتقدمة.
2) يحتاج حساب الاختبار في الكود إلى إضافة حساب الاختبار بنفسك. سينا "حساب معلومات التطبيق" ؛ Tengxun "القائمة البيضاء الإذن التحكم". بالطبع ، من الممكن أيضًا استخدام حساب المطور مباشرة.
3) أرسل Weibo إلى اقتباس Sina's Weibo4j-Oauth2-Beta2.1.1.zip و Tengxun 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.cond. org.apache.commons.httpclient.params.httpmethodparams ؛ import org.apache.http.httpexception ؛ import org.core.weibo.sina.oauth ؛ استيراد org.core.weibo.sina.timeline ؛ import org.core.weibo.sina.http.achtp.achtp.achtp.achtin ؛ org.core.weibo.sina.model.weiboException ؛ import org.core.weibo.sina.weibo4j.util.weiboconfig ؛/**** كلمة المرور * return * throws httpexception * throws ioException */ accesstoken statoken public getToken (string username ، string password) يلقي httpexception ، ioException {String clientId = weiboconfig.getValue ("client_id") ؛ string redirecturi = weiboconfig.getValue ("redirect_uri") ؛ url url = weiboconfig.getValue ("Offecturl") ؛ postmethod postmethod = postmethod جديد (url) ؛ // مفتاح التطبيق postmethod.adddarameter ("client_id" ، clientId) ؛ // app's redirect page postmethod.addparameter ("redirect_uri" ، redirecturi) ؛ . postmethod.adddarameter ("passwd" ، كلمة المرور) ؛ postmethod.addparameter ("Isloginsina" ، "0") ؛ postmethod.addparameter ("الإجراء" ، "إرسال") ؛ postmethod.addparameter ("reponse_type" ، "code") ؛ httpmethodparams param = postmethod.getParams () ؛ param.setContentCharset ("UTF-8") ؛ // إضافة قائمة معلومات الرأس <Header> headers = new ArrayList <Header> () ؛ headers.add (رأس جديد ("المرجع" ، "https://api.weibo.com/oauth2/authorize؟client_id="+ cclientid+"&redirect_uri="+ redrecturi+"&from=sina&response_type=code"))) ؛ headers.add (رأس جديد ("مضيف" ، "api.weibo.com")) ؛ Headers.Add (رأس جديد ("مستخدم عامل" ، "Mozilla/5.0 (Windows NT 6.1 ؛ RV: 11.0) Gecko/20100101 Firefox/11.0") ؛ httpclient client = new httpclient () ؛ client.gethostconfiguration (). getParams (). client.executemethod (postmethod) ؛ int status = postmethod.getStatusCode () ؛ system.out.println (الحالة) ؛ if (الحالة! = 302) {system.out.println ("فشل تحديث الرمز المميز") ؛ العودة لاغية. } // حل موقع رأس الرمز المميز = postmethod.getResponseHeader ("الموقع") ؛ if (location! = null) {string returl = location.getValue () ؛ int begin = returl.indexof ("code =") ؛ if (start! = -1) {int end = returl.indexof ("&" ، start) ؛ if (end == -1) end = returl.length () ؛ رمز السلسلة = returl.substring (ابدأ + 5 ، نهاية) ؛ if (code! = null) {oauth oauth = new oauth () ؛ حاول {AccessToken Token = Oauth.getAccessTokenBycode (Code) ؛ الرمز الرمز المميز. } catch (استثناء e) {E.PrintStackTrace () ؛ }}}} إرجاع null ؛ } / ** * أرسل Weibo * param token token adken * param content content weibo * regurn * @throws استثناء * / public static boolean sinasendweibo (Tring token ، string content) يلقي استثناء {boolean flag = false ؛ الجدول الزمني جدول زمني = جدول زمني جديد () ؛ timeline.client.settoken (رمز) ؛ حاول {timeline.updatestatus (المحتوى) ؛ العلم = صحيح ؛ } catch (weiboException e) {flag = false ؛ System.out.println (E.GeterRorCode ()) ؛ } العلم الإرجاع ؛ } static void main (string [] args) يلقي الاستثناء {AccessToken at = getToken ("xxxx" ، "xxx") ؛ sinasendweibo (at.getAccessToken () ، "test") ؛ }} 2) Tengxun
package org.Utils ؛ import java.io.bytearrayoutputstream ؛ import java.io.fileOutputStream ؛ import java.io.ioException ؛ import java.io.outputstream ؛ java.io.unsupportedencodexception ؛ import java.security.messagedigest net.sf.json.jsonobject ؛ import org.apache.http.httpentity ؛ import org.apache.http.httprespons org.apache.http.client.methods.httpget ؛ import org.apache.http.impl.client.defaulthttpclient ؛ import org.apache.http.util.entityutils ؛ import org.core.tencent.api.userapi ؛ org.core.weibo.tencent.oauthv2.oauthv2 ؛ import org.core.weibo.tencent.oauthv2.oauthv2client ؛/****Tengxun يسجل تلقائيًا في السلسلة النهائية (012345567999999999999999999999999999999999999999999999999999999999999999991111234999999999999111212012. public static oauthv2 oauth = new oauthv2 () ؛ عميل httpclient ثابت خاص = جديد defaulthttpclient () ؛ . Oauth.SetClientscret ("EA71B26B0CBE5778CDD1C09AD1753A3") ؛ Oauth.setredirecturi ("http://www.tencent.com/zh-cn/index.shtml") ؛ }/** * * * param qq * http://check.ptlogin2.qq.com/check؟uin= {0 )&appid=15000101&r= {1} سلسلة getPassword (سلسلة QQ ، كلمة مرور السلسلة ، سلسلة verifyCode) يلقي الاستثناء {String p = hexchar2bin (md5 (password)) ؛ string u = md5 (p + hexchar2bin (qq.replace ("// x" ، "") .ToupperCase ())) ؛ String V = MD5 (U + VerifyCode.toupperCase ()) ؛ العودة v ؛ } السلسلة الثابتة العامة MD5 (String OriginalText) يلقي الاستثناء {byte buf [] = OriginalText.getBytes ("ISO-8859-1") ؛ StringBuffer HexString = new StringBuffer () ؛ نتيجة السلسلة = "" ؛ سلسلة الرقم = "" ؛ حاول {messagedigest خوارزمية = messagedigest.getInstance ("MD5") ؛ GALGORITHM.RESET () ؛ GALGORITHM.UPDATE (BUF) ؛ Byte [] Digest = GALGORITHM.DIGEST () ؛ لـ (int i = 0 ؛ i <digest.length ؛ i ++) {digit = integer.toHexString (0xff & digest [i]) ؛ if (digit.length () == 1) {digit = "0" + digit ؛ } hexstring.append (digit) ؛ } النتيجة = hexstring.toString () ؛ } catch (استثناء ex) {result = "" ؛ } return result.toupperCase () ؛ } سلسلة ثابتة عامة hexchar2bin (سلسلة MD5STR) ترمي UnsupportedEncodingException {bytearrayoutputstream baos = new ByTearRayoutputStream (md5str.length () / 2) ؛ لـ (int i = 0 ؛ i <md5str.length () ؛ i = i + 2) {baos.write ((hexstring.indexof (md5str.charat (i)) << 4 | hexstring .indexof (md5str.charat (i + 1)))) ؛ } إرجاع سلسلة جديدة (baos.tobytearray () ، "ISO-8859-1") ؛ }/**** تسجيل الدخول المحاكاة* param qq qq رقم* param password qq password* athrows استثناء*/تسجيل الدخول الفراغ العام الثابت (سلسلة QQ ، كلمة مرور السلسلة) رمي الاستثناء {httpget get = new httpget ("https://ssl.ptlogin2 "& appid = 46000101 & ptlang = 2052 & js_type = 2 & js_ver = 10009 & r = 0.7948186025712065") ؛ httpresponse استجابة = client.execute (get) ؛ string estity = entityUtils.ToString (response.getentity ()) ؛ String [] checkNum = entity.substring (entity.indexof ("(" ("(" + 1 ، entity.lastindexof (")")). استبدال ("" "،" ") .Split (" ، ") ؛ سلسلة PASS = "" ؛ سلسلة revieData = "" ؛ // احصل على رمز التحقق (إذا كان هناك إخراج رمز التحقق إلى C: /Code.jpg ، أدخله واستمر في التنفيذ إذا ("1". httpget ("http://captcha.qq.com/getimage؟aid=46000101&r=0.347878999699082&uin=" + qq + "& vc_type =" + checknum [1] + ") ؛ httpresponse استجابة 2 = client.execute (getImg) ؛ OutputStream OS = جديد fileOutputStream ("C: /Code.jpg") ؛ byte [] b = entityUtils.TobyTearRay (response2.getentity ()) ؛ OS.Write (B ، 0 ، B.Length) ؛ OS.Close () ؛ الماسح الضوئي في = ماسح ضوئي جديد (system.in) ؛ Responsedata = in.nextLine () ؛ in.close () ؛ } آخر {responsedata = checkNum [1] ؛ } / ** ************ المستخدم ) "& Aid = 46000101 & Target = Top & U1 = https ٪ 3a ٪ 2fopen.t.qq.com ٪ 2fcgi-bin ٪ 2foauth2 ٪ 2fauthorize ٪ 3fclient_id ٪ 3d"+ oauth.getClientId ()+ "٪ 26Response_type ٪ 3dcode ٪ 26redirect. Oauth.getredirecturi ()+ "& ptredirect = 1 & h = 1 & from_ui = 1 & dumy = & qlogin_param = abbfew = ddd & warding = ٪ e6 ٪ 8e ٪ 88 ٪ e6 ٪ 9d ٪ 83 & fp = loginerroralert & action = 8-13-240977 & g = 1 & t = 1 & dummy = httpresponse استجابة 2 = client.execute (getImg) ؛ httpentity httpentity = response2.getentity () ؛ سلسلة entityxc = entityUtils.ToString (httpentity) ؛ System.out.println (entityxc) ؛ } /** * * طلب تطبيق Weibo Open Platform للعودة إلى صفحة تفويض تسجيل الدخول ، ولكن إذا لم يكن هناك SessionKey ، فلن يكون تسجيل الدخول ناجحًا أبدًا. تم العثور على SessionKey في عنوان URL الموضوعة في علامة إدخال في الصفحة التي تم إرجاعها ، لذلك تحتاج إلى الحصول على هذا SessionKey. في الواقع ، يمكنك الوصول مباشرة إلى عنوان URL في العلامة والقفز */السلسلة الثابتة العامة geturl () رمي clientprotocolexception ، ioException {httpget getCode = new httpget ( "& response_type = code & redirect_uri =" + oauth.getRedirecturi () + "& checkStatus = yes & appfrom = & g_tk & checkType = showauth & state =") ؛ httpresponse استجابة 3 = client.execute (getCode) ؛ httpentity entityqqq = response3.getentity () ؛ سلسلة entityxcc = entityUtils.ToString (entityqqq) ؛ نموذج السلسلة = entityxcc.subString (entityxcc.indexof ("<form") ، entityxcc .Indexof ("</form>")) ؛ String [] ss = form.split ("/>") ؛ إدخال سلسلة = "" ؛ لـ (int i = 0 ؛ i <ss.length ؛ i ++) {if (ss [i] .indexof ("name =/" u1/"")> 0) {input = ss [i] ؛ } ؛ } إرجاع الإدخال. reponsed4.getentity () ؛ entity = geturlcode.subString (geturlcode.indexof ("url =") ، geturlcode.indexof ("/"> ")) ؛ StringBuffer SB = New StringBuffer () ؛ String [] arr = entity.split ("//؟") [1] .Split ("&") ؛ لـ (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]+"&") ؛ } ؛ } // استخدم التعليمات البرمجية للحصول على AccessToken OauthV2Client.Parseauthorization (SB.SubString (0 ، SB.Length () - 1) ، OAuth) ؛ Oauth.setGrantType ("eventize_code") ؛ OAuthv2Client.AccessToken (OAuth) ؛ } /**** استدعاء (واجهة حساب النظام الأساسي المفتوح Tengxun) للحصول على معلومات الشخص* athrows استثناء* /public static void getInfo () يلقي الاستثناء {// إخراج الرمز المميز. إذا حصلت على الرمز المميز ، فهذا يعني أن تسجيل الدخول ناجح ويمكنك إجراء العملية التالية. system.out.println ("token ="+oauth.getAccessToken ()) ؛ userapi getUser = جديد 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) يرمي الاستثناء {init (oauth) ؛ تسجيل الدخول ("123145" ، "xxxx") ؛ httpget get = new httpget (geturl ()) ؛ settoken (الحصول) ؛ getInfo () ؛ }} 4. سيكون هناك إخراج السجل المقابل عند الإرسال بنجاح
سينا (السطر الأخير من السجل):
2078 Debug [2013-03-14 16:35:29] {"create_at": "Thu Mar 14 16:35:30 +0800 2013 "،" ID ": 355579113294940 ،" MID ":" 355579113294940 "،" IDSTR ":" 355579113294940 "،" text ":" test "،" المصدر ":" ... "...
تينغ شون:
علامة تسجيل لوجود تسجيل الدخول الناجح:
ptuicb ('0' ، '0' ، 'https: //open.t.qq.com/cgi-bin/oauth2/authorize؟ client_id = 801216331 & response_type = code & redirect_uri = http:' 1 '،' login نجح!
qhttpclient httpget [3] استجابة = {"بيانات": {"birth_day": 26 ، "birth_month": 8 ، "birth_year": 2011 ، "city_code": "2" ،
السجلات غير مدرجة بالكامل ، ولكن للرجوع إليها فقط.
رمز المصدر تنزيل:
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.