init
This commit is contained in:
		
							
								
								
									
										121
									
								
								scripts/extract.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								scripts/extract.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,121 @@ | ||||
| // 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) { | ||||
|     let done = false; | ||||
|     let timeOut; | ||||
|     return new Promise((resolve, reject) => { | ||||
|         let req = { | ||||
|             from: "doExtractGotoUrl", | ||||
|             url: url | ||||
|         } | ||||
|         chrome.tabs.sendMessage(tab.id, req, r => { | ||||
|             // if (r != req.from) return; | ||||
|             // detectLoop(); | ||||
|             setTimeout(() => { | ||||
|                 detectLoop(); | ||||
|             }, 500); | ||||
|         }); | ||||
|         setTimeout(() => { | ||||
|             if (!done) { | ||||
|                 reject(`redirectTab failed after 10 second.`); | ||||
|                 clearTimeout(timeOut); | ||||
|             } | ||||
|         }, 10000); | ||||
|  | ||||
|         function detectLoop() { | ||||
|             let req = { | ||||
|                 from: "doExtractReportIn" | ||||
|             } | ||||
|             chrome.tabs.sendMessage(tab.id, req, r => { | ||||
|                 if (r != req.from) return; | ||||
|                 resolve(tab) | ||||
|                 done = true; | ||||
|             }); | ||||
|             if (!done) { | ||||
|                 clearTimeout(timeOut); | ||||
|                 timeOut = setTimeout(() => { | ||||
|                     detectLoop(); | ||||
|                 }, 100); | ||||
|             } | ||||
|         } | ||||
|     }); | ||||
| } | ||||
|  | ||||
| function createTab(url) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|         chrome.tabs.create({ | ||||
|             active: true, | ||||
|             url: url | ||||
|         }, function (tab) { | ||||
|             resolve(tab); | ||||
|         }); | ||||
|     }); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user