우선, Weibo 개발자 계정이 필요합니다. 우리에게 필요한 것은 앱 키, 앱 비밀 및 redirect_uri입니다. 회사는 원래이 단계를 밟았으므로 저장했습니다. 바이두어에는 많은 검색이 있습니다.
좋아, 지금 시작하자 :
먼저이 코드를 온라인으로 찾았고 여기에 링크를 썼습니다.
나는 한 번에 그것을 해결하게되어 매우 기뻤습니다. 그러나 " 토큰 새로 고침 실패 "오류가 발생했습니다. 코드를 읽은 후, 나는 302가 아닌 200을 반환했으며 약간 혼란 스러웠습니다. 내가 왜 이런 일이 일어 났는지에 대해 어떻게 연구하든 그가 브라우저에 생성 한 URL을 넣고 읽었습니다. 인증 페이지를 입력했는데 먼저 로그인 할 필요가 없었습니다. F12를 살펴본 후 실제로 200 이었으므로 성공적으로 로그인하지 않았기 때문에 Weibo Backend에 로그인하여 그러한 코드를 찾기 시작했습니다. 원래 주소는 잊혀졌으며 원래 저자는 당황했습니다.
package com.spider.httpclient; import java.io.bufferedReader; import java.io.ioException; import java.io.inputStream; import java.io.inputStreamreader; import java.net.uri; import java.net.urisyntaxection; import java.net.urlencoder; java.util.date; import java.util.list; import javax.script.invocable; import javax.script.scripttengine; import javax.script.script.scriptengeemanager; import javax.script.scriptexception; import org.apache.commons.commons.binary.base64; import org.htec. org.apache.http.httpentity; import org.apache.http.httpresponse; import org.apache.http.namevaluepair; import org.apache.http.client.clientprotocolexception; import org.apache.http.client.httpclient; org.apache.http.client.config.cookiespecs; import org.apache.http.client.entity.urlencodedformentity; import org.apache.http.client.methods.httpget; import org.apache.http.client.methods.httpost; org.apache.http.config.registry; import org.apache.http.config.registryBuilder; import org.apache.http.cookie.cookiespec; import org.apache.http.cookie.cookiespecprovider; import org.apache.http.mpl.client.basicciestore org.apache.http.impl.client.httpclients; import org.apache.http.impl.cookie.defaultcookiespec; import org.apache.http.impl.cookie.defaultCookiespecprovider; import org.apache.message.basicnamevaluepair; org.apache.http.protocol.httpcontext; import org.apache.http.util.entityutils; import com.alibaba.fastjson.jsonarray; import com.alibaba.fastjson.jsonobject;/*** sina weibo login, 4 월 7 일 08:16, and and and and and and and and and and and and and and and and and and and and and and and and and and and and and and and and and and and and and and and then 암호화 방법은 js * * @author tom */public class sinaweibologger {private httpclient client; 개인 httppost 게시물; 개인 httpget get; Private BasicCookiestore Cookiestore; 개인 문자열 사용자 이름; // 일반 텍스트 계정 개인 문자열 비밀번호; // 일반 텍스트 비밀번호 개인 문자열 su; // base64 암호화 된 계정 개인 문자열 sp; // rsa 암호화 된 비밀번호 // 프리 로그 정보에 필요한 데이터는 개인 Long Servertime을 시작합니다. // 서버 타임 스탬프 개인 문자열 nonce; // 서버는 문자열 개인 문자열 RSAKV를 반환합니다. // 서버는 문자열을 반환하고 RSA 암호화 암호는 개인 문자열 pubkey입니다. // Server는 RSA 암호화 Private Int Retcode에 사용되는 RSA 암호화 공개 키를 반환합니다. // 상태 값 비공개 문자열 PCID; 개인 int is_openlock; 개인 int showpin; 개인 INT 실행; // 프리 로그 인 정보 종료 // 로그인 한 후 JSON 데이터를 반환 개인 문자열 UID; 개인 문자열 Nick; 개인 jsonarray 도메인; // private StringBuffer HeaderCookie = new StringBuffer (); // 암호 로그인 암호화 js 파일 콘텐츠 개인 정적 문자열 sina_js = "var sinassoencoder = sinassoencoder || {}; core_sha1 = function (x, len) {x [len >> 5] | = 0x80 << (24-len%32); x [((len+64 >> 9) << 4) +15] = len; var w = array (80); var a = 1732584193; var b = -271733879; var c = -17258; d = 271733878; var e = -1009589776; for (var i = 0; i <x.length; i+= 16) {var olda = a; var oldb = b; var oldd = c; var oldd = d; var old = e; for (var j = 0; j <80; w [j] = rol (w [j-3]^w [j-8]^W [j-14]^w [J-16], 1); var t = safe_add (safe_add (rol (a, 5), sha1_ft (j, b, c, d)), safe_add (safe_add (e, w [j]), sha1_kt (j)); e = d; d = c; c = rol (b, 30) ; b = a; a = t;} a = safe_add (a, olda); b = safe_add (b, oldb); c = safe_add (c, oldc); d = safe_add (d, oldd); e = safe_add (e, old);} 반환 배열 (a, b, b, c, d, e);}; var sha1_ft = function (t, b, c, d) {if (t <20) return (b & c) | (~ b) & d); if (t <40) b^c^d; if (t <60) retur (b & c) | (b & d) | (c & d); (c & d); SHA1_KT = function (t) {return (t <20)? 1518500249 : (t <40)? 1859775393 : (t <60)? -1894007588 : -899497514;}; var safe_add = function (x, y) {var lsw = (x & 0xff)+(& 0xff); msw = (x >> 16)+(y >> 16)+(lsw >> 16); return (msw << 16) | (lsw & 0xfff);}; var rol = function (num, cnt) {return (num << cnt) | (num >>> (32-cnt); var str2binb = function (str) {var bin = var 마스크 = (1 << chrsz) -1; for (var i = 0; i <str.length*chrsz; i+= chrsz) bin [i >> 5] | = (str.charcodeat (i/chrsz) & mask) << (24-i%32); 반환 빈;}; var binb2hex = function) {var hex_tab = hexcase? '0123456789ABCDEF': '0123456789ABCDEF'; var str = ''; for (var i = 0; i <binarray.length*4; i ++) {str+= hex_tab.charat ((binarray [i >> 2] >> ((3-i%4)*8+4) & 0xf)+hex_tab.charat ((binarray [i >> 2] >> ((3-i%4)*8)))); str;}; this.base64 = {encode : function (input) {input = '+input; if (input ==' ') return' '; var output ='; var chr1, chr3 = ''; var ec1, enc2, enc3, enc4 = ''; var i = 0; do {chr1 = input.charcodeat (i ++); chr2 = input.charcodeat (i ++); chr3 = input.charcodeat (i ++); enc1 = chr1 >> 2; en c2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isnan (chr2)) {enc3 = enc4 = 64;} else if (isnan (chr3)) {enc4 = 64;} output = output+this._keys.charat (enc1)+this._keys.charat (enc2)+this._keys.char at (enc3)+this._keys.charat (enc4); chr1 = chr2 = chr3 = ''; enc1 = enc2 = enc3 = enc3 = enc4 = '';} while (i <input.length); return 출력;}, _ 키 : 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/='};}). CALL (sinassoencoder); (function () {var dbits; var canary = 0xdeadbeefefefe; j_lm = ((Canary & 0xffffffff) == 0xefcafe); 함수 biginteger (a, b, c) {if (a! = null) if ( 'number'== typeof a) this.fromNumber (a, b, c); 그렇지 않으면 (b == null && 'string'! = typeof a) this (256); this.fromString (a, b);} 함수 nbi () {return new biginteger (null);} 함수 am1 (i, x, w, w, w, j, c, n) {while (-n> = 0) {var v = x*this [i ++]+w [j]+c; c = math.floor (v/0x40000); C;} 함수 am2 (i, x, w, j, c, n) {var xl = x & 0x7fff, xh = x >> 15; while (-n> = 0) {var l = this [i] & 0x7ff; var h = this [i ++] >> 15; var M = xh*l+h*xl; l = xl*l+((m & 0x7ffff) << 15)+w [j]+(c & 0x3fffffff); c = (l >> 30)+(m >>> 15)+xh*h+(c >> 30); w [j ++] = l & 0x3fffffffffffffffffffffffffffffffffffffffffffffffff; am3 (i, x, w, j, c, n) {var xl = x & 0x3ffff, xh = x >> 14; while (-n> = 0) {var l = this [i] & 0x3ffff; var h = this [i ++] >> 14; var M = xh*l+h*xl; l = xl*l+((m & 0x3ffff) << 14)+w [j]+c; c = (l >> 28)+(m >> 14)+xh*h; w [j ++] = l & 0xfffffff;} return c;} biginteger.prototype.am = am3; dbits = 28; biginteger.prototype.db = dbits; biginteger.dm = ((1 << dbits) -1); biginteger.prototype.dv = (1 << dbits); var bi_fp = 52; biginteger.prototype.fv = math.pow (2, bi_fp); biginteger.prototype.f1 = bi_fp-dbits; biginteger.prototype.f2 = 2*dbits-bi_fp; var bi_rm = '0123456789abcdefghghghghghgghghgghghghgghghghgghghgghghghgghgghgghgghghghgghgghghgghghgghgghgghgghghghgghgghgghgghgghgghgghghgghgghgghi bi_rc = new Array (); var rr, vv; rr = '0'.charcodeat (0); for (vv = 0; vv <= 9; ++ vv) bi_rc [rr ++] = vv; rr ='a'.charcodeat (0); for (vv = 10 ; vv <36; ++ vv) bi_rc [rr ++] = vv; rr = 'a'.charcodeat (0); for (vv = 10; vv <36; ++ vv) bi_rc [rr ++] = vv; 함수 int2char (n) {return bi_rm.charat (n);} 함수 intat (s, i) {var c = bi_rc [s.charcodeat (i)]; return (c == null)? -1 : c;} 함수 bnpcopyto (r) {for i = this.t-1; i> = 0;-i) r [i] = this [i]; rt = this.t; rs = this.s;} 함수 bnpfromint (x) {this.t = 1; this.s = (x <0)? -1 : 0; if (x> 0) this [x <-1) this [0] = x+dv; nbv (i) {var r = nbi (); r.fromint (i); return r;} 함수 bnpfromstring (s, b) {var k; if (b == 16) k = 4; 그렇지 않으면 (b == 8) k = 3; else (b == 256) k = 8; 그렇다면 (b == 2) k = 1; if (b == 4) k = 2; else {this.fromradix (s, b); return;} this.t = 0; this.s = 0; var i = s.length, mi = false, sh = 0; while (-i> = 0) {var x = (k == 8)? s [i] & 0xff : intat (s, i); if (x <0) {if (s.charat (i) == '-') mi = true; mi = false; if (sh == 0) this.t ++] = x; else if (sh+k> this.db) {this [this.t-1] | = (x & ((1 << (this.db-sh)))) << sh; this [this.t ++] = (x >> (this.db-sh));} else 이 [this.t-1] | = x << sh; sh+= k; if (sh> = this.db) sh- = this.db;} if (k == 8 && (s [0] & 0x80)! = 0) {this.s = -1; if (sh> 0) th [this.t-1] | = ((1 << (this.db-sh)) -1) << sh;} this.clamp (); if (mi) biginteger.zero.subto (this, this);} 함수입니다 bnpclamp () {var c = this.s & this.dm; while (this.t> 0 && this.t [this.t-1] == c)-this.t;} 함수 bntoString (b) {if (this.s <0) return '-'+this.negate (b); var k; if (b == 16); if (b == 2) k = 1; 다른 if (b == 32) k = 5; else (b == 4) k = 2; 그렇지 않으면 this.toradix (b); var km = (1 << k) -1, d, m = false, r = '', i = this.t; var p = this.db- (i*this.db)%k; if (i-> 0) {if (p <this.db && (d = this [i] >> p)> 0) {m = true; r = int2char (d);} while (i> = 0) {if (p <k) {d = (this [i] & (1 << p)) <<) << (kp); d | = this [-i] >> (p+= this.db-k);} else {d = (this [i] >> (p- = k)) & km; if (p <= 0) {p+= this.db;-i;}} if (d> 0) m = true; if (m) r+= int2char (d); m? r : '0';} 함수 bnnegate () {var r = nbi (); biginteger.zero.subto (this, r); return r;} function bnabs () {return (this.s <0)? i = this.t; r = ia.t; if (r! = 0) r; rack r; while (-i> = 0) if ((r = this [i] -a [i])! = 0) return r; return 0;} 함수 nbits (x) {var r = 1, t; if (((t = x >>> 16)! = 0) {x = t; r+= 16;} if (((t = x >> 8)! = 0) {x = t; r+= 8;} if ((t = x >> 4) ! = 0) {x = t; r+= 4;} if ((t = x >> 2)! = 0) {x = t; r+= 2;} if ((t = x >> 1)! = 0) {x = t; r+= 1;} return r;} 함수 bnbitlength () {if (this.t <= 0) 반환 0; return this.db*(this.t-1)+nbits (this [this.t-1]^(this.s & this.dm));} 함수 bnbitlength () {if (this.t <= 0) return 0; return this.db*(this.t-1)+nbits (this [this.t-1]^(this.s & this.dm));} 함수 bnpdlshiftto (n, r) {var for (i = this.t-1; i> = 0; -i) r [i+n] = this [i]; for (i = n-1; i> = 0; -i) r [i] = 0; rt = this.t.t+n; rs = this.s;} 함수 bnpdrshiftto (n, r) {for i = n; i <this.t.t; ++ i) r [in] = this [i]; rt = math.max (this.tn, 0); rs = this.s;} 함수 bnplshiftto (n, r) {var bs = n%this.db; var cbs = this.db-bs; var bm = (1 <cbs) -1; var ds = math.floor (n/this.db), c = (this.s << bs) & this.dm, i; for (i = this.t-1; i> = 0;-i) {r [i+ds+1] = (this [i] >> cbs) | c; c = (this [i] & bm) << bs;}는 (i = ds-1; i> = 0; -i) r [i] = 0; r [ds] = c; rt = this.t.t+ds+1; rs = this.s; r.clamp ();} 함수 bnprshiftto (n, r) {rs = this.s; var ds = math.floor (n/this.db); if (ds> = this.t) {rt = 0; return;} var bs = n%this.db; var cbs = this.db-bs; var bm = (1 << bs) -1; r [0] = this [ds]; i = ds+1; i <this.t; ++ i) {r [i-ds-1] | = (this [i] & bm) << cbs; r [i-ds] = this [i] >> bs;} if (bs> 0) r [this.t-ds-1] | = (this.s & bm) << cbs; bnpsubto (a, r) {var i = 0, c = 0, m = math.min (at, this.t); is.dm; c >> = this.db;} c+= this.s;} else {c+= this.s; while (i <at) {c- = a [i]; r [i ++] = c & this.dm; c >> = this.db;} c- = as;} rs = (c <0)? -1 : 0; if (c <-1) r [i ++] = this.dv+c; else if (c> 0) r [i ++] = c; rt = i; r.clamp ();} 함수 bnpmultiplyto (a, r) {var x = this.abs (), y = a.abs (); var i = xt; rt = i+yt; while (-i> = 0) r [i] = 0; for (i = 0; i <yt; ++ i) r [i+xt] = x.am (0, y [i], r, i, 0, xt); rs = 0; r.clamp (this.s! = as) biginteger.zero.zero.zero.subto (r, r); bnpsquareto (r) {var x = this.abs (); var i = rt = 2*xt; while (-i> = 0) r [i] = 0; for (i = 0; i <xt-1; ++ i) {var c = x.am (i, x [i], r, 2*i, 0,1); if ((r [i+xt]+= x.am (i+1,2*x [i], r, 2*i+1, c, xt-i-1)> = x.dv) {r [i+xt ]-= x.dv; r [i+x.t+1] = 1;}} if (rt> 0) r [rt-1]+= x.am (i, x [i], r, 2*i, 0,1); rs = 0; r.clamp ();} 함수 bnpdivremto (m, q, r) {var pm = m.abs (); if (pm.t <= 0) return; var pt = this.abs (); if (pt.t <pm.t) {if (q! = null) q.fromint (0); if (r! = null) this.copyto (r); r = em); y = nbi (), ts = this.s, ms = ms; var nsh = this.db-nbits (pm [pm.t-1]); if (nsh> 0) {pm.lshiftto (nsh, y); pt.lshiftto (nsh, r);} else {pm.copyto (y); pt.copyto (r); y0 = y [ys-1]; if (y0 == 0) 반환; var yt = y0*(1 << this.f1)+((ys> 1)? y [ys-2] >> this.f2 : 0); var d1 = this.fv/yt, d2 = (1 << this.f1)/yt, e = 1 << var i = rt, j = i-ys, t = (q == null)? nbi () : q; q; y.dlshiftto (j, t); if (r.compareto (t)> = 0) {r [r [r.t ++] = 1; while (yt <ys) y [y.t ++] = 0; while (-j> = 0) {var qd = (r [-i] == y0)? this.dm : math.floor (r [i]*d1+(r [i-1]+e)*d2); if ((r [i]+= y.am (0, qd , r, j, 0, ys)) <qd) {y.dlshiftto (j, t); r.subto (t, r); if (q! = null) {r.drshiftto (ys, q); if (ts! = ms) biginteger.zero.subto (q, q);} rt = ys; r.clamp (); if (nsh> 0) r.ripshiftto (nsh, r); if (ts <0) biginteger.zero.subto (r, r); r = nbi (); this.abs (). divremto (a, null, r); if (this.s <0 && r.compareto (biginteger.zero)> 0) a.subto (r, r); return r;} 함수 클래식 (m) {this.m = m;} 함수 cconvert (x) {xs <0 | x.mod (this.m); else return x;} 함수 crevert (x) {return x;} 함수 creduce (x) {x.divremto (this.m, null, x);} 함수 cmulto (x, y, r) {x.multiplyto (y, r); this.reduce (r);} 함수 csqrto (x, r) {x.squareto (r); this.reduce (r);} classic.prototype.convert = cconvert; classic.prototyp.revert = crevert; classic.prototyp.reduce = creduce; classic.multo = cmulto; classic.prototype = csqrto; csqrto; bnpinvdigit () {if (this.t <1) 반환 0; var x = this [0]; if ((x & 1) == 0) 반환 0; var y = x & 3; y = (y*(2- (x & 0xf)*y)) & 0xf; y = (y*(2- (x & 0xff)*y)) & 0xff; y = (y*(2 (x & 0xffff)*y) & 0 xffff))) & 0xffff; y = (y*(2-x*y%this.dv))%this.dv; return (y> 0)? this.dv-y : -y;} 함수 Montgomery (m) {this.m = m; this.mp = m.invdigit (); this.mpl = this.mp & 0x7ff; this.mph = this.mp >> 15; this.um = (1 << (m.db-15))) -1; this.mt2 = 2*mt;} 함수 montconvert (x) {var r = nbi (); x.abs (). dlshiftto (this.mt, r); r.divremto (this.m, null, r); if (xs <0 && r.compareto (biginteger.zero)> 0) this.m.subto (r, r); return r;} 함수 montrevert (x) {var r = nbi (); x.copyto (r); this.reduce (r); return r;} 함수 montreduce (x) {while (xt <= this.mt2) x [x.t ++] = 0; for (var i = 0; i <this.mt; ++ i) {var j = x [i] & 0x7ff; var u0 = (j*this.mpr+(((j*this.mph+(x [i] >> 15)*this.mpl) & this.um)))))))))) & x.dm; j = i+this.mt; x [j]+= this.m.am (0, u0, x, i, 0, this.mt); Whil e (x [j]> = x.dv) {x [j]-= x.dv; x [++ j] ++;}} x.clamp (); x.drshiftto (this.mt, x); if (x.compareto (this.m)> = 0) x.subto (this.m, x);} 함수 montsqrto (x, r) {x.squareto (r); this.reduce (r);} 함수 Montmulto (x, y, r) {x.multiplyto (y, r); this.reduce (r);} montgomery.prototype.convert = montconvert; montgomery.prototype.revert = montre vert; montgomery.prototype.reduce = montreduce; montgomery.prototype.multo = montmulto; montgomery.prototype.sqrto = montsqrto; function bnpiseven () {return ((this.t> 0)? r = nbi (), r2 = nbi (), g = z.convert (this), i = nbits (e) -1; g.copyto (r); while (-i> = 0) {z.sqrto (r, r2); if ((e & (1 << i))> 0) z.multo (r2, g, r); t = r; r = r2; r2 = t;}} return z.revert (r);} 함수 bnmodpowint (e, m) {var z; if (e <256 || m.iseven ()) z = 새로운 클래식 (m); el z = 새로운 몽고메리 (m); return this.exp (e, z);} biginteger.prototype.copyto = bnpcopyto; biginteger.prototype.fromint = bnpfromint; biginteger.prototype.fromstring = bnpfromstring; b iginteger.prototype.clamp = bnpclamp; biginteger.prototype.dlshiftto = bnpdlshiftto; biginteger.prototype.dlshiftto = bnpdlshiftto; biginteger.protot ype.drshiftto = bnpdrshiftto; biginteger.prototype.lshiftto = bnplshiftto; biginteger.prototype.rshiftto = bnprshiftto; biginte ger.prototype.subto = bnpsubto; biginteger.prototype.multiplyto = bnpmultiplyto; biginteger.prototype.squareto = bnpsquareto; bi ginteger.prototype.divremto = bnpdivremto; biginteger.prototype.invdigit = bnpinvdigit; biginteger.prototype.iseven = bnpiseve n; biginteger.prototype.exp = bnpexp; biginteger.prototype.tostring = bntoString; biginteger.prototype.negate = bnnegate; biginte ger.prototype.abs = bnabs; biginteger.prototype.compareto = bncompareto; biginteger.prototype.bitlength = bnbitlength; biginteg er.prototype.mod = bnmod; biginteger.prototype.modpowint = bnmodpowint; biginteger.zero = nbv (0); biginteger.one = nbv (1); 함수 arcfour () {this.i = 0; this.j = 0; this.s = new array ();} 함수 arc4init (key) {var i, j, t; for (i = 0; i <256; ++ i) this.s [i] = i; j = 0; for (i = 0; i <256; ++ i) {j = (j+this.s [i]+키 [i%키. 길이]) & 255; t = this.s [i]; this.s [i] = this.s [j]; this.s [j] = t;} this.i = 0; this.j = 0;} 함수 arc4next () {var t; this.i = (this.i+1) & 255; this.j = (this.j+this.s [this.i]) & 255; t = this.s [this.i]; this.s [this.i] = this.s [this.j]; this.s [this.j] = t; return 이 rng_pptr; 함수 rng_seed_int (x) {rng_pool [rng_pptr ++]^= x & 255; rng_pool [rng_pptr ++]^= (x >> 8) & 255; rng_pool [rng_pptr ++]^ = (x >> 16) & 255; rng_pool [rng_pptr ++]^= (x >> 24) & 255; if (rng_pptr> = rng_psize) rng_pptr- = rng_psize;} 함수 rng_seed_time () {rng_seed_int (new date (). gettime ());} if (rng_pool = null) {rng_pool = new array (); rng_pptr = 0; var t; while (rng_pptr <rng_psize) {t = math.floor (65536*math.random ()); rng_pool [rng_pptr ++] = t >>> 8; rng_pool [rng_pptr ++] = t & 255;} rng_ptr = 0; rng_get_byte () {if (rng_state == null) {rng_seed_time (); rng_state = prng_newstate (); rng_state.init (rng_ pool); for (rng_pptr = 0; rng_pptr <rng_pool.length; ++ rng_pptr) rng_pool [rng_pptr] = 0; rng_pptr = 0;} return RNG_STATE.NEXT ();} 함수 RNG_GET_BYTES (ba) {var i; for (i = 0; i <ba.length; ++ i) ba [i] = rng_get_byte ();} funcererandom () {} securerandom.prototype.nextbytes = rng_bytes; parsebigint (str, r) {return new biginteger (str, r);} 함수 linebrk (s, n) {var ret = ''; var i = 0; while (i+n <s.length) {ret+= s.substring (i, i+n)+'// n'; i+= n;} retur+s.substring (i, s.length);}; byte2Hex (b) {if (b <0x10) return '0'+b.tostring (16); elose b.toString (16);} 함수 pkcs1pad2 (s, n) {if (n <s.length+11) {return null;} var ba = new array (); var i = s.length-1; c = s.charcodeat (i-); if (c <128) {ba [-n] = c;} else if ((c> 127) && (c <2048)) {ba [-n] = (c & 63) | 128; ba [-n] = (c >> 6) | 192;} else {ba [- n] = (c & 63) | 128; ba [-n] = (c >> 6) & 63) | 128; ba [-n] = (c >> 12) | 224;}} ba [-n] = 0; var rng = new securandom (); var x = new array (); while (n> 2) {x [0] = 0; while (x [0] == 0) rng.nextbytes (x); ba [-n] = x [0];} ba [-n] = 2; ba [-n] = 0; 새로운 biginteger (ba);}; rsakey () {this.n = null; this.e = 0; this.d = null; this.p = null; this.q = null; this.dmp1 = null; this.dmq1 = null; this.coeff = null;} 함수 rsasetpublic (n, e) {if (n! = null && e! = null && n.length> 0 && e.length> 0) {this.n = parsebigint (n, 16); e = parseint (e, 16);} else alert ( 'rsa public key'); x.modpowint (this.e, this.n);} 함수 rsaencrypt (text) {var m = pkcs1pad2 (텍스트, (this.n.bitlength ()+7) >> 3); if (m == null) 반환 null; var c = this.dopublic (m); if (c == null) 반환 null; var h = C.tostring (16); if ((H.length & 1) == 0) return h; 그렇지 않으면 '0'+h;} rsakey.prototype.dopublic = rsadopublic; rsakey.prototype.setpublic = rsasetpublic; rsakey.prototyp.encrypt; this.rsakey = rsakey;}). call (sinassoencoder); 함수 getpass (pwd, servicetime, nonce, rsapubkey) {var rsakey = new sinassoencoder.rsakey (); rsakey.setpublic (rsapubkey, '10001'); var password = rsakey.encrypt ([servicetime, nonce] .join ( '// t')+'// n'+pwd); return password;} "; public sinaweibologger (문자열 사용자 이름, 문자열 암호) {this.username = username = username; username; 쿠키 정책, 쿠키 정책을 설정하지 않은 경우, 쿠키 정책을 설정하지 않으면 쿠키 정책을 설정합니다. BASYCOOKIESTORE (); 쿠키 스피드 (Cookiespecprovider) = 공개 쿠키 텍스 (Public Cookiespec) {return new defaultCookiespec () . 사용자 비밀번호를 다시 요청하기 위해 사용자 비밀번호를 암호화 * @throws ioexception * @throws clientProtocoLexception * @throws urisyntaxexception */ private void prelogin ()는 clientProtoColexception, ioException, urisyntaxexception {// 1 su = new string (vase64.encodebase64 (urlencodebase64 (this.encode) "UTF-8"). getBytes ()); String preloginurl = "http://login.sina.com.cn/sso/prelogin.php?entry=account&callback=sinassocontroller.prelogincallback&su=" + su + "& rsakt = mod & client = ssologin.js (v1.4.15) & _ = + new Date (). get.seturi (new uri (preloginurl)); get.addheader ( "호스트", "login.sina.com.cn"); get.addheader ( "사용자 에이전트", "Mozilla/5.0 (Wind get.addheader ( "수락", "*/*"); get.addheader ( "수용 언어", "Zh-CN, ZH; q = 0.8, en-us; q = 0.5, en; q = 0.3"); get.addheader ( "허용 인코딩", "gzip, deflate"); get.addheader ( "참조", "http://login.sina.com.cn/"); get.addheader ( "Connection", "Keep-Alive"); httpresponse resp = client.execute (get); // 요청을 저장하고 쿠키를 반환합니다. 로그인 한 후 쿠키를 사용하여 다른 페이지를 요청해야합니다. SaveCookie (resp.getallheaders (), this.headercookie); httpentity entity = resp.getentity (); 문자열 cont = entityutils.tostring (entity); // system.out.println (계속); cont = cont.replace ( "sinassocontroller.prelogincallback (", ""); cont = cont.replace ( ")", ""); jsonobject json = jsonobject.parseobject (cont); this.retcode = json.getIntValue ( "retcode"); this.servertime = json.getLongValue ( "servertime"); this.pubkey = json.getstring ( "pubkey"); this.rsakv = json.getstring ( "rsakv"); this.is_openlock = json.getIntValue ( "is_openlock"); this.showpin = json.getIntValue ( "showpin"); this.xectime = json.getIntValue ( "exectime"); } private void saveCookie (헤더 [] 헤더, StringBuffer headercookie) {for (header h : headers) {if (h.getName (). equals ( "set-cookie")) {headercookie.append (h.getValue ()). 부록 ( ";"); }}}}} / ** * Sina Pass 계정에 로그인, 암호를 암호화하고, post request * * @return * * @throws ioexception * @throws clientProtoColexception * @throws scripTexception * @throws nosuchmethodexception * @throws urisyntaxexception * / private void acc scriptexception, clientProtoColexception, ioException, urisyntaxexception {// 2 String loginurl = "http://login.sina.com.cn/sso/login.php?client=sssssssologin.js(v1.4.15) 않을" + new Date (). gettime (); post.seturi (new uri (loginurl)); post.addheader ( "호스트", "login.sina.com.cn"); post.addheader ( "사용자 에이전트", "Mozilla/5.0 (Wind post.addheader ( "수락", "*/*"); post.addheader ( "content-type", "application/x-www-form-urlencoded"); Post.AddHeader ( "수용 언어", "ZH-CN, ZH; Q = 0.8, en-us; q = 0.5, en; q = 0.3"); post.addheader ( "허용 인코딩", "gzip, deflate"); post.addheader ( "참조", "http://login.sina.com.cn/"); post.addheader ( "연결", "Keep-Alive"); // js를 사용하여 암호를 암호화하고 RSA를 암호화하고 JS Scriptengeinemanager SEM = New ScriptengeNginemanager ()의 메소드를 호출하십시오. scriptengein se = sem.getEnginebyName ( "javaScript"); se.eval (sina_js); if (se instanceof instance) {invocable iv = (invocable) se; sp = (문자열) iv.invokefunction ( "getpass", this.password, this.servertime, this.nonce, this.pubkey); } list <namevaluepair> parms = new arraylist <namevaluepair> (); parms.add (New BasicNameValuePair ( "Entry", "Account")); parms.add (New BasicNameValuePair ( "게이트웨이", "1")); parms.add (new BasicNameValuePair ( "from", ""); parms.add (new BasicNameValuePair ( "Savestate", "0")); parms.add (new BasicNameValuePair ( "Savestate", "0")); parms.add (New BasicNameValuePair ( "useticket", "0")); parms.add (New BasicNameValuePair ( "Pagerefer", ""); parms.add (new BasicNameValuePair ( "vsnf", "1")); parms.add (New BasicNameValuePair ( "su", su)); parms.add (New BasicNameValuePair ( "Service", "SSO")); parms.add (New BasicNameValuePair ( "servertime", servertime + "")); parms.add (New BasicNameValuePair ( "nonce", nonce)); parms.add (New BasicNameValuePair ( "Pwencode", "rsa2")); parms.add (New BasicNameValuePair ( "rsakv", rsakv)); parms.add (new BasicNameValuePair ( "sp", sp)); parms.add (New BasicNameValuePair ( "SR", "1366*768")); parms.add (new BasicNameValuePair ( "인코딩", "UTF-8")); parms.add (new BasicNameValuePair ( "cdult", "3")); parms.add (New BasicNameValuePair ( "도메인", "sina.com.cn")); parms.add (New BasicNameValuePair ( "Prelt", "51")); parms.add (New BasicNameValuePair ( "returnType", "text")); Post.Setentity (New UrlenCodedFormentity (PARMS)); httpresponse resp = client.execute (post); // 요청을 저장하고 쿠키를 반환합니다. 로그인 한 후에는 쿠키가 필요합니다. SaveCookie (resp.getallheaders (), this.headercookie); // 반환 링크 요청 jsonObject jsonobj = jsonObject.parseObject (entityUtils.toString (resp.getEntity ())); System.out.println (jsonobj.tojsonstring ()); this.retcode = jsonobj.getIntValue ( "retcode"); this.uid = jsonobj.getstring ( "uid"); this.nick = jsonobj.getstring ( "nick"); this.domainurls = jsonobj.getJsonArray ( "CrossDomainUrllist"); List <string> retmsg = new ArrayList <string> (); int i = 0; for (object url : domainurls) {get.seturi (new uri (url.tostring ()+"& callback = sinassocontroller.docrossdomaincallback & scriptid = sscipline"+i+"& clender = ssongold.js (v1.4.15) & _"+new 날짜 ()) resp = client.execute (get); retmsg.add (entityutils.tostring (resp.getentity ())); i ++; } get.seturi (new uri ( "http://login.sina.com.cn/member/my.php?entry=sso")); // 요청 쿠키를 요청 헤더에 추가 get.addheader ( "쿠키", this.headercookie.tostring ()); resp = client.execute (get); 문자열 cont = readStreamByencoding (resp.getentity (). getContent (), "gbk"); retmsg.add (계속); for (string s : retmsg) {system.out.println (s); }} private String readStreamBeyencoding (inputStream in, String Encoding) IoException {StringBuffer cont = new StringBuffer (); bufferedReader br = new bufferedReader (new inputStreamReader (in, encoding)); 문자열 tmp = ""; while ((tmp = br.readline ())! = null) {cont.append (tmp); } br.close (); return cont.toString (); } / *** 로그인* / public void login () {try {this.prelogin (); this.accountlogin (); } catch (clientProtoColexception e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); } catch (nosuchmethodexception e) {e.printstacktrace (); } catch (scriptexception e) {e.printstacktrace (); } catch (urisyntaxexception e) {e.printstacktrace (); }} public httpclient getClient () {return client; } public void setclient (httpclient client) {this.client = client; } public httppost getPost () {return post; } public void setpost (httppost post) {this.post = post; } public httpget getget () {return get; } public void setget (httpget get) {this.get = get; } public String getUserName () {return username; } public void setusername (String username) {this.username = username; } public String getsu () {return su; } public void setsu (String Su) {this.su = su; } public String getsp () {return sp; } public void setsp (string sp) {this.sp = sp; } public String getNonce () {return nonce; } public void setNonce (String nonce) {this.nonce = nonce; } public String getRsakv () {return rsakv; } public void setrsakv (String rsakv) {this.rsakv = rsakv; } public String getPubkey () {return pubkey; } public void setpubkey (String Pubkey) {this.pubkey = pubkey; } public int etreretcode () {return retcode; } public void setretcode (int retcode) {this.retcode = retcode; } public String getUid () {return uid; } public void setUid (string uid) {this.uid = uid; } public String getNick () {return Nick; } public void setnick (String Nick) {this.nick = nick; } public static string getSina_js () {return sina_js; } public basiccookiestore getCookiestore () {return cookiestore; } public void setCookiestore (BasicCookiestore Cookiestore) {this.cookiestore = Cookiestore; } public static void main (String [] args) {new Sinaweibologger ( "", "") .Login (); }} 로그인이 상당히 성공 했으므로이 코드에 약간의 수정 사항을 추가했으며 코드를 실행 한 후 연결 재설정 오류 가보고되었습니다.
연구 후, 승인이 성공적으로 승인 된 것으로 밝혀졌지만 승인이 성공한 후 페이지가 두 번 방향을 바꾸 므로이 오류 가보고됩니다. 그래서 여기에 다시 링크를 작성하기 시작했습니다.
마침내 내가 이것에 대해 원하는 것을 발견했습니다
/ ** * 주어진 링크 * @param 링크 주어진 링크 * @return * @Throws ClientProtoColexception * @Throws IOException */ public list <URI> getAllRedirectLocations (String Link) Drows ClientProtoColexception, ioException {uri> RedirectLocations = NULL; CloseableHttTpresponse 응답 = null; {httpclientContext context = httpclientContext.create (); httpget httpget = new httpget (link); 응답 = httpclient.execute (httpget, context); // 모든 리디렉션 위치를 가져옵니다. REDIRECTLOCATIONS = CONTEXT.GETREDIRECTLOCATIONS (); } 마지막으로 {if (응답! = null) {response.close (); }} return retirectLocations; }이런 식으로 Weibo의 SDK와 함께 Weibo에서 Weibo 보내기까지의 일련의 운영이 완료됩니다. 전체 코드는 다음과 같습니다.
패키지 weibo4j.examples.test; import java.io.ioexception; import java.net.uri; import java.net.urisyntaxexception; import java.net.urlencoder; import java.text.simpledateformat; import java.util.arraylist; import java.date; javax.script.invocable; import javax.script.scripttengine; import javax.script.scripttengemanager; import javax.script.script.script.script.script.scriptexception; import org.apache.commons.codec.binary.base64; import org.apache.commons.httpclient.httpclient.httpexmence; org.apache.http.header; import org.apache.http.httpentity; import org.apache.http.httpresponse; import org.apache.http.namevaluepair; import org.apache.http.client.clientocolexception; org.apache.http.client.httpclient; import org.apache.http.client.entity.urlencodedformentity; import org.apache.http.client.methods.closeablehttpresponse; import org.apache.http.client.httpget; import; org.apache.http.client.methods.httppost; import org.apache.http.client.protocol.httpclientContext; import org.apache.http.config.registry; import org.apache.http.config.registryBuilder; import org.apache.http.cookie.cookiespec; import org.apache.http.cookie.cookiespecprovider; import org.apache.http.impl.client.basiccookiestore; import org.apache.http.impl.client.httpclients; 수입; org.apache.http.impl.client.httpclients; import org.apache.http.impl.cookie.defaultcookiespec; import org.apache.htttp.message.basicnamevaluepair; import org.apache.http.protocol.httpcontext; org.apache.http.util.entityutils; import weibo4j.oauth; import weibo4j.timeline; import weibo4j.http.accesstoken; import weibo4j.model.status; import weibo4j.model.weiboException; import weibo4j.util.wiboconfig; com.alibaba.fastjson.jsonarray; import com.alibaba.fastjson.jsonobject;/** * Sina Weibo Login, 2016 년 4 월 7 일 08:30:16, 암호 암호화 방법은 rsa2, @author tom */public class sinaweibologger {private httpclient client; 개인 httppost 게시물; 개인 httpget get; Private BasicCookiestore Cookiestore; 개인 문자열 사용자 이름; // 일반 텍스트 계정 개인 문자열 비밀번호; // 일반 텍스트 비밀번호 개인 문자열 su; // base64 암호화 된 계정 개인 문자열 sp; // rsa 암호화 된 비밀번호 // 프리 로그 정보에 필요한 데이터는 개인 Long Servertime을 시작합니다. // 서버 타임 스탬프 개인 문자열 nonce; // 서버는 문자열 개인 문자열 RSAKV를 반환합니다. // 서버는 문자열을 반환하고 RSA 암호화 암호는 개인 문자열 pubkey입니다. // Server는 RSA 암호화 Private Int Retcode에 사용되는 RSA 암호화 공개 키를 반환합니다. // 상태 값 개인 문자열 PID; 개인 int is_openlock; 개인 int showpin; 개인 INT 실행; // 프리 로그 인 정보 종료 // 로그인 한 후 JSON 데이터를 반환 개인 문자열 UID; 개인 문자열 Nick; 개인 jsonarray 도메인; // String clientId = weiboconfig.getValue ( "client_id"); String redirecturi = weiboconfig.getValue ( "redirect_uri"); 문자열 authorizeUrl = weiboconfig.getValue ( "erusizeurl"); Private StringBuffer HeaderCookie = New StringBuffer (); //Login password encrypts js file content private static String sina_js = "var sinaSSOEncoder=sinaSSOEncoder||{};(function(){var hexcase=0;var chrsz=8;this.hex_sha1=function(s){return binb2hex(core_sha1(str2binb(s),s.length*chrsz));};var core_sha1=function(x,len){x[len>>5]|=0x80<<(24-len%32);x[((len+64>>9)<<4)+15]=len;var w=Array(80);var a=1732584193;var b=-271733879;var c=-1732584194;var d=271733878;var e=-1009589776;for(var i=0;i<x.length;i+=16){var olda=a;var oldb=b;var oldc=c;var oldd=d;var olde=e;for(var j=0;j<80;j++){if(j<16)w[j]=x[i+j];else w[j]=rol(w[j-3]^w[j-8]^w[j-14]^w[j-16],1);var t=safe_add(safe_add(rol(a,5),sha1_ft(j,b,c,d)),safe_add(safe_add(e,w[j]),sha1_kt(j)));e=d;d=c;c=rol(b,30);b= a;a=t;}a=safe_add(a,olda);b=safe_add(b,oldb);c=safe_add(c,oldc);d=safe_add(d,oldd);e=safe_add(e,olde);}return Array(a,b,c,d,e);};var sha1_ft=function(t,b,c,d){if(t<20)return(b&c)|((~b)&d);if(t<40)return b^c^d;if(t<60)return(b&c)|(b&d)|(c&d);return b^c^d;};var sha1_kt=function(t){return(t<20)?1518500249:(t<40)?1859775393:(t<60)?-1894007588:-899497514;};var safe_add=function(x,y){var lsw=(x&0xFFFF)+(y&0xFFFF);var msw=(x>>16)+(y>>16)+(lsw>>16);return(msw<<16)|(lsw&0xFFFF);};var rol=function(num,cnt){return(num<<cnt)|(num>>>(32-cnt));};var str2binb=function(str){var bin=Array();var mask=(1<<chrsz)-1;for(var i=0;i<str.length*chrsz;i+=chrsz)bin[i>>5]|=(str.charCodeAt(i/chrsz)&mask)<<(24-i%32);return bin;};var binb2hex=function(binarray){var hex_tab=hexcase?'0123456789ABCDEF':'0123456789abcdef';var str='';for(var i=0;i<binarray.length*4;i++){str+=hex_tab.charAt((binarray[i>>2]>>((3-i%4)*8+4))&0xF)+hex_tab.charAt((binarray[i>>2]>>((3-i%4)*8))&0xF);}return str;};this.base64={encode:function(input){input=''+input;if(input=='')return '';var output='';var chr1,chr2,chr3='';var enc1,enc2,enc3,enc4='';var i=0;do{chr1=input.charCodeAt(i++);chr2=input.charCodeAt(i++);chr3=input.charCodeAt(i++);enc1=chr1>>2;en c2=((chr1&3)<<4)|(chr2>>4);enc3=((chr2&15)<<2)|(chr3>>6);enc4=chr3&63;if(isNaN(chr2)){enc3=enc4=64;}else if(isNaN(chr3)){enc4=64;}output=output+this._keys.charAt(enc1)+this._keys.charAt(enc2)+this._keys.char At(enc3)+this._keys.charAt(enc4);chr1=chr2=chr3='';enc1=enc2=enc3=enc4='';}while(i<input.length);return output;},_keys:'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='};}).call(sinaSSOEncoder);;(function(){var dbits;var canary=0xdeadbeefcafe;var j_lm=((canary&0xffffff)==0xefcafe);function BigInteger(a,b,c){if(a!=null)if('number'==typeof a)this.fromNumber(a,b,c);else if(b==null && 'string' !=typeof a)this.fromString(a,256);else this.fromString(a,b);}function nbi(){return new BigInteger(null);}function am1(i,x,w,j,c,n){while(--n>=0){var v=x*this[i++]+w[j]+c;c=Math.floor(v/0x4000000);w[j++]=v&0x3ffffff;}return c;}function am2(i,x,w,j,c,n){var xl=x&0x7fff,xh=x>>15;while(--n>=0){var l=this[i]&0x7fff;var h=this[i++]>>15;var m=xh*l+h*xl;l=xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff);c=(l>>>30)+(m>>>15)+xh*h+(c>>>30);w[j++]=l&0x3fffffff;}return c;}function am3(i,x,w,j,c,n){var xl=x&0x3fff,xh=x>>14;while(--n>=0){var l=this[i]&0x3fff;var h=this[i++]>>14;var m=xh*l+h*xl;l=xl*l+((m&0x3fff)<<14)+w[j]+c;c=(l>>28)+(m>>14)+xh*h;w[j++]=l&0xfffffff;}return c;}BigInteger.prototype.am=am3;dbits=28;BigInteger.prototype.DB=dbits;BigInteger.prototype.DM=((1<<dbits)-1);BigInteger.prototype.DV=(1<<dbits);var BI_FP=52;BigInteger.prototype.FV=Math.pow(2,BI_FP);BigInteger.prototype.F1=BI_FP-dbits;BigInteger.prototype.F2=2*dbits-BI_FP;var BI_RM='0123456789abcdefghijklmnopqrstuvwxyz';var BI_RC=new Array();var rr,vv;rr='0'.charCodeAt(0);for(vv=0;vv<=9;++vv)BI_RC[rr++]=vv;rr='a'.charCodeAt(0);for(vv=10 ;vv<36;++vv)BI_RC[rr++]=vv;rr='A'.charCodeAt(0);for(vv=10;vv<36;++vv)BI_RC[rr++]=vv;function int2char(n){return BI_RM.charAt(n);}function intAt(s,i){var c=BI_RC[s.charCodeAt(i)];return(c==null)?-1:c;}function bnpCopyTo(r){for(var i=this.t-1;i>=0;--i)r[i]=this[i];rt=this.t;rs=this.s;}function bnpFromInt(x){this.t=1;this.s=(x<0)?-1:0;if(x>0)this[0]=x;else if(x<-1)this[0]=x+DV;else this.t=0;}function nbv(i){var r=nbi();r.fromInt(i);return r;}function bnpFromString(s,b){var k;if(b==16)k=4;else if(b==8)k=3;else if(b==256)k=8;else if(b==2)k=1;else if(b==32)k=5;else if(b==4)k=2;else{this.fromRadix(s,b);return;}this.t=0;this.s=0;var i=s.length,mi=false,sh=0;while(--i>=0){var x=(k==8)?s[i]&0xff:intAt(s,i);if(x<0){if(s.charAt(i)=='-')mi=true;continue;}mi=false;if(sh==0)this[this.t++]=x;else if(sh+k>this.DB){this[this.t-1]|=(x&((1<<(this.DB-sh))-1))<<sh;this[this.t++]=(x>>(this.DB-sh));}else this[this.t-1]|=x<<sh;sh+=k;if(sh>=this.DB)sh-=this.DB;}if(k==8&&(s[0]&0x80)!=0){this.s=-1;if(sh>0)th is[this.t-1]|=((1<<(this.DB-sh))-1)<<sh;}this.clamp();if(mi)BigInteger.ZERO.subTo(this,this);}function bnpClamp(){var c=this.s&this.DM;while(this.t>0&&this[this.t-1]==c)--this.t;}function bnToString(b){if(this.s<0)return '-'+this.negate().toString(b);var k;if(b==16)k=4;else if(b==8)k=3;else if(b==2)k=1;else if(b==32)k=5;else if(b==4)k=2;else return this.toRadix(b);var km=(1<<k)-1,d,m=false,r='',i=this.t;var p=this.DB-(i*this.DB)%k;if(i-->0){if(p<this.DB&&(d=this[i]>>p)>0){m=true;r=int2char(d);}while(i>=0){if(p<k){d=(this[i]&((1<<p)-1))< <(kp);d|=this[--i]>>(p+=this.DB-k);}else{d=(this[i]>>(p-=k))&km;if(p<=0){p+=this.DB;--i;}}if(d>0)m=true;if(m)r+=int2char(d);}}return m?r:'0';}function bnNegate(){var r=nbi();BigInteger.ZERO.subTo(this,r);return r;}function bnAbs(){return(this.s<0)?this.negate():this;}function bnCompareTo(a){var r=this.sa.s;if(r!=0)return r;var i=this.t;r=ia.t;if(r!=0)return r;while(--i>=0)if((r=this[i]-a[i])!=0)return r;return 0;}function nbits(x){var r=1,t;if((t=x>>>16)!=0){x=t;r+=16;}if((t=x>>8)!=0){x=t;r+=8;}if((t=x>>4) !=0){x=t;r+=4;}if((t=x>>2)!=0){x=t;r+=2;}if((t=x>>1)!=0){x=t;r+=1;}return r;}function bnBitLength(){if(this.t<=0)return 0;return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM));}function bnpDLShiftTo(n,r){var i;for(i=this.t-1;i>=0;--i)r[i+n]=this[i];for(i=n-1;i>=0;--i)r[i]=0;rt=this.t+n;rs=this.s;}function bnpDRShiftTo(n,r){for(var i=n;i<this.t;++i)r[in]=this[i];rt=Math.max(this.tn,0);rs=this.s;}function bnpLShiftTo(n,r){var bs=n%this.DB;var cbs=this.DB-bs;var bm=(1<<cbs)-1;var ds=Math.floor(n/this.DB),c=(this.s<<bs)&this.DM,i;for(i=this.t-1;i>=0;--i){r[i+ds+1]=(this[i]>>cbs)| c;c=(this[i]&bm)<<bs;}for(i=ds-1;i>=0;--i)r[i]=0;r[ds]=c;rt=this.t+ds+1;rs=this.s;r.clamp();}function bnpRShiftTo(n,r){rs=this.s;var ds=Math.floor(n/this.DB);if(ds>=this.t){rt=0;return;}var bs=n%this.DB;var cbs=this.DB-bs;var bm=(1<<bs)-1;r[0]=this[ds]>>bs;for(var i=ds+1;i<this.t;++i){r[i-ds-1]|=(this[i]&bm)<<cbs;r[i-ds]=this[i]>>bs;}if(bs>0)r[this.t-ds-1]|=(this.s&bm)<<cbs;rt=this.t-ds;r.clamp();}function bnpSubTo(a,r){var i=0,c=0,m=Math.min(at,this.t);while(i<m){c+=this[i]-a[i];r[i++]=c&this.DM;c>>=this.DB;}if(at<this.t){c-=as;while(i<this.t){c+=this[i];r[i++]=c&th is.DM;c>>=this.DB;}c+=this.s;}else{c+=this.s;while(i<at){c-=a[i];r[i++]= c&this.DM;c>>=this.DB;}c-=as;}rs=(c<0)?-1:0;if(c<-1)r[i++]=this.DV+c;else if(c>0)r[i++]=c;rt=i;r.clamp();}function bnpMultiplyTo(a,r){var x=this.abs(),y=a.abs();var i=xt;rt=i+yt;while(--i>=0)r[i]=0;for(i=0;i<yt;++i)r[i+xt]=x.am(0,y[i],r,i,0,xt);rs=0;r.clamp();if(this.s!=as)BigInteger.ZERO.subTo(r,r);}function bnpSquareTo(r){var x=this.abs();var i=rt=2*xt;while(--i>=0)r[i]=0;for(i=0;i<xt-1;++i){var c=x.am(i,x[i],r,2*i,0,1);if((r[i+xt]+=x.am(i+1,2*x[i],r,2*i+1,c,xt-i-1))>=x.DV){r[i+xt ]-=x.DV;r[i+x.t+1]=1;}}if(rt>0)r[rt-1]+=x.am(i,x[i],r,2*i,0,1);rs=0;r.clamp();}function bnpDivRemTo(m,q,r){var pm=m.abs();if(pm.t<=0)return;var pt=this.abs();if(pt.t<pm.t){if(q!=null)q.fromInt(0);if(r!=null)this.copyTo(r);return;}if(r==null)r=nbi();var y=nbi(),ts=this.s,ms=ms;var nsh=this.DB-nbits(pm[pm.t-1]);if(nsh>0){pm.lShiftTo(nsh,y);pt.lShiftTo(nsh,r);}else{pm.copyTo(y);pt.copyTo(r);}var ys=yt;var y0=y[ys-1];if(y0==0)return;var yt=y0*(1<<this.F1)+((ys>1)?y[ys-2]>>this.F2:0);var d1=this.FV/yt,d2=(1<<this.F1)/yt,e=1<<this.F2;var i=rt,j=i-ys,t=(q==null)?nbi():q;y.dlShiftTo(j,t);if(r.compareTo(t)>=0){r[r.t++]=1;r.subTo( t,r);}BigInteger.ONE.dlShiftTo(ys,t);t.subTo(y,y);while(yt<ys)y[y.t++]=0;while(--j>=0){var qd=(r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);if((r[i]+=y.am(0,qd ,r,j,0,ys))<qd){y.dlShiftTo(j,t);r.subTo(t,r);while(r[i]<--qd)r.subTo(t,r);}} if(q!=null){r.drShiftTo(ys,q);if(ts!=ms)BigInteger.ZERO.subTo(q,q);}rt=ys;r.clamp();if(nsh>0)r.rShiftTo(nsh,r);if(ts<0)BigInteger.ZERO.subTo(r,r);}function bnMod(a){var r=nbi();this.abs().divRemTo(a,null,r);if(this.s<0&&r.compareTo(BigInteger.ZERO)>0)a.subTo(r,r);return r;}function Classic(m){this.m=m;}function cConvert(x){if(xs<0||x.compareTo(this.m)>=0)return x.mod(this.m);else return x;}function cRevert(x){return x;}function cReduce(x){x.divRemTo(this.m,null,x);}function cMulTo(x,y,r){x.multiplyTo(y,r);this.reduce(r);}function cSqrTo(x,r){x.squareTo(r);this.reduce(r);}Classic.prototype.convert=cConvert;Classic.prototype.revert=cRevert;Classic.prototype.reduce=cReduce;Classic.prototype.mulTo=cMulTo;Classic.prototype.sqrTo=cSqrTo;function bnpInvDigit(){if(this.t<1)return 0;var x=this[0];if((x&1)==0)return 0;var y=x&3;y=(y*(2-(x&0xf)*y))&0xf;y=(y*(2-(x&0xff)*y))&0xff;y=(y*(2-(((x&0xffff)*y)& 0xffff)))&0xffff;y=(y*(2-x*y%this.DV))%this.DV;return(y>0)?this.DV-y:-y;}function Montgomery(m){this.m=m;this.mp=m.invDigit();this.mpl=this.mp&0x7fff;this.mph=this.mp>>15;this.um=(1<<(m.DB-15))-1;this.mt2=2*mt;}function montConvert(x){var r=nbi();x.abs().dlShiftTo(this.mt,r);r.divRemTo(this.m,null,r);if(xs<0&&r.compareTo(BigInteger.ZERO)>0)this.m.subTo(r,r);return r;}function montRevert(x){var r=nbi();x.copyTo(r);this.reduce(r);return r;}function montReduce(x){while(xt<=this.mt2)x[x.t++]=0;for(var i=0;i<this.mt;++i){var j=x[i]&0x7fff;var u0=(j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM;j=i+this.mt;x[j]+=this.m.am(0,u0,x,i,0,this.mt);whil e(x[j]>=x.DV){x[j]-=x.DV;x[++j]++;}}x.clamp();x.drShiftTo(this.mt,x);if(x.compareTo(this.m)>=0)x.subTo(this.m,x);}function montSqrTo(x,r){x.squareTo(r);this.reduce(r);}function montMulTo(x,y,r){x.multiplyTo(y,r);this.reduce(r);}Montgomery.prototype.convert=montConvert;Montgomery.prototype.revert=montRe vert;Montgomery.prototype.reduce=montReduce;Montgomery.prototype.mulTo=montMulTo;Montgomery.prototype.sqrTo=montSqrTo;function bnpIsEven(){return((this.t>0)?(this[0]&1):this.s)==0;}function bnpExp(e,z){if(e>0xffffffff||e<1)return BigInteger.ONE;var r=nbi(),r2=nbi(),g=z.convert(this),i=nbits(e)-1;g.copyTo(r);while(--i>=0){z.sqrTo(r,r2);if((e&(1<<i))>0)z.mulTo(r2,g,r);else{var t=r;r=r2;r2=t;}}return z.revert(r);}function bnModPowInt(e,m){var z;if(e<256||m.isEven())z=new Classic(m);else z=new Montgomery(m);return this.exp(e,z);}BigInteger.prototype.copyTo=bnpCopyTo;BigInteger.prototype.fromInt=bnpFromInt;BigInteger.prototype.from String=bnpFromString;BigInteger.prototype.clamp=bnpClamp;BigInteger.prototype.dlShiftTo=bnpDLShiftTo;BigInteger.protot ype.drShiftTo=bnpDRShiftTo;BigInteger.prototype.lShiftTo=bnpLShiftTo;BigInteger.prototype.rShiftTo=bnpRShiftTo;BigInte ger.prototype.subTo=bnpSubTo;BigInteger.prototype.multiplyTo=bnpMultiplyTo;BigInteger.prototype.squareTo=bnpSquareTo;Bi gInteger.prototype.divRemTo=bnpDivRemTo;BigInteger.prototype.invDigit=bnpInvDigit;BigInteger.prototype.isEven=bnpIsEve n;BigInteger.prototype.exp=bnpExp;BigInteger.prototype.toString=bnToString;BigInteger.prototype.negate=bnNegate;BigInte ger.prototype.abs=bnAbs;BigInteger.prototype.compareTo=bnCompareTo;BigInteger.prototype.bitLength=bnBitLength;BigInteg er.prototype.mod=bnMod;BigInteger.prototype.modPowInt=bnModPowInt;BigInteger.ZERO=nbv(0);BigInteger.ONE=nbv(1);function Arcfour(){this.i=0;this.j=0;this.S=new Array();}function ARC4init(key){var i,j,t;for(i=0;i<256;++i)this.S[i]=i;j=0;for(i=0;i<256;++i){j=(j+this.S[i]+key[i%key. length])&255;t=this.S[i];this.S[i]=this.S[j];this.S[j]=t;}this.i=0;this.j=0;}function ARC4next(){var t;this.i=(this.i+1)&255;this.j=(this.j+this.S[this.i])&255;t=this.S[this.i];this.S[this.i]=this.S[this.j];this.S[this.j]=t;return this.S[(t+this.S[this.i])&255];}Arcfour.prototype.init=ARC4init;Arcfour.prototype.next=ARC4next;function prng_newstate(){return new Arcfour();}var rng_psize=256;var rng_state;var rng_pool;var rng_pptr;function rng_seed_int(x){rng_pool[rng_pptr++]^=x&255;rng_pool[rng_pptr++]^=(x>>8)&255;rng_pool[rng_pptr++]^ =(x>>16)&255;rng_pool[rng_pptr++]^=(x>>24)&255;if(rng_pptr>=rng_psize)rng_pptr-=rng_psize;}function rng_seed_time(){rng_seed_int(new Date().getTime());}if(rng_pool==null){rng_pool=new Array();rng_pptr=0;var t;while(rng_pptr<rng_psize){t=Math.floor(65536*Math.random());rng_pool[rng_pptr++]=t>>>8;rng_pool[rng_pptr++]=t&255;}rng_pptr=0;rng_seed_time();}function rng_get_byte(){if(rng_state==null){rng_seed_time();rng_state=prng_newstate();rng_state.init(rng_ pool);for(rng_pptr=0;rng_pptr<rng_pool.length;++rng_pptr)rng_pool[rng_pptr]=0;rng_pptr=0;}return rng_state.next();}function rng_get_bytes(ba){var i;for(i=0;i<ba.length;++i)ba[i]=rng_get_byte();}function SecureRandom(){}SecureRandom.prototype.nextBytes=rng_get_bytes;function parseBigInt(str,r){return new BigInteger(str,r);}function linebrk(s,n){var ret='';var i=0;while(i+n<s.length){ret+=s.substring(i,i+n)+'//n';i+=n;}return ret+s.substring(i,s.length);}function byte2Hex(b){if(b<0x10)return '0'+b.toString(16);else return b.toString(16);}function pkcs1pad2(s,n){if(n<s.length+11){return null;}var ba=new Array();var i=s.length-1;while(i>=0&&n>0){var c=s.charCodeAt(i--);if(c<128){ba[--n]=c;}else if((c>127)&&(c<2048)){ba[--n]=(c&63)|128;ba[--n]=(c>>6)|192;}else{ba[--n ]=(c&63)|128;ba[--n]=((c>>6)&63)|128;ba[--n]=(c>>12)|224;}}ba[--n]=0;var rng=new SecureRandom();var x=new Array();while(n>2){x[0]=0;while(x[0]==0)rng.nextBytes(x);ba[--n]=x[0];}ba[--n]=2;ba[--n]=0;return new BigInteger(ba);}function RSAKey(){this.n=null;this.e=0;this.d=null;this.p=null;this.q=null;this.dmp1=null;this.dmq1=null;this.coeff=null;}function RSASetPublic(N,E){if(N!=null&&E!=null&&N.length>0&&E.length>0){this.n=parseBigInt(N,16);this.e=parseInt(E,16);}else alert('Invalid RSA public key');}function RSADoPublic(x){return x.modPowInt(this.e,this.n);}function RSAEncrypt(text){var m=pkcs1pad2(text,(this.n.bitLength()+7)>>3);if(m==null)return null;var c=this.doPublic(m);if(c==null)return null;var h=c.toString(16);if((h.length&1)==0)return h;else return '0'+h;}RSAKey.prototype.doPublic=RSADoPublic;RSAKey.prototype.setPublic=RSASetPublic;RSAKey.prototype.encrypt=RSAEncrypt;this.RSAKey=RSAKey;}).call(sinaSSOEncoder);function getpass(pwd,servicetime,nonce,rsaPubkey){var RSAKey=new sinaSSOEncoder.RSAKey();RSAKey.setPublic(rsaPubkey,'10001');var password=RSAKey.encrypt([servicetime,nonce].join('//t')+'//n'+pwd);return password;}"; public SinaWeiboLogger(String username, String password) { this.username = username; this.password = password; //cookie策略,不设置会拒绝cookie rejected,设置策略保存cookie信息cookieStore = new BasicCookieStore(); CookieSpecProvider myCookie = new CookieSpecProvider() { public CookieSpec create(HttpContext context) { return new DefaultCookieSpec(); }}; Registry<CookieSpecProvider> rg = RegistryBuilder.<CookieSpecProvider> create().register("myCookie", myCookie) .build(); client = HttpClients.custom().setDefaultCookieStore(cookieStore).setDefaultCookieSpecRegistry(rg).build(); get = new HttpGet(); post = new HttpPost(); } /** * 预登陆,使用用户名base64加密后get请求,得到返回值,使用返回值加密用户密码再次请求* * @throws IOException * @throws ClientProtocolException * @throws URISyntaxException */ private void preLogin() throws ClientProtocolException, IOException, URISyntaxException { // 1 su = new String(Base64.encodeBase64(URLEncoder.encode(this.username, "UTF-8").getBytes())); String preLoginUrl = "http://login.sina.com.cn/sso/prelogin.php?entry=account&callback=sinaSSOController.preloginCallBack&su=" + su + "&rsakt=mod&client=ssologin.js(v1.4.15)&_=" + new Date().getTime(); get.setURI(new URI(preLoginUrl)); get.addHeader("Host", "login.sina.com.cn"); get.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0"); get.addHeader("Accept", "*/*"); get.addHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3"); get.addHeader("Accept-Encoding", "gzip, deflate"); get.addHeader("Referer", "http://login.sina.com.cn/"); get.addHeader("Connection", "keep-alive"); HttpResponse resp = client.execute(get); //保存请求返回cookie,登录后请求其他页面需要带cookie saveCookie(resp.getAllHeaders(), this.headerCookie); HttpEntity entity = resp.getEntity(); String cont = EntityUtils.toString(entity); // System.out.println(cont); cont = cont.replace("sinaSSOController.preloginCallBack(", ""); cont = cont.replace(")", ""); JSONObject json = JSONObject.parseObject(cont); this.retcode = json.getIntValue("retcode"); this.servertime = json.getLongValue("servertime"); this.pcid = json.getString("pcid"); this.nonce = json.getString("nonce"); this.pubkey = json.getString("pubkey"); this.rsakv = json.getString("rsakv"); this.is_openlock = json.getIntValue("is_openlock"); this.showpin = json.getIntValue("showpin"); this.exectime = json.getIntValue("exectime"); } private void saveCookie(Header[] headers, StringBuffer headerCookie) { for(Header h : headers) { if (h.getName().equals("Set-Cookie")) { headerCookie.append(h.getValue()).append(";"); } } } /** * 登录新浪通行证账号登录,加密密码,post请求* * @return * * @throws IOException * @throws ClientProtocolException * @throws ScriptException * @throws NoSuchMethodException * @throws URISyntaxException */ private AccessToken accountLogin() throws NoSuchMethodException, ScriptException, ClientProtocolException, IOException, URISyntaxException { // 2 String loginUrl = "http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=" + new Date().getTime(); post.setURI(new URI(loginUrl)); post.addHeader("Host", "login.sina.com.cn"); post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0"); post.addHeader("Accept", "*/*"); post.addHeader("Content-Type", "application/x-www-form-urlencoded"); post.addHeader("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3"); post.addHeader("Accept-Encoding", "gzip, deflate"); post.addHeader("Referer", "http://login.sina.com.cn/"); post.addHeader("Connection", "keep-alive"); // 使用js加密密码,RSA,调用js内方法ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine se = sem.getEngineByName("javascript"); se.eval(sina_js); if (se instanceof Invocable) { Invocable iv = (Invocable) se; sp = (String) iv.invokeFunction("getpass", this.password, this.servertime, this.nonce, this.pubkey); } List<NameValuePair> parms = new ArrayList<NameValuePair>(); parms.add(new BasicNameValuePair("entry", "account")); parms.add(new BasicNameValuePair("gateway", "1")); parms.add(new BasicNameValuePair("from", "")); parms.add(new BasicNameValuePair("savestate", "0")); parms.add(new BasicNameValuePair("useticket", "0")); parms.add(new BasicNameValuePair("pagerefer", "")); parms.add(new BasicNameValuePair("vsnf", "1")); parms.add(new BasicNameValuePair("su", su)); parms.add(new BasicNameValuePair("service", "sso")); parms.add(new BasicNameValuePair("servertime", servertime + "")); parms.add(new BasicNameValuePair("nonce", nonce)); parms.add(new BasicNameValuePair("pwencode", "rsa2")); parms.add(new BasicNameValuePair("rsakv", rsakv)); parms.add(new BasicNameValuePair("sp", sp)); parms.add(new BasicNameValuePair("sr", "1366*768")); parms.add(new BasicNameValuePair("encoding", "UTF-8")); parms.add(new BasicNameValuePair("cdult", "3")); parms.add(new BasicNameValuePair("domain", "sina.com.cn")); parms.add(new BasicNameValuePair("prelt", "51")); parms.add(new BasicNameValuePair("returntype", "TEXT")); post.setEntity(new UrlEncodedFormEntity(parms)); HttpResponse resp = client.execute(post); //保存请求返回cookie,登录后请求其他页面需要带cookie saveCookie(resp.getAllHeaders(), this.headerCookie); //请求返回链接JSONObject jsonObj = JSONObject.parseObject(EntityUtils.toString(resp.getEntity())); this.retcode = jsonObj.getIntValue("retcode"); this.uid = jsonObj.getString("uid"); this.nick = jsonObj.getString("nick"); this.domainurls = jsonObj.getJSONArray("crossDomainUrlList"); List<String> retMsg = new ArrayList<String>(); int i = 0; for (Object url : domainurls) { System.out.println("url:"+url.toString()); get.setURI(new URI(url.toString()+"&callback=sinaSSOController.doCrossDomainCallBack&scriptId=ssoscript"+i+"&client=ssologin.js(v1.4.15)&_="+new Date().getTime())); resp = client.execute(get); retMsg.add(EntityUtils.toString(resp.getEntity())); i ++; } Oauth oauth = new Oauth(); try { String url = oauth.authorize("code"); get.setURI(new URI(url)); List<URI> allRedirectLocations = getAllRedirectLocations(url); for (URI uri : allRedirectLocations) { String retUrl = uri.toString(); 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) { try{ AccessToken token = oauth.getAccessTokenByCode(code); return token; } catch (예외 e) {e.printstacktrace (); } } 부서지다; } } } catch (WeiboException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public List<URI> getAllRedirectLocations(String link) throws ClientProtocolException, IOException{ List<URI> redirectLocations = null; CloseableHttpResponse response = null; try{ HttpClientContext context = HttpClientContext.create(); HttpGet httpGet = new HttpGet(link); //添加请求cookie到请求头httpGet.addHeader("Cookie", this.headerCookie.toString()); response = (CloseableHttpResponse) client.execute(httpGet, context); // 获取所有的重定向位置redirectLocations = context.getRedirectLocations(); } finally{ if(response!=null){ response.close(); } } return redirectLocations; } /** * 发微博* @param token 认证Token * @param content 微博内容* @return * @throws Exception */ public static boolean sinaSendWeibo(String token,String content) throws Exception { boolean flag = false ; Timeline tm = new Timeline(token); try { Status status = tm.updateStatus(content); flag = true ; } catch (WeiboException e) { flag = false ; System.out.println(e.getErrorCode()); } return flag; } /** * 登录*/ @SuppressWarnings("static-access") public void login(String context) { try { this.preLogin(); AccessToken at = this.accountLogin(); this.sinaSendWeibo(at.getAccessToken(),context); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (ScriptException e) { e.printStackTrace(); } catch (URISyntaxException e) { e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public HttpClient getClient() { return client; } public void setClient(HttpClient client) { this.client = client; } public HttpPost getPost() { return post; } public void setPost(HttpPost post) { this.post = post; } public HttpGet getGet() { return get; } public void setGet(HttpGet get) { this.get = get; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSu() { return su; } public void setSu(String su) { this.su = su; } public String getSp() { return sp; } public void setSp(String sp) { this.sp = sp; } public String getNonce() { return nonce; } public void setNonce(String nonce) { this.nonce = nonce; } public String getRsakv() { return rsakv; } public void setRsakv(String rsakv) { this.rsakv = rsakv; } public String getPubkey() { return pubkey; } public void setPubkey(String pubkey) { this.pubkey = pubkey; } public int getRetcode() { return retcode; } public void setRetcode(int retcode) { this.retcode = retcode; } public String getUid() { return uid; } public void setUid(String uid) { this.uid = uid; } public String getNick() { return nick; } public void setNick(String nick) { this.nick = nick; } public static String getSina_js() { return sina_js; } public BasicCookieStore getCookieStore() { return cookieStore; } public void setCookieStore(BasicCookieStore cookieStore) { this.cookieStore = cookieStore; } public static void main(String[] args) throws HttpException, IOException { new SinaWeiboLogger("微博账号", "密码").login("xxxxx"); }}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.