mirror of
https://github.com/primedigitaltech/azon_seeker.git
synced 2026-02-07 07:43:12 +08:00
feature: collecting item links
This commit is contained in:
parent
bdc3d0d512
commit
94fa61dfa1
@ -39,6 +39,7 @@
|
|||||||
"chokidar": "^4.0.3",
|
"chokidar": "^4.0.3",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"crx": "^5.0.1",
|
"crx": "^5.0.1",
|
||||||
|
"emittery": "^1.1.0",
|
||||||
"esno": "^4.8.0",
|
"esno": "^4.8.0",
|
||||||
"fs-extra": "^11.2.0",
|
"fs-extra": "^11.2.0",
|
||||||
"husky": "^9.1.7",
|
"husky": "^9.1.7",
|
||||||
|
|||||||
9
pnpm-lock.yaml
generated
9
pnpm-lock.yaml
generated
@ -41,6 +41,9 @@ importers:
|
|||||||
crx:
|
crx:
|
||||||
specifier: ^5.0.1
|
specifier: ^5.0.1
|
||||||
version: 5.0.1
|
version: 5.0.1
|
||||||
|
emittery:
|
||||||
|
specifier: ^1.1.0
|
||||||
|
version: 1.1.0
|
||||||
esno:
|
esno:
|
||||||
specifier: ^4.8.0
|
specifier: ^4.8.0
|
||||||
version: 4.8.0
|
version: 4.8.0
|
||||||
@ -1381,6 +1384,10 @@ packages:
|
|||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
emittery@1.1.0:
|
||||||
|
resolution: {integrity: sha512-rsX7ktqARv/6UQDgMaLfIqUWAEzzbCQiVh7V9rhDXp6c37yoJcks12NVD+XPkgl4AEavmNhVfrhGoqYwIsMYYA==}
|
||||||
|
engines: {node: '>=14.16'}
|
||||||
|
|
||||||
emoji-regex@10.4.0:
|
emoji-regex@10.4.0:
|
||||||
resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
|
resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
|
||||||
|
|
||||||
@ -4869,6 +4876,8 @@ snapshots:
|
|||||||
minimatch: 9.0.1
|
minimatch: 9.0.1
|
||||||
semver: 7.6.3
|
semver: 7.6.3
|
||||||
|
|
||||||
|
emittery@1.1.0: {}
|
||||||
|
|
||||||
emoji-regex@10.4.0: {}
|
emoji-regex@10.4.0: {}
|
||||||
|
|
||||||
emoji-regex@8.0.0: {}
|
emoji-regex@8.0.0: {}
|
||||||
|
|||||||
@ -1,4 +1,9 @@
|
|||||||
|
import Emittery from 'emittery';
|
||||||
|
import { AmazonPageWorker, AmazonPageWorkerEvents } from './types';
|
||||||
|
|
||||||
class AmazonPageWorkerImpl implements AmazonPageWorker {
|
class AmazonPageWorkerImpl implements AmazonPageWorker {
|
||||||
|
readonly channel = new Emittery<AmazonPageWorkerEvents>();
|
||||||
|
|
||||||
public async doSearch(keywords: string): Promise<string> {
|
public async doSearch(keywords: string): Promise<string> {
|
||||||
const url = new URL('https://www.amazon.com/s');
|
const url = new URL('https://www.amazon.com/s');
|
||||||
url.searchParams.append('k', keywords);
|
url.searchParams.append('k', keywords);
|
||||||
@ -16,7 +21,7 @@ class AmazonPageWorkerImpl implements AmazonPageWorker {
|
|||||||
return url.toString();
|
return url.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async wanderSearchList(): Promise<void> {
|
private async wanderSearchSinglePage() {
|
||||||
const tab = await browser.tabs
|
const tab = await browser.tabs
|
||||||
.query({ active: true, currentWindow: true })
|
.query({ active: true, currentWindow: true })
|
||||||
.then((tabs) => tabs[0]);
|
.then((tabs) => tabs[0]);
|
||||||
@ -31,6 +36,15 @@ class AmazonPageWorkerImpl implements AmazonPageWorker {
|
|||||||
window.scrollBy(0, ~~(Math.random() * 500) + 500);
|
window.scrollBy(0, ~~(Math.random() * 500) + 500);
|
||||||
await new Promise((resolve) => setTimeout(resolve, 10));
|
await new Promise((resolve) => setTimeout(resolve, 10));
|
||||||
}
|
}
|
||||||
|
const items = document.querySelectorAll<HTMLDivElement>(
|
||||||
|
'.a-section.a-spacing-small.puis-padding-left-small',
|
||||||
|
);
|
||||||
|
const links: string[] = [];
|
||||||
|
items.forEach((el) => {
|
||||||
|
const link =
|
||||||
|
el.querySelector<HTMLAnchorElement>('a.a-link-normal')?.href;
|
||||||
|
link && links.push(link);
|
||||||
|
});
|
||||||
const nextButton =
|
const nextButton =
|
||||||
document.querySelector<HTMLLinkElement>('.s-pagination-next');
|
document.querySelector<HTMLLinkElement>('.s-pagination-next');
|
||||||
if (
|
if (
|
||||||
@ -41,14 +55,25 @@ class AmazonPageWorkerImpl implements AmazonPageWorker {
|
|||||||
setTimeout(resolve, 500 + ~~(500 * Math.random())),
|
setTimeout(resolve, 500 + ~~(500 * Math.random())),
|
||||||
);
|
);
|
||||||
nextButton.click();
|
nextButton.click();
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
return true;
|
return links;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return false;
|
return null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
console.log('results', results);
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
||||||
|
return results.pop()?.result as string[] | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async wanderSearchList(): Promise<void> {
|
||||||
|
let links = await this.wanderSearchSinglePage();
|
||||||
|
while (links) {
|
||||||
|
this.channel.emit('item-links-collected', { links });
|
||||||
|
links = await this.wanderSearchSinglePage();
|
||||||
|
}
|
||||||
return new Promise((resolve) => setTimeout(resolve, 1000));
|
return new Promise((resolve) => setTimeout(resolve, 1000));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
17
src/logic/page-worker/types.d.ts
vendored
17
src/logic/page-worker/types.d.ts
vendored
@ -1,4 +1,21 @@
|
|||||||
|
import type Emittery from 'emittery';
|
||||||
|
|
||||||
|
interface AmazonPageWorkerEvents {
|
||||||
|
/**
|
||||||
|
* Emitted when a new item is found on the Amazon page.
|
||||||
|
* @param link - The item link that was found.
|
||||||
|
*/
|
||||||
|
['item-links-collected']: { links: string[] };
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
interface AmazonPageWorker {
|
interface AmazonPageWorker {
|
||||||
|
/**
|
||||||
|
* The channel for communication with the Amazon page worker.
|
||||||
|
* This is an instance of Emittery, which allows for event-based communication.
|
||||||
|
*/
|
||||||
|
readonly channel: Emittery<AmazonPageWorkerEvents>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Search for a list of items on Amazon
|
* Search for a list of items on Amazon
|
||||||
* @param keywords - The keywords to search for on Amazon.
|
* @param keywords - The keywords to search for on Amazon.
|
||||||
|
|||||||
@ -2,11 +2,19 @@
|
|||||||
import { keywords } from '~/logic/storage';
|
import { keywords } from '~/logic/storage';
|
||||||
import pageWorker from '~/logic/page-worker';
|
import pageWorker from '~/logic/page-worker';
|
||||||
|
|
||||||
|
const links = ref<string[]>([]);
|
||||||
|
const worker = pageWorker.createAmazonPageWorker();
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
worker.channel.on('item-links-collected', (ev) => {
|
||||||
|
links.value = links.value.concat(ev.links);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
const onSearch = async () => {
|
const onSearch = async () => {
|
||||||
if (keywords.value.trim() === '') {
|
if (keywords.value.trim() === '') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const worker = pageWorker.createAmazonPageWorker();
|
|
||||||
await worker.doSearch(keywords.value);
|
await worker.doSearch(keywords.value);
|
||||||
await worker.wanderSearchList();
|
await worker.wanderSearchList();
|
||||||
};
|
};
|
||||||
@ -31,13 +39,18 @@ const onSearch = async () => {
|
|||||||
</n-space>
|
</n-space>
|
||||||
<div style="height: 10px"></div>
|
<div style="height: 10px"></div>
|
||||||
<n-card class="result-content-container" title="结果框">
|
<n-card class="result-content-container" title="结果框">
|
||||||
<n-empty description="还没有结果哦">
|
<n-empty v-if="links.length === 0" description="还没有结果哦">
|
||||||
<template #icon>
|
<template #icon>
|
||||||
<n-icon :size="50">
|
<n-icon :size="50">
|
||||||
<solar-cat-linear />
|
<solar-cat-linear />
|
||||||
</n-icon>
|
</n-icon>
|
||||||
</template>
|
</template>
|
||||||
</n-empty>
|
</n-empty>
|
||||||
|
<n-list size="medium" v-else>
|
||||||
|
<n-list-item v-for="(link, index) in links" :key="index">
|
||||||
|
<n-tag :href="link" target="_blank">{{ link }}</n-tag>
|
||||||
|
</n-list-item>
|
||||||
|
</n-list>
|
||||||
</n-card>
|
</n-card>
|
||||||
</main>
|
</main>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user