前段时间对一个第三方微博app---Share的实现原理非常感兴趣,也想自己实现一个自己的第三方微博app。目标有了,那就去查一下微博数据怎么获取吧。原来微博是有开放第三方接口的,只需要申请一个appkey,在Android开发中直接使用微博提供的SDK即可。非常方便,可是。。。这种方便是有代价的,对于一些只是想调用接口玩玩的同学,微博并不会提供大量的微博api调用次数,每天大概只能刷个100次微博就不能再调用了,而且,一些接口也做了很严格的限制,比如发微博要带一个第三方安全链接,比如www.google.com。。。不能查看特定用户的微博等等。。太蛋疼了!于是我想到能不能用模拟登陆的方式直接获取到用户时间线微博,这样就不用调用那烦人的接口了。。。于是在github上找到了fuck-login项目,里面有个模拟登陆微博的python脚本,是通过模拟登陆微博主站 weibo.com再跳转到m.weibo.cn,但实测m.weibo.cn不能爬取微博,要跳转到weibo.cn这个旧网站才行,他的时间线微博id全在返回的html数据里面了。

但毕竟是使用python实现的,于是我按照思路用java代码重新写了一遍,需要用gradle导入 okhttp,persistentcookiejar,scriptenginemanager。

以下是python代码。转载于fuck-login项目 点击打开链接

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Date    : 2018-01-28 18:47:39
# @Author  : xchaoinfo (xchaoinfo)import time
import base64
import rsa
import binascii
import requests
import re
from PIL import Image
import random
from urllib.parse import quote_plus
import http.cookiejar as cookielib"""
整体的思路是,
1. 先登录到 weibo.com,
2. 然后用 weibo.com 的 cookie 跳转到 m.weibo.cn
3. 保存 cookie 方便以后使用
3. 仅仅在 Python3.4+ 测试通过,低版本没有测试
4. 代码 PEP8 规范
"""agent = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0'
headers = {'User-Agent': agent
}class WeiboLogin(object):"""通过登录 weibo.com 然后跳转到 m.weibo.cn"""def __init__(self, user, password, cookie_path):super(WeiboLogin, self).__init__()self.user = userself.password = passwordself.session = requests.Session()self.cookie_path = cookie_pathself.session.cookies = cookielib.LWPCookieJar(filename=self.cookie_path)self.index_url = "http://weibo.com/login.php"self.session.get(self.index_url, headers=headers, timeout=2)self.postdata = dict()def get_su(self):"""对 email 地址和手机号码 先 javascript 中 encodeURIComponent对应 Python 3 中的是 urllib.parse.quote_plus然后在 base64 加密后decode"""username_quote = quote_plus(self.user)username_base64 = base64.b64encode(username_quote.encode("utf-8"))return username_base64.decode("utf-8")# 预登陆获得 servertime, nonce, pubkey, rsakvdef get_server_data(self, su):"""与原来的相比,微博的登录从 v1.4.18 升级到了 v1.4.19这里使用了 URL 拼接的方式,也可以用 Params 参数传递的方式"""pre_url = "http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su="pre_url = pre_url + su + "&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)&_="pre_url = pre_url + str(int(time.time() * 1000))pre_data_res = self.session.get(pre_url, headers=headers)# print(pre_data_res.text)sever_data = eval(pre_data_res.content.decode("utf-8").replace("sinaSSOController.preloginCallBack", ''))return sever_datadef get_password(self, servertime, nonce, pubkey):"""对密码进行 RSA 的加密"""rsaPublickey = int(pubkey, 16)key = rsa.PublicKey(rsaPublickey, 65537)  # 创建公钥message = str(servertime) + '\t' + str(nonce) + '\n' + str(self.password)  # 拼接明文js加密文件中得到message = message.encode("utf-8")passwd = rsa.encrypt(message, key)  # 加密passwd = binascii.b2a_hex(passwd)  # 将加密信息转换为16进制。return passwddef get_cha(self, pcid):"""获取验证码,并且用PIL打开,1. 如果本机安装了图片查看软件,也可以用 os.subprocess 的打开验证码2. 可以改写此函数接入打码平台。"""cha_url = "https://login.sina.com.cn/cgi/pin.php?r="cha_url = cha_url + str(int(random.random() * 100000000)) + "&s=0&p="cha_url = cha_url + pcidcha_page = self.session.get(cha_url, headers=headers)with open("cha.jpg", 'wb') as f:f.write(cha_page.content)f.close()try:im = Image.open("cha.jpg")im.show()im.close()except Exception as e:print(u"请到当前目录下,找到验证码后输入")def pre_login(self):# su 是加密后的用户名su = self.get_su()sever_data = self.get_server_data(su)servertime = sever_data["servertime"]nonce = sever_data['nonce']rsakv = sever_data["rsakv"]pubkey = sever_data["pubkey"]showpin = sever_data["showpin"]  # 这个参数的意义待探索password_secret = self.get_password(servertime, nonce, pubkey)self.postdata = {'entry': 'weibo','gateway': '1','from': '','savestate': '7','useticket': '1','pagerefer': "https://passport.weibo.com",'vsnf': '1','su': su,'service': 'miniblog','servertime': servertime,'nonce': nonce,'pwencode': 'rsa2','rsakv': rsakv,'sp': password_secret,'sr': '1366*768','encoding': 'UTF-8','prelt': '115',"cdult": "38",'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack','returntype': 'TEXT'  # 这里是 TEXT 和 META 选择,具体含义待探索}return sever_datadef login(self):# 先不输入验证码登录测试try:sever_data = self.pre_login()login_url = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)&_'login_url = login_url + str(time.time() * 1000)login_page = self.session.post(login_url, data=self.postdata, headers=headers)ticket_js = login_page.json()ticket = ticket_js["ticket"]except Exception as e:sever_data = self.pre_login()login_url = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)&_'login_url = login_url + str(time.time() * 1000)pcid = sever_data["pcid"]self.get_cha(pcid)self.postdata['door'] = input(u"请输入验证码")login_page = self.session.post(login_url, data=self.postdata, headers=headers)ticket_js = login_page.json()ticket = ticket_js["ticket"]# 以下内容是 处理登录跳转链接save_pa = r'==-(\d+)-'ssosavestate = int(re.findall(save_pa, ticket)[0]) + 3600 * 7jump_ticket_params = {"callback": "sinaSSOController.callbackLoginStatus","ticket": ticket,"ssosavestate": str(ssosavestate),"client": "ssologin.js(v1.4.19)","_": str(time.time() * 1000),}jump_url = "https://passport.weibo.com/wbsso/login"jump_headers = {"Host": "passport.weibo.com","Referer": "https://weibo.com/","User-Agent": headers["User-Agent"]}jump_login = self.session.get(jump_url, params=jump_ticket_params, headers=jump_headers)uuid = jump_login.textuuid_pa = r'"uniqueid":"(.*?)"'uuid_res = re.findall(uuid_pa, uuid, re.S)[0]web_weibo_url = "http://weibo.com/%s/profile?topnav=1&wvr=6&is_all=1" % uuid_resweibo_page = self.session.get(web_weibo_url, headers=headers)weibo_pa = r'<title>(.*?)</title>'# print(weibo_page.content.decode("utf-8"))userID = re.findall(weibo_pa, weibo_page.content.decode("utf-8", 'ignore'), re.S)[0]print(u"欢迎你 %s, 你在正在使用 xchaoinfo 写的模拟登录微博" % userID)# weibo.com 登录成功# 利用 weibo.com 的 cookie 登录到  m.weibo.cnprint("利用 weibo.com 的 cookie 登录到  m.weibo.cn")Mheaders = {"Host": "login.sina.com.cn","User-Agent": agent}# m.weibo.cn 登录的 url 拼接_rand = str(time.time())mParams = {"url": "https://m.weibo.cn/","_rand": _rand,"gateway": "1","service": "sinawap","entry": "sinawap","useticket": "1","returntype": "META","sudaref": "","_client_version": "0.6.26",}murl = "https://login.sina.com.cn/sso/login.php"mhtml = self.session.get(murl, params=mParams, headers=Mheaders)mhtml.encoding = mhtml.apparent_encodingmpa = r'replace\((.*?)\);'mres = re.findall(mpa, mhtml.text)# 关键的跳转步骤,这里不出问题,基本就成功了。Mheaders["Host"] = "passport.weibo.cn"self.session.get(eval(mres[0]), headers=Mheaders)# mlogin = self.session.get(eval(mres[0]), headers=Mheaders)# print(mlogin.status_code)# 进过几次 页面跳转后,m.weibo.cn 登录成功,下次测试是否登录成功Mheaders["Host"] = "m.weibo.cn"Set_url = "https://m.weibo.cn"pro = self.session.get(Set_url, headers=Mheaders)pa_login = r'isLogin":true,'login_res = re.findall(pa_login, pro.text)print(login_res)# 可以通过 session.cookies 对 cookies 进行下一步相关操作self.session.cookies.save()if __name__ == '__main__':username = "yourusername"  # 用户名password = "yourpassword"  # 密码cookie_path = "yourcookie_path"  # 保存cookie 的文件名称weibo = WeiboLogin(username, password, cookie_path)weibo.login()

