155 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // function extract(itemsSelector, fieldSelectors, url, from, to, interval)
 | |
| // function extract(itemsSelector, fieldSelectors, url, pages)
 | |
| function extract(itemsSelector, fieldSelectors, url, ...args) {
 | |
|     let urls = [];
 | |
|     if (url) {
 | |
|         if (args[0] instanceof Array) {
 | |
|             urls = args[0].map(p => url.replace("${page}", p));
 | |
|         } else if (args.length >= 3) {
 | |
|             let from = args.shift();
 | |
|             let to = args.shift();
 | |
|             let interval = args.shift();
 | |
|             for (let i = from; i <= to; i += interval) {
 | |
|                 urls.push(url.replace("${page}", i));
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     let data = [];
 | |
|     return new Promise((resolve, reject) => {
 | |
|         chrome.tabs.query({
 | |
|             active: true,
 | |
|             currentWindow: true
 | |
|         }, function (tabs) {
 | |
|             let pms;
 | |
|             let tab = tabs[0];
 | |
|             if (urls.length) {
 | |
|                 pms = urls.reduce((p, url) => p.then(
 | |
|                     results => {
 | |
|                         data.push(...results);
 | |
|                         return redirectTab(tab, url).then(
 | |
|                             tab => extractTabData(tab, itemsSelector, fieldSelectors)
 | |
|                         );
 | |
|                     },
 | |
|                     () => p
 | |
|                 ), Promise.resolve([]));
 | |
|             } else {
 | |
|                 pms = extractTabData(tab, itemsSelector, fieldSelectors);
 | |
|             }
 | |
|             pms.then(
 | |
|                 results => {
 | |
|                     data.push(...results);
 | |
|                     data.unshift(fieldSelectors);
 | |
|                     saveFileAsk(data);
 | |
|                     resolve("save done.")
 | |
|                 },
 | |
|                 err => reject(err)
 | |
|             );
 | |
|         });
 | |
|     });
 | |
| }
 | |
| 
 | |
| function extractTabData(tab, itemsSelector, fieldSelectors) {
 | |
|     let done = false;
 | |
|     return new Promise((resolve, reject) => {
 | |
|         chrome.tabs.sendMessage(
 | |
|             tab.id, {
 | |
|                 from: "doExtractRequest",
 | |
|                 itemsSelector: itemsSelector,
 | |
|                 fieldSelectors: fieldSelectors
 | |
|             },
 | |
|             response => {
 | |
|                 done = true;
 | |
|                 resolve(response);
 | |
|             }
 | |
|         );
 | |
|         setTimeout(() => {
 | |
|             if (!done) reject(`extractTabData failed after 2 second.`);
 | |
|         }, 2000);
 | |
|     });
 | |
| }
 | |
| 
 | |
| function redirectTab(tab, url) {
 | |
|     return new Promise((resolve, reject) => {
 | |
|         let req = {
 | |
|             from: "doExtractGotoUrl",
 | |
|             url: url
 | |
|         }
 | |
|         let curUrl = "";
 | |
|         queryUrl(tab)
 | |
|             .then(u => {
 | |
|                 if (url !== u) {
 | |
|                     curUrl = u;
 | |
|                     chrome.tabs.sendMessage(tab.id, req);
 | |
|                 }
 | |
|             })
 | |
|             .then(() => queryUrl(tab, curUrl))
 | |
|             .then(() => reportIn(tab))
 | |
|             .then(tab => resolve(tab))
 | |
|             .catch(err => reject(err));
 | |
|     });
 | |
| }
 | |
| 
 | |
| function reportIn(tab) {
 | |
|     let req = {
 | |
|         from: "doExtractReportIn"
 | |
|     }
 | |
|     return new Promise((resolve, reject) => {
 | |
|         let timeOut;
 | |
|         let rejectTimeout = setTimeout(() => {
 | |
|             reject(`reportIn failed after 10 second.`);
 | |
|             clearTimeout(timeOut);
 | |
|         }, 10000);
 | |
|         loop();
 | |
| 
 | |
|         function loop() {
 | |
|             chrome.tabs.sendMessage(tab.id, req, r => {
 | |
|                 if (r == req.from) {
 | |
|                     resolve(tab);
 | |
|                     clearTimeout(rejectTimeout);
 | |
|                 } else {
 | |
|                     timeOut = setTimeout(() => {
 | |
|                         loop();
 | |
|                     }, 500);
 | |
|                 }
 | |
|             });
 | |
|         }
 | |
|     });
 | |
| }
 | |
| 
 | |
| function queryUrl(tab, urlExcluded) {
 | |
|     let req = {
 | |
|         from: "doExtractQueryUrl"
 | |
|     }
 | |
|     return new Promise((resolve, reject) => {
 | |
|         let timeOut;
 | |
|         let rejectTimeout = setTimeout(() => {
 | |
|             reject(`queryUrl failed after 10 second.`);
 | |
|             clearTimeout(timeOut);
 | |
|         }, 10000);
 | |
|         loop();
 | |
| 
 | |
|         function loop() {
 | |
|             chrome.tabs.sendMessage(tab.id, req, url => {
 | |
|                 if (url && (!urlExcluded || (urlExcluded && urlExcluded != url))) {
 | |
|                     resolve(url);
 | |
|                     clearTimeout(rejectTimeout);
 | |
|                 } else {
 | |
|                     timeOut = setTimeout(() => {
 | |
|                         loop();
 | |
|                     }, 500);
 | |
|                 }
 | |
|             });
 | |
|         }
 | |
|     });
 | |
| }
 | |
| 
 | |
| function createTab(url) {
 | |
|     return new Promise((resolve, reject) => {
 | |
|         chrome.tabs.create({
 | |
|             active: true,
 | |
|             url: url
 | |
|         }, function (tab) {
 | |
|             resolve(tab);
 | |
|         });
 | |
|     });
 | |
| } |