background.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. var tempData = null
  2. var openList = {}
  3. // 从 storage 中读取数据
  4. chrome.storage.local.get(['owoOpenList'], (result) => {
  5. if (result.owoOpenList) {
  6. openList = result.owoOpenList
  7. }
  8. })
  9. // 保存到 storage 中
  10. function saveOpenList() {
  11. chrome.storage.local.set({ owoOpenList: openList })
  12. }
  13. // 对数据进行处理
  14. function clearData (data) {
  15. let returnData = []
  16. data.forEach(element => {
  17. if (openList[element.id] || element.type == 'autoRun') {
  18. returnData.push(element)
  19. }
  20. })
  21. return returnData
  22. }
  23. function reGetData (url, callBack) {
  24. const nowTime = Date.parse(new Date())
  25. const serverUrl = 'https://assist.lamp.run/assistAll'
  26. fetch(`${serverUrl}`, {
  27. method: 'POST',
  28. body: JSON.stringify({
  29. "edition": 7,
  30. "url": url
  31. }),
  32. redirect: 'follow'
  33. }).then(data => data.json()).then(dataTemp => {
  34. tempData = {
  35. time: nowTime,
  36. data: dataTemp
  37. }
  38. if (callBack) callBack(dataTemp)
  39. })
  40. }
  41. function handleFetchRequest(url, options) {
  42. return new Promise((resolve, reject) => {
  43. fetch(url, options)
  44. .then(async response => {
  45. try {
  46. const contentType = response.headers.get('content-type');
  47. let data;
  48. if (contentType && contentType.includes('application/json')) {
  49. data = await response.json();
  50. } else {
  51. data = await response.text();
  52. }
  53. resolve({
  54. ok: response.ok,
  55. status: response.status,
  56. statusText: response.statusText,
  57. headers: Object.fromEntries(response.headers.entries()),
  58. data: data,
  59. url: response.url
  60. });
  61. } catch (error) {
  62. reject({
  63. error: '解析响应失败',
  64. details: error.message,
  65. status: response.status
  66. });
  67. }
  68. })
  69. .catch(error => {
  70. reject({
  71. error: '请求失败',
  72. details: error.message,
  73. type: error.name
  74. });
  75. });
  76. });
  77. }
  78. // 监听消息
  79. chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
  80. // console.log(message)
  81. switch (message.name) {
  82. case 'getData':
  83. const nowTime = Date.parse(new Date())
  84. // 缓存
  85. if (tempData && (tempData.time + 60 * 60 * 1000) > nowTime) {
  86. console.log('使用缓存返回!', tempData)
  87. sendResponse(clearData(tempData.data))
  88. } else {
  89. reGetData(message.url, (dataTemp) => {
  90. sendResponse(clearData(dataTemp))
  91. })
  92. }
  93. break;
  94. case 'fetch': // 新增的 fetch 处理方法
  95. const { url, options = {} } = message;
  96. handleFetchRequest(url, options)
  97. .then(result => {
  98. sendResponse({
  99. success: true,
  100. ...result
  101. });
  102. })
  103. .catch(error => {
  104. sendResponse({
  105. success: false,
  106. error: error
  107. });
  108. });
  109. break;
  110. default:
  111. break;
  112. }
  113. return true
  114. })
  115. // 在文件开头添加调试
  116. console.log('Background service worker 启动');
  117. console.log('Manifest 权限:', chrome.runtime.getManifest().permissions);
  118. console.log('declarativeNetRequest API:', chrome.declarativeNetRequest);
  119. // 初始化加载拦截规则
  120. function initBlockList() {
  121. fetch(`https://assist.lamp.run/blockList`)
  122. .then(response => {
  123. if (!response.ok) {
  124. throw new Error(`HTTP ${response.status}`);
  125. }
  126. return response.json();
  127. })
  128. .then(dataTemp => {
  129. console.log('获取到拦截规则:', dataTemp);
  130. blockListTemp = dataTemp;
  131. return lanjie(dataTemp);
  132. })
  133. .catch(error => {
  134. console.error('获取拦截规则失败:', error);
  135. // 设置空的拦截规则
  136. blockListTemp = {};
  137. lanjie({});
  138. });
  139. }
  140. // 插件安装/更新时初始化
  141. chrome.runtime.onInstalled.addListener(() => {
  142. console.log('插件已安装/更新');
  143. initBlockList();
  144. });
  145. // 插件启动时也初始化
  146. initBlockList();
  147. async function lanjie(blockList) {
  148. // 先检查 API 是否可用
  149. if (!chrome.declarativeNetRequest || !chrome.declarativeNetRequest.updateDynamicRules) {
  150. console.error('declarativeNetRequest API 不可用,请检查 manifest.json 配置');
  151. // 重新检查权限
  152. chrome.management.getSelf((extensionInfo) => {
  153. console.log('插件权限信息:', extensionInfo.permissions);
  154. });
  155. return;
  156. }
  157. console.log('开始设置拦截规则...');
  158. const rules = [];
  159. let id = 1000; // 使用较大的ID避免冲突
  160. for (const [url, redirect] of Object.entries(blockList)) {
  161. rules.push({
  162. id: id++,
  163. priority: 1,
  164. action: {
  165. type: 'redirect',
  166. redirect: { url: redirect }
  167. },
  168. condition: {
  169. urlFilter: url,
  170. resourceTypes: ['main_frame', 'sub_frame', 'xmlhttprequest', 'script']
  171. }
  172. });
  173. }
  174. try {
  175. // 先获取现有规则
  176. const oldRules = await chrome.declarativeNetRequest.getDynamicRules();
  177. console.log('现有规则数量:', oldRules.length);
  178. // 移除所有现有规则
  179. const oldIds = oldRules.map(rule => rule.id);
  180. if (oldIds.length > 0) {
  181. await chrome.declarativeNetRequest.updateDynamicRules({
  182. removeRuleIds: oldIds
  183. });
  184. console.log(`移除 ${oldIds.length} 条旧规则`);
  185. }
  186. // 添加新规则
  187. if (rules.length > 0) {
  188. await chrome.declarativeNetRequest.updateDynamicRules({
  189. addRules: rules
  190. });
  191. console.log(`添加 ${rules.length} 条新规则成功`);
  192. }
  193. } catch (error) {
  194. console.error('更新规则失败:', error);
  195. // 调试信息
  196. console.log('当前插件 manifest:', chrome.runtime.getManifest());
  197. console.log('API 支持状态:', {
  198. declarativeNetRequest: !!chrome.declarativeNetRequest,
  199. updateDynamicRules: !!chrome.declarativeNetRequest?.updateDynamicRules,
  200. getDynamicRules: !!chrome.declarativeNetRequest?.getDynamicRules
  201. });
  202. }
  203. }
  204. chrome.runtime.onMessageExternal.addListener(
  205. function(request, sender, sendResponse) {
  206. console.log(request)
  207. switch (request.name) {
  208. case 'sendMessage':
  209. var myHeaders = new Headers();
  210. myHeaders.append("Content-Type", "application/json");
  211. var raw = JSON.stringify({
  212. "first": {
  213. "value": "插件提示",
  214. "color": "#173177"
  215. },
  216. "keyword1": {
  217. "value": request.keyword1,
  218. "color": "#173177"
  219. },
  220. "keyword2": {
  221. "value": request.keyword1,
  222. "color": "#173177"
  223. },
  224. "keyword3": {
  225. "value": (new Date()).toLocaleString(),
  226. "color": "#173177"
  227. },
  228. "remark": {
  229. "value": request.remark,
  230. "color": "#173177"
  231. }
  232. });
  233. var requestOptions = {
  234. method: 'POST',
  235. headers: myHeaders,
  236. body: raw,
  237. redirect: 'follow'
  238. };
  239. fetch(`https://message.lamp.run/workWeixin?type=${request.type}&template=EvpHwEBpG2rkLHYMtIH2ADww9JCQwEaWlTAqyoPF6xQ`, requestOptions)
  240. .then(response => response.text())
  241. .then(result => console.log(result))
  242. .catch(error => console.log('error', error));
  243. case 'notifications':
  244. chrome.notifications.create(null, {
  245. type: 'basic',
  246. iconUrl: 'img/48.png',
  247. title: request.title,
  248. message: request.message
  249. });
  250. case 'playMusic':
  251. let musicUrl = request.url ? request.url : 'https://cunchu.site/work/assist/lingyin.wav'
  252. new Audio(musicUrl).play()
  253. default:
  254. break;
  255. }
  256. sendResponse('ok')
  257. }
  258. );
  259. // function logResponse(responseDetails) {
  260. // console.log(responseDetails);
  261. // }
  262. // chrome.webRequest.onCompleted.addListener(
  263. // logResponse,
  264. // {urls: ["<all_urls>"]}
  265. // );