WebSocket Logger

Log all the communication of every WebSocket

目前為 2018-02-07 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name WebSocket Logger
  3. // @namespace esterTion
  4. // @description Log all the communication of every WebSocket
  5. // @include *://*/*
  6. // @version 1
  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. val.string = decodeURIComponent(escape(String.fromCharCode.apply(null, arr)));
  24. val.b64str = btoa(val.string);
  25. return val;
  26. }
  27. }
  28. var proxyDesc = {
  29. set: function (target, prop, val) {
  30. if (prop == 'onmessage') {
  31. var oldMessage = val;
  32. val = function (e) {
  33. console.log(`#${target.WSLoggerId} Msg from server >> `, processDataForOutput(e.data));
  34. oldMessage(e);
  35. };
  36. }
  37. return target[prop] = val;
  38. },
  39. get: function (target, prop) {
  40. var val = target[prop];
  41. if (prop == 'send') val = function (data) {
  42. console.log(`#${target.WSLoggerId} Msg from client >> `, processDataForOutput(data));
  43. target.send(data);
  44. };
  45. else if (typeof val == 'function') val = val.bind(target);
  46. return val;
  47. }
  48. };
  49. WebSocket = new Proxy(oldWS, {
  50. construct: function (target, args, newTarget) {
  51. var obj = new target(args[0]);
  52. obj.WSLoggerId = loggerIncrement++;
  53. console.log(`WebSocket #${obj.WSLoggerId} created, connecting to`, args[0]);
  54. return new Proxy(obj, proxyDesc);
  55. }
  56. });
  57. });
  58.  
  59. var observer = new MutationObserver(function () {
  60. if (document.head) {
  61. observer.disconnect();
  62. var script = document.createElement('script');
  63. script.innerHTML = '(' + scriptString + ')();';
  64. document.head.appendChild(script);
  65. script.remove();
  66. }
  67. });
  68. observer.observe(document, { subtree: true, childList: true });