微博登录

微博登录

声明:本项目仅仅用于学习交流,不可用于任何商业活动。

唠唠:

​ 相信大家平时都使用微博,微博提供一个平台,我们既可以作为观众,在微博上浏览你感兴趣的信息;也可以作为发布者,在微博上发布内容供别人浏览。所以我们今天的受害者就是微博,啊哈哈哈。

g63rJs.jpg

开始上货

​ 微博有好几个Type,有个如同我们phone的网站,还有其他的,我感觉都是不如我们今天搞这个微博Type好。

首先点击上面那个超链接:

​ 打开是这样的界面(如下图1.1):

​ (图1.1)

g6Y29J.jpg

我们在里面输入手机号以及错误的密码看看它的返回什么。但是我发现在我仅仅输入密码之后,再不点击东西的情况下就有东西返回(如下图1.2):

​ (图1.2)

g6akgH.jpg

这是它的返回数据(如下图1.3)

​ (图1.3)

g60Xi6.jpg

​ 我们先看图1.2上传的参数,首先一眼就可以看出_是时间戳。其它参数也每变,都是固定的。这是我一开始以为的,后来在我点击登录,打断点,分析密码加密过程时发现了su是什么,下面会讲到。

​ 我们再看一下图1.3,返回的参数,首先是pubkey,肯涉及某些加密,需要的key,pcid与验证码有关,其实我一开始分析是有图片验证码的,但是这后来写教程时又没了,让我有点懵逼,不过这里就说一下了,是个重点,在网页上我们如果碰见验证码,要输入验证码,如果输入验证码,不对要重新输入,在我后面的分析中我发现验证码并没有上传服务器或者和密码一块加密什么的。它仅仅是在本地做个验证,所以我们完全可以不用管。然后那个pcid就是验证码请求url里面的一个参数。其实在我后来登录搞定密码加密后,居然无法登录,然后我发现是在自己账号密码输入正确后,还要验证,可以微博app扫码或者短信验证。这也是为什么会有一个smsurl参数。

接下来我们输入密码:

会出现下面的图(如图2.1)

​ (图2.1)

在这里插入图片描述

我们把请求上传数据(图2.1)与返回数据(图1.3)进行对比,可以发现nonce,rsakv是可以通过返回数据获取的,su与上面su一样。sp看着很长,有可能是密码,而其它参数是不变的,可以写死,ctrl+shift+t搜索一下sp,如果直接搜索sp,会发现搜索到好多关于sp的文件,然后试试sp:,sp : sp=,或者sp =,当我试到sp=试,搜索到一个文件,如图(图2.2)。

​ (图2.2)

g6BNy4.jpg

我们打开看一下下图(如2.3)。

​ (图2.3)

g6Bg6e.jpg

我们点击那个{},进行格式化。

然后搜索一下sp

搜索时有好多sp,耐心找一下,会发现e.sp = b;这个(如图2.4),同时也会发现上面有encryptrsaPubkeynonsce等关键字,可能就是这里加密。同时会发现 e.su = sinaSSOEncoder.base64.encode(urlencode(a));,这个可能就是su,同时也说明su也是被加密的,不过很简单,先进行url编码,然后base64编码,这个可能就是账号。

​ (图2.4)

g6Dc40.jpg

打个断点看看。同时我也在e.su = sinaSSOEncoder.base64.encode(urlencode(a));处后来打了断点,果然su就是账号的加密(如图2.5)。

​ (图2.5)

g6rYqJ.jpg

那我们看一下sp的加密,这里密码加密其实就是RSA加密(RSA算法具体百度,这里不多说了),具体我们看一下下面的js代码:

if (me.loginType & rsa && me.servertime && sinaSSOEncoder && sinaSSOEncoder.RSAKey) {
            e.servertime = me.servertime;
            e.nonce = me.nonce;
            e.pwencode = "rsa2";
            e.rsakv = me.rsakv;
            var f = new sinaSSOEncoder.RSAKey;
            f.setPublic(me.rsaPubkey, "10001");
            b = f.encrypt([me.servertime, me.nonce].join("\t") + "\n" + b)
        } else if (me.loginType & wsse && me.servertime && sinaSSOEncoder && sinaSSOEncoder.hex_sha1) {
            e.servertime = me.servertime;
            e.nonce = me.nonce;
            e.pwencode = "wsse";
            b = sinaSSOEncoder.hex_sha1("" + sinaSSOEncoder.hex_sha1(sinaSSOEncoder.hex_sha1(b)) + me.servertime + me.nonce)
        }

