WebSocket Logger

Log all the communication of every WebSocket

目前为 2018-02-08 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name WebSocket Logger
  3. // @namespace esterTion
  4. // @description Log all the communication of every WebSocket
  5. // @include *://*/*
  6. // @version 2
  7. // @grant none
  8. // @run-at document-start
  9. // ==/UserScript==
  10.  
  11. var scriptString = (function () {
  12. if (window.Proxy == undefined) return;
  13. var oldWS = window.WebSocket;
  14. var loggerIncrement = 1;
  15. function processDataForOutput(data) {
  16. if (typeof data == 'string') return data;
  17. else if (data.byteLength != undefined) {
  18. var val = { orig: data, uintarr: new Uint8Array(data) };
  19. var arr = [], i = 0;
  20. for (; i < data.byteLength; i++) {
  21. arr.push(val.uintarr[i]);
  22. }
  23. var hexarr = arr.map(function (i) { var s = i.toString(16); while (s.length < 2) s = '0' + s; return s; });
  24. val.hexstr = hexarr.join('');
  25. val.string = unescape(hexarr.map(function (i) { return '%' + i; }).join(''));
  26. val.b64str = btoa(val.string);
  27. try {
  28. val.string = decodeURIComponent(escape(val.string));
  29. } catch (e) { }
  30. return val;
  31. }
  32. }
  33. var proxyDesc = {
  34. set: function (target, prop, val) {
  35. if (prop == 'onmessage') {
  36. var oldMessage = val;
  37. val = function (e) {
  38. console.log(`#${target.WSLoggerId} Msg from server << `, processDataForOutput(e.data));
  39. oldMessage(e);
  40. };
  41. }
  42. return target[prop] = val;
  43. },
  44. get: function (target, prop) {
  45. var val = target[prop];
  46. if (prop == 'send') val = function (data) {
  47. console.log(`#${target.WSLoggerId} Msg from client >> `, processDataForOutput(data));
  48. target.send(data);
  49. };
  50. else if (typeof val == 'function') val = val.bind(target);
  51. return val;
  52. }
  53. };
  54. WebSocket = new Proxy(oldWS, {
  55. construct: function (target, args, newTarget) {
  56. var obj = new target(args[0]);
  57. obj.WSLoggerId = loggerIncrement++;
  58. console.log(`WebSocket #${obj.WSLoggerId} created, connecting to`, args[0]);
  59. return new Proxy(obj, proxyDesc);
  60. }
  61. });
  62. });
  63.  
  64. var observer = new MutationObserver(function () {
  65. if (document.head) {
  66. observer.disconnect();
  67. var script = document.createElement('script');
  68. script.innerHTML = '(' + scriptString + ')();';
  69. document.head.appendChild(script);
  70. script.remove();
  71. }
  72. });
  73. observer.observe(document, { subtree: true, childList: true });