English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
서론:
형제들이 왔습니다. 최근에 어떻게 Sina Weibo 로그인을 모의하고 데이터를 수집하는지 묻는 사람이 있었습니다. 저는 조용히 한 대의 고기烟火을 피우고, 자신에게 조용히 말했습니다. '노인은 나에게 나오는 시간이야', 그래서 오늘 시간이 있어서 정리하고, 몇 가지 간단히 말씀드리겠습니다.
먼저:
Sina Weibo에 로그인하려면 예 로그인이 필요합니다. 즉, 계정 base를64암호화, 비밀번호 RSA 암호화 및 요청http://login.sina.com.cn/sso/prelogin.php링크에서 로그인에 필요한 몇 가지 매개변수를 가져오고, 반환된 문자열은 다음과 같습니다:
{"retcode":0,"servertime":1487292003,"pcid":"gz-9e1f24c9acdefb111e1c8078558c7d9c0bf2"1"2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443"1330428213"1,"smsurl":"https:\"}}/\/login.sina.com.cn\/sso\/msglogin#63;entry=weibo&mobile=18360903574&s=ea7a2e91c5f1d6da7f42aa87fe6963d0","showpin":0,"exectime":222}
다음은 예전 로그인 처리 코드입니다:
/** * @author LongJin * @description 초기 로그인 정보<br> 반환 false는 초기 실패를 의미합니다 * @return */ public boolean preLogin(){ boolean flag = false; try { su = new String(Base64.encodeBase64(URLEncoder.encode(username, "UTF-8").getBytes())); String url = "http:";//login.sina.com.cn/sso/prelogin.php#63;entry=weibo&rsakt=mod&checkpin=1&" + "client=ssologin.js(v1.4.5)&_=" + getTimestamp(); url += "&su=" + su; String content; content = HttpUtils.getRequest(client, url); System.out.println("content------------" + content); JSONObject json = JSONObject.fromObject(content); System.out.println(json); servertime = json.getLong("servertime"); nonce = json.getString("nonce"); rsakv = json.getString("rsakv"); pubkey = json.getString("pubkey"); flag = encodePwd(); } catch (UnsupportedEncodingException e) { System.out.println("UnsupportedEncoding 예외가 발생했습니다"); } catch (ClientProtocolException e) { System.out.println("抛出ClientProtocol异常"); } catch (IOException e) { System.out.println("抛出IO异常"); } return flag; }
다음은:
로그인에 필요한 매개변수를 얻은 후 POST 요청을 사용합니다http://login.sina.com.cn/sso/login.php위의 예전 로그인 후 처리된 데이터를 매개변수로代入하여 결과를 얻습니다:
<html> <head> <meta http-equiv="Content-Type" content="text"/html; charset=GBK" /> <title>신浪 통합 인증</title> <script charset="utf-8" src="http://i.sso.sina.com.cn/js/ssologin.js"></script> </head> <body> 로그인 중 ... <script> try{sinaSSOController.setCrossDomainUrlList({"retcode":0,"arrURL":["http:\/\/passport.97973.com\/sso\/crossdomain?action=login&savestate=1518828005","http:\/\/passport.weibo.cn\/sso\/crossdomain?action=login&savestate=1"]});} catch(e){ var msg = e.message; var img = new Image(); var type = 1; img.src = 'http://login.sina.com.cn/sso/debuglog?msg=' + msg +'&type=' + type; }try{sinaSSOController.crossDomainAction('login',function(){location.replace('http://passport.weibo.com/wbsso/login?ssosavestate=1518828005&url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack&ticket=ST-NTUwODg3MjkxMQ==-1487292005-gz-FF56C545999F864FC6C7AB86FCA9FA4A-1&retcode=0');});} catch(e){ var msg = e.message; var img = new Image(); var type = 2; img.src = 'http://login.sina.com.cn/sso/debuglog?msg=' + msg +'&type=' + type; } </script> </body> </html>
그런 다음 정규 표현식으로 우리가 원하는 부분을 추출합니다: location.replace('') 중간 부분, 정규 표현식은 다음과 같습니다:
String regex = "위치.replace\\('([\\s\\S*?)'\\);";
정규 표현식으로 얻은 결과를 처리하고, 성공하면 GET 요청으로 얻은 링크를 사용하여 로그인 부분의 코드는 다음과 같습니다:
/** * @author LongJin * @description 로그인 * @return true: 로그인 성공 */ public boolean login() { if(preLogin()) {}} String url = "http:";//login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15); List<NameValuePair> parms = new ArrayList<NameValuePair>(); parms.add(new BasicNameValuePair("entry", "weibo")); parms.add(new BasicNameValuePair("geteway", ""));1")); parms.add(new BasicNameValuePair("from", "")); parms.add(new BasicNameValuePair("savestate", ""));7")); parms.add(new BasicNameValuePair("useticket", ""));1")); parms.add(new BasicNameValuePair("pagerefer", "http:"));//login.sina.com.cn/sso/logout.php?entry=miniblog&r=http%3A%2F%2Fweibo.com%2Flogout.php%3Fbackurl%3D%2F" parms.add(new BasicNameValuePair("vsnf", ""));1")); parms.add(new BasicNameValuePair("su", su)); parms.add(new BasicNameValuePair("service", "miniblog")); parms.add(new BasicNameValuePair("servertime", servertime)); + "")); parms.add(new BasicNameValuePair("nonce", nonce)); parms.add(new BasicNameValuePair("pwencode", "rsa"));2")); parms.add(new BasicNameValuePair("rsakv", rsakv)); parms.add(new BasicNameValuePair("sp", sp)); parms.add(new BasicNameValuePair("encoding", "UTF-8")); parms.add(new BasicNameValuePair("prelt", "182")); parms.add(new BasicNameValuePair("url", "http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack")); parms.add(new BasicNameValuePair("domain", "sina.com.cn")); parms.add(new BasicNameValuePair("returntype", "META")); try { String content = HttpUtils.postRequest(client, url, parms); System.out.println("content----------" + content); String regex = "위치.replace\\('([\\s\\S*?)'\\);";//\\(' '\\) 특수 문자 변환 매칭 ('' 내용)//위치.replace([\\s\\S]*?) Pattern p = Pattern.compile(regex); Matcher m = p.matcher(content); if(m.find()) { System.out.println("ss = ");+m.group()); 위치 = m.group(1); if(위치.contains("reason=")) {//이 단계까지 왔으면 축하합니다, 오류가 발생했습니다 errInfo = 위치.substring(위치.indexOf("reason=")); + 7); errInfo = URLDecoder.decode(errInfo, "GBK"); } System.out.println("위치 = ");+위치); String 결과 = HttpUtils.getRequest(client, 위치);//.substring(2, location.length()-2) int beginIndex = result.indexOf("("); int endIndex = result.lastIndexOf(")"); result = result.substring(beginIndex+1, endIndex);//截取括号里面的json字符串 //content = URLDecoder.decode(content, "UTF-8; JSONObject jsonObject = JSONObject.fromObject(result);//转换为json //获取uniqueid+userdomain用于访问时带的参数 uniqueid = jsonObject.getJSONObject("userinfo").getString("uniqueid"); userdomain = jsonObject.getJSONObject("userinfo").getString("userdomain"); System.out.println("result--------------" + result); return true; } } } catch (ClientProtocolException e) { System.out.println("抛出ClientProtocol异常"); } catch (IOException e) { System.out.println("抛出IO异常"); } } return false; }
补充一下密码加密部分的代码:
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){ var olda = a; var oldb = b; var oldc = c; var oldd = d; var olde = e; for (var j = 0; j <+=160; j8){ if (j <++) w[j] = x[i16j]; else w[j] = rol(w[j+] ^ w[j-3];-8];-14];-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) & #63;1518500249: (t <40) & #63;1859775393: (t <60) & #63;-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='';enc1>>2);enc2=$((chr1&3)<<4)|(chr2>>4);enc3=$((chr2&15)<<2)|(chr3>>6);enc4='';enc3&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.charAt(enc3)+this._keys.charAt(enc4);chr1='';enc2='';enc3='';enc1=enc2=enc3=enc4123456789+/='};}).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;}2(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;}함수 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;함수 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(var i=this.t-1;i>=0;--;this.s=(x<0):0;if(x>0)this[0]=x;else if(x<63;-1)this[0]=x-1DV;else this.t=0;}function nbv(i){var r=nbi();r.fromInt(i);return r;}function bnpFromString(s,b){var k;if(b==+;else{this.fromRadix(s,b);return;}this.t=0;this.s=0;var i=s.length,mi=false,sh=0;while(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=2i>=0){var x=(k==--;s[i]&0xff:intAt(s,i);if(x<0){if(s.charAt(i)=='8)]?')mi=true;continue;}mi=false;if(sh==0)this[this.t-=x;else if(sh++k>this.DB){this[this.t+]|=(x&(-1))<<sh;this[this.t1<<(this.DB-sh))-1]=(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)this[this.t-1]|=(1<<(this.DB-sh))-1);}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=이.t;var p=이.DB-(i*이.DB)%k;if(i-->0){if(p<이.DB&&(d=이[i]>>p)>0){m=true;r=int2char(d);}while(i>=0){if(p<k){d=(이[i]&((1<<p)-1))<<(k-p);d|=이[--i]>>(p+=이.DB-k);}else{d=(이[i]>>(p-=k))&km;if(p<=0){p+=이.DB;--i;}}if(d>0)m=true;if(m)r+=int2char(d);}}return m?r:'0';}function bnNegate(){var r=nbi();BigInteger.ZERO.subTo(이,r);return r);}function bnAbs(){return(이.s<0)?이.negate():이;}function bnCompareTo(a){var r=이.s-a.s;if(r!=0)return r;var i=이.t;r=i-a.t;if(r!=0)return r;while(--i>=0)if((r=이[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(이.t<=0)return 0;return 이.DB*(이.t-1)+nbits(이[이.t-1]]^(이.s&이.DM));}function bnpDLShiftTo(n,r){var i;for(i=이.t-1;i>=0;--i)r[i+n]=이[i];for(i=n-1;i>=0;--i)r[i]=0;r.t=이.t+n;r.s=이.s;}function bnpDRShiftTo(n,r){for(var i=n;i<이.t;++i)r[i-n]=이[i];r.t=이.t(Math.max(this.t-n,0);r.s=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;r.t=this.t+ds+1;r.s=this.s;r.clamp();}function bnpRShiftTo(n,r){r.s=this.s;var ds=Math.floor(n/this.DB);if(ds>=this.t){r.t=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;r.t=this.t-ds;r.clamp();}function bnpSubTo(a,r){var i=0,c=0,m=Math.min(a.t,this.t);while(i<m){c+=this[i]-a[i];r[i++}=c&this.DM;c>>=this.DB;}if(a.t<this.t){c-=a.s;while(i<this.t){c+=this[i];r[i++}=c&this.DM;c>>=this.DB;}c+=this.s;}else{c+=this.s;while(i<a.t){c-=a[i];r[i++}=c&this.DM;c>>=this.DB;}c-=a.s;}r.s=(c<0)?-1:0;if(c<-1)r[i++}=this.DV+c;else if(c>0)r[i++}=c;r.t=i;r.clamp();}function bnpMultiplyTo(a,r){var x=this.abs(),y=a.abs();var i=x.t;r.t=i+))>=x.DV){r[i--i)++r[ifunction bnpSquareTo(r){var x=this.abs();var i=r.t=+x.t]=x.am(0,y[i],r,i,0,x.t);r.s=0;r.clamp();if(this.s!=a.s)BigInteger.ZERO.subTo(r,r);}2*x.t;while(--i>=0)r[i]=0;for(i=0;i<x.t-1;++i){var c=x.am(i,x[i],r,2*i,0,1);if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1))>=x.DV){r[i+x.t]-=x.DV;r[i+>x.t+1;r.subTo(t,r);1;}}if(r.t>0)r[r.t-1]+=x.am(i,x[i],r,2*i,0,1);r.s=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=m.s;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=y.t;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=r.t,j=i-ys,t=(q==null)?nbi():q;y.dlShiftTo(j,t);if(r.compareTo(t)>=0){r[r.t++;r.subTo(t,r);1BigInteger.ONE.dlShiftTo(ys,t);t.subTo(y,y);while(y.t<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);}r.t=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(x.s<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=이제이.mp&0x7fff;this.mph=이제이.mp>>15;this.um=(1<<(m.DB-15))-1;this.mt2=2*m.t;}function montConvert(x){var r=nbi();x.abs().dlShiftTo(이제이.m.t,r);r.divRemTo(이제이,null,r);if(x.s<0&&r.compareTo(BigInteger.ZERO)>0)이제이.m.subTo(r,r);return r;}function montRevert(x){var r=nbi();x.copyTo(r);this.reduce(r);return r;}function montReduce(x){while(x.t<=this.mt2)x[x.t++=0;for(var i=0;i<이제이.m.t;++i){var j=x[i]&0x7fff;var u0=(j*이제이.mpl+(((j*이제이.mph+(x[i]>>15)*이제이.mpl)&이제이.um<<15))&x.DM;j=i+이제이.m.t;x[j]+=이제이.m.am(0,u0,x,i,0,이제이.m.t);while(x[j]>=x.DV)=x.DV;x[-j]++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=montRevert;Montgomery.prototype.reduce=montReduce;Montgomery.prototype.mulTo=montMulTo;Montgomery.prototype.sqrTo=montSqrTo;function bnpIsEven(){return((this.t>0)++;}}x.clamp();x.drShiftTo(this.m.t,x);if(x.compareTo(this.m)>=0)x.subTo(this.m,x);63;(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.fromString=bnpFromString;BigInteger.prototype.clamp=bnpClamp;BigInteger.prototype.dlShiftTo=bnpDLShiftTo;BigInteger.prototype.drShiftTo=bnpDRShiftTo;BigInteger.prototype.lShiftTo=bnpLShiftTo;BigInteger.prototype.rShiftTo=bnpRShiftTo;BigInteger.prototype.subTo=bnpSubTo;BigInteger.prototype.multiplyTo=bnpMultiplyTo;BigInteger.prototype.squareTo=bnpSquareTo;BigInteger.prototype.divRemTo=bnpDivRemTo;BigInteger.prototype.invDigit=bnpInvDigit;BigInteger.prototype.isEven=bnpIsEven;BigInteger.prototype.exp=bnpExp;BigInteger.prototype.toString=bnToString;BigInteger.prototype.negate=bnNegate;BigInteger.prototype.abs=bnAbs;BigInteger.prototype.compareTo=bnCompareTo;BigInteger.prototype.bitLength=bnBitLength;BigInteger.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;++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+function byte+s.substring(i,s.length);}2Hex(b){if(b<0x10)return '0'+b.toString(16);else return b.toString(16);}1pad2(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.dmp1116);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()+73);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;}";
/** * 密码进行RSA加密<br> * 返回false说明加密失败 * @return */ private boolean encodePwd() { ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine se = sem.getEngineByName("javascript"); try { // js를 사용하여 암호화 비밀번호, RSA, js 내부 메서드 호출, 여기서는 문자열을 사용하고 있지만 파일에 직접 저장하고 읽을 수도 있습니다. 다음 주석 부분과 같이. se.eval(sina_js); //js 내부 함수를 사용하여 암호화 호출 if (se instanceof Invocable) { Invocable iv = (Invocable) se; sp = (String) iv.invokeFunction("getpass", this.password, this.servertime, this.nonce, this.pubkey); } /* FileReader fr = new FileReader("E:\\encoder.js"); se.eval(fr); Invocable invocableEngine = (Invocable) se; String callbackvalue = (String) invocableEngine.invokeFunction("encodePwd", pubkey, servertime, nonce, password); sp = callbackvalue;*/ return true; } catch (ScriptException e) { // TODO Auto-generated catch block //e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block //e.printStackTrace(); } errInfo = "암호 암호화 실패!"; return false; } /** * @author LongJin * @description 오류 정보 반환 * @return */ public String getErrInfo() { return errInfo; }
로그인 부분은 기본적으로 완료되었습니다。
마지막으로 테스트 로그인 데이터 수집을 수행합니다:
public static void main(String[] args) throws ClientProtocolException, IOException { SinaWeibo weibo = new SinaWeibo("**", ", "***;//계정과 비밀번호는 여기서는 공개하지 않습니다 if(weibo.login()) { System.out.println("로그인 성공!"); InputStream con= HttpUtils.getRequests(client, "http://weibo.com/u/"+uniqueid+userdomain);//개인主页를 요청하여 입력 스트림을 가져옵니다 String cont = readStreamByEncoding(con, "UTF-8;//반환된 입력 스트림을 문자열로 변환합니다 String sb = HttpUtils.getText(cont);//jsoup를 통해 text 내용 부분을 가져옵니다 //readStreamOutFileByEncoding(sb); 또한, 가져온 내용을 파일에 쓸 수도 있습니다 } System.out.println("로그인 실패!"); } }
가져온 결과는 다음과 같습니다:
text--------------저는 "이建联" 이选项에 투표했습니다. #국적MVP# 이 시즌 정규 시즌 최고의 가치 있는 선수(MVP) 선정은 중국 농구 협회 소식 위원회 구성원 단체, 클럽이 추천한 현지 매체 대표로 구성되었으며, 신浪은 한 표를 가지고 있으며, 팬들의 의견을 농구 협회에 전달할 것입니다. 이 시즌 국적 MVP는 누구인가요? #국적MVP#63;63;63;63;
이제 전체 로그인이 완료되었습니다. 부족한 점이 많다면 많이 지적해 주십시오.
이것이 이 문서의 모든 내용입니다. 이 문서의 내용이 여러분의 학습이나 업무에 도움이 되길 바랍니다. 또한, 나아가 '노래教程'을 많이 지지해 주시기 바랍니다!
선언: 이 문서의 내용은 인터넷에서 가져왔으며, 저작권자는 본사입니다. 내용은 인터넷 사용자가 자발적으로 기여하고 업로드한 것이며, 이 사이트는 소유권을 가지지 않으며, 인공 편집 처리를 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 위반이 의심되는 내용이 있으면, 이메일을 notice#w로 보내 주시기 바랍니다.3codebox.com(이메일을 보내면, #을 @으로 변경하십시오. 신고를 하고, 관련 증거를 제공하십시오. 실제로 확인되면, 이 사이트는 즉시 위반 내용을 삭제합니다.)