可能有小伙伴好奇,为什么是RSA加密呢,这里不是两种加密,但是经过我多次尝试,发现仅仅运行if里面的,没有else的事,所以我才说RSA加密,但我仅仅走的是手机号登录,至于邮箱什么的是不是走else就不知道了,感兴趣的小伙伴可以尝试一下。

接下来来到一个我认为的难点了,扣 and 改代码.

扣 and 改代码

细心地人会发现sinaSSOEncoder,这个不仅在username加密时被引用,在password加密时页引用到了,那么我就看一下它是什么。我们鼠标选择,停留在它身上看一看(如图3.1)

​ (图3.1)

g6ySht.jpg

可以发现它有好几个加密,可以是一个聚合了多个加密类型的库。那我们把它找出来,这时我们切换到控制台,也就是console(如下图3.2)

​ (图3.2)

g6yTEj.jpg

点击红色那个,就会定位到该函数所在位置,我们在往上找找,就会发现sinaSSOEncoder(如下图3.3),黄色的就是我们要找的,我们就往下找,找到对应的地方,复制到本地就好,我用的是pycharm,因为Ajian是个学生,所以就申请了教育版,以前我以为要教育邮箱,后来才知道,没有也行,通过学信网的证明也是可以的。

​ (图3.3)

g6yzb4.jpg

其实复制到下图(图3.4)就okk了。

​ (图3.4)

g6cpy8.jpg

我们先运行一下,结果如下图(图3.5)

​ (图3.5)

g6ctl6.jpg

navigator is not defined=====》说navigator没有定义,那我们就在最上面填一个navigator = {}

添加之后,我们再次运行,OK,没有报错了,接下来我们添加一下密码加密的代码。

e.servertime = me.servertime;
e.nonce = me.nonce;
e.pwencode = "rsa2";
e.rsakv = me.rsakv;
e.password = me.password;
var f = new sinaSSOEncoder.RSAKey;
f.setPublic(me.rsaPubkey, "10001");
b = f.encrypt([me.servertime, me.nonce].join("\t") + "\n" + e.password)

不过这个代码我们要改一下,改成下面这样。

function encrypt(me) {
    e.servertime = me.servertime;
    e.nonce = me.nonce;
    e.pwencode = "rsa2";
    e.rsakv = me.rsakv;
    e.password = me.password;
    var f = new sinaSSOEncoder.RSAKey;
    f.setPublic(me.rsaPubkey, "10001");
    b = f.encrypt([me.servertime, me.nonce].join("\t") + "\n" + e.password)
    console.log(b)
}
var me = {'servertime': 1621061717, 'nonce': '0ZUT5X', 'rsakv': '1330428213', 'password': '123456', 'rsaPubkey': 'EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443'}
encrypt(me)

再次运行,又报错了。我们看一下,如下图(图3.6)

​ (图3.6)

g6gK3t.jpg

e没有被定义,我们就在函数encrypy里面定义一下,加一个var e = {};就ok了。我们再运行看一下。

g6g1u8.jpg

出接结果了,我与网站上对比,格式一样。

还有就是username加密,这个我用python实现了,其实password加密,我们也可以用python,不过我是想联系js扣 and 改代码,就用js了。

那我们登录看看,然后我大意了。哎!就像我上面讲的,居然有个二维码扫码验证,不过成功就在眼前,我们岂能放弃。最后看看再输入正确账号密码之后是什么请求。

还没完,还有:

我们输入正确的账号密码后出现这个情况,如下图(图4.1)

​ (图4.1)

g6gc59.jpg

通过我在抓的包中寻找下图(图4.2)标记情况

​ (图4.2)

g6gH5d.jpg

黄色的就是就是图4.1,而通过红色就可以获得二维码,我们分析一下参数,我发现,只有callback对应的STK_16210797316101是变化的,并且变得是_后面的,明显是时间戳。我们看一下返回值,如下图(图4.3)

​ (图4.3)

g62ua4.jpg

我打开image对应的链接,果然就是图4.1。

好了,我们把这些添加我们的代码,看一下它的返回值是不是图4.3形式。

