php 新浪通行证、新浪微博模拟统一登录 (后台网页抓取版) 2016
程序员文章站
2022-05-23 15:49:36
...
前几天做了一个Java的新浪通行证模拟登录测试。现在给大家一个php的新浪通行证、微博登录的示例:具体都有备注,大家阅读代码吧.
'login.sina.com.cn', 'User-Agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0', 'Accept' => '*/*', 'Accept-Language' => 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding' => 'gzip, deflate', 'Referer' => 'http://login.sina.com.cn/', 'Connection' => 'keep-alive' ); //base64加密后用户名 private $su = ''; //js加密后的密码 private $sp = ''; function __construct() { } //预登陆 function pre_login() { // 用户名称base64加密-用于预登陆 $this->su = base64_encode ( urlencode ( $this->username ) ); // 预登陆url $pre_login_url = 'http://login.sina.com.cn/sso/prelogin.php?entry=account&callback=sinaSSOController.preloginCallBack&su='; $pre_login_url = $pre_login_url . $this->su . '&rsakt=mod&client=ssologin.js(v1.4.15)&_=' . time (); $return_val = $this->request_url ( $pre_login_url, null, $this->request_cookie, $this->request_headers); list ( $header, $body ) = explode ( "\r\n\r\n", $return_val, 2 ); preg_match_all ( "/Set\-Cookie:([^;]*);/", $header, $matches ); $info ['cookie'] = $matches; $info ['header'] = $header; $info ['content'] = $body; $this->request_cookie .= $matches; $body = str_replace('sinaSSOController.preloginCallBack(', '', $body); $json = str_replace(')', '', $body); $this->json_obj = json_decode($json); //ajax后变量重置,所以存到cookie param::set_cookie('sina_su', $this->su); param::set_cookie('sina_cookie', $this->request_cookie); param::set_cookie('sina_servertime', $this->json_obj->servertime); param::set_cookie('sina_nonce', $this->json_obj->nonce); param::set_cookie('sina_rsakv', $this->json_obj->rsakv); //加密明文密码 $this->ajax_pwd_encode(); } //根据预登陆返回信息,登录 function account_login() { //登录url $login_url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_='.time(); $this->request_headers['Content-Type'] = 'application/x-www-form-urlencoded'; //登录所需数据 $post_data['entry'] = 'account'; $post_data['gateway'] = '1'; $post_data['from'] = ''; $post_data['savestate'] = '0'; $post_data['useticket'] = '0'; $post_data['pagerefer'] = ''; $post_data['vsnf'] = '1'; $post_data['su'] = param::get_cookie('sina_su'); $post_data['service'] = 'sso'; $post_data['servertime'] = param::get_cookie('sina_servertime'); $post_data['nonce'] = param::get_cookie('sina_nonce'); $post_data['pwencode'] = 'rsa2'; $post_data['rsakv'] = param::get_cookie('sina_rsakv'); $post_data['sp'] = $this->sp; $post_data['sr'] = '1366*768'; $post_data['encoding'] = 'UTF-8'; $post_data['cdult'] = '3'; $post_data['domain'] = 'sina.com.cn'; $post_data['prelt'] = '51'; $post_data['returntype'] = 'TEXT'; //登录 $data = $this->request_url($login_url, $post_data, $this->request_cookie, $this->request_headers); //获取返回cookie 及 json数据 list ( $header, $body ) = explode ( "\r\n\r\n", $data, 2 ); //保存cookie $this->save_cookie($header); $json_login = json_decode($body); //访问返回json链接 $domain_urls = $json_login->crossDomainUrlList; $i = 0; foreach ($domain_urls as $v) { $req_url = $v.'&callback=sinaSSOController.doCrossDomainCallBack&scriptId=ssoscript'.$i.'&client=ssologin.js(v1.4.15)&_='.time(); $req_data = $this->request_url ( $req_url, null, $this->request_cookie, array(), 0); // list ( $header, $body ) = explode ( "\r\n\r\n", $data, 2 );// $this->save_cookie($header); $i ++; } } function save_cookie($header) { $headers = explode('\r\n', $header); foreach ($headers as $v) { $tmp = explode("\r\n", $v); foreach ($tmp as $it) { $pos = strpos($it, 'Set-Cookie'); if ($pos !== false) { $cv = explode(":", $it); $this->request_cookie .= $cv[1].';'; } } } } function sina_login() { //获取加密后的密码 $this->sp = $_GET['sp']; //账号登录 $this->account_login(); //重定向到新浪通行证页面 $this->request_cookie = trim($this->request_cookie); $this->request_headers['Content-Type'] = 'text/html'; $url = 'http://login.sina.com.cn'; //返回的html $html = $this->request_url($url, null, $this->request_cookie, $this->request_headers, 0); } //调用js 加密密码 function ajax_pwd_encode() { echo ""; echo 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>9)>16)+(y>>16)+(lsw>>16);return(msw>>(32-cnt));};var str2binb=function(str){var bin=Array();var mask=(1>5]|=(str.charCodeAt(i/chrsz)&mask)>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;enc2=((chr1&3)>4);enc3=((chr2&15)>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.charAt(enc3)+this._keys.charAt(enc4);chr1=chr2=chr3='';enc1=enc2=enc3=enc4='';}while(i=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)>>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)>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=0;--i)r[i]=this[i];r.t=this.t;r.s=this.s;}function bnpFromInt(x){this.t=1;this.s=(x0)this[0]=x;else if(x=0){var x=(k==8)?s[i]&0xff:intAt(s,i);if(xthis.DB){this[this.t-1]|=(x&((1>(this.DB-sh));}else this[this.t-1]|=x=this.DB)sh-=this.DB;}if(k==8&&(s[0]&0x80)!=0){this.s=-1;if(sh>0)this[this.t-1]|=((10&&this[this.t-1]==c)--this.t;}function bnToString(b){if(this.s0){if(p >p)>0){m=true;r=int2char(d);}while(i>=0){if(p >(p+=this.DB-k);}else{d=(this[i]>>(p-=k))&km;if(p0)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)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;--i)r[i+n]=this[i];for(i=n-1;i>=0;--i)r[i]=0;r.t=this.t+n;r.s=this.s;}function bnpDRShiftTo(n,r){for(var i=n;i =0;--i){r[i+ds+1]=(this[i]>>cbs)|c;c=(this[i]&bm)=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;for(var i=ds+1;i >bs;}if(bs>0)r[this.t-ds-1]|=(this.s&bm)>=this.DB;}if(a.t >=this.DB;}c+=this.s;}else{c+=this.s;while(i >=this.DB;}c-=a.s;}r.s=(c0)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+y.t;while(--i>=0)r[i]=0;for(i=0;i =0)r[i]=0;for(i=0;i =x.DV){r[i+x.t]-=x.DV;r[i+x.t+1]=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.t0){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*(11)?y[ys-2]>>this.F2:0);var d1=this.FV/yt,d2=(1=0){r[r.t++]=1;r.subTo(t,r);}BigInteger.ONE.dlShiftTo(ys,t);t.subTo(y,y);while(y.t =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)) 0)r.rShiftTo(nsh,r);if(ts0)a.subTo(r,r);return r;}function Classic(m){this.m=m;}function cConvert(x){if(x.s=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.t0)?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=(10)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(x.t>15)*this.mpl)&this.um)=x.DV){x[j]-=x.DV;x[++j]++;}}x.clamp();x.drShiftTo(this.m.t,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=montRevert;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=0){z.sqrTo(r,r2);if((e&(10)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>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 >>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 =0&&n>0){var c=s.charCodeAt(i--);if(c127)&&(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;} EOT; echo " "; } /** * 模拟post、get请求 * * @param string $url * @param array $post_data * null时,get请求 * @param string $request_cookie */ function request_url($url = '', $post_data = array(), $request_cookies = '', $request_headers = '', $return_cookie=1) { if (empty ( $url )) { return false; } $is_post = false; if (! empty ( $post_data ) && is_array ( $post_data )) { $o = ""; foreach ( $post_data as $k => $v ) { $o .= "$k=" . urlencode ( $v ) . "&"; } $post_data = substr ( $o, 0, - 1 ); $is_post = true; } $ch = curl_init (); // 初始化curl curl_setopt ( $ch, CURLOPT_URL, $url ); // 抓取指定网页 curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 ); // 要求结果为字符串且输出到屏幕上 if ($is_post) { curl_setopt ( $ch, CURLOPT_POST, 1 ); // post提交方式 curl_setopt ( $ch, CURLOPT_POSTFIELDS, $post_data ); // post数据 } curl_setopt ( $ch, CURLOPT_COOKIE, $request_cookies ); // 请求cookie curl_setopt ( $ch, CURLOPT_HEADER, $return_cookie); // 返回cookie到头 curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, 120 ); curl_setopt ( $ch, CURLOPT_HTTPHEADER, $request_headers ); curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1); $data = curl_exec ( $ch ); // 运行curl curl_close ( $ch ); return $data; }}?>