基于websocket,RPC调用,猿人学20题,python

RPCNB

1、首先,先分析第20题,请求一下,看看需要什么东西
在这里插入图片描述
明显的sign,t也可以看得出来是时间戳

接着跟进,
在这里插入图片描述
定位到这里

在这里插入图片描述
可以看到t确定是时间戳,sign通过window.sign方法计算的,打一个断点,再次点击下一页

跟进这个方法,在这里插入图片描述
看到 getStringFromWasm0 就知道是wasm了,扣具体太麻烦了,我们上RPC

首先搭建websocket的服务端

import asyncio
import websockets

connected = set()


async def server(websocket):
    connected.add(websocket)
    try:
        async for message in websocket:
            for conn in connected:
                if conn != websocket:
                    await conn.send(message)
    finally:
        connected.remove(websocket)


start_server = websockets.serve(server, "localhost", 5000)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

这时候上我们的JS代码,连接我们的服务端,WebSocket的onopen方法是加载的时候调用的,onmessage方法是接收到参数后调用的,
观察到sign的生成方法为:

window.sign(window.page + '|' + t.toString()),

所以,我们改写成如下方法:

!(function () {
    var ws = new WebSocket('ws://localhost:5000');
    ws.onopen = function (evt) {
        console.log('Connection open ...');
    };
    ws.onmessage = function (evt) {
        console.log(evt.data)
        t = Date.parse(new Date());
        var sign = window.sign(evt.data.toString() + '|' + t.toString())
        ws.send(sign);
    };
})();

ws.send是将生成的参数返回给我们

我们将命令输入控制台:
在这里插入图片描述
可以发现正常Hook,这时候编写接受参数

import asyncio
import websockets

loop = asyncio.get_event_loop()


async def hello(message):
    # 连接 websocket 并发送消息 获取相应
    async with websockets.connect("ws://localhost:5000") as websocket:
        await websocket.send(message)
        return await websocket.recv()


def get_encrypt(message):
    return str(loop.run_until_complete(hello(message)))


if __name__ == "__main__":
    print(get_encrypt(str("1")))

我们测试一下
在这里插入图片描述
正常输出结果,我们查看一下浏览器
在这里插入图片描述
可以发现接受到了我们传递的参数 1,
这时候,就可以编写代码了,

import time

import requests
from client import get_encrypt #引入请求rpc的方法

count = 0
for page in range(1, 6):
    sign = get_encrypt(str(page))
    ts = str(int(time.time() * 1000))[:-3] + "000"
    url = "https://match.yuanrenxue.com/api/match/20".format(page, sign, ts)
    data = {
        "page": page,
        "sign": sign,
        "t": ts,
    }
    payload = {}
    headers = {
        'User-Agent': 'yuanrenxue.project',
    }
    cookie = {
        "sessionid": "你的sessionid"
    }
    response = requests.request("GET", url, headers=headers, params=data, cookies=cookie)
    for tt in response.json()["data"]:
        jishu = int(tt["value"])
        count +=jishu
print(count)

我们测试一下

在这里插入图片描述
正常请求出结果,再看看浏览器
在这里插入图片描述
完成,此种方法对于部分网站还是比较实用的。但是真正锻炼技术的方法不仅仅是如此,此种方法只是单独为了拿到结果测试,不推荐使用此方法进行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Asurs9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值