monkey.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import InjectTools from './inject-tools.js';
  2. import Statistics from './statistics.js';
  3. export default (() => {
  4. let start = (params) => {
  5. try {
  6. const PAGE_MONKEY_LOCAL_STORAGE_KEY = 'PAGE-MODIFIER-LOCAL-STORAGE-KEY';
  7. let handler = monkeys => {
  8. monkeys.filter(cm => !cm.mDisabled).forEach(cm => {
  9. let result = null;
  10. let matched = cm.mPattern.match(/^\/(.*)\/(.*)?$/);
  11. if (matched && ( !matched[2] || matched[2] && !/[^igm]*/i.test(matched[2]))) {
  12. // 正则,直接匹配
  13. cm.mPattern = new RegExp(matched[1], matched[2] || "");
  14. result = cm.mPattern.test(params.url) && cm;
  15. } else if (cm.mPattern.indexOf('*') > -1) {
  16. if (cm.mPattern.startsWith('*://')) {
  17. cm.mPattern = cm.mPattern.replace('*://', '(http|https|file)://');
  18. } else if (cm.mPattern.indexOf('://') < 0) {
  19. cm.mPattern = '(http|https|file)://' + cm.mPattern;
  20. }
  21. // 通配符,则转换为正则再匹配
  22. cm.mPattern = new RegExp('^' + cm.mPattern.replace(/\./g,'\\.').replace(/\//g, '\\/').replace(/\*/g, '.*').replace(/\?/g, '\\?') + '$');
  23. result = cm.mPattern.test(params.url) && cm;
  24. } else {
  25. // 绝对地址,直接比对
  26. let arr = [cm.mPattern, `${cm.mPattern}/`];
  27. if (!cm.mPattern.startsWith('http://') && !cm.mPattern.startsWith('https://')) {
  28. arr = arr.concat([`http://${cm.mPattern}`, `http://${cm.mPattern}/`,
  29. `https://${cm.mPattern}`, `https://${cm.mPattern}/`]);
  30. }
  31. if (arr.includes(params.url)) {
  32. result = cm;
  33. }
  34. }
  35. if (result) {
  36. let scripts = '(' + ((monkey) => {
  37. let injectFunc = () => {
  38. // 执行脚本
  39. try{evalCore.getEvalInstance(window)(monkey.mScript)}catch(x){}
  40. parseInt(monkey.mRefresh) && setTimeout(() => {
  41. location.reload(true);
  42. }, parseInt(monkey.mRefresh) * 1000);
  43. };
  44. window._fhImportJs = js => {
  45. return fetch(js).then(resp => resp.text()).then(jsText => {
  46. if(window.evalCore && window.evalCore.getEvalInstance){
  47. return window.evalCore.getEvalInstance(window)(jsText);
  48. }
  49. let el = document.createElement('script');
  50. el.textContent = jsText;
  51. document.head.appendChild(el);
  52. });
  53. };
  54. let jsFiles = (monkey.mRequireJs || '').split(/[\s,,]+/).filter(js => js.length);
  55. if (jsFiles.length) {
  56. let arrPromise = Array.from(new Set(jsFiles)).map(js => window._fhImportJs(js));
  57. Promise.all(arrPromise).then(injectFunc);
  58. } else {
  59. injectFunc();
  60. }
  61. }).toString() + `)(${JSON.stringify(result)})`;
  62. InjectTools.inject(params.tabId, {js: scripts, allFrames: false});
  63. }
  64. });
  65. };
  66. chrome.storage.local.get(PAGE_MONKEY_LOCAL_STORAGE_KEY, (resps) => {
  67. let cacheMonkeys, storageMode = false;
  68. if ((!resps || !resps[PAGE_MONKEY_LOCAL_STORAGE_KEY]) && typeof localStorage !== 'undefined') {
  69. cacheMonkeys = localStorage.getItem(PAGE_MONKEY_LOCAL_STORAGE_KEY) || '[]';
  70. storageMode = true;
  71. } else {
  72. cacheMonkeys = resps[PAGE_MONKEY_LOCAL_STORAGE_KEY] || '[]';
  73. }
  74. if(params && params.url){
  75. handler(JSON.parse(cacheMonkeys));
  76. }
  77. // 本地存储的内容,需要全部迁移到chrome.storage.local中,以确保unlimitedStorage
  78. if (storageMode) {
  79. let storageData = {};
  80. storageData[PAGE_MONKEY_LOCAL_STORAGE_KEY] = cacheMonkeys;
  81. chrome.storage.local.set(storageData);
  82. }
  83. });
  84. } catch (e) {
  85. console.log('monkey error',e);
  86. }
  87. return true;
  88. };
  89. return {start};
  90. })();