概述

页面Websocket收到的数据是使用自定义协议处理过的,无法直接看到明文的内容。
现在需要使用playwright结合chrome,进行调试,将其它的数据抠出来。

具体内容如下:

  1. pr拦截websocket数据,并保存到本地
  2. pr启动页面,并将保存的数据载入页面
  3. 找到页面ws数据处理入口处,替换为保存的数据
  4. 开始单步调试

先保存数据再调试的好处是,调试更有针对性。 再使用java代码对原始数据进行解析的时候,起到对照作用。

实现

拦截websocket数据,并保存到本地

  1. public void capture(String captureUrl) {
  2. log.debug("start to test playwright demo");
  3. try (Playwright playwright = Playwright.create()) {
  4. BrowserType chromium = playwright.chromium();
  5. Path userDataDir = Paths.get("d:/my/");
  6. BrowserContext context = chromium.launchPersistentContext(userDataDir,
  7. new BrowserType.LaunchPersistentContextOptions().setHeadless(false).setDevtools(true).setSlowMo(50));
  8. Page page = context.newPage();
  9. //等待页面加载完成
  10. File errorDir = new File("D:\\data\\pdderror\\" + RandomUtil.randomString(6));
  11. errorDir.mkdir();
  12. AtomicInteger i = new AtomicInteger(0);
  13. page.onWebSocket(webSocket -> {
  14. webSocket.onFrameReceived(frame -> {
  15. byte[] binary = new byte[0];
  16. FileUtils.writeByteArrayToFile(new File(errorDir, "MyData" + i.getAndIncrement()), binary);
  17. }
  18. });
  19. });
  20. page.navigate(captureUrl);
  21. page.waitForLoadState();
  22. page.waitForTimeout(9000 * 1000);
  23. log.debug("over");
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. }
  27. }

将websocket数据送入页面

参考之前的文章:Playwright:将java字节数组传给js的ArrayBuffer

页面加断点,并在入口处替换数据

  1. 打开页面,按F12进入调试模式
  2. 按ctrl + shift + f全局搜索WebSocket
  3. 找到代码的入口,进行格式化

image.png
格式化之后如下:
image.png

单步调试

找到接收ws应答消息的入口,下断点。

其它

直接在网页上下载websocket的数据

在js调试过程中,如果需要直接将数据下载到本地,可以使用下面的方法。

  1. /**
  2. * 用于保存二进制文件到本地
  3. **/
  4. let saveByteArray = (function () {
  5. let a = document.createElement("a");
  6. document.body.appendChild(a);
  7. a.style = "display: none";
  8. return function (data, name) {
  9. let url;
  10. if (data && data.toString() === "[object Blob]") {
  11. url = window.URL.createObjectURL(data);
  12. } else {
  13. let blob = new Blob([data], { type: "arraybuffer" });
  14. url = window.URL.createObjectURL(blob);
  15. }
  16. a.href = url;
  17. a.download = name;
  18. a.click();
  19. window.URL.revokeObjectURL(url);
  20. };
  21. })();