精华内容
下载资源
问答
  • 用requests模拟登陆weibo.cn,分析整个流程如下,第一,登陆weibo.cn获得登陆界面,模拟表单提交,post成功(下面截图的蓝色部分),成功后有一个重定向,从返回的header里头location可以获得,但是我用requests....

    用requests模拟登陆weibo.cn,分析整个流程如下,第一,登陆weibo.cn获得登陆界面,模拟表单提交,post成功(下面截图的蓝色部分),成功后有一个重定向,从返回的header里头location可以获得,但是我用requests.header没有找到location值,请问这个怎么处理,后面附上了代码,麻烦有大牛能提点一下

    import requests

    from bs4 import BeautifulSoup as bs

    weiboUrl = 'http://weibo.cn/pub/'

    loginUrl = bs(requests.get(weiboUrl).content).find("div",{"class":"ut"}).find("a")['href']

    origInfo = bs(requests.get(loginUrl).content)

    loginInfo = origInfo.find("form")['action']

    loginpostUrl = 'http://login.weibo.cn/login/'+loginInfo

    print loginpostUrl

    headers = {

    'Host': 'login.weibo.cn',

    'User-Agent' : 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; BOIE9;ZHCN)',

    'Referer' : 'http://login.weibo.cn/login/?ns=1&revalid=2&backURL=http%3A%2F%2Fweibo.cn%2F&backTitle=%D0%C2%C0%CB%CE%A2%B2%A9&vt=',

    }

    postData = {

    'mobile': YourName,

    origInfo.find("form").find("input",{"type":"password"})['name']: YourPsw,

    'remember':'on',

    'backURL':origInfo.find("form").find("input",{"name":"backURL"})['value'],

    'backTitle': origInfo.find("form").find("input",{"name":"backTitle"})['value'],

    'tryCount': origInfo.find("form").find("input",{"name":"tryCount"})['value'],

    'vk': origInfo.find("form").find("input",{"name":"vk"})['value'],

    'submit': origInfo.find("form").find("input",{"name":"submit"})['value'],

    }

    req = requests.post(loginpostUrl, data=postData, headers=headers)

    print req.headers

    req2 = requests.get('http://weibo.cn/?vt=4',cookies=req.cookies)

    print req2.content

    展开全文
  • 能模拟登陆这个(http://login.sina.com.cn/member/my.php?entry=sso "") cookie也保存下来了 但这是访问http://weibo.com就是403 源码贴上来超过3000字了,不知道能不能贴一个博客的地址 Java 模拟新浪登录 2016...
  • 于是在github上找到了fuck-login项目,里面有个模拟登陆微博的python脚本,是通过模拟登陆微博主站 weibo.com再跳转到m.weibo.cn,但实测m.weibo.cn不能爬取微博,要跳转到weibo.cn这个旧网站才行,他的时间线微博id...

      前段时间对一个第三方微博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 = user
            self.password = password
            self.session = requests.Session()
            self.cookie_path = cookie_path
            self.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, rsakv
        def 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_data
    
        def 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 passwd
    
        def 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 + pcid
            cha_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_data
    
        def 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 * 7
            jump_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.text
    
            uuid_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_res
            weibo_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.cn
            print("利用 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_encoding
            mpa = 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() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.i("info_callFailure",e.toString());
                }
    
                @Override
                public 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() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        Log.i("info_callFailure",e.toString());
                    }
    
                    @Override
                    public 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() {
                @Override
                public 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() {
                            @Override
                            public void onFailure(Call call, IOException e) {
                                Log.i("info_callFailure",e.toString());
                            }
    
                            @Override
                            public 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

     

    展开全文
  • ↗↗ 为了方便第三方开发者快速集成微博 SDK,我们提供了以下联系方式,协助开发者进行集成: **QQ群:248982250** **QQ群:284084420** **QQ群:109094998** **邮箱:sdk4wb@sina.cn** **微博:移动新技术** 虽然...

    # ReadMe

    ------

    v10.10.0

    1. 适配Android 11 ,支持通过FileProvider分享。

    v10.9.0

    1. 修复可能存在的安全问题。

    v10.8.0

    1. 修复bug.

    v10.7.0

    1. 20年第一个版本,在v9.12.0基础上的升级。

    2. 主要解决9.12.0版本中的bug.

    3。v4.x.x版本系列之后不再维护,推荐升级。具体接入方式2019SDK目录下有文档。

    4. 接入中遇到问题及时联系我解决.(QQ:879073159)

    ------

    2019年末,微博SDK版本v9.12.0全新更新:

    1.全新的SDK接入文档,解决同学们接入时候没有详细文档的痛点。

    2.全新的SDK API设计。

    3.全新的SDK Demo,实现傻瓜式接入。

    4.aar包瘦身,删除无用代码。

    注意点:

    1.新版本API有变动,如需升级到最新版本,需要看着文档一步一步来升级。

    2.新版本位置:2019SDK。

    3.新版本接入遇到问题,请及时联系我,我看到会及时回复大家。(QQ:879073159)

    ------

    资料的下载入口在本网页的右侧,有一个 download-ZIP 按钮,即可下载到本地。↗↗

    为了方便第三方开发者快速集成微博 SDK,我们提供了以下联系方式,协助开发者进行集成:

    **QQ群:248982250**

    **QQ群:284084420**

    **QQ群:109094998**

    **邮箱:sdk4wb@sina.cn**

    **微博:移动新技术**

    虽然我们提供了若干文档,但总有不尽人意的地方,为了快速上手,少走弯路,我们建议您采用以下方式来了解并集成微博SDK。

    * Step 1:浏览 ReadMe 了解大致情况

    * Step 2:运行示例程序 [WeiboSDKDemo.apk][4] 或 [Demo][5] 了解 SDK 提供的所有功能

    * Step 3:查看 [微博Android平台SDK文档V4.1.pdf][1] 深入了解如何使用

    * Step 4:参照 [Demo][5] 进行开发

    **如果您在使用过程中有些问题不清楚如何解决**,请先仔细阅读:[常见问题FAQ][2],尝试能否找到对应的答案。

    另外,关于 SDK 的 Bug 反馈、用户体验,以及建议与不足等,请大家尽量提交到 Github 上,充分利用好 Github 这一工具。

    目前 SDK 有很多不足之处,请给我们一些时间,我们会力争为第三方开发者提供一个规范、简单易用、稳定可靠、可扩展、可定制的 SDK。

    ------

    # Release-Note: Android SDK V4.1

    ## 版本变更:

    v4.4.4

    1.删除异常打印堆栈信息。(接入新版本如果没有包名报备(加入白名单),请联系QQ(879073159))

    v4.4.3

    1.解决空指针异常。(接入新版本如果没有包名报备(加入白名单),请联系QQ(879073159))

    v4.4.2

    1.修复恶意启动可能造成的crash.(接入新版本如果没有包名报备(加入白名单),请联系QQ(879073159))

    v4.4.1

    1.默认支持armeabi,arm64-v8a,armeabi-v7a架构。

    2.修改无法获取到权限时可能造成的异常。(接入新版本如果没有包名报备(加入白名单),请联系QQ(879073159))

    v4.4.0

    1.默认支持armeabi,arm64-v8a两种架构。

    2.修复分享时横竖屏切换导致的异常。

    3.修复其他若干bug(接入新版本如果没有包名报备(加入白名单),请联系QQ(879073159))

    4.4.3.8已经报备过的,之后不用报备。

    v4.3.9

    1.修复分享遇到的bug若干。(接入新版本如果没有包名报备(加入白名单),请联系QQ(879073159))

    v4.3.8

    1.修复若干bug

    2.默认只支持armeabi架构

    3.使用4.3.8时,请联系客服进行包名报备。联系方式QQ(879073159)

    v4.3.7

    1.修复bug

    2.增加64位的so

    v4.3.6

    1.修复bug

    v4.3.5

    1.修复Android4.4.4以下版本分享后没有回调.

    v4.3.4

    1.修复bug

    v4.3.1

    1.修复bug

    2.关于分享之后的回调,4.3.0开始用如下方法接受:

    @Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    shareHandler.doResultIntent(data,this);

    }

    v4.3.0

    1.修复bug

    v4.2.7

    1.支持微博极速版授权登录

    v4.1

    1.修复了一些已知的bug

    2.支持多图分享和视频分享

    3.支持分享视频到微博故事

    v4.0

    1.新的授权和分享逻辑,使你的接入更明确

    2.修改了一些已知的问题

    v3.2

    1. 新的网页授权和分享

    3. 移除open api相关文档,如果你还想继续使用open api请参考旧版本目录 [旧版本相关/demo-src]接入放自己维护

    4. 移除LinkCard模式分享,当前只支持文字和图片混合(我们不建议你继续使用老的sdk接入微博进行LinkCard分享,微博客户端可能会在未来取消该功能,对你的程序可能会造成异常)

    5. 移除微博支付功能

    6. 精简sdk,解决已知的bug

    ------

    # 快速上手

    ## 概述

    微博 Android 平台 SDK 为第三方应用提供了简单易用的微博API调用服务,使第三方客户端无需了解复杂的验证机制即可进行授权登陆,并提供微博分享功能,可直接通过微博官方客户端分享微博。

    >本文档详细内容请查阅:[微博Android平台SDK文档V4.1.pdf][1]

    ------

    # 名词解释

    | 名词 | 注解 |

    | -------- | :----- |

    | AppKey | 分配给每个第三方应用的 app key。用于鉴权身份,显示来源等功能。|

    | RedirectURI | 第三方应用授权回调页面。建议使用默认回调页`https://api.weibo.com/oauth2/default.html` ,可以在新浪微博开放平台->我的应用->应用信息->高级应用->授权设置->应用回调页中找到。|

    | Scope | 通过scope,平台将开放更多的微博核心功能给开发者,同时也加强用户隐私保护,提升了用户体验,用户在新OAuth2.0授权页中有权利选择赋予应用的功能。|

    | AccessToken | 表示用户身份的 token,用于微博 API 的调用。|

    | Web 授权 | 通过WebView进行授权,并返回Token信息。|

    | SSO 授权 | 通过唤起微博客户端进行授权,并返回Token信息。|

    使用微博sdk授权和分享时,请确保你的AppKey、RedirectURI、Scope、PackageName和开发者官网中填写的一致.

    ------

    ## 功能列表

    ### 1. 认证授权

    - SSO 授权:在**有客户端**的情况下,使用 SSO 授权登陆;无客户端的情况下,自动唤起 Web 授权

    - Web 授权:在**没有客户端**的情况下,可直接使用该授权

    - SSO 授权+Web 授权 混合授权,(**推荐使用**) ( 如果手机安装了微博客户端则使用客户端授权,没有则进行网页授权 ) 详情请查看Demo中`WBAuthActivity`中说明

    # 特别说明:新版本的sdk已经移除了openapi功能(包括获取用户信息等方法),如果你想再授权后获取用户信息,请参考open api接口文档 [微博开放平台api][10],使用自己的网络引擎请求数据

    ### 2. 微博分享

    通过微博SDK,第三方应用能够分享文字、图片、视频:

    **有微博客户端情况**

    * 通过第三方应用唤起微博客户端进行分享(该分享方式为第三方客户端通常的使用方式)

    **无微博客户端情况**

    OpenApi openApi已经不在微博sdk中维护,如果你想使用OpenApi,请参考开发者网站使用自己的网络接入

    * 通过`OpenAPI`进行分享,如果你要接入openAPI 进行分享,请参考开放平台接口[微博开放平台api][9]。

    ------

    ## 运行示例代码

    为了方便第三方应用更快的集成微博 SDK,更清晰的了解目前微博 SDK 所提供的功能,我们在 GitHub 上提供了一个简单的 **示例工程** 以及对应的 **APK安装包** 。

    **方式一:**通过 adb install 命令直接安装 app_debug.apk (在新文档文件夹下面)

    **方式二:**在 Android Studio 中导入并运行 weibosdkdemo 工程(详情请查看[微博Android平台SDK文档4.1.pdf][1]中:**运行示例代码**)

    ## 微博SDK及DEMO工程目录结构及分析

    微博SDK目前以是**部分开源**的形式提供给第三方开发者的,简单来说,可以分为以下三部分:

    ------

    ## 集成前准备

    ### 1. 申请应用程序的APP_KEY

    在这一步中,您需要在微博开放平台上,对您的应用进行注册,并获取APP_KEY,添加应用的授权回调页(Redirect URI)。详情请仔细阅读:移动客户端接入(http://t.cn/aex4JF )

    ### 2. 注册应用程序的包名和签名

    您需要在微博开放平台上注册应用程序的包名和签名后,才能正确进行授权。

    请注意:包名和签名未注册,或者签名注册不正确,都会导致无法授权。

    应用程序包名:指`AndroidManifest.xml`文件中,`package`标签所代表的内容。

    应用程序签名:该签名是通过官方提供的签名工具生成的MD5值。

    详情请查看:[微博Android平台SDK文档V4.0pdf][1] 中:**如何使用签名工具获取您应用的签名?**

    ### 3. 集成sdk

    1:Android Studio接入

    在你工程的主模块下面修改build.gradle文件,添加微博sdk的依赖

    ```java

    allprojects {

    repositories {

    jcenter()

    mavenCentral()

    maven { url "https://dl.bintray.com/thelasterstar/maven/" }

    }

    }

    compile 'com.sina.weibo.sdk:core:4.4.3:openDefaultRelease@aar'

    ```

    或者将新文档目录下的openDefault-4.4.1.aar复制到工程libs目录下,修改build.gradle文件如下:

    ```java

    repositories{

    flatDir {

    dirs 'libs'

    }

    }

    dependencies {

    compile fileTree(dir: 'libs', include: ['*.jar'])

    compile 'com.android.support:appcompat-v7:24.2.1'

    compile(name: 'openDefault-4.4.3', ext: 'aar')

    }

    ```

    2:Eclipse:

    复制github项目下【eclipse集成】目录下的文件到你的工程中

    3:关于so

    微博sdk aar中默认直提供了[armeabi] [armeabi-v7a] [arm64-v8a]三个平台的so,如果你需要适配更多版本的so,请到github->so目录中获取全部平台的so文件

    如果你只想引入特别的平台在gradle 中配置如下

    ```java

    splits {

    abi {

    enable true

    reset()

    include 'armeabi' //根据需求自己修改

    universalApk true

    }

    }

    ```

    4:关于混淆

    ```java

    -keep class com.sina.weibo.sdk.** { *; }

    ```

    ------

    ## 第三方如何使用(认证授权)

    ### 1. 替换成自己应用的 APP_KEY 等参数

    鉴于目前有很多第三方开发直接拷贝并使用Demo中的Constants类,因此,有必要说明,第三方开发者需要将Constants类中的各种参数替换成自己应用的参数,请仔细阅读代码注释。

    ```java

    public interface Constants {

    /** 当前 DEMO 应用的 APP_KEY,第三方应用应该使用自己的 APP_KEY 替换该 APP_KEY */

    public static final String APP_KEY = "2045436852";

    /**

    * 当前 DEMO 应用的回调页,第三方应用可以使用自己的回调页。

    * 建议使用默认回调页:https://api.weibo.com/oauth2/default.html

    */

    public static final String REDIRECT_URL = "http://www.sina.com";

    /**

    * WeiboSDKDemo 应用对应的权限,第三方开发者一般不需要这么多,可直接设置成空即可。

    * 详情请查看 Demo 中对应的注释。

    */

    public static final String SCOPE =

    "email,direct_messages_read,direct_messages_write,"

    + "friendships_groups_read,friendships_groups_write,statuses_to_me_read,"

    + "follow_app_official_microblog," + "invitation_write";

    }

    ```

    ### 2. 创建微博API接口类对象

    ```java

    mAuthInfo = new AuthInfo(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);

    WbSdk.install(this,mAuthInfo);

    ```

    其中:APP_KEY、 REDIRECT_URL、 SCOPE需要替换成第三方应用申请的内容。

    ### 3. 实现WbAuthListener接口

    ```java

    private class SelfWbAuthListener implements com.sina.weibo.sdk.auth.WbAuthListener{

    @Override

    public void onSuccess(final Oauth2AccessToken token) {

    WBAuthActivity.this.runOnUiThread(new Runnable() {

    @Override

    public void run() {

    mAccessToken = token;

    if (mAccessToken.isSessionValid()) {

    // 显示 Token

    updateTokenView(false);

    // 保存 Token 到 SharedPreferences

    AccessTokenKeeper.writeAccessToken(WBAuthActivity.this, mAccessToken);

    Toast.makeText(WBAuthActivity.this,

    R.string.weibosdk_demo_toast_auth_success, Toast.LENGTH_SHORT).show();

    }

    }

    });

    }

    @Override

    public void cancel() {

    Toast.makeText(WBAuthActivity.this,

    R.string.weibosdk_demo_toast_auth_canceled, Toast.LENGTH_LONG).show();

    }

    @Override

    public void onFailure(WbConnectErrorMessage errorMessage) {

    Toast.makeText(WBAuthActivity.this, errorMessage.getErrorMessage(), Toast.LENGTH_LONG).show();

    }

    }

    ```

    ### 4. 调用方法,认证授权

    * 1 Web 授权,直接调用以下函数:*

    ```java

    mSsoHandler = new SsoHandler(WBAuthActivity.this);

    mSsoHandler.authorizeWeb(new WbAuthListener());

    ```

    * 2 SSO授权,需要调用以下函数:*

    ```java

    mSsoHandler = new SsoHandler(WBAuthActivity.this);

    mSsoHandler. authorizeClientSso(new WbAuthListener());

    ```

    * 3 all In one方式授权,需要调用以下函数:*

    ```java

    mSsoHandler = new SsoHandler(WBAuthActivity.this);

    mSsoHandler. authorize(new WbAuthListener());

    ```

    * 注:此种授权方式会根据手机是否安装微博客户端来决定使用sso授权还是网页授权,如果安装有微博客户端 则调用微博客户端授权,否则调用Web页面方式授权 参见pdf文档说明 *

    以上三种授权需要在Activity的`onActivityResult`函数中,调用以下方法:

    ```java

    @Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    if (mSsoHandler != null) {

    mSsoHandler.authorizeCallBack(requestCode, resultCode, data);

    }

    }

    ```

    ## 其它功能

    其它功能请相见文档:[微博Android平台SDK文档V4.1.pdf][1]

    [1]:https://github.com/sinaweibosdk/weibo_android_sdk/blob/master/%E6%96%B0%E6%96%87%E6%A1%A3/%E5%BE%AE%E5%8D%9ASDK%204.0%E6%96%87%E6%A1%A3.pdf

    [2]:https://github.com/sinaweibosdk/weibo_android_sdk/blob/master/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%20FAQ.md

    [3]:https://github.com/sinaweibosdk/weibo_android_sdk/blob/master/WeiboSDK_API-V2.4.0.CHM

    [4]:https://github.com/sinaweibosdk/weibo_android_sdk/blob/master/%E6%96%B0%E6%96%87%E6%A1%A3/app-debug.apk

    [5]:https://github.com/sinaweibosdk/weibo_android_sdk/tree/master/weibosdkdemo

    [6]:https://github.com/sinaweibosdk/weibo_android_sdk/edit/master/README.md#%E7%BD%91%E7%BB%9C%E8%AF%B7%E6%B1%82%E6%A1%86%E6%9E%B6%E7%9A%84%E4%BD%BF%E7%94%A8

    [7]:https://github.com/sinaweibosdk/weibo_android_sdk/edit/master/README.md#%E4%B8%BE%E4%BE%8B%E4%BD%BF%E7%94%A8%E5%BC%82%E6%AD%A5%E6%8E%A5%E5%8F%A3%E6%9D%A5%E5%8F%91%E9%80%81%E4%B8%80%E6%9D%A1%E5%B8%A6%E5%9B%BE%E7%89%87%E7%9A%84%E5%BE%AE%E5%8D%9A

    [8]:http://sinaweibosdk.github.io/weibo_android_sdk/doc/

    [9]:http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI

    [10]:http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI

    一键复制

    编辑

    Web IDE

    原始数据

    按行查看

    历史

    展开全文
  • 主要爬取微博热搜榜的内容,首先登陆微博网页版:http://m.weibo.cn登陆后可以选择右上方的“搜索”图标,然后选择“微博热搜”,即可进入热搜榜。image.pngimage.png目前微博采用Ajax技术,使用chrome的开发者...

    爬取网址:http://m.weibo.cn→搜索→微博热搜榜

    爬取信息:热搜榜内容

    爬取方式:json数据

    存储方式:txt文件,结果用词云来展现。

    主要爬取微博热搜榜的内容,首先登陆微博网页版:http://m.weibo.cn。登陆后可以选择右上方的“搜索”图标,然后选择“微博热搜”,即可进入热搜榜。

    a1f6a205f28d

    image.png

    a1f6a205f28d

    image.png

    目前微博采用Ajax技术,使用chrome的开发者工具,在请求URL中即可看到网址。请求头加上User-Agent和Cookies即可。

    a1f6a205f28d

    image.png

    使用Preview标签可以清楚看到数据的结构。

    a1f6a205f28d

    image.png

    代码为:

    import requests

    import json

    url = "https://m.weibo.cn/api/container/getIndex?containerid=106003type%253D25%2526t%253D3%2526disable_hot%253D1%2526filter_type%253Drealtimehot&title=%25E5%25BE%25AE%25E5%258D%259A%25E7%2583%25AD%25E6%2590%259C&hidemenu=1&extparam=filter_type%3Drealtimehot%26mi_cid%3D%26pos%3D9%26c_type%3D30%26source%3Dranklist%26flag%3D1%26display_time%3D1519704766&luicode=10000011&lfid=106003type%3D1&featurecode=20000320"

    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3294.6 Safari/537.36',

    'Cookie':'xxxx'}

    r = requests.get(url,headers= headers)

    json_data = json.loads(r.text)

    hot_groups = json_data['data']['cards'][0]['card_group'] #热搜词

    realtime_groups = json_data['data']['cards'][1]['card_group'] #实时上升热点

    print(len(hot_groups),len(realtime_groups ))

    with open("F:/weibo.txt",'a+') as f:

    for hot_group in hot_groups:

    text1 = hot_group['desc']

    f.write(text1+"\n")

    for realtime_group in realtime_groups:

    text2 = realtime_group['desc']

    f.write(text2+"\n")

    使用词频统计,代码如下:

    from jieba import analyse

    with open("F:/weibo.txt",'r') as f:

    sentence = f.read()

    analyse.set_stop_words("F:/中文停用词表.txt") ##设置停用词表,这些词便不会加入统计计算。

    tags = analyse.extract_tags(sentence,topK=100,withWeight=True)

    for i in tags:

    print(i[0],int(i[1]*1000))

    打印的部分结果为:

    四六级 169

    艺考 113

    张杰 109

    章丘 102

    女友 88

    苹果 71

    女孩 70

    猫咪 65

    夏清 65

    爸爸 64

    ...

    制作的词云结果为:

    a1f6a205f28d

    image.png

    展开全文
  • 微博登录过程分析

    千次阅读 2018-04-11 10:33:00
    本文原创,转发请注明出处:... 登录界面:手机端、电脑端 1、https://weibo.com/#_loginLayer_1523255015273 2、https://passport.weibo.cn/signin/login 电脑端登录后的效果: 1、https://m....
  • weibo_android_sdk

    2021-06-04 04:49:00
    详情请仔细阅读:移动客户端接入(http://t.cn/aex4JF ) 2. 注册应用程序的包名和签名 您需要在微博开放平台上注册应用程序的包名和签名后,才能正确进行授权。 请注意:包名和签名未注册,或者签名注册不正确,...
  • 微博数据爬取

    2019-05-29 22:04:44
    weibo_url 这条微博的URL,可以作为这则微博的唯一标识 user_id 这条微博的发布者的ID content 微博的内容 tool 发布的工具,一般是手机型号,或者上图中的"weibo.com" created_at 微博...
  • 爬取的内容为京东客服的...类似于这样的:https://m.weibo.cn/u/5650743478?uid=5650743478&amp;luicode=10000011&amp;lfid=100103type%3D1%26q%3D%40%E4%BA%AC%E4%B8%9C%E5%AE%A2%E6%9C%8D&amp;featurecod
  • 登录界面 抓包分析可以使用Http Analyzer,Filders,但是看起来很复杂,还是使用火狐好(chrome远远... 首先,在输入用户名后,会进行预登录,网址为:http://login.sina.com.cn/sso/prelogin.php?entry=weibo&...
  • 2019独角兽企业重金招聘Python工程师标准>>> 导致这个错误的主要...这里的信息跟我们生成的 一致,这样就可以愉快的登陆了 转载于:https://my.oschina.net/u1302856/blog/366294
  • Android第三方登录可以说是非常的常见,今天主要先说一下新浪微博第三方登陆授权。 SDK版本支持 SDK v3.0已经发布了支持iPhone和Android的版本。 须将你的应用的包名签名信息在平台进行填写注册。 SDK3.0不区分...
  • C#模拟移动端weibosdk登录APP应用

    千次阅读 2017-11-07 15:44:00
    项目进展:现已可以通过微博sdk登录三方应用 ...GET https://open.weibo.cn/oauth2/authorize?client_id=608714079&redirect_uri=http%3A%2F%2Fwww.xiaohongshu.com%2F&scope=all&response_type...
  • 1.sina.php <?... /** * PHP Library for weibo.com * * @author */ class sinaPHP { function __construct($client_id, $client_secret, $access_token=NULL){ $this->client...
  • ”https:\/\/crosdom.weicaifu.com\/sso\/crosdom?action=login&savestate=1461400544″,”http:\/\/passport.weibo.cn\/sso\/crossdomain?action=login&savestate=1″]} crossdomainUrlList为服务器告诉你下面你要...
  • 微博爬虫接口&步骤

    千次阅读 2020-06-18 09:46:16
    写在开始 ...仅限学些交流用 接口访问应有一定得时间间隔. 部分接口请求需要携带登陆cookies信息 基本步骤 获取用户信息->获取微博列表->获取微博详情 ...接口 https://m.weibo.cn/api/container/getInd
  • python爬虫爬取微博之战疫情用户评论及详情

    万次阅读 多人点赞 2020-02-17 14:36:24
    文章目录1、爬取具体动态的内容及评论1.1、分析网页1.1.1、检查网页1.1.2、元素点位1.1.3、下拉加载1.2、如何爬取下拉加载的...微博网址: https://m.weibo.cn/ 进入微博后,点击《战疫情》主题下,并随便选择一个...
  • 通过新浪通行证登陆微博,曲线救国,然后再进行模拟发文 /*$temp = explode(' ',microtime()); $num = floor($temp[0]*1000); if($num=10) $second = $temp[1]*10000+$num; else if($num ) $second = $temp[1]*...
  • 【Python爬虫实例学习篇】——5、【超详细记录】从爬取微博评论数据(免登陆)到生成词云 个人博客地址:ht/tps://www.asyu17.cn/ 精彩部分提醒: (1)微博评论页详情链接为一个js脚本 (2)获取js脚本链接需要该条...
  • 1)添加相关jar包: httpmime.jar 以下信息是必须的 //!!!请根据您的实际情况修改!!! 认证成功后浏览器会被重定向到这个url中... private String redirectUri="http://www.tencent.com/zh-cn/index.shtml"; ...
  • 发生了什么,t.cn短网址用不了了

    千次阅读 2019-09-18 15:50:33
    关于t.cn短网址停用 谷歌短网址自今年4月13日起停止服务 而9.11新浪微博也是很低调的关闭了短网址功能,中秋前夕很多用户忽然发现调用的t.cn短链接接口用不了了。 是的,当你还一脸懵逼的时候,小编在一篇公众号文章...
  • 登陆 通过请求 http://login.sina.com.cn/sso/prelogin.php 来获取客户端对用户password进行加密的參数。 主要列举例如以下: pubkey :客户端使用RSA加密的公钥 servertime:服务器时间。用来与用户...
  • java 群发求职邮件

    千次阅读 2017-05-20 12:20:09
    大型的求职网站每天只能发送10条简历,但这是远远不够的啊,于是就写了这个爬虫,爬取了hr的邮箱,批量发送邮件。 使用了HTMLunit,方便登陆微博。
  • // 拼凑登陆数据 HttpPost loginPost = new HttpPost( "https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)&_" + System.currentTimeMillis() + "&openapilogin=qrcode...
  • 微博Android平台SDK文档

    千次阅读 2016-03-18 15:06:28
    博Android平台SDK文档 编号:WEIBO_ANDROID_SDK  版本:WEIBO_ANDROID_SDK V3.1.2    修订记录: 时间 文档版本 修订人 备注 2012/7/20 2.0.0   初稿 2012/8/2 2.0.0
  • request.data.get("password") weibo_uid = request.data.get("weibo_uid") if not all([username, password, weibo_uid]): return Response({"code": 4005, "msg": "参数不全"}) # 判断username是否存在 try: user ...
  • 本篇文章给大家带来的内容是关于Python模拟微博登陆的方法介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。今天想做一个微博爬个人页面的工具,满足一些不可告人的秘密。那么首先就要...
  • 网络爬虫篇——入门

    2019-05-31 16:39:03
    UOR=,,login.sina.com.cn; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WWzpLexbJaLHOf3D4eAUn3N5JpX5KMhUgL.Fo-Ee0eNeoepe0e2dJLoIpRLxK.L1hzL1KS3Ig2LxK-L1h-LB-eLxK-LB-BL1K5t; ALF=1590827260; SSOLoginState=...
  • 第三方微博登陆文档说明还算比较好,坑也比较少。有可能遇到的是:文件不存在 C8998 的解决方法。 新浪微博开放平台地址: http://open.weibo.com 填写一个就行
  • req.add_header('Referer', 'https://passport.weibo.cn/signin/welcome?entry=mweibo&r=http%3A%2F%2Fm.weibo.cn%2F%3Fjumpfrom%3Dweibocom&jumpfrom=weibocom') with request.urlopen(req, data=login_data....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,401
精华内容 960
关键字:

weibo.cn登陆