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

RPCNB

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

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

基于websocket,RPC调用,猿人学20题,python_第1张图片
可以看到t确定是时间戳,sign通过window.sign方法计算的,打一个断点,再次点击下一页

跟进这个方法,基于websocket,RPC调用,猿人学20题,python_第2张图片
看到 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是将生成的参数返回给我们

我们将命令输入控制台:
基于websocket,RPC调用,猿人学20题,python_第3张图片
可以发现正常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")))

我们测试一下
在这里插入图片描述
正常输出结果,我们查看一下浏览器
基于websocket,RPC调用,猿人学20题,python_第4张图片
可以发现接受到了我们传递的参数 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)

我们测试一下

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

你可能感兴趣的:(python,js,javascript,rpc,websocket)