以下是我用java重写的代码,若要获取微博数据,调用init方法完成后,直接用virtuallogin.client访问weibo.cn内的页面即可,可以把cookie保存起来,这样就不用每次都要init了(未实现)。

public class virtuallogin {public static String user="";//你的账号public static String password="";//你的密码public static  OkHttpClient client;public static String serverdata;public static String servertime;public static String nonce;public static String rsakv;public static String pubkey;public static String sp;public static String su;public static String ticket;public static String ssosavestate;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;enc2=((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.charAt(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];r.t=this.t;r.s=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)this[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))<<(k-p);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.s-a.s;if(r!=0)return r;var i=this.t;r=i-a.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;r.t=this.t+n;r.s=this.s;}function bnpDRShiftTo(n,r){for(var i=n;i<this.t;++i)r[i-n]=this[i];r.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+y.t;while(--i>=0)r[i]=0;for(i=0;i<y.t;++i)r[i+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);}function bnpSquareTo(r){var x=this.abs();var i=r.t=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]=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++]=1;r.subTo(t,r);}BigInteger.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=this.mp&0x7fff;this.mph=this.mp>>15;this.um=(1<<(m.DB-15))-1;this.mt2=2*m.t;}function montConvert(x){var r=nbi();x.abs().dlShiftTo(this.m.t,r);r.divRemTo(this.m,null,r);if(x.s<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(x.t<=this.mt2)x[x.t++]=0;for(var i=0;i<this.m.t;++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.m.t;x[j]+=this.m.am(0,u0,x,i,0,this.m.t);while(x[j]>=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<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;++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 static Handler handler0;public static Handler handler;public String get_su(String su){try {String encodedString = Base64.encodeToString(URLEncoder.encode(su, "UTF-8").getBytes(), Base64.DEFAULT);Log.d("TAG", encodedString);virtuallogin.su=encodedString;return encodedString;}catch (Exception t){return null;}}public void get_server_data(final Handler handler) {String pre_url = "http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=";pre_url = pre_url + virtuallogin.su + "&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)&_=";pre_url = pre_url + System.currentTimeMillis() * 1000;Log.d("TAG",pre_url);Request request = new Request.Builder().addHeader("User-Agent","Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0").url(pre_url).build();Call call = virtuallogin.client.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.i("info_callFailure",e.toString());}@Overridepublic void onResponse(Call call, Response response) throws IOException {try {String serverdata = URLDecoder.decode(response.body().string(), "UTF-8");serverdata=serverdata.replace("sinaSSOController.preloginCallBack","");virtuallogin.serverdata=serverdata.substring(1,serverdata.length()-1);Log.d("TAG",serverdata);Message msg=new Message();msg.what=1;msg.obj=serverdata;handler.sendMessage(msg);}catch (Exception t){}}});}public void get_password( final Handler handler){try {JSONObject jsondata = new JSONObject(virtuallogin.serverdata);virtuallogin.servertime=jsondata.getString("servertime");virtuallogin.nonce = jsondata.getString("nonce");virtuallogin.rsakv = jsondata.getString("rsakv");virtuallogin.pubkey = jsondata.getString("pubkey");ScriptEngineManager sem = new ScriptEngineManager();ScriptEngine se = sem.getEngineByName("javascript");se.eval(virtuallogin.sina_js);//调用js内部函数用于加密if (se instanceof Invocable) {Invocable iv = (Invocable) se;virtuallogin.sp = (String) iv.invokeFunction("getpass", virtuallogin.password,virtuallogin.servertime, virtuallogin.nonce,virtuallogin.pubkey);Log.d("TAG","SP!!"+virtuallogin.sp);}String login_url = "https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)&_"+ System.currentTimeMillis() * 1000;FormBody.Builder builder = new FormBody.Builder();builder.add("entry","weibo").add("gateway","1").add("from","").add("savestate","7").add("useticket","1").add("pagerefer","https://passport.weibo.com").add("vsnf","1").add("su",virtuallogin.su).add("service","miniblog").add("servertime",virtuallogin.servertime).add("nonce",virtuallogin.nonce).add("pwencode","rsa2").add("rsakv",virtuallogin.rsakv).add("sp",virtuallogin.sp).add("sr","1366*768").add("encoding","UTF-8").add("prelt","115").add("cdult","38").add("url","http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack").add("returntype","TEXT");RequestBody formBody = builder.build();Request request = new Request.Builder().addHeader("User-Agent","Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0").url(login_url).post(formBody).build();Call call = virtuallogin.client.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.i("info_callFailure",e.toString());}@Overridepublic void onResponse(Call call, Response response) throws IOException {try {String jsonstring=  response.body().string();Log.d("TAG","坚持就是胜利"+jsonstring);JSONObject json=new JSONObject(jsonstring);String ticket=json.getString("ticket");Message msg=new Message();msg.what=1;msg.obj=ticket;Log.d("TAG","ticket"+ticket);handler.sendMessage(msg);}catch (Exception t){}}});}  catch (Exception t){Log.d("TAG","ERROR");}}public void login(final Handler handler){new Thread(new Runnable() {@Overridepublic void run() {try {String jump_url = "https://passport.weibo.com/wbsso/login";FormBody.Builder builder = new FormBody.Builder();builder.add("callback","sinaSSOController.callbackLoginStatus").add("ticket",virtuallogin.ticket).add("ssosavestate",virtuallogin.ssosavestate).add("client","ssologin.js(v1.4.19)").add("_",""+System.currentTimeMillis()*1000);RequestBody formBody = builder.build();Request request = new Request.Builder().addHeader("Host","passport.weibo.com").addHeader("Referer","https://weibo.com/").addHeader("User-Agent","Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0").url(jump_url).post(formBody).build();Call call = virtuallogin.client.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.i("info_callFailure",e.toString());}@Overridepublic void onResponse(Call call, Response response) throws IOException {String text=response.body().string();Log.d("TAG","最后啦!!!"+text);String uniqueid=text.substring(text.indexOf("\"uniqueid\"")+12,text.indexOf("\"displayname\"")-2);String uniqueurl="http://weibo.com/"+uniqueid+"/profile?topnav=1&wvr=6&is_all=1";Log.d("TAG","uniqueurl"+uniqueurl);Request weiborequest = new Request.Builder().addHeader("User-Agent","Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0").url(uniqueurl).build();Response weiboresponse =virtuallogin.client.newCall(weiborequest).execute();Log.d("TAG","欢迎!!"+weiboresponse.body().string());String muurl = "https://login.sina.com.cn/sso/login.php";FormBody.Builder builder = new FormBody.Builder();builder.add("url","https://weibo.cn/").add("_rand",""+System.currentTimeMillis()).add("gateway","1").add("service","sinawap").add("entry","sinawap").add("useticket","1").add("returntype","META").add("sudaref","").add("_client_version","0.6.26");RequestBody formBody = builder.build();Request request = new Request.Builder().addHeader("Host","login.sina.com.cn").addHeader("User-Agent","Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0").url(muurl).post(formBody).build();Response loginweiboresponse =virtuallogin.client.newCall(request).execute();String replacetext=loginweiboresponse.body().string();Log.d("TAG","replacetext"+replacetext);String replace=replacetext.substring(replacetext.indexOf("location.replace")+18,replacetext.length());replace=replace.substring(0,replace.indexOf("\");"));Log.d("TAG","replace"+replace);Request mrequest = new Request.Builder().addHeader("Host","passport.weibo.cn").addHeader("User-Agent","Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0").url(replace).build();Response mresponse =virtuallogin.client.newCall(mrequest).execute();Request weibocnrequest = new Request.Builder().addHeader("Host","weibo.cn").addHeader("User-Agent","Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0").url("https://weibo.cn/?since_id=0&max_id=G8qV1DjVK&prev_page=1&page=1").build();Response weibocnresponse =virtuallogin.client.newCall(weibocnrequest).execute();Log.d("TAG","真的是最后拉TAT:"+weibocnresponse.body().string());Message msg=new Message();msg.what=0;handler.sendMessage(msg);}});}  catch (Exception t){Log.d("TAG","ERROR");}}}).start();}public void init(Context context, final Handler finishhandler){virtuallogin.handler0=new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case 1:virtuallogin.ticket=(String)msg.obj;Log.d("TAG","cuowu!!!!!!tickers111!"+virtuallogin.ticket);virtuallogin.ssosavestate=virtuallogin.ticket.substring(20,30);virtuallogin.ssosavestate=""+(Long.parseLong(virtuallogin.ssosavestate) + 3600 * 7);login(finishhandler);break;default:break;}}};virtuallogin.handler=new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case 1:get_password(handler0);break;default:break;}}};ClearableCookieJar cookieJar =new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context));virtuallogin.client = new OkHttpClient.Builder().cookieJar(cookieJar).build();get_su(virtuallogin.user);get_server_data(handler);}
}