返回值:window.STK_1621080516819 && STK_1621080516819({"retcode":20000000,"msg":"succ","data":{"qrid":"2NmZgn7nEAFCv1R4xGd345dbp06Y9V27dBnFyY29kZQ..","image":"http:\/\/v2.qr.weibo.cn\/inf\/gen?api_key=a0241ed0d922e7286303ea5818292a76&data=https%3A%2F%2Fpassport.weibo.cn%2Fsignin%2Fqrcode%2Fscan%3Fqr%3D2NmZgn7nEAFCv1R4xGd345dbp06Y9V27dBnFyY29kZQ..%26sinainternalbrowser%3Dtopnav%26showmenu%3D0&datetime=1621080516&deadline=0&level=M&logo=http%3A%2F%2Fimg.t.sinajs.cn%2Ft6%2Fstyle%2Fimages%2Findex%2Fweibo-logo.png&output_type=img&redirect=0&sign=ed1d3696478b41e8b7cd47e43de898aa&size=180&start_time=0&title=sso&type=url"}});

哎,还真是,好了,搞成功了,剩下的就是扫码以及获取cookie了。

俺的小经历:

其实最近一直搞js逆向,说实话,自学真的挺难的,没人教,没人带,只能靠自己,这就让我想起当初开始学爬虫了,走了许多坑,不过很挺过来了,哈哈哈,现在面临js逆向了,一夜回到解放前了,还要走一段小黑路,哈哈哈哈。许多人都是缺啥补啥,但是我太愚笨,领悟不透,只会一点简单的缺啥补啥。这个公众号是我记录自己学习经历的见证,把自己学到的,会的,分享出来。如有错误,欢迎大佬指出来,让我改正,菜鸡Ajian不胜感激。

还有就是最近要搞单片机,打算在这上面分享。

如果jio的写的不错,就关注一下俺:

g62fij.jpg

——————————————————————————————————————————

,把自己学到的,会的,分享出来。如有错误,欢迎大佬指出来,让我改正,菜鸡Ajian不胜感激。

还有就是最近要搞单片机,打算在这上面分享。

如果jio的写的不错,就关注一下俺:

[外链图片转存中…(img-tGEzsDje-1621080865667)]

———————————————————————————

g625zq.jpg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是Python模拟微博登录的示例代码: ```python import requests from bs4 import BeautifulSoup # 构造请求头部 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 登录页面URL login_url = 'https://passport.weibo.cn/signin/login' # 构造登录请求表单数据 data = { 'username': 'your_username', # 替换为你的微博账号 'password': 'your_password', # 替换为你的微博密码 'savestate': '1', 'r': '', 'ec': '0', 'pagerefer': 'https://passport.weibo.cn/signin/welcome?entry=mweibo&r=https%3A%2F%2Fm.weibo.cn%2F', 'entry': 'mweibo' } # 发送登录请求 session = requests.session() response = session.post(login_url, headers=headers, data=data) # 获取登录后的首页内容 home_url = 'https://m.weibo.cn/' response = session.get(home_url, headers=headers) soup = BeautifulSoup(response.content, 'html.parser') print(soup) ``` 请注意,微博登录需要输入验证码,上述示例代码并未处理验证码。如果出现验证码,需要手动输入或者使用第三方库进行识别。此外,微博登录也可能需要进行短信验证等额外步骤。 ### 回答2: Python可以使用Selenium库来模拟微博登录。 Selenium是一个自动化测试工具,可以模拟用户在浏览器中的操作。首先,我们需要安装Selenium库和一个浏览器驱动,比如ChromeDriver。 接下来,我们可以使用以下代码来模拟微博登录: ```python from selenium import webdriver from selenium.webdriver.common.keys import Keys import time # 创建一个Chrome浏览器的实例 driver = webdriver.Chrome() # 打开微博登录页面 driver.get("https://weibo.com/login.php") # 定位到用户名和密码的输入框,并输入相应的值 username_input = driver.find_element_by_name("username") username_input.send_keys("your_username") password_input = driver.find_element_by_name("password") password_input.send_keys("your_password") # 提交登录信息 password_input.send_keys(Keys.ENTER) # 等待登录成功并跳转到首页 time.sleep(5) # 打印登录成功后的页面标题 print(driver.title) # 关闭浏览器 driver.quit() ``` 上述代码首先创建一个Chrome浏览器实例,然后打开微博登录页面。接着,通过`find_element_by_name`方法定位到用户名和密码的输入框,并使用`send_keys`方法输入相应的值。 然后,通过`send_keys(Keys.ENTER)`方法提交登录信息。登录成功后,等待5秒钟,然后打印登录成功后的页面标题。 最后,关闭浏览器。 通过这样的方式,我们可以使用Python来模拟微博登录,实现自动化登录功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值