具体的实现原理可以去知乎搜索微博模拟登陆去了解,对照着大神的python源码去学习。最后来一个未完成的demo截图吧。。没有时间再去完善了,还要准备找工作呢TAT

如何不通过调用官方微博api制作一个第三方微博app---在Android开发模拟登陆微博(weibo.cn)相关推荐

  1. 【新手】基于C++Qt5通过调用百度翻译API制作简易翻译工具

    基于C++Qt5通过调用百度翻译API制作简易翻译工具 目录 基于C++Qt5通过调用百度翻译API制作简易翻译工具 写在前面 步骤: 1.注册百度翻译开放平台账号并开通翻译服务 2.下载安装Qt5和 ...

  2. ios一个app调起另一个app_电商app开发价格:制作一个电商app需要多少钱?

    智能手机的发展,带动了各式各样手机app的市场,现在大家网购大多数都是通过电商app实现,再加上分销.配送等模式发展,自建电商app成为很多企业的选择,电商app开发成本大概多少?制作一个电商app需 ...

  3. Android 数据库制作APP,在Android 中使用Anko框架制作一个完整的App,第二集

    作者:feintkotlin(Kotlin学习网) 说明:这次更新对一些小的细节进行了改进,并增加了SQLite的操作.该应用支持6.0及以上android系统 更新:当有网络时,将前5条数据保存到数 ...

  4. Android实现动态贴纸,Android开发之仿微博贴纸效果实现——进阶篇

    上个月写了一篇<Android开发之仿微博贴纸效果实现--基础篇>,文章中提到还有一篇进阶篇要写,很早就想动笔了,因中途去维护了开源库<高仿微信图片选择器2.0版本>,导致耽搁 ...

  5. php selenium模拟登陆,python+selenium自动化实战携带cookies模拟登陆微博

    首先获取cookies,使用手机扫码登录斗鱼,然后利用网页cookies保存在本地 有些同学可能会问,这不是相当于自己登录了吗,还模拟什么呢,其实来说这是一次获取cookies可以使用很久 #!/us ...

  6. python爬虫(一):模拟登陆微博

    最近花了不少时间来学python爬虫,觉得还是有很多问题的,比如说requests.get获得Pixiv的网页源代码,一直获取不到,不过我猜测大概是headers的问题,准备之后处理. 废话少说我们先 ...

  7. httpclient模拟登陆微博问题

    我用httpclient模拟登陆微博报如下错误: [DEBUG] RequestAddCookies - Cookie [version: 0][name: USRHAWB][value: usrmd ...

  8. Java模拟登陆微博获取cookie+使用微博图床api上传图片

    前言 Wbp4j 前排安利以下使用java完成的基于微博图床api实现的一个上传图片的小轮子,然后里面也有完整的代码可以查看,欢迎戳一下~ 传送门 目的 因为最近个人小项目里需要上传图片,看着自己的1 ...

  9. python3 模拟登陆微博

    import requests url='https://passport.weibo.cn/signin/login' #提交信息 dat={'username':'微博用户名', 'passwor ...

最新文章

  1. MySQL installer
  2. HTML之CSS画三角形原理,纯CSS写三角形样式集合(原理解析)
  3. 工程计价里面的表以及相关税额的计算
  4. Oracle中listener does not currently know of SID given in connect descriptor
  5. 【bzoj3530】[Sdoi2014]数数 AC自动机+数位dp
  6. hikaridatasource连接池_完美!细数SpringBoot中的那些“连接池”
  7. 微信开发者工具——支持less的插件
  8. 算法分析与设计实验报告——0-1背包问题的动态规划算法实现
  9. c#实现16进制和字符串之间转换
  10. css+html实现时间轴
  11. 嵌入式开发培训怎么样,嵌入式开发培训前景如何?
  12. 2022年8月11日:使用 ASP.NET Core 为初学者构建 Web 应用程序--使用 ASP.NET Core 控制器创建 Web API(没看懂,需要再看一遍)
  13. mysql 如何分组统计个数_mysql 怎样统计分组数
  14. 我的网站防盗链和屏蔽蜘蛛的iis8.5 web.config功能
  15. [CF505E]Mr. Kitayuta vs. Bamboos/[海军国际项目办公室]迷途竹林
  16. php ean-13,用php生成EAN_13标准的条形码_php
  17. @Configuration注解 -【Spring底层原理】
  18. Zynq笔记(一) —PL端(FPGA部分)的设计流程
  19. iphone模拟定位_为什么iPhone定位服务比您想象的更有用
  20. Java项目:基于java的医院挂号预约系统(计算机毕业设计)

热门文章

  1. 缩小贫富差距和增加人口的唯一办法
  2. MATLAB——三维图像
  3. python重新编号功能_python – 重新编号蛋白质结构文件中的残基(pdb)
  4. “金三银四”春招旺季,HR如何快速抢人才?
  5. clock Gating
  6. post导出excel
  7. iis对UNC路径的访问被拒绝
  8. 为什么穷人越来越穷?
  9. catia打开大文件需要开启高速缓存
  10. 软件设计模式及体系结构之外观模式