mirror of
https://github.com/opelly27/streetmerchant.git
synced 2026-05-20 04:07:36 +00:00
Compare commits
216 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 89e3709440 | |||
| a7be09d56e | |||
| e3d09803ad | |||
| 40c4a8c1b9 | |||
| eee669b1b3 | |||
| 9e8c83622d | |||
| f583029bf3 | |||
| 8ee6815c0f | |||
| 6934d5b31c | |||
| cfe292eb3e | |||
| a3c726b45c | |||
| 11e14655e1 | |||
| b3a88f6608 | |||
| 659edcd421 | |||
| 5effbae882 | |||
| 4d1e1ba3e7 | |||
| 69e005905a | |||
| cb7d215c3a | |||
| 1288f9271a | |||
| e527e43e85 | |||
| 7cf60f84e1 | |||
| fbb024a9ce | |||
| d422c7d0d3 | |||
| 488bc544c9 | |||
| d341ef72aa | |||
| 347f49b2d4 | |||
| 1c113efc42 | |||
| 03539ca666 | |||
| 42808b836c | |||
| e8ee59fae1 | |||
| 4324706f32 | |||
| b6030b3cc3 | |||
| 557ff511e3 | |||
| 9e3922e0d1 | |||
| 2c3c47b4a9 | |||
| 9d5af9f8f9 | |||
| 07306891d7 | |||
| 5f81a8a25f | |||
| e6803d4d7c | |||
| 2501f6b5cc | |||
| 5a5927ba1e | |||
| 8d5792bf9e | |||
| b1ece9edad | |||
| 2cd2991cca | |||
| c1c9bc49a2 | |||
| 4acf6e616f | |||
| af90b1a0a3 | |||
| edb39f8f05 | |||
| 1009ce6636 | |||
| 2548ca4a74 | |||
| c22c960dc1 | |||
| b20bd4a496 | |||
| d02b40b5b8 | |||
| 728f21a62c | |||
| 0cc4e4c4b2 | |||
| 0e65f33690 | |||
| 4455e4ed8d | |||
| 2572c8af80 | |||
| 233c4496e2 | |||
| 7aa2212115 | |||
| 4f57df016b | |||
| 329318427f | |||
| 630f46ce47 | |||
| 1cc63c051c | |||
| 127d846fbe | |||
| 4b8b6feda6 | |||
| b6d03317ba | |||
| 8df4339bdb | |||
| bb8c89b775 | |||
| d63685f290 | |||
| 95b4a153bd | |||
| 4fe0f50941 | |||
| e488ef22fb | |||
| de1427c076 | |||
| 1015358b50 | |||
| a2072449d2 | |||
| 8c17d21dfd | |||
| 8ac3a3bc37 | |||
| 8c383235af | |||
| ecb27ebf0a | |||
| 3b204f15ac | |||
| 2143b15809 | |||
| f932009c01 | |||
| a10ae42454 | |||
| ba6eccc90a | |||
| 9791568cd4 | |||
| ce609fb518 | |||
| 5f0c656b30 | |||
| 113e92df8b | |||
| c81282ef9f | |||
| aec8cfdae2 | |||
| 9bf0e30222 | |||
| 13f1c3d50c | |||
| 9695e29a02 | |||
| 11e64942a0 | |||
| c177aedd21 | |||
| b7930b25fd | |||
| 05720e519b | |||
| 8ece4b6412 | |||
| 7997d6d22a | |||
| f474cc6966 | |||
| f87053cb02 | |||
| dbde7814af | |||
| b2ebac36c0 | |||
| b03d24217f | |||
| 2fa893795f | |||
| 122e68a764 | |||
| cb898c7923 | |||
| 09827741ae | |||
| 2120d2901d | |||
| 3f191bbd00 | |||
| 724f6b19a1 | |||
| bc45fd8d11 | |||
| 0a1198b69c | |||
| e0849c4dc2 | |||
| 75b2460aea | |||
| 50ee40a2d4 | |||
| 9d7f908e04 | |||
| 3b14ec7574 | |||
| 57b3a500ae | |||
| b821eab273 | |||
| 513f578fdc | |||
| a6a69e7ae5 | |||
| 58761fc48e | |||
| 3ab0de6e86 | |||
| be541713a8 | |||
| 84382def6f | |||
| a768eb4cf5 | |||
| ca2580d72b | |||
| 9c35e728ac | |||
| 52c7e74372 | |||
| c479ce2b6a | |||
| 83508bc5ea | |||
| c9cda1e4e5 | |||
| d0a4667a64 | |||
| 459e9af34c | |||
| 8ed5daf729 | |||
| f8af5a85c0 | |||
| 20bea85e41 | |||
| 943ab837e2 | |||
| 9c2ea8dbe9 | |||
| 30f3fab419 | |||
| c0638d2e4b | |||
| 426a8ce015 | |||
| 21d0a94a8e | |||
| 8faf3202e7 | |||
| ef926d2282 | |||
| 3f62921439 | |||
| 1ed8eca6f9 | |||
| 53cb59aada | |||
| 8d0a32ca22 | |||
| 445a00728f | |||
| 6a4049bbc3 | |||
| 13d4ee6a71 | |||
| a74980b728 | |||
| 8a1874216a | |||
| 0ef76d66bc | |||
| 082776cfca | |||
| ad5bd55c1a | |||
| 4f86d2462e | |||
| 8ab6e1f1d8 | |||
| f9a3d03f35 | |||
| 9ef83fd1d2 | |||
| 8e5c28e10b | |||
| de69f7ae8a | |||
| ca1564e8fa | |||
| a908ce417b | |||
| 6bc7737ef0 | |||
| 14998d87f9 | |||
| 76761c5b8d | |||
| a402c64f5e | |||
| e893d79ad7 | |||
| fb82526a42 | |||
| 90fb430b71 | |||
| 5b70ff14cb | |||
| 0c6e2d587d | |||
| 1cf618c1c1 | |||
| 28d1cf90b8 | |||
| f34a808451 | |||
| eb59dc3433 | |||
| beee355563 | |||
| 5a6b252ae1 | |||
| 0c80d6caea | |||
| 272b49b4ac | |||
| ec8d3571cf | |||
| 7a5bc22ba8 | |||
| 673b5f325c | |||
| 70b2e7c408 | |||
| 4debcd33a7 | |||
| 0b7d92341a | |||
| 0cc5de95ca | |||
| bc788cbd95 | |||
| ab037029b6 | |||
| 6e2a16238c | |||
| f86a8259f3 | |||
| 2b5588bd46 | |||
| cdc3a84d2d | |||
| ef9afb8d69 | |||
| 8836a1c1c4 | |||
| 96ae818e84 | |||
| 7425e6437f | |||
| f65df4ce56 | |||
| ecdb7a058d | |||
| 02d29c3c64 | |||
| ca59777917 | |||
| 8db16dd0cb | |||
| a9b2ecfd48 | |||
| 8fdfa4d57c | |||
| 64898b8ae3 | |||
| d592cd5d77 | |||
| 316b3bbb81 | |||
| be1953b206 | |||
| 445689efc4 | |||
| 2d25c464f8 | |||
| 704fa393c2 | |||
| 769f19efa2 |
@@ -9,9 +9,4 @@ trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[*.md]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
[*.ts]
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
build/
|
||||
docs/
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"extends": "./node_modules/gts/",
|
||||
"rules": {
|
||||
"prettier/prettier": [
|
||||
"error",
|
||||
{
|
||||
"endOfLine": "auto"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -3,36 +3,31 @@ name: "\U0001F41B Bug report"
|
||||
about: Report a bug for this project
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: jef
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Expected Behavior
|
||||
|
||||
<!--- Tell us what should happen -->
|
||||
<!-- Tell us what should happen -->
|
||||
|
||||
## Current Behavior
|
||||
|
||||
<!--- Tell us what happens instead of the expected behavior -->
|
||||
<!-- Tell us what happens instead of the expected behavior -->
|
||||
|
||||
## Steps to Reproduce
|
||||
|
||||
<!--- Provide a link to a live example, or an unambiguous set of steps to -->
|
||||
<!--- reproduce this bug. Include code to reproduce, if relevant -->
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
4.
|
||||
<!-- Provide a link to a live example, or an unambiguous set of steps to reproduce this bug. -->
|
||||
<!-- Include code to reproduce, if relevant -->
|
||||
|
||||
## Environment
|
||||
|
||||
**OS:**
|
||||
**dotenv file:**
|
||||
- OS:
|
||||
|
||||
<!-- Put your dotenv within backticks below. Be sure to remove any secrets/passwords. -->
|
||||
```dotenv
|
||||
|
||||
```
|
||||
|
||||
## Logs
|
||||
|
||||
<!--- Provide a brief log -->
|
||||
<!-- Provide a brief log -->
|
||||
|
||||
Executable
+3
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
npm run test
|
||||
+25
-16
@@ -1,39 +1,48 @@
|
||||
name: ci
|
||||
name: Continuous Integration
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
jobs:
|
||||
build-and-lint:
|
||||
build-lint:
|
||||
name: Build and lint
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2.1.3
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 14.15.0
|
||||
- uses: actions/cache@v2
|
||||
node-version: 15.10.0
|
||||
- name: Setup build cache
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: ~/.npm
|
||||
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
|
||||
restore-keys: ${{ runner.os }}-node-
|
||||
- name: Add problem matcher
|
||||
run: echo "::add-matcher::.github/xo-problem-matcher.json"
|
||||
- name: Pull dependencies
|
||||
run: |
|
||||
npm ci
|
||||
npm run build
|
||||
npm run lint
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
- name: Compile TypeScript
|
||||
run: npm run compile
|
||||
- name: Run linter
|
||||
run: npm run lint
|
||||
build-docker:
|
||||
name: Build Docker image
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: dorny/paths-filter@v2.6.0
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
- name: Run paths filter
|
||||
uses: dorny/paths-filter@v2
|
||||
id: filter
|
||||
with:
|
||||
filters: |
|
||||
build:
|
||||
- 'Dockerfile'
|
||||
- 'package*.json'
|
||||
- name: Build image
|
||||
- name: Build Docker image
|
||||
if: steps.filter.outputs.build == 'true'
|
||||
run: docker build .
|
||||
|
||||
@@ -1,19 +1,20 @@
|
||||
name: documentation
|
||||
name: Documentation
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
jobs:
|
||||
deploy:
|
||||
build-deploy:
|
||||
name: Build and publish documentation
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
- name: Setup Python runtime
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.x
|
||||
- name: Install Python dependencies
|
||||
- name: Install Python packages
|
||||
run: pip install mkdocs-material mkdocs-git-revision-date-plugin mkdocs-macros-plugin
|
||||
- name: Deploy documentation
|
||||
- name: Build and publish documentation
|
||||
run: mkdocs gh-deploy --force
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
name: Nightly Release
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
workflow_dispatch: {}
|
||||
jobs:
|
||||
build-release:
|
||||
name: Build and release Docker image
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
- name: Login into GitHub Container Registry
|
||||
run: echo ${{ secrets.CR_PAT }} | docker login ghcr.io -u $GITHUB_ACTOR --password-stdin
|
||||
- name: Build Docker image
|
||||
run: |
|
||||
docker build \
|
||||
-t "ghcr.io/${GITHUB_REPOSITORY}:${GITHUB_SHA:0:7}" \
|
||||
-t "ghcr.io/${GITHUB_REPOSITORY}:nightly" .
|
||||
- name: Release Docker image
|
||||
run: |
|
||||
docker push "ghcr.io/${GITHUB_REPOSITORY}:${GITHUB_SHA:0:7}"
|
||||
docker push "ghcr.io/${GITHUB_REPOSITORY}:nightly"
|
||||
@@ -1,19 +0,0 @@
|
||||
name: nightly
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
workflow_dispatch: {}
|
||||
jobs:
|
||||
publish:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: login into github package registry
|
||||
run: echo ${{ secrets.CR_PAT }} | docker login ghcr.io -u $GITHUB_ACTOR --password-stdin
|
||||
- name: build nightly docker image
|
||||
run: |
|
||||
docker build \
|
||||
-t "ghcr.io/${GITHUB_REPOSITORY}:${GITHUB_SHA:0:7}" \
|
||||
-t "ghcr.io/${GITHUB_REPOSITORY}:nightly" .
|
||||
- name: publish nightly image
|
||||
run: docker push "ghcr.io/${GITHUB_REPOSITORY}"
|
||||
@@ -1,15 +1,18 @@
|
||||
name: pr-lint
|
||||
name: Pull Request Linter
|
||||
on:
|
||||
pull_request_target:
|
||||
pull_request:
|
||||
types:
|
||||
- opened
|
||||
- edited
|
||||
- reopened
|
||||
- synchronize
|
||||
jobs:
|
||||
main:
|
||||
lint-pr:
|
||||
name: Lint pull request title
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: amannn/action-semantic-pull-request@v2.1.1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Lint pull request title
|
||||
uses: jef/conventional-commits-pr-action@v1
|
||||
with:
|
||||
comment: false
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
@@ -1,22 +1,27 @@
|
||||
name: cd
|
||||
name: Release
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
jobs:
|
||||
publish:
|
||||
build-tag-release:
|
||||
name: Build, tag, and release Docker image
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: GoogleCloudPlatform/release-please-action@v2.10
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
- name: Setup release please
|
||||
uses: google-github-actions/release-please-action@v2
|
||||
id: release
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
release-type: simple
|
||||
release-type: node
|
||||
changelog-path: CHANGELOG.md
|
||||
package-name: streetmerchant
|
||||
- name: login into github package registry
|
||||
- name: Login into GitHub Container Registry
|
||||
if: ${{ steps.release.outputs.release_created }}
|
||||
run: echo ${{ secrets.CR_PAT }} | docker login ghcr.io -u $GITHUB_ACTOR --password-stdin
|
||||
- name: build latest docker image
|
||||
- name: Build Docker image
|
||||
if: ${{ steps.release.outputs.release_created }}
|
||||
run: |
|
||||
docker build \
|
||||
@@ -24,6 +29,8 @@ jobs:
|
||||
-t "ghcr.io/${GITHUB_REPOSITORY}:latest" .
|
||||
env:
|
||||
TAG_NAME: ${{ steps.release.outputs.tag_name }}
|
||||
- name: publish latest image
|
||||
- name: Release Docker image
|
||||
if: ${{ steps.release.outputs.release_created }}
|
||||
run: docker push "ghcr.io/${GITHUB_REPOSITORY}"
|
||||
run: |
|
||||
docker push "ghcr.io/${GITHUB_REPOSITORY}:${TAG_NAME}"
|
||||
docker push "ghcr.io/${GITHUB_REPOSITORY}:latest"
|
||||
@@ -1,4 +1,4 @@
|
||||
name: 'Close stale issues'
|
||||
name: Stale Checker
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
@@ -21,6 +21,6 @@ jobs:
|
||||
stale-pr-message: ${{ env.STALE_MESSAGE }}
|
||||
env:
|
||||
CLOSE_MESSAGE: 'This issue has been closed because it is stale. Reopen if necessary.'
|
||||
EXEMPT_LABEL: 'status: needs discussion'
|
||||
EXEMPT_LABEL: 'status: needs discussion,priority: low,priority: medium, priority: high,status: help wanted,status: in progress'
|
||||
STALE_LABEL: 'status: stale'
|
||||
STALE_MESSAGE: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days'
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
"problemMatcher": [
|
||||
{
|
||||
"owner": "xo",
|
||||
"pattern": [
|
||||
{
|
||||
"regexp": "^\\s+(.*):(\\d+):(\\d+)$",
|
||||
"file": 1
|
||||
},
|
||||
{
|
||||
"regexp": "^\\s+✖\\s+(\\d+):(\\d+)\\s+(.*)\\s+(.*)$",
|
||||
"line": 1,
|
||||
"column": 2,
|
||||
"message": 3,
|
||||
"code": 4,
|
||||
"loop": true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
+4
-1
@@ -2,11 +2,12 @@
|
||||
.vs/
|
||||
.vscode/
|
||||
build/
|
||||
coverage/
|
||||
node_modules/
|
||||
src/config/*.yaml
|
||||
|
||||
.env
|
||||
dotenv
|
||||
*.proxies
|
||||
success-*.png
|
||||
|
||||
*.wav
|
||||
@@ -16,3 +17,5 @@ success-*.png
|
||||
desktop.ini
|
||||
|
||||
twitch.json
|
||||
terraform/terraform.tfstate
|
||||
terraform/terraform.tfstate.backup
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
14.15.0
|
||||
15.10.0
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
module.exports = {
|
||||
...require('gts/.prettierrc.json')
|
||||
}
|
||||
+105
@@ -1,5 +1,110 @@
|
||||
# Changelog
|
||||
|
||||
## [3.5.0](https://www.github.com/jef/streetmerchant/compare/v3.4.1...v3.5.0) (2021-03-02)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add restart time for leaking Chromium in Ubuntu ([#1880](https://www.github.com/jef/streetmerchant/issues/1880)) ([1009ce6](https://www.github.com/jef/streetmerchant/commit/1009ce6636c21c378121bd83b251a371a1b8568e))
|
||||
* add terraform infra as code for AWS fargate ([#1987](https://www.github.com/jef/streetmerchant/issues/1987)) ([d341ef7](https://www.github.com/jef/streetmerchant/commit/d341ef72aa6b74e54c11aeb455516b2a69a8a664))
|
||||
* clean up proxy logging with n/N in each lookup ([#1839](https://www.github.com/jef/streetmerchant/issues/1839)) ([8df4339](https://www.github.com/jef/streetmerchant/commit/8df4339bdb3d96cb448e3acb727fdc534688bfc0))
|
||||
* **notification:** add simple SmartThings switch activation ([#1902](https://www.github.com/jef/streetmerchant/issues/1902)) ([c22c960](https://www.github.com/jef/streetmerchant/commit/c22c960dc179f5ed74ae41a25178e6d2feed0bf9))
|
||||
* **notification:** add Streamlabs support ([#1872](https://www.github.com/jef/streetmerchant/issues/1872)) ([edb39f8](https://www.github.com/jef/streetmerchant/commit/edb39f8f05451c3cc1994c0beb2338bae04ab585))
|
||||
* **nvidia:** updated store for europe ([#1732](https://www.github.com/jef/streetmerchant/issues/1732)) ([2143b15](https://www.github.com/jef/streetmerchant/commit/2143b158090dc065a29bdde4c6dc592a5a745c07))
|
||||
* **sms:** add US Cellular ([#1874](https://www.github.com/jef/streetmerchant/issues/1874)) ([4455e4e](https://www.github.com/jef/streetmerchant/commit/4455e4ed8df84a37fa16fdc58d130c11a997f9b5))
|
||||
* **store:** add globaldata ([#2004](https://www.github.com/jef/streetmerchant/issues/2004)) ([5effbae](https://www.github.com/jef/streetmerchant/commit/5effbae882bed9d287f8ccc84e9dd38a6ebdebb1))
|
||||
* **store:** add ldlc (FR) ([#2037](https://www.github.com/jef/streetmerchant/issues/2037)) ([a7be09d](https://www.github.com/jef/streetmerchant/commit/a7be09d56eda441cb1625ebb642cccab63d71f31))
|
||||
* **store:** add netonnet-no ([#1989](https://www.github.com/jef/streetmerchant/issues/1989)) ([e6803d4](https://www.github.com/jef/streetmerchant/commit/e6803d4d7c60424c043b540f0cb555bd29b9d7aa))
|
||||
* **store:** add Norwegian stores ([#1985](https://www.github.com/jef/streetmerchant/issues/1985)) ([5a5927b](https://www.github.com/jef/streetmerchant/commit/5a5927ba1ef5d138f5741b672b1fe2466e5760c2))
|
||||
* **store:** add novoatalho (PT) ([#2043](https://www.github.com/jef/streetmerchant/issues/2043)) ([a3c726b](https://www.github.com/jef/streetmerchant/commit/a3c726b45c5ab8f0a6c8a239e0de0a913c4e0c55))
|
||||
* **store:** add PCDiga.com ([#1990](https://www.github.com/jef/streetmerchant/issues/1990)) ([2501f6b](https://www.github.com/jef/streetmerchant/commit/2501f6b5cc46aa05bfe94ca238b5866e4fd60f36))
|
||||
* **store:** corsair-uk ([#1733](https://www.github.com/jef/streetmerchant/issues/1733)) ([c81282e](https://www.github.com/jef/streetmerchant/commit/c81282ef9fd95c39dc6d338f3d79de16906c89b6))
|
||||
* use node 15, use package version ([#2066](https://www.github.com/jef/streetmerchant/issues/2066)) ([eee669b](https://www.github.com/jef/streetmerchant/commit/eee669b1b3e54ada1180877fe766aaded9e02936))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **alternate:** update URLs ([#1814](https://www.github.com/jef/streetmerchant/issues/1814)) ([d63685f](https://www.github.com/jef/streetmerchant/commit/d63685f2905eb7f207f13da7682ad6a81d9d7aca))
|
||||
* **amazon-ca:** out of stock check was missing ([#1885](https://www.github.com/jef/streetmerchant/issues/1885)) ([0e65f33](https://www.github.com/jef/streetmerchant/commit/0e65f336902dec99aa10a4b4823f4d2411674cae))
|
||||
* **amazon-ca:** update selector ([#1851](https://www.github.com/jef/streetmerchant/issues/1851)) ([3293184](https://www.github.com/jef/streetmerchant/commit/329318427fc3eb1081751289401269119a252905))
|
||||
* **amazon-uk:** add label for ps5 ([8ee6815](https://www.github.com/jef/streetmerchant/commit/8ee6815c0fb6ea129d2de600d10e6732e90ce924)), closes [#2036](https://www.github.com/jef/streetmerchant/issues/2036)
|
||||
* **discord:** ensure first group in list is notified ([#1788](https://www.github.com/jef/streetmerchant/issues/1788)) ([9791568](https://www.github.com/jef/streetmerchant/commit/9791568cd4205b00ce9c5d301937efc17089b769))
|
||||
* **docs:** nvidia store changes ([#1797](https://www.github.com/jef/streetmerchant/issues/1797)) ([de1427c](https://www.github.com/jef/streetmerchant/commit/de1427c076e5051673635fb9ec7e9880f0e3c260))
|
||||
* **galaxus:** update selector ([#1730](https://www.github.com/jef/streetmerchant/issues/1730)) ([1015358](https://www.github.com/jef/streetmerchant/commit/1015358b502a30a8cfc9fedfeab2dc09098d9615))
|
||||
* **microcenter:** properly flag in stock items ([#1754](https://www.github.com/jef/streetmerchant/issues/1754)) ([ce609fb](https://www.github.com/jef/streetmerchant/commit/ce609fb518fa7811a77e3ab7d26ecacf86ac35e6))
|
||||
* **nvidia:** update inStock text ([#1850](https://www.github.com/jef/streetmerchant/issues/1850)) ([4f57df0](https://www.github.com/jef/streetmerchant/commit/4f57df016ba2ab6fdd5e7ca7e98ea6d9fba463a7))
|
||||
* remove package-lock.json ([e3d0980](https://www.github.com/jef/streetmerchant/commit/e3d09803ad3d53b5c4310b3e369a69c99515fd8c))
|
||||
* **vuugo:** add out of stock check ([#1731](https://www.github.com/jef/streetmerchant/issues/1731)) ([9695e29](https://www.github.com/jef/streetmerchant/commit/9695e29a02ea320842954db9f2ea51612b983490))
|
||||
* **web:** 404 Error / page not visible ([#1825](https://www.github.com/jef/streetmerchant/issues/1825)) ([95b4a15](https://www.github.com/jef/streetmerchant/commit/95b4a153bd8b708cfefd07e3f16e787bb069da48))
|
||||
* **wipoid:** corrected 3070 / 3080 links ([#1879](https://www.github.com/jef/streetmerchant/issues/1879)) ([2572c8a](https://www.github.com/jef/streetmerchant/commit/2572c8af80685be514ff762f8203e7de7cab8634))
|
||||
|
||||
### [3.4.1](https://www.github.com/jef/streetmerchant/compare/v3.4.0...v3.4.1) (2021-01-17)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **proxy:** build proxyList correctly ([c177aed](https://www.github.com/jef/streetmerchant/commit/c177aedd210e14cb7d401295cb16ece1dfb1ebe7))
|
||||
|
||||
## [3.4.0](https://www.github.com/jef/streetmerchant/compare/v3.3.0...v3.4.0) (2021-01-17)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add browser opening to test:notification ([f87053c](https://www.github.com/jef/streetmerchant/commit/f87053cb02e04b3cb2c0cf253187a9e9857c9858))
|
||||
* add c8 and mocha for testing ([f87053c](https://www.github.com/jef/streetmerchant/commit/f87053cb02e04b3cb2c0cf253187a9e9857c9858))
|
||||
* add command parameter to set custom dotenv conf ([#1590](https://www.github.com/jef/streetmerchant/issues/1590)) ([b03d242](https://www.github.com/jef/streetmerchant/commit/b03d24217f8ff5a56ddf19c019d10b48afec813f))
|
||||
* add redis ([#1390](https://www.github.com/jef/streetmerchant/issues/1390)) ([fb82526](https://www.github.com/jef/streetmerchant/commit/fb82526a427e503fff1f1cf56b091ff0c8a5a96e))
|
||||
* **asus:** add outOfStock label ([#1653](https://www.github.com/jef/streetmerchant/issues/1653)) ([d0a4667](https://www.github.com/jef/streetmerchant/commit/d0a4667a643398d836652642b993107ed05619d8)), closes [#368](https://www.github.com/jef/streetmerchant/issues/368)
|
||||
* **azerty:** add ryzen 5000 series ([#878](https://www.github.com/jef/streetmerchant/issues/878)) ([ca59777](https://www.github.com/jef/streetmerchant/commit/ca59777917777401affc5b72a68238983f286237))
|
||||
* **caseking:** add 3060ti/3070 cards / add missing 3080/3090 cards ([#1715](https://www.github.com/jef/streetmerchant/issues/1715)) ([b2ebac3](https://www.github.com/jef/streetmerchant/commit/b2ebac36c078d8001501d45e3a2bbf5f91a1a489))
|
||||
* **galaxus:** update selector, add out of stock check ([#1607](https://www.github.com/jef/streetmerchant/issues/1607)) ([c9cda1e](https://www.github.com/jef/streetmerchant/commit/c9cda1e4e597c7103a32c32c9e5a79824ad44de5))
|
||||
* **lookup:** add max price for xbox ([f34a808](https://www.github.com/jef/streetmerchant/commit/f34a808451b735c384f4b763cedd816c85ab7abc)), closes [#1436](https://www.github.com/jef/streetmerchant/issues/1436)
|
||||
* **lookup:** add protection against infinite recursion for Cloudflare ([#1505](https://www.github.com/jef/streetmerchant/issues/1505)) ([1cf618c](https://www.github.com/jef/streetmerchant/commit/1cf618c1c12d3ab94688139a8410bed181af3eb2)), closes [#1459](https://www.github.com/jef/streetmerchant/issues/1459) [#1490](https://www.github.com/jef/streetmerchant/issues/1490)
|
||||
* **lookup:** handle Cloudflare DDoS protection ([#1434](https://www.github.com/jef/streetmerchant/issues/1434)) ([f86a825](https://www.github.com/jef/streetmerchant/commit/f86a8259f37f0ed25b00e243b29aa28c3e68bdff)), closes [#1297](https://www.github.com/jef/streetmerchant/issues/1297)
|
||||
* **proshop-de:** add proshop-de inStock selector ([#1633](https://www.github.com/jef/streetmerchant/issues/1633)) ([9c2ea8d](https://www.github.com/jef/streetmerchant/commit/9c2ea8dbe91f46e24eae1e9e717164d99f94d0e1))
|
||||
* **proxy:** fallback to a global proxy list ([#1388](https://www.github.com/jef/streetmerchant/issues/1388)) ([be1953b](https://www.github.com/jef/streetmerchant/commit/be1953b2069fce72969904c1bc18055df73f4b6b))
|
||||
* **pushover:** add screenshot to push notification if available ([#1552](https://www.github.com/jef/streetmerchant/issues/1552)) ([f9a3d03](https://www.github.com/jef/streetmerchant/commit/f9a3d03f356d7ed2072772b86c7776f62dcd32b5))
|
||||
* remove stale user agents, use top 50 ([6e2a162](https://www.github.com/jef/streetmerchant/commit/6e2a16238c54bc448f3ae5243ef8729f384ea59b))
|
||||
* **store:** add `johnlewis` store, add `shopto` store ([#1481](https://www.github.com/jef/streetmerchant/issues/1481)) ([ec8d357](https://www.github.com/jef/streetmerchant/commit/ec8d3571cfbbd3a028aed9b5650eb8a52c9af587))
|
||||
* **store:** add equippr & futurex for DE region ([#1501](https://www.github.com/jef/streetmerchant/issues/1501)) ([5b70ff1](https://www.github.com/jef/streetmerchant/commit/5b70ff14cb9ab5e0a72922624d54b40bb0642bcd))
|
||||
* **store:** add GPU and CPU support for Vuugo ([#1555](https://www.github.com/jef/streetmerchant/issues/1555)) ([8ab6e1f](https://www.github.com/jef/streetmerchant/commit/8ab6e1f1d801c3ae52987fe9e8550adbe2015ea6))
|
||||
* **store:** add more italian sites ([#1701](https://www.github.com/jef/streetmerchant/issues/1701)) ([cb898c7](https://www.github.com/jef/streetmerchant/commit/cb898c7923ce8a45548807571e734ad232ce0004))
|
||||
* **store:** add pcking and acompc ([#1470](https://www.github.com/jef/streetmerchant/issues/1470)) ([beee355](https://www.github.com/jef/streetmerchant/commit/beee35556376056b31d6719fb090ce58b7ea985f))
|
||||
* **store:** add SG Location for Amazon and Newegg ([#1600](https://www.github.com/jef/streetmerchant/issues/1600)) ([ef926d2](https://www.github.com/jef/streetmerchant/commit/ef926d2282cedaef38bc3d4d427820f4aa65dc8d))
|
||||
* **store:** addition of several australian sites ([#1651](https://www.github.com/jef/streetmerchant/issues/1651)) ([2fa8937](https://www.github.com/jef/streetmerchant/commit/2fa893795f21535e1799116843e0668b669835ab))
|
||||
* **store:** specify links to navigate to between product searches ([#1542](https://www.github.com/jef/streetmerchant/issues/1542)) ([0982774](https://www.github.com/jef/streetmerchant/commit/09827741aec2158e88c19fd6b0156c32736671c8))
|
||||
* **twilio:** add support to have multiple numbers ([#1450](https://www.github.com/jef/streetmerchant/issues/1450)) ([83508bc](https://www.github.com/jef/streetmerchant/commit/83508bc5ea509aac0742c525a6434ef8f8001899))
|
||||
* update Docker and ci ([f87053c](https://www.github.com/jef/streetmerchant/commit/f87053cb02e04b3cb2c0cf253187a9e9857c9858))
|
||||
* **vsgamers:** add maxPrice selector([#1682](https://www.github.com/jef/streetmerchant/issues/1682)) ([84382de](https://www.github.com/jef/streetmerchant/commit/84382def6f23b1e8b1ad8c14fb4f423f32a35eb7))
|
||||
* **web:** properly set `for` attribute for labels ([#1626](https://www.github.com/jef/streetmerchant/issues/1626)) ([c0638d2](https://www.github.com/jef/streetmerchant/commit/c0638d2e4b923abacaf81fb09fd80948cd5e7ce9))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **acompc:** false positives ([#1699](https://www.github.com/jef/streetmerchant/issues/1699)) ([0a1198b](https://www.github.com/jef/streetmerchant/commit/0a1198b69c4e7b22fcf9c9d0ed94ff51da4f8bce))
|
||||
* **amazon-de-warehouse:** update wrong maxPrice selector ([#1514](https://www.github.com/jef/streetmerchant/issues/1514)) ([90fb430](https://www.github.com/jef/streetmerchant/commit/90fb430b712aa6a89227a17d37a83380326db21b))
|
||||
* **bandh:** asus cards / out of stock check added ([#1670](https://www.github.com/jef/streetmerchant/issues/1670)) ([b821eab](https://www.github.com/jef/streetmerchant/commit/b821eab273f3d8d4cecc1642467dbbad63f4e763))
|
||||
* **bestbuy:** shorter pageview urls and missing carturl links ([#1613](https://www.github.com/jef/streetmerchant/issues/1613)) ([8faf320](https://www.github.com/jef/streetmerchant/commit/8faf3202e79825de5289659435c5f93b4e892086)), closes [#1610](https://www.github.com/jef/streetmerchant/issues/1610)
|
||||
* **computeruniverse:** false positives ([#1698](https://www.github.com/jef/streetmerchant/issues/1698)) ([e0849c4](https://www.github.com/jef/streetmerchant/commit/e0849c4dc2427a9f8be1927847a1fb2609a24600))
|
||||
* disable redis if not configured ([6bc7737](https://www.github.com/jef/streetmerchant/commit/6bc7737ef04e5592e19b0b6a76e5fb0cd4b048df)), closes [#1516](https://www.github.com/jef/streetmerchant/issues/1516)
|
||||
* **galaxus:** maxPrice selector ([#1469](https://www.github.com/jef/streetmerchant/issues/1469)) ([7a5bc22](https://www.github.com/jef/streetmerchant/commit/7a5bc22ba8cede51311b80182c18fb0227532cd2))
|
||||
* **galaxus:** update selector ( 14.01.2020 07:00 ) ([#1664](https://www.github.com/jef/streetmerchant/issues/1664)) ([a768eb4](https://www.github.com/jef/streetmerchant/commit/a768eb4cf54f81657532ae0c5e00588cc167eae2))
|
||||
* **galaxus:** update selector ([#1578](https://www.github.com/jef/streetmerchant/issues/1578)) ([ad5bd55](https://www.github.com/jef/streetmerchant/commit/ad5bd55c1ad9f54c9c1aa7ae875bd430d6304fac))
|
||||
* **galaxus:** update selector ([#1599](https://www.github.com/jef/streetmerchant/issues/1599)) ([445a007](https://www.github.com/jef/streetmerchant/commit/445a00728fec1c8b6bded8583d4a6712c195143b))
|
||||
* **galaxus:** update selector ([#1705](https://www.github.com/jef/streetmerchant/issues/1705)) ([2120d29](https://www.github.com/jef/streetmerchant/commit/2120d2901d03ae2238bd56d46e0c43dcb16af70e))
|
||||
* **lookup:** check out of stock before price ([#1422](https://www.github.com/jef/streetmerchant/issues/1422)) ([02d29c3](https://www.github.com/jef/streetmerchant/commit/02d29c3c64a7976622da6cbdf099b76b455082d0))
|
||||
* **lookup:** remove mobile versions of user agent ([96ae818](https://www.github.com/jef/streetmerchant/commit/96ae818e84c99d0597e0ddd7b5ecfe1a0615d1ed))
|
||||
* **newegg:** false positives (all stores) ([#1714](https://www.github.com/jef/streetmerchant/issues/1714)) ([3f191bb](https://www.github.com/jef/streetmerchant/commit/3f191bbd00e7474fbef71ddd28955672835ef1a0))
|
||||
* properly pass array entries as separate indices ([#1502](https://www.github.com/jef/streetmerchant/issues/1502)) ([0c6e2d5](https://www.github.com/jef/streetmerchant/commit/0c6e2d587d81041b07a561b3f53b8b1ebcb9f843))
|
||||
* **proxy:** fix requests with proxies ([#1408](https://www.github.com/jef/streetmerchant/issues/1408)) ([f65df4c](https://www.github.com/jef/streetmerchant/commit/f65df4ce56891c368dab8dd6fe85a584cf9e6f49))
|
||||
* **proxy:** update proxy module ([#1451](https://www.github.com/jef/streetmerchant/issues/1451)) ([ab03702](https://www.github.com/jef/streetmerchant/commit/ab037029b654f5e169a97c9e7a2c4dfa6cf1e768)), closes [#1437](https://www.github.com/jef/streetmerchant/issues/1437)
|
||||
* **store:** link builder in UK stores ([#1486](https://www.github.com/jef/streetmerchant/issues/1486)) ([eb59dc3](https://www.github.com/jef/streetmerchant/commit/eb59dc3433c54027695fb68cfe69b1d90fce3fec))
|
||||
* **store:** Update 30 series links and models for store.asus.com ([#1645](https://www.github.com/jef/streetmerchant/issues/1645)) ([20bea85](https://www.github.com/jef/streetmerchant/commit/20bea85e411277f70b987675b53055b69d450e0f)), closes [#1637](https://www.github.com/jef/streetmerchant/issues/1637)
|
||||
* **store:** update missing/mislabeled cards for Canadian retailers ([#1574](https://www.github.com/jef/streetmerchant/issues/1574)) ([082776c](https://www.github.com/jef/streetmerchant/commit/082776cfca740ac0a22736f791c62705a62185be))
|
||||
* **store:** update out of stock detection for MediaMarkt and Saturn ([#1549](https://www.github.com/jef/streetmerchant/issues/1549)) ([4f86d24](https://www.github.com/jef/streetmerchant/commit/4f86d2462e5d1eba6a7d7839585c0fe8c1b70da5)), closes [#1545](https://www.github.com/jef/streetmerchant/issues/1545)
|
||||
* **webui:** handling of file serving ([#1383](https://www.github.com/jef/streetmerchant/issues/1383)) ([445689e](https://www.github.com/jef/streetmerchant/commit/445689efc49bf8edb0b5a027611f02ea0d0f126f))
|
||||
* **wipoid:** added 3090/3080/3070/3060ti/ryzen store items ([#1683](https://www.github.com/jef/streetmerchant/issues/1683)) ([be54171](https://www.github.com/jef/streetmerchant/commit/be541713a8855f18b5102917751842e514796e00))
|
||||
|
||||
## [3.3.0](https://www.github.com/jef/streetmerchant/compare/v3.2.0...v3.3.0) (2020-12-13)
|
||||
|
||||
|
||||
|
||||
+7
-8
@@ -1,4 +1,4 @@
|
||||
FROM node:14.15.0-alpine3.12 AS builder
|
||||
FROM node:15.10.0-alpine3.12 AS builder
|
||||
|
||||
LABEL org.opencontainers.image.source="https://github.com/jef/streetmerchant"
|
||||
|
||||
@@ -12,20 +12,20 @@ COPY tsconfig.json tsconfig.json
|
||||
RUN npm ci
|
||||
|
||||
COPY src/ src/
|
||||
RUN npm run build
|
||||
RUN npm run compile
|
||||
RUN npm prune --production
|
||||
|
||||
FROM node:14.15.0-alpine3.12
|
||||
FROM node:15.10.0-alpine3.12
|
||||
|
||||
RUN apk add --no-cache chromium
|
||||
|
||||
ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser \
|
||||
DOCKER=true
|
||||
DOCKER=true
|
||||
|
||||
RUN addgroup -S appuser && adduser -S -g appuser appuser \
|
||||
&& mkdir -p /home/appuser/Downloads /app \
|
||||
&& chown -R appuser:appuser /home/appuser \
|
||||
&& chown -R appuser:appuser /app
|
||||
&& mkdir -p /home/appuser/Downloads /app \
|
||||
&& chown -R appuser:appuser /home/appuser \
|
||||
&& chown -R appuser:appuser /app
|
||||
|
||||
USER appuser
|
||||
|
||||
@@ -35,7 +35,6 @@ COPY --from=builder /build/node_modules/ node_modules/
|
||||
COPY --from=builder /build/build/ build/
|
||||
COPY web/ web/
|
||||
COPY package.json package.json
|
||||
COPY version.txt version.txt
|
||||
|
||||
ENTRYPOINT ["npm", "run"]
|
||||
CMD ["start:production"]
|
||||
|
||||
@@ -1,28 +1,12 @@
|
||||
<p align="center">
|
||||
<a href="https://jef.codes/streetmerchant"
|
||||
><img
|
||||
src="https://raw.githubusercontent.com/jef/streetmerchant/main/docs/assets/images/streetmerchant-banner.png"
|
||||
alt="streetmerchant"
|
||||
/></a>
|
||||
<a href="https://jef.codes/streetmerchant"><img src="https://raw.githubusercontent.com/jef/streetmerchant/main/docs/assets/images/streetmerchant-banner.png" /></a>
|
||||
</p>
|
||||
<p align="center">
|
||||
<strong>The world's easiest, most powerful stock checker</strong>
|
||||
</p>
|
||||
<p align="center">
|
||||
<a href="https://github.com/jef/streetmerchant/actions?query=workflow%3Aci"
|
||||
><img src="https://github.com/jef/streetmerchant/workflows/ci/badge.svg"
|
||||
/></a>
|
||||
<a href="https://discord.gg/gbVY4vB9JF"
|
||||
><img
|
||||
src="https://img.shields.io/discord/773913070665859073.svg?label=chat&logo=discord&logoColor=ffffff&color=7389D8"
|
||||
alt="Tweet"
|
||||
/></a>
|
||||
<a
|
||||
href="https://twitter.com/intent/tweet?text=Beat%20the%20masses%20with%20streetmerchant&url=https://github.com/jef/streetmerchant&hashtags=typescript,opensource,bot,shopping"
|
||||
><img
|
||||
src="https://img.shields.io/badge/twitter-share-green?logo=twitter&style=social"
|
||||
alt="Tweet"
|
||||
/></a>
|
||||
<a href="https://github.com/jef/streetmerchant/actions/workflows/ci.yaml"><img src="https://img.shields.io/github/workflow/status/jef/streetmerchant/ci?color=24292e&label=ci&logo=github&logoColor=tewt&style=flat-square" /></a>
|
||||
<a href="https://discord.gg/gbVY4vB9JF"><img src="https://img.shields.io/discord/773913070665859073.svg?color=24292e&label=%20&logo=discord&logoColor=ffffff&style=flat-square" /></a>
|
||||
</p>
|
||||
<p align="center">
|
||||
<em>To get started, visit <a href="https://jef.codes/streetmerchant">jef.codes/streetmerchant</a></em>
|
||||
|
||||
@@ -64,7 +64,7 @@ To customize streetmerchant, make a copy of `dotenv-example` as `dotenv` and mak
|
||||
|
||||
The command `npm run start:dev` can be used instead of `npm run start` to automatically restart the project when filesystem changes are detected in the `src/` folder or `dotenv` file.
|
||||
|
||||
Use `npm run lint` to see any linting uses and `npm run lint:fix` to automatically fix the issues it can.
|
||||
Use `npm run lint` to see any linting uses and `npm run fix` to automatically fix the issues it can.
|
||||
|
||||
### Developing in Docker
|
||||
|
||||
|
||||
@@ -130,4 +130,4 @@ This is the main portion:
|
||||
|
||||

|
||||
|
||||
Use the full URL that you just copied and set that value to `DISOCRD_WEB_HOOK`.
|
||||
Use the full URL that you just copied and set that value to `DISCORD_WEB_HOOK`.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
app.document$.subscribe(function() {
|
||||
var tables = document.querySelectorAll("article table")
|
||||
tables.forEach(function(table) {
|
||||
new Tablesort(table)
|
||||
})
|
||||
})
|
||||
app.document$.subscribe(() => {
|
||||
const tables = document.querySelectorAll('article table');
|
||||
tables.forEach(table => {
|
||||
new Tablesort(table);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block extrahead %}
|
||||
{% set title = config.site_name %}
|
||||
{% if page and page.meta and page.meta.title %}
|
||||
{% set title = title ~ " - " ~ page.meta.title %}
|
||||
{% elif page and page.title and not page.is_homepage %}
|
||||
{% set title = title ~ " - " ~ page.title | striptags %}
|
||||
{% endif %}
|
||||
|
||||
{% set image = config.site_url ~ '/assets/images/streetmerchant-github.png' %}
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:type" content="website" />
|
||||
<meta property="og:title" content="{{ title }}" />
|
||||
<meta property="og:description" content="{{ config.site_description }}" />
|
||||
<meta property="og:url" content="{{ page.canonical_url }}" />
|
||||
<meta property="og:image" content="{{ image }}" />
|
||||
<meta property="og:image:type" content="image/png" />
|
||||
<meta property="og:image:width" content="1280" />
|
||||
<meta property="og:image:height" content="640" />
|
||||
|
||||
<!-- Twitter -->
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
<meta name="twitter:site" content="@hijxf" />
|
||||
<meta name="twitter:creator" content="@hijxf" />
|
||||
<meta name="twitter:title" content="{{ title }}" />
|
||||
<meta name="twitter:description" content="{{ config.site_description }}" />
|
||||
<meta name="twitter:image" content="{{ image }}" />
|
||||
{% endblock %}
|
||||
@@ -18,11 +18,12 @@
|
||||
| `PROXY_PROTOCOL` | Protocol of proxy server, such as `socks5`. Default: `http` |
|
||||
| `PROXY_ADDRESS` | IP Address or fqdn of proxy server |
|
||||
| `PROXY_PORT` | TCP Port number on which the proxy is listening for connections. Default: `80` |
|
||||
| `RESTART_TIME` | Restarts chrome after defined milliseconds. `0` for never, default: `0` |
|
||||
| `SCREENSHOT` | Capture screenshot of page if a card is found. Default: `true` |
|
||||
| `WEB_PORT` | Starts a webserver to be able to control the bot while it is running. Setting this value starts this service. |
|
||||
|
||||
???+ info
|
||||
You can also have a list of proxies that are rotated while searching stores. Proxies can be read from a file named `STORENAME.proxies` in the format of `socks5://username:password@ip`; one per line. In this case, there is no need to use the `PROXY_*` environments.
|
||||
There is more information on proxy settings in the [Proxy documentation](proxy.md).
|
||||
|
||||
???+ tip
|
||||
- You can also have a list of proxies that are rotated while searching stores. Proxies can be read from a file named `STORENAME.proxies` in the format of `socks5://username:password@ip`; one per line.
|
||||
|
||||
+99
-60
@@ -1,28 +1,34 @@
|
||||
# Filter
|
||||
|
||||
| Environment variable | Description | Notes |
|
||||
|:---:|---|---|
|
||||
| `COUNTRY` | [Supported country](#supported-countries) you want to be scraped | Only used with `nvidia-api`, default: `usa` |
|
||||
| `MAX_PRICE_SERIES_3060TI` | Maximum price allowed for a match, applies 3060 Ti series cards (does not apply to these sites: Nvidia, Asus, EVGA) | Default: leave empty for no limit, otherwise enter a price (enter whole dollar amounts only, avoid use of: dollar symbols, commas, and periods.) e.g.: `1234` - Cards above `1234` will be skipped. |
|
||||
| `MAX_PRICE_SERIES_3070` | Maximum price allowed for a match, applies 3070 series cards (does not apply to these sites: Nvidia, Asus, EVGA) | Default: leave empty for no limit, otherwise enter a price (enter whole dollar amounts only, avoid use of: dollar symbols, commas, and periods.) e.g.: `1234` - Cards above `1234` will be skipped. |
|
||||
| `MAX_PRICE_SERIES_3080` | Maximum price allowed for a match, applies 3080 series cards (does not apply to these sites: Nvidia, Asus, EVGA) | Default: leave empty for no limit, otherwise enter a price (enter whole dollar amounts only, avoid use of: dollar symbols, commas, and periods.) e.g.: `1234` - Cards above `1234` will be skipped. |
|
||||
| `MAX_PRICE_SERIES_3090` | Maximum price allowed for a match, applies 3090 series cards (does not apply to these sites: Nvidia, Asus, EVGA) | Default: leave empty for no limit, otherwise enter a price (enter whole dollar amounts only, avoid use of: dollar symbols, commas, and periods.) e.g.: `1234` - Cards above `1234` will be skipped. |
|
||||
| `MAX_PRICE_SERIES_CORSAIR_SF` | Maximum price allowed for a match, applies to Corsair PSUs | Default: leave empty for no limit, otherwise enter a price (enter whole dollar amounts only, avoid use of: dollar symbols, commas, and periods.) e.g.: `1234` - PSUs above `1234` will be skipped. |
|
||||
| `MAX_PRICE_SERIES_DARKHERO` | Maximum price allowed for a match, applies to ASUS Dark Hero motherboards | Default: leave empty for no limit, otherwise enter a price (enter whole dollar amounts only, avoid use of: dollar symbols, commas, and periods.) e.g.: `1234` - PSUs above `1234` will be skipped. |
|
||||
| `MAX_PRICE_SERIES_RYZEN5600` | Maximum price allowed for a match, applies AMD 5600 series cpus | Default: leave empty for no limit, otherwise enter a price (enter whole dollar amounts only, avoid use of: dollar symbols, commas, and periods.) e.g.: `1234` - CPUs above `1234` will be skipped. |
|
||||
| `MAX_PRICE_SERIES_RYZEN5800` | Maximum price allowed for a match, applies AMD 5800 series cpus | Default: leave empty for no limit, otherwise enter a price (enter whole dollar amounts only, avoid use of: dollar symbols, commas, and periods.) e.g.: `1234` - CPUs above `1234` will be skipped. |
|
||||
| `MAX_PRICE_SERIES_RYZEN5900` | Maximum price allowed for a match, applies AMD 5900 series cpus | Default: leave empty for no limit, otherwise enter a price (enter whole dollar amounts only, avoid use of: dollar symbols, commas, and periods.) e.g.: `1234` - CPUs above `1234` will be skipped. |
|
||||
| `MAX_PRICE_SERIES_RYZEN5950` | Maximum price allowed for a match, applies AMD 5950 series cpus | Default: leave empty for no limit, otherwise enter a price (enter whole dollar amounts only, avoid use of: dollar symbols, commas, and periods.) e.g.: `1234` - CPUs above `1234` will be skipped. |
|
||||
| `MAX_PRICE_SERIES_SONYPS5C` | Maximum price allowed for a match, applies PS5 console | Default: leave empty for no limit, otherwise enter a price (enter whole dollar amounts only, avoid use of: dollar symbols, commas, and periods.) e.g.: `1234` - PS5 above `1234` will be skipped. |
|
||||
| `MAX_PRICE_SERIES_SONYPS5DE` | Maximum price allowed for a match, applies PS5 digital edition | Default: leave empty for no limit, otherwise enter a price (enter whole dollar amounts only, avoid use of: dollar symbols, commas, and periods.) e.g.: `1234` - PS5 above `1234` will be skipped. |
|
||||
| `MAX_PRICE_SERIES_TEST` | Maximum price allowed for a match, applies `test:series` | Default: leave empty for no limit, otherwise enter a price (enter whole dollar amounts only, avoid use of: dollar symbols, commas, and periods.) e.g.: `1234` - PS5 above `1234` will be skipped. |
|
||||
| `MICROCENTER_LOCATION` | Specific MicroCenter location(s) to search | Comma separated, e.g.: `marietta,duluth`, default: `web` |
|
||||
| `NVIDIA_ADD_TO_CART_ATTEMPTS` | The maximum number of times the `nvidia-api` add to cart feature will be attempted before failing | Default: `10` |
|
||||
| `NVIDIA_SESSION_TTL` | The time in milliseconds to keep the cart active while using `nvidia-api` | Default: `60000` |
|
||||
| `SHOW_ONLY_BRANDS` | Filter to show specified brands | Comma separated, e.g.: `evga,zotac` |
|
||||
| `SHOW_ONLY_MODELS` | Filter to show specified models | Both supported formats are comma separated <br/><br/>1. Standard E.g.: `founders edition,rog strix` <br/><br/> 2. Advanced E.g: `MODEL:SERIES`, E.g: `founders edition:3090,rog strix` |
|
||||
| `SHOW_ONLY_SERIES` | Filter to show specified series | Comma separated, e.g.: `3080,ryzen5900` |
|
||||
| `STORES` | [Supported stores](#supported-stores) you want to be scraped | Both supported formats are comma separated <br/><br/>1. Standard E.g.: `"nvidia"` <br/><br/> 2. Advanced E.g: `STORE:PAGE_SLEEP_MIN:PAGE_SLEEP_MAX`, E.g: `nvidia:10000:30000` <br/><br/>Default: `nvidia` |
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
| `MAX_PRICE_SERIES_3060` | Maximum price allowed for a match, applies 3060 series cards (does not apply to these sites: Nvidia, Asus, EVGA) |
|
||||
| `MAX_PRICE_SERIES_3060TI` | Maximum price allowed for a match, applies 3060 Ti series cards (does not apply to these sites: Nvidia, Asus, EVGA) |
|
||||
| `MAX_PRICE_SERIES_3070` | Maximum price allowed for a match, applies 3070 series cards (does not apply to these sites: Nvidia, Asus, EVGA) |
|
||||
| `MAX_PRICE_SERIES_3080` | Maximum price allowed for a match, applies 3080 series cards (does not apply to these sites: Nvidia, Asus, EVGA) |
|
||||
| `MAX_PRICE_SERIES_3090` | Maximum price allowed for a match, applies 3090 series cards (does not apply to these sites: Nvidia, Asus, EVGA) |
|
||||
| `MAX_PRICE_SERIES_CORSAIR_SF` | Maximum price allowed for a match, applies to Corsair PSUs |
|
||||
| `MAX_PRICE_SERIES_DARKHERO` | Maximum price allowed for a match, applies to ASUS Dark Hero motherboards |
|
||||
| `MAX_PRICE_SERIES_RYZEN5600` | Maximum price allowed for a match, applies AMD 5600 series cpus |
|
||||
| `MAX_PRICE_SERIES_RYZEN5800` | Maximum price allowed for a match, applies AMD 5800 series cpus |
|
||||
| `MAX_PRICE_SERIES_RYZEN5900` | Maximum price allowed for a match, applies AMD 5900 series cpus |
|
||||
| `MAX_PRICE_SERIES_RYZEN5950` | Maximum price allowed for a match, applies AMD 5950 series cpus |
|
||||
| `MAX_PRICE_SERIES_RX6800` | Maximum price allowed for a match, applies AMD RX 6800 |
|
||||
| `MAX_PRICE_SERIES_RX6800XT` | Maximum price allowed for a match,applies AMD RX 6800 XT |
|
||||
| `MAX_PRICE_SERIES_RX6900XT` | Maximum price allowed for a match, applies AMD RX 6900 XT |
|
||||
| `MAX_PRICE_SERIES_SONYPS5C` | Maximum price allowed for a match, applies PS5 console |
|
||||
| `MAX_PRICE_SERIES_SONYPS5DE` | Maximum price allowed for a match, applies PS5 digital edition |
|
||||
| `MAX_PRICE_SERIES_XBOXSS` | Maximum price allowed for a match, applies PS5 digital edition |
|
||||
| `MAX_PRICE_SERIES_XBOXSX` | Maximum price allowed for a match, applies PS5 digital edition |
|
||||
| `MAX_PRICE_SERIES_TEST` | Maximum price allowed for a match, applies `test:series` |
|
||||
| `MICROCENTER_LOCATION` | Specific MicroCenter location(s) to search. Comma separated, e.g.: `marietta,duluth`, default: `web` |
|
||||
| `SHOW_ONLY_BRANDS` | Filter to show specified brands. Comma separated, e.g.: `evga,zotac` |
|
||||
| `SHOW_ONLY_MODELS` | Filter to show specified models. Comma separated, can include series. E.g.: `founders edition:3090,rog strix` |
|
||||
| `SHOW_ONLY_SERIES` | Filter to show specified series. Comma separated, e.g.: `3080,ryzen5900` |
|
||||
| `STORES` | [Supported stores](#supported-stores) you want to be scraped. Default: `amazon,bestbuy`. Comma separated, can include `PAGE_SLEEP_MIN` and `PAGE_SLEEP_MAX` values. E.g.: `amazon:10000:30000,bestbuy,newegg:50000:80000`. |
|
||||
|
||||
???+ note
|
||||
For `MAX_PRICE_SERIES_*` variables: Use whole numbers only (no currency symbol is required). Avoid using any commas or decimal points. Example: `1234`. Merchandise found above this price will be skipped.
|
||||
|
||||
## Supported stores
|
||||
|
||||
@@ -30,7 +36,10 @@ Used with the `STORES` variable.
|
||||
|
||||
| Stores | Country | Environment variable |
|
||||
|---|---|---|
|
||||
| AComPC | DE | `acompc` |
|
||||
| Adorama | US | `adorama`|
|
||||
| Akinformatica | IT | `akinformatica`|
|
||||
| Allneeds | AU | `allneeds`|
|
||||
| Alternate | DE | `alternate`|
|
||||
| Alternate | NL | `alternate-nl`|
|
||||
| Amazon | US | `amazon`|
|
||||
@@ -41,11 +50,13 @@ Used with the `STORES` variable.
|
||||
| Amazon | FR | `amazon-fr`|
|
||||
| Amazon | IT | `amazon-it`|
|
||||
| Amazon | NL | `amazon-nl`|
|
||||
| Amazon | SG | `amazon-sg`|
|
||||
| Amazon | UK | `amazon-uk`|
|
||||
| AMD | US | `amd`|
|
||||
| AMD | CA | `amd-ca`|
|
||||
| AMD | DE | `amd-de`|
|
||||
| AMD | IT | `amd-it`|
|
||||
| AMD | UK | `amd-uk`|
|
||||
| AntOnline | US | `antonline`|
|
||||
| Argos | UK | `argos`|
|
||||
| Argos | IE | `argos-ie`|
|
||||
@@ -53,79 +64,116 @@ Used with the `STORES` variable.
|
||||
| ARLT | DE | `arlt`|
|
||||
| ASUS | US | `asus` |
|
||||
| ASUS | DE | `asus-de` |
|
||||
| AWD-IT | UK | `awd` |
|
||||
| Azerty | NL | `azerty`|
|
||||
| B&H | US | `bandh`|
|
||||
| Best Buy | US | `bestbuy`|
|
||||
| Best Buy | CA | `bestbuy-ca`|
|
||||
| Box | UK | `box`|
|
||||
| BPCTech | AU | `bpctech`|
|
||||
| BPM-Power | IT | `bpm-power`|
|
||||
| CanadaComputers | CA | `canadacomputers` |
|
||||
| Caseking | DE | `caseking`|
|
||||
| CCL | UK | `ccl`|
|
||||
| Centrecom | AU | `centrecom`|
|
||||
| Comet | IT | `comet`|
|
||||
| ComputerAlliance | AU | `computeralliance`|
|
||||
| Computeruniverse | DE | `computeruniverse` |
|
||||
| Coolblue | NL | `coolblue`|
|
||||
| Coolmod | ES | `coolmod`|
|
||||
| Corsair | US | `corsair`|
|
||||
| Corsair | UK | `corsair-uk`|
|
||||
| CPL | AU | `cpl`|
|
||||
| Currys | UK | `currys`|
|
||||
| Cyberport | DE | `cyberport` |
|
||||
| DComp | AU | `dcomp`|
|
||||
| Drako | IT | `drako` |
|
||||
| DustinHome | NO | `dustinhome-no` |
|
||||
| EBGames | CA | `ebgames`|
|
||||
| eBuyer | UK | `ebuyer`|
|
||||
| El Corte Inglés | ES | `elcorteingles`|
|
||||
| Elkjop | NO | `elkjop`|
|
||||
| ePrice | IT | `eprice`|
|
||||
| Equippr | DE | `equippr`|
|
||||
| Euronics | IT | `euronics`|
|
||||
| Euronics | DE | `euronics-de`|
|
||||
| Evatech | AU | `evatech`|
|
||||
| EVGA | US | `evga`|
|
||||
| EVGA | EU | `evga-eu`|
|
||||
| Expert | DE | `expert`|
|
||||
| Futurex | DE | `futurex`|
|
||||
| Galaxus | DE | `galaxus`|
|
||||
| Game | UK | `game`|
|
||||
| Gamestop | US | `gamestop`|
|
||||
| Gamestop | DE | `gamestop-de`|
|
||||
| Gamestop | IE | `gamestop-ie`|
|
||||
| Harvey Normans | IE | | `harveynorman-ie` |
|
||||
| Gamestop | IT | `gamestop-it`|
|
||||
| Globaldata | PT | `globaldata`|
|
||||
| Hardware Planet | IT | | `hardware-planet` |
|
||||
| HarrisTechnology | AU | `harristechnology`|
|
||||
| Harvey Normans | IE | `harveynorman-ie` |
|
||||
| iGame Computer | AU | `igame-computer`|
|
||||
| John Lewis | UK | `johnlewis`|
|
||||
| Kabum | BR | `kabum`|
|
||||
| Komplett | NO | `komplett-no`|
|
||||
| Landmark Computers | AU | `landmark-computers`|
|
||||
| Ldlc | FR | `ldlc`|
|
||||
| Mediamarkt | DE | `mediamarkt`|
|
||||
| Medimax | DE | `medimax`|
|
||||
| Megekko | NL | `megekko`|
|
||||
| MemoryExpress | CA | `memoryexpress`|
|
||||
| Micro Center | US | `microcenter`|
|
||||
| Mindfactory | DE | `mindfactory` |
|
||||
| MSY | AU | `msy`|
|
||||
| Mwave | AU | `mwave`|
|
||||
| Netonnet | NO | `netonnet-no`|
|
||||
| Newegg | US | `newegg`|
|
||||
| Newegg | CA | `newegg-ca`|
|
||||
| Newegg | SG | `newegg-sg`|
|
||||
| Notebooksbilliger | DE |`notebooksbilliger`|
|
||||
| Novatech | UK | `novatech`|
|
||||
| Nvidia | US | `nvidia`|
|
||||
| Nvidia API | | `nvidia-api`|
|
||||
| Novo Atalho | PT | `novoatalho`|
|
||||
| Nvidia | EU/UK | [See below](#nvidia-store-reference) |
|
||||
| Office Depot | US | `officedepot`|
|
||||
| Ollo | IT | `ollo`|
|
||||
| Otto | DE | `otto`|
|
||||
| Overclockers | UK | `overclockers`|
|
||||
| PBTech | AU | `pbtech`|
|
||||
| PCByte | AU | `pcbyte`|
|
||||
| PCCG | AU | `pccg`|
|
||||
| PCComponentes | ES | `pccomponentes`|
|
||||
| PCDiga | PT | `pcdiga`|
|
||||
| PCKing | DE | `pcking` |
|
||||
| PlayStation | US | `playstation`|
|
||||
| PNY | US | `pny`|
|
||||
| Power | NO | `power-no`|
|
||||
| Proshop | DE | `proshop-de`|
|
||||
| Proshop | DK | `proshop-dk`|
|
||||
| Proshop | NO | `proshop-no`|
|
||||
| Rosman | AU | `rosman`|
|
||||
| Rosman-Melb | AU | `rosman-melb`|
|
||||
| Saturn | DE | `saturn`|
|
||||
| Save On It | AU | `saveonit`|
|
||||
| Scan | UK | `scan`|
|
||||
| Scorptec | AU | `scorptec`|
|
||||
| ShopTo | UK | `shopto`|
|
||||
| Smyths Toys | UK | `smythstoys`|
|
||||
| Smyths Toys | IE | `smythstoys-ie`|
|
||||
| Spielegrotte | DE | `spielegrotte`|
|
||||
| Storm Computers | AU | `storm-computer`|
|
||||
| Target | US | `target`|
|
||||
| Tesco | IE | `tesco-ie`|
|
||||
| TopAchat | GR | `topachat`|
|
||||
| Toys R Us | US | `toysrus` |
|
||||
| Umart | AU | `umart`|
|
||||
| Unieuro | IT | `unieuro`|
|
||||
| Very | UK | `very`|
|
||||
| Vuugo | CA | `vuugo` |
|
||||
| Walmart | US | `walmart`|
|
||||
| Walmart | CA | `walmart-ca`|
|
||||
| Wells Technology | AU | `wellstechnology`|
|
||||
| Wipoid | ES | `wipoid`|
|
||||
| Zotac | US | `zotac`|
|
||||
| TopAchat | GR | `topachat`|
|
||||
|
||||
### Micro Center stores
|
||||
|
||||
@@ -151,24 +199,24 @@ Used with the `SHOW_ONLY_BRANDS` and `SHOW_ONLY_MODELS` variables.
|
||||
| Brand | Model |
|
||||
|:---:|---|
|
||||
| `amd` | `5600x`, `5800x`, `5900x`, `5950x`, `amd reference` |
|
||||
| `asus` | `crosshair viii`, `dual`, `dual oc`, `strix`, `strix oc`, `tuf`, `tuf oc` |
|
||||
| `corsair` | `750 platinum`, `600 platinum` |
|
||||
| `asus` | `crosshair viii`, `dual`, `dual oc`, `ekwb`, `strix`, `strix oc`, `strix white`, `tuf`, `tuf oc` |
|
||||
| `corsair` | `750 platinum`, `600 platinum`, `600 gold` |
|
||||
| `colorful` | `igame advanced oc`, `igame vulcan oc` |
|
||||
| `evga` | `ftw3`, `ftw3 ultra`, `ftw3 ultra hydro copper`, `xc3`, `xc3 black`, `xc3 ultra` |
|
||||
| `evga` | `ftw3`, `ftw3 black`, `ftw3 ultra`, `ftw3 ultra hybrid`, `ftw3 ultra hydro copper`, `xc3`, `xc black`, `xc gaming`, `xc3 black`, `xc3 ultra`, `xc3 ultra hybrid` |
|
||||
| `gainward` | `phantom gs`, `phoenix`, `phoenix gs`, `phoenix gs oc` |
|
||||
| `gigabyte` | `aorus master`, `aorus xtreme`, `aorus xtreme waterforce`, `aorus xtreme waterforce wb`, `eagle`, `eagle oc`, `gaming`, `gaming oc`, `turbo`, `vision`, `vision oc` |
|
||||
| `gigabyte` | `aorus master`, `aorus xtreme`, `aorus xtreme waterforce`, `aorus xtreme waterforce wb`, `eagle`, `eagle oc`, `gaming`, `gaming oc`, `gaming oc pro`, `turbo`, `vision`, `vision oc` |
|
||||
| `galax` | `sg`, `sg oc` |
|
||||
| `inno3d` | `gaming x3`, `ichill x3`, `ichill x4`, `ichill frostbite`, `twin x2 oc` |
|
||||
| `inno3d` | `gaming x3`, `ichill x3`, `ichill x4`, `ichill frostbite`, `twin x2`, `twin x2 oc` |
|
||||
| `kfa2` | `sg`, `sg oc` |
|
||||
| `leadtek` | `hurricane` |
|
||||
| `microsoft` | `xbox series x`, `xbox series s` |
|
||||
| `msi` | `gaming x trio`, `suprim x`, `ventus 2x oc`, `ventus 3x`, `ventus 3x oc` |
|
||||
| `msi` | `gaming x trio`, `suprim`, `suprim x`, `ventus 2x oc`, `ventus 3x`, `ventus 3x oc` |
|
||||
| `nvidia` | `founders edition` |
|
||||
| `palit` | `gamerock oc`, `gaming pro`, `gaming pro oc` |
|
||||
| `pny` | `dual fan`, `xlr8 revel`, `xlr8 uprising` |
|
||||
| `pny` | `dual fan`, `xlr8 epic x`, `xlr8 revel`, `xlr8 uprising` |
|
||||
| `sony` | `ps5 console`, `ps5 digital` |
|
||||
| `xfx` | `merc`, `amd reference` |
|
||||
| `zotac` | `amp holo`, `amp extreme holo`, `trinity`, `trinity oc`, `twin edge`, `twin edge oc` |
|
||||
| `zotac` | `amp holo`, `amp extreme holo`, `amp white`, `trinity`, `trinity oc`, `twin edge`, `twin edge oc`, `twin edge oc white` |
|
||||
|
||||
## Supported series
|
||||
|
||||
@@ -183,6 +231,7 @@ Used with the `SHOW_ONLY_SERIES` variable.
|
||||
| AMD RX 6800 | `rx6800` |
|
||||
| AMD RX 6800XT | `rx6800xt` |
|
||||
| AMD RX 6900XT | `rx6900xt` |
|
||||
| Nvidia RTX 3060 | `3060` |
|
||||
| Nvidia RTX 3060 Ti | `3060ti` |
|
||||
| Nvidia RTX 3070 | `3070` |
|
||||
| Nvidia RTX 3080 | `3080` |
|
||||
@@ -194,31 +243,21 @@ Used with the `SHOW_ONLY_SERIES` variable.
|
||||
| Xbox Series S | `xboxss` |
|
||||
| Xbox Series X | `xboxsx` |
|
||||
|
||||
## Supported countries
|
||||
## Nvidia Store Reference
|
||||
|
||||
Used with the `COUNTRY` variable.
|
||||
???+ note
|
||||
Use the Nvidia Store to check stock for Founders Edition cards only (3060 Ti/3070/3080/3090). For USA use `bestbuy` instead.
|
||||
|
||||
???+ attention
|
||||
Used _only_ with `nvidia` and `nvidia-api`.
|
||||
???+ info
|
||||
Use the `STORE` variable for your chosen country. For example, to check for a FE card in Belgium you would use the `nvidia-fr` store.
|
||||
|
||||
| Country | 3080 FE | 3090 FE | Test Card | Notes |
|
||||
|:---:|:---:|:---:|:---:|:---:|
|
||||
| `austria` | `✔` | `✔` | `✔` | |
|
||||
| `belgium` | `✔` | `✔` | `✔` | |
|
||||
| `canada` | `✔` | `✔` | `✔` | |
|
||||
| `czechia` | `✔` | `✔` | `✔` | |
|
||||
| `denmark` | `✔` | | `✔` | Missing RTX 3090 |
|
||||
| `finland` | `✔` | | `✔` | Missing RTX 3090 |
|
||||
| `france` | `✔` | `✔` | `✔` | |
|
||||
| `germany` | `✔` | `✔` | `✔` | |
|
||||
| `great_britain` | `✔` | `✔` | `✔` | |
|
||||
| `ireland` | `✔` | `✔` | `✔` | |
|
||||
| `italy` | `✔` | `✔` | `✔` | |
|
||||
| `luxembourg` | `✔` | `✔` | `✔` | |
|
||||
| `netherlands` | `✔` | `✔` | `✔` | |
|
||||
| `norway` | `✔` | `✔` | `✔` | |
|
||||
| `poland` | `✔` | `✔` | `✔` | |
|
||||
| `portugal` | `✔` | | | RTX 3080 only |
|
||||
| `spain` | `✔` | `✔` | `✔` | |
|
||||
| `sweden` | `✔` | `✔` | `✔` | |
|
||||
| `usa` | `✔` | `✔` | `✔` | |
|
||||
| Country | Store | Retailer
|
||||
|:---:|:---:|:---:|
|
||||
| Austria | `nvidia-de`| NBB |
|
||||
| Belgium | `nvidia-fr` | LDLC |
|
||||
| France | `nvidia-fr` | LDLC |
|
||||
| Germany | `nvidia-de` | NBB |
|
||||
| Ireland | `nvidia-gb` | Scan |
|
||||
| Luxembourg | `nvidia-fr` | LDLC |
|
||||
| Spain | `nvidia-es` | LDLC |
|
||||
| United Kingdom | `nvidia-gb` | Scan |
|
||||
|
||||
@@ -18,6 +18,7 @@ You can test your notification configuration by running `npm run test:notificati
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
| `DISCORD_NOTIFY_GROUP` | Discord group you would like to notify |
|
||||
| `DISCORD_NOTIFY_GROUP_3060` | Discord group to notify on 3060 stock |
|
||||
| `DISCORD_NOTIFY_GROUP_3060TI` | Discord group to notify on 3060 Ti stock |
|
||||
| `DISCORD_NOTIFY_GROUP_3070` | Discord group to notify on 3070 stock |
|
||||
| `DISCORD_NOTIFY_GROUP_3080` | Discord group to notify on 3080 stock |
|
||||
@@ -36,7 +37,7 @@ You can test your notification configuration by running `npm run test:notificati
|
||||
| `DISCORD_WEB_HOOK` | Discord Web Hook URL. Can be comma separated. Use whole webhook URL |
|
||||
|
||||
???+ note
|
||||
All ground can be comma separated. `DISCORD_NOTIFY_GROUP` is always used if set.
|
||||
All groups can be comma separated. `DISCORD_NOTIFY_GROUP` is always used if set.
|
||||
|
||||
- If you're using a role, please use `<@&2834729847239842>`
|
||||
- If you're using a user, please use `<@2834729847239842>`
|
||||
@@ -73,6 +74,7 @@ Default provider is Gmail. If you use a different email provider, you must provi
|
||||
| Sprint | `sprint`|
|
||||
| Telus | `telus`|
|
||||
| T-Mobile | `tmobile`|
|
||||
| USCC | `uscc`|
|
||||
| Verizon | `verizon`|
|
||||
| Virgin | `virgin`|
|
||||
| Virgin (CA) | `virgin-ca`|
|
||||
@@ -121,7 +123,7 @@ For cloud only usage, instructions to generate are located [here](https://develo
|
||||
|
||||
## Pushbullet
|
||||
|
||||
Generate token at https://www.pushbullet.com/#settings/account.
|
||||
Generate token at [pushbullet.com/#settings/account](https://pushbullet.com/#settings/account).
|
||||
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
@@ -129,7 +131,7 @@ Generate token at https://www.pushbullet.com/#settings/account.
|
||||
|
||||
## Pushover
|
||||
|
||||
Generate token at https://pushover.net/apps/build.
|
||||
Generate token at [pushover.net/apps/build](https://pushover.net/apps/build).
|
||||
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
@@ -142,6 +144,12 @@ Generate token at https://pushover.net/apps/build.
|
||||
???+ note
|
||||
`PUSHOVER_EXPIRE` and `PUSHOVER_RETRY` are only used when `PUSHOVER_PRIORITY="2"`
|
||||
|
||||
## Redis
|
||||
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
| `REDIS_URL` | Connection string in format (redis://[username]:[password]@[host][:port]/[database-id]) (redis://localhost:6379/1) |
|
||||
|
||||
## Slack
|
||||
|
||||
| Environment variable | Description |
|
||||
@@ -149,6 +157,15 @@ Generate token at https://pushover.net/apps/build.
|
||||
| `SLACK_CHANNEL` | Channel for posting |
|
||||
| `SLACK_TOKEN` | API token |
|
||||
|
||||
## SmartThings
|
||||
|
||||
Generate token at [account.smartthings.com/tokens](https://account.smartthings.com/tokens).
|
||||
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
| `SMARTTHINGS_TOKEN` | Access token |
|
||||
| `SMARTTHINGS_SWITCH_LABEL` | Switch Label of switch to activate|
|
||||
|
||||
## Telegram
|
||||
|
||||
| Environment variable | Description |
|
||||
@@ -158,7 +175,7 @@ Generate token at https://pushover.net/apps/build.
|
||||
|
||||
## Twilio
|
||||
|
||||
Token generation can be found at https://twilio.com/console.
|
||||
Token generation can be found at [twilio.com/console](https://twilio.com/console).
|
||||
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
@@ -172,7 +189,7 @@ Token generation can be found at https://twilio.com/console.
|
||||
|
||||
## Twitter
|
||||
|
||||
Generate all Twitter keys at: https://developer.twitter.com/
|
||||
Generate all Twitter keys at [developer.twitter.com](https://developer.twitter.com).
|
||||
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
@@ -184,6 +201,8 @@ Generate all Twitter keys at: https://developer.twitter.com/
|
||||
|
||||
## Twitch
|
||||
|
||||
Instructions on how to set up tokens can be found at [d-fischer.github.io/twitch-chat-client/docs/examples/basic-bot](https://d-fischer.github.io/twitch-chat-client/docs/examples/basic-bot).
|
||||
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
| `TWITCH_CLIENT_ID` | Twitch client ID |
|
||||
@@ -191,3 +210,16 @@ Generate all Twitter keys at: https://developer.twitter.com/
|
||||
| `TWITCH_ACCESS_TOKEN` | Twitch access token |
|
||||
| `TWITCH_REFRESH_TOKEN` | Twitch refresh token |
|
||||
| `TWITCH_CHANNEL` | Twitch channel |
|
||||
|
||||
## StreamLabs
|
||||
|
||||
Instructions on how to set up tokens can be found at [dev.streamlabs.com](https://dev.streamlabs.com/docs/register-your-application).
|
||||
You don't need to submit your application for review, just whitelist yourself!
|
||||
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
| `STREAMLABS_ACCESS_TOKEN` | StreamLabs access token |
|
||||
| `STREAMLABS_TYPE` | StreamLabs alert type |
|
||||
| `STREAMLABS_IMAGE`| Custom image to display. Leave it blank for default |
|
||||
| `STREAMLABS_SOUND` | Custom image to play. Leave it blank for default |
|
||||
| `STREAMLABS_DURATION` | StreamLabs alert duration (in milliseconds) |
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
# Proxy
|
||||
|
||||
## Filename
|
||||
|
||||
Proxy configuration can be set either per store in a file called `storename.proxies` or globally in `global.proxies` in the streetmerchant root directory.
|
||||
|
||||
If both exist, the store specific file will take precedence.
|
||||
|
||||
## Format
|
||||
|
||||
The format is one proxy per line with the following structure:
|
||||
`protocol://[user:password@]ip[:port]`
|
||||
|
||||
Supported protocols are `http` and `socks5`.
|
||||
|
||||
Valid examples include:
|
||||
- `socks5://1.2.3.4:3180`
|
||||
- `socks5://abcd:efgh@1.2.3.4:5678`
|
||||
- `http://1.2.3.4:80`
|
||||
- `http://abcd:efgh@1.2.3.4:8080`
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
../../terraform/README.md
|
||||
+12
-3
@@ -7,9 +7,9 @@ ASCII_BANNER=
|
||||
ASCII_COLOR=
|
||||
AUTO_ADD_TO_CART=
|
||||
BROWSER_TRUSTED=
|
||||
COUNTRY=
|
||||
DESKTOP_NOTIFICATIONS=
|
||||
DISCORD_NOTIFY_GROUP=
|
||||
DISCORD_NOTIFY_GROUP_3060=
|
||||
DISCORD_NOTIFY_GROUP_3060TI=
|
||||
DISCORD_NOTIFY_GROUP_3070=
|
||||
DISCORD_NOTIFY_GROUP_3080=
|
||||
@@ -35,6 +35,7 @@ HEADLESS=
|
||||
IN_STOCK_WAIT_TIME=
|
||||
LOG_LEVEL=
|
||||
LOW_BANDWIDTH=
|
||||
MAX_PRICE_SERIES_3060=
|
||||
MAX_PRICE_SERIES_3060TI=
|
||||
MAX_PRICE_SERIES_3070=
|
||||
MAX_PRICE_SERIES_3080=
|
||||
@@ -49,6 +50,8 @@ MAX_PRICE_SERIES_RYZEN5900=
|
||||
MAX_PRICE_SERIES_RYZEN5950=
|
||||
MAX_PRICE_SERIES_SONYPS5C=
|
||||
MAX_PRICE_SERIES_SONYPS5DE=
|
||||
MAX_PRICE_SERIES_XBOXSS=
|
||||
MAX_PRICE_SERIES_XBOXSX=
|
||||
MAX_PRICE_SERIES_TEST=
|
||||
MICROCENTER_LOCATION=
|
||||
MQTT_BROKER_ADDRESS=
|
||||
@@ -58,8 +61,6 @@ MQTT_PASSWORD=
|
||||
MQTT_QOS=
|
||||
MQTT_TOPIC=
|
||||
MQTT_USERNAME=
|
||||
NVIDIA_ADD_TO_CART_ATTEMPTS=
|
||||
NVIDIA_SESSION_TTL=
|
||||
OPEN_BROWSER=
|
||||
PAGE_BACKOFF_MIN=
|
||||
PAGE_BACKOFF_MAX=
|
||||
@@ -89,12 +90,15 @@ PUSHOVER_RETRY=
|
||||
PUSHOVER_TOKEN=
|
||||
PUSHOVER_USER=
|
||||
PUSHOVER_PRIORITY=
|
||||
RESTART_TIME=
|
||||
SCREENSHOT=
|
||||
SHOW_ONLY_BRANDS=
|
||||
SHOW_ONLY_MODELS=
|
||||
SHOW_ONLY_SERIES=
|
||||
SLACK_CHANNEL=
|
||||
SLACK_TOKEN=
|
||||
SMARTTHINGS_TOKEN=
|
||||
SMARTTHINGS_SWITCH_LABEL=
|
||||
SMTP_ADDRESS=
|
||||
SMTP_PORT=
|
||||
STORES=
|
||||
@@ -114,4 +118,9 @@ TWITTER_ACCESS_TOKEN_SECRET=
|
||||
TWITTER_CONSUMER_KEY=
|
||||
TWITTER_CONSUMER_SECRET=
|
||||
TWITTER_TWEET_TAGS=
|
||||
STREAMLABS_ACCESS_TOKEN=
|
||||
STREAMLABS_TYPE=
|
||||
STREAMLABS_IMAGE=
|
||||
STREAMLABS_SOUND=
|
||||
STREAMLABS_DURATION=
|
||||
WEB_PORT=
|
||||
|
||||
+7
-4
@@ -2,7 +2,7 @@
|
||||
site_name: streetmerchant
|
||||
site_url: https://jef.codes/streetmerchant
|
||||
site_author: Jef LeCompte
|
||||
site_description: The world's easiest, most powerful stock checker
|
||||
site_description: 🤖 The world's easiest, most powerful stock checker
|
||||
|
||||
# Repository
|
||||
repo_name: jef/streetmerchant
|
||||
@@ -13,12 +13,13 @@ copyright: Copyright © 2016 - 2020 Jef LeCompte
|
||||
|
||||
# Configuration
|
||||
theme:
|
||||
custom_dir: docs/overrides
|
||||
favicon: https://raw.githubusercontent.com/jef/streetmerchant/main/docs/assets/images/streetmerchant-logo.png
|
||||
features:
|
||||
- search.suggest
|
||||
font:
|
||||
text: Noto Sans
|
||||
code: JetBrains Mono
|
||||
text: Roboto
|
||||
code: Fira Code
|
||||
icon:
|
||||
repo: octicons/octoface-24
|
||||
logo: assets/images/streetmerchant-logo.png
|
||||
@@ -43,7 +44,7 @@ extra:
|
||||
- icon: fontawesome/brands/twitter
|
||||
link: https://twitter.com/hijxf
|
||||
- icon: fontawesome/brands/linkedin
|
||||
link: https://www.linkedin.com/in/jeflecompte/
|
||||
link: https://www.linkedin.com/in/jeflecompte
|
||||
|
||||
extra_javascript:
|
||||
- https://cdnjs.cloudflare.com/ajax/libs/tablesort/5.2.1/tablesort.min.js
|
||||
@@ -83,6 +84,8 @@ nav:
|
||||
- Application: reference/application.md
|
||||
- Filter: reference/filter.md
|
||||
- Notification: reference/notification.md
|
||||
- Proxy: reference/proxy.md
|
||||
- Terraform: reference/terraform.md
|
||||
- Help:
|
||||
- General: help/general.md
|
||||
- Troubleshoot: help/troubleshoot.md
|
||||
|
||||
Generated
+16010
-4800
File diff suppressed because it is too large
Load Diff
+50
-46
@@ -1,17 +1,25 @@
|
||||
{
|
||||
"name": "streetmerchant",
|
||||
"description": "🔮 For all your Nvidia needs",
|
||||
"version": "3.5.0",
|
||||
"description": "The world's easiest, most powerful stock checker",
|
||||
"main": "src/index.ts",
|
||||
"scripts": {
|
||||
"all": "npm run build && npm run lint",
|
||||
"build": "tsc",
|
||||
"lint": "xo",
|
||||
"lint:fix": "xo --fix",
|
||||
"start": "npm run build && node build/index.js",
|
||||
"fix": "gts fix",
|
||||
"lint": "gts lint",
|
||||
"clean": "gts clean",
|
||||
"compile": "tsc",
|
||||
"pretest": "npm run compile",
|
||||
"posttest": "npm run lint",
|
||||
"prestart": "npm run compile",
|
||||
"start": "node build/src/index.js",
|
||||
"start:dev": "nodemon --config nodemon.json",
|
||||
"start:production": "node build/index.js",
|
||||
"test:notification": "npm run build && node build/__test__/notification-test.js",
|
||||
"test:notification:production": "node build/__test__/notification-test.js"
|
||||
"start:production": "node build/src/index.js",
|
||||
"test": "c8 mocha 'build/test/**/test-*.js' --exclude 'build/test/functional/**/test-*.js'",
|
||||
"test:notification": "npm run compile && node build/test/functional/test-notification.js",
|
||||
"test:notification:production": "node build/test/functional/test-notification.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12.0.0"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -25,60 +33,56 @@
|
||||
},
|
||||
"homepage": "https://github.com/jef/streetmerchant#readme",
|
||||
"dependencies": {
|
||||
"@bridgerakol/samsung-smart-api": "^2.8.1",
|
||||
"@doridian/puppeteer-page-proxy": "^1.2.11",
|
||||
"@jef/pushbullet": "^2.4.3",
|
||||
"@slack/web-api": "^5.14.0",
|
||||
"@types/random-useragent": "^0.3.0",
|
||||
"@slack/web-api": "^6.0.0",
|
||||
"chalk": "^4.1.0",
|
||||
"cheerio": "^1.0.0-rc.3",
|
||||
"cheerio": "^1.0.0-rc.5",
|
||||
"discord.js": "^12.5.1",
|
||||
"dotenv": "^8.2.0",
|
||||
"messaging-api-telegram": "^1.0.1",
|
||||
"messaging-api-telegram": "^1.0.4",
|
||||
"mqtt": "^4.2.6",
|
||||
"node-fetch": "^2.6.1",
|
||||
"node-hue-api": "^4.0.9",
|
||||
"node-notifier": "^8.0.0",
|
||||
"node-hue-api": "^4.0.10",
|
||||
"node-notifier": "^9.0.0",
|
||||
"node-pagerduty": "^1.3.6",
|
||||
"nodemailer": "^6.4.16",
|
||||
"open": "^7.3.0",
|
||||
"nodemailer": "^6.5.0",
|
||||
"open": "^7.4.2",
|
||||
"play-sound": "^1.1.3",
|
||||
"puppeteer": "^5.5.0",
|
||||
"puppeteer-extra": "^3.1.15",
|
||||
"puppeteer-extra-plugin-adblocker": "^2.11.9",
|
||||
"puppeteer-extra-plugin-block-resources": "^2.2.7",
|
||||
"puppeteer-extra-plugin-stealth": "^2.6.5",
|
||||
"puppeteer-page-proxy": "^1.2.8",
|
||||
"puppeteer": "^8.0.0",
|
||||
"puppeteer-extra": "^3.1.17",
|
||||
"puppeteer-extra-plugin-adblocker": "^2.11.10",
|
||||
"puppeteer-extra-plugin-block-resources": "^2.2.8",
|
||||
"puppeteer-extra-plugin-stealth": "^2.7.5",
|
||||
"pushover-notifications": "^1.2.2",
|
||||
"random-useragent": "^0.5.0",
|
||||
"twilio": "^3.54.0",
|
||||
"twitch": "^4.3.5",
|
||||
"twitch-auth": "^4.3.5",
|
||||
"twitch-chat-client": "^4.3.6",
|
||||
"redis": "^3.0.2",
|
||||
"top-user-agents": "^1.0.21",
|
||||
"twilio": "^3.57.0",
|
||||
"twitch": "^4.4.12",
|
||||
"twitch-auth": "^4.4.12",
|
||||
"twitch-chat-client": "^4.4.12",
|
||||
"twitter": "^1.7.1",
|
||||
"winston": "^3.3.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/async": "^3.2.5",
|
||||
"@types/cheerio": "^0.22.23",
|
||||
"@types/node": "^14.14.12",
|
||||
"@types/node-fetch": "^2.5.7",
|
||||
"@types/cheerio": "^0.22.24",
|
||||
"@types/mocha": "^8.2.1",
|
||||
"@types/node": "^14.14.31",
|
||||
"@types/node-fetch": "^2.5.8",
|
||||
"@types/node-notifier": "^8.0.0",
|
||||
"@types/nodemailer": "^6.4.0",
|
||||
"@types/puppeteer": "^5.4.2",
|
||||
"@types/redis": "^2.8.28",
|
||||
"@types/sinon": "^9.0.10",
|
||||
"@types/twitter": "^1.7.0",
|
||||
"nodemon": "^2.0.6",
|
||||
"c8": "^7.6.0",
|
||||
"gts": "^3.1.0",
|
||||
"mocha": "^8.3.0",
|
||||
"nodemon": "^2.0.7",
|
||||
"sinon": "^9.2.4",
|
||||
"ts-node": "^9.1.1",
|
||||
"typescript": "^4.1.2",
|
||||
"webpack": "^5.10.0",
|
||||
"xo": "^0.36.1"
|
||||
},
|
||||
"xo": {
|
||||
"prettier": true,
|
||||
"ignores": "docs/javascripts",
|
||||
"rules": {
|
||||
"no-warning-comments": "off",
|
||||
"sort-imports": "error",
|
||||
"sort-keys": "error",
|
||||
"sort-vars": "error"
|
||||
}
|
||||
"typescript": "^4.2.2",
|
||||
"webpack": "^5.24.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
import {Link, Store} from '../store/model';
|
||||
import {sendNotification} from '../notification';
|
||||
|
||||
const link: Link = {
|
||||
brand: 'test:brand',
|
||||
cartUrl: 'https://www.example.com/cartUrl',
|
||||
model: 'test:model',
|
||||
price: 100,
|
||||
series: 'test:series',
|
||||
url: 'https://www.example.com/url'
|
||||
};
|
||||
|
||||
const store: Store = {
|
||||
currency: '',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: 'test:container',
|
||||
text: ['test:text']
|
||||
}
|
||||
},
|
||||
links: [link],
|
||||
name: 'test:name'
|
||||
};
|
||||
|
||||
/**
|
||||
* Send test email.
|
||||
*/
|
||||
sendNotification(link, store);
|
||||
+11
-11
@@ -2,23 +2,23 @@ import {Page} from 'puppeteer';
|
||||
import {PuppeteerExtraPluginAdblocker} from 'puppeteer-extra-plugin-adblocker';
|
||||
|
||||
export const adBlocker = new PuppeteerExtraPluginAdblocker({
|
||||
blockTrackers: true
|
||||
blockTrackers: true,
|
||||
});
|
||||
|
||||
export async function enableBlockerInPage(page: Page) {
|
||||
const blockerObject = await adBlocker.getBlocker();
|
||||
if (blockerObject.isBlockingEnabled(page)) {
|
||||
return;
|
||||
}
|
||||
const blockerObject = await adBlocker.getBlocker();
|
||||
if (blockerObject.isBlockingEnabled(page)) {
|
||||
return;
|
||||
}
|
||||
|
||||
await blockerObject.enableBlockingInPage(page);
|
||||
await blockerObject.enableBlockingInPage(page);
|
||||
}
|
||||
|
||||
export async function disableBlockerInPage(page: Page) {
|
||||
const blockerObject = await adBlocker.getBlocker();
|
||||
if (!blockerObject.isBlockingEnabled(page)) {
|
||||
return;
|
||||
}
|
||||
const blockerObject = await adBlocker.getBlocker();
|
||||
if (!blockerObject.isBlockingEnabled(page)) {
|
||||
return;
|
||||
}
|
||||
|
||||
await blockerObject.disableBlockingInPage(page);
|
||||
await blockerObject.disableBlockingInPage(page);
|
||||
}
|
||||
|
||||
+9
-12
@@ -1,10 +1,7 @@
|
||||
import chalk from 'chalk';
|
||||
import {readFileSync} from 'fs';
|
||||
|
||||
const version = readFileSync('version.txt', 'utf8');
|
||||
|
||||
export const banner = {
|
||||
asciiVersion: `
|
||||
asciiVersion: `
|
||||
██████ ▄▄▄█████▓ ██▀███ ▓█████ ▓█████▄▄▄█████▓ ███▄ ▄███▓▓█████ ██▀███ ▄████▄ ██░ ██ ▄▄▄ ███▄ █ ▄▄▄█████▓
|
||||
▒██ ▒ ▓ ██▒ ▓▒▓██ ▒ ██▒▓█ ▀ ▓█ ▀▓ ██▒ ▓▒▓██▒▀█▀ ██▒▓█ ▀ ▓██ ▒ ██▒▒██▀ ▀█ ▓██░ ██▒▒████▄ ██ ▀█ █ ▓ ██▒ ▓▒
|
||||
░ ▓██▄ ▒ ▓██░ ▒░▓██ ░▄█ ▒▒███ ▒███ ▒ ▓██░ ▒░▓██ ▓██░▒███ ▓██ ░▄█ ▒▒▓█ ▄ ▒██▀▀██░▒██ ▀█▄ ▓██ ▀█ ██▒▒ ▓██░ ▒░
|
||||
@@ -14,12 +11,12 @@ export const banner = {
|
||||
░ ░▒ ░ ░ ░ ░▒ ░ ▒░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░▒ ░ ▒░ ░ ▒ ▒ ░▒░ ░ ▒ ▒▒ ░░ ░░ ░ ▒░ ░
|
||||
░ ░ ░ ░ ░░ ░ ░ ░ ░ ░ ░ ░ ░░ ░ ░ ░ ░░ ░ ░ ▒ ░ ░ ░ ░
|
||||
░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
|
||||
${version}`,
|
||||
render(ascii: boolean, hexColor: string) {
|
||||
return chalk
|
||||
.hex(hexColor)
|
||||
.bold(ascii ? this.asciiVersion : this.stringVersion);
|
||||
},
|
||||
stringVersion: `STREETMERCHANT
|
||||
${version}`
|
||||
${process.env.npm_package_version}`,
|
||||
render(ascii: boolean, hexColor: string) {
|
||||
return chalk
|
||||
.hex(hexColor)
|
||||
.bold(ascii ? this.asciiVersion : this.stringVersion);
|
||||
},
|
||||
stringVersion: `STREETMERCHANT
|
||||
${process.env.npm_package_version}`,
|
||||
};
|
||||
|
||||
+353
-309
@@ -2,18 +2,29 @@ import {existsSync, readFileSync} from 'fs';
|
||||
import {banner} from './banner';
|
||||
import dotenv from 'dotenv';
|
||||
import path from 'path';
|
||||
import * as console from 'console';
|
||||
|
||||
if (existsSync(path.resolve(__dirname, '../dotenv'))) {
|
||||
dotenv.config({path: path.resolve(__dirname, '../dotenv')});
|
||||
if (process.env.npm_config_conf) {
|
||||
if (
|
||||
existsSync(path.resolve(__dirname, '../../' + process.env.npm_config_conf))
|
||||
) {
|
||||
dotenv.config({
|
||||
path: path.resolve(__dirname, '../../' + process.env.npm_config_conf),
|
||||
});
|
||||
} else {
|
||||
dotenv.config({path: path.resolve(__dirname, '../../.env')});
|
||||
}
|
||||
} else if (existsSync(path.resolve(__dirname, '../../dotenv'))) {
|
||||
dotenv.config({path: path.resolve(__dirname, '../../dotenv')});
|
||||
} else {
|
||||
dotenv.config({path: path.resolve(__dirname, '../.env')});
|
||||
dotenv.config({path: path.resolve(__dirname, '../../.env')});
|
||||
}
|
||||
|
||||
console.info(
|
||||
banner.render(
|
||||
envOrBoolean(process.env.ASCII_BANNER, false),
|
||||
envOrString(process.env.BANNER_COLOR, '#808080')
|
||||
)
|
||||
banner.render(
|
||||
envOrBoolean(process.env.ASCII_BANNER, false),
|
||||
envOrString(process.env.BANNER_COLOR, '#808080')
|
||||
)
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -23,15 +34,15 @@ console.info(
|
||||
* @param array Default array. If not set, is `[]`.
|
||||
*/
|
||||
function envOrArray(
|
||||
environment: string | undefined,
|
||||
array?: string[]
|
||||
environment: string | undefined,
|
||||
array?: string[]
|
||||
): string[] {
|
||||
return (environment
|
||||
? environment.includes('\n')
|
||||
? environment.split('\n')
|
||||
: environment.split(',')
|
||||
: array ?? []
|
||||
).map((s) => s.trim());
|
||||
return (environment
|
||||
? environment.includes('\n')
|
||||
? environment.split('\n')
|
||||
: environment.split(',')
|
||||
: array ?? []
|
||||
).map(s => s.trim());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -41,10 +52,10 @@ function envOrArray(
|
||||
* @param boolean Default boolean. If not set, is `true`.
|
||||
*/
|
||||
function envOrBoolean(
|
||||
environment: string | undefined,
|
||||
boolean?: boolean
|
||||
environment: string | undefined,
|
||||
boolean?: boolean
|
||||
): boolean {
|
||||
return environment ? environment === 'true' : boolean ?? true;
|
||||
return environment ? environment === 'true' : boolean ?? true;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -54,7 +65,7 @@ function envOrBoolean(
|
||||
* @param string Default string. If not set, is `''`.
|
||||
*/
|
||||
function envOrString(environment: string | undefined, string?: string): string {
|
||||
return environment ? environment : string ?? '';
|
||||
return environment ? environment : string ?? '';
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -64,7 +75,7 @@ function envOrString(environment: string | undefined, string?: string): string {
|
||||
* @param number Default number. If not set, is `0`.
|
||||
*/
|
||||
function envOrNumber(environment: string | undefined, number?: number): number {
|
||||
return environment ? Number(environment) : number ?? 0;
|
||||
return environment ? Number(environment) : number ?? 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -80,31 +91,31 @@ function envOrNumber(environment: string | undefined, number?: number): number {
|
||||
* @param number Default number. If not set, is `0`.
|
||||
*/
|
||||
function envOrNumberMin(
|
||||
environmentMin: string | undefined,
|
||||
environmentMax: string | undefined,
|
||||
number?: number
|
||||
environmentMin: string | undefined,
|
||||
environmentMax: string | undefined,
|
||||
number?: number
|
||||
) {
|
||||
if (environmentMin || environmentMax) {
|
||||
if (environmentMin && environmentMax) {
|
||||
return Number(
|
||||
Number(environmentMin) < Number(environmentMax)
|
||||
? environmentMin
|
||||
: environmentMax
|
||||
);
|
||||
}
|
||||
if (environmentMin || environmentMax) {
|
||||
if (environmentMin && environmentMax) {
|
||||
return Number(
|
||||
Number(environmentMin) < Number(environmentMax)
|
||||
? environmentMin
|
||||
: environmentMax
|
||||
);
|
||||
}
|
||||
|
||||
if (environmentMax) {
|
||||
return Number(environmentMax) < (number ?? 0)
|
||||
? Number(environmentMax)
|
||||
: number ?? 0;
|
||||
}
|
||||
if (environmentMax) {
|
||||
return Number(environmentMax) < (number ?? 0)
|
||||
? Number(environmentMax)
|
||||
: number ?? 0;
|
||||
}
|
||||
|
||||
if (environmentMin) {
|
||||
return Number(environmentMin);
|
||||
}
|
||||
}
|
||||
if (environmentMin) {
|
||||
return Number(environmentMin);
|
||||
}
|
||||
}
|
||||
|
||||
return number ?? 0;
|
||||
return number ?? 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -120,60 +131,72 @@ function envOrNumberMin(
|
||||
* @param number Default number. If not set, is `0`.
|
||||
*/
|
||||
function envOrNumberMax(
|
||||
environmentMin: string | undefined,
|
||||
environmentMax: string | undefined,
|
||||
number?: number
|
||||
environmentMin: string | undefined,
|
||||
environmentMax: string | undefined,
|
||||
number?: number
|
||||
) {
|
||||
if (environmentMin || environmentMax) {
|
||||
if (environmentMin && environmentMax) {
|
||||
return Number(
|
||||
Number(environmentMin) < Number(environmentMax)
|
||||
? environmentMax
|
||||
: environmentMax
|
||||
);
|
||||
}
|
||||
if (environmentMin || environmentMax) {
|
||||
if (environmentMin && environmentMax) {
|
||||
return Number(
|
||||
Number(environmentMin) < Number(environmentMax)
|
||||
? environmentMax
|
||||
: environmentMax
|
||||
);
|
||||
}
|
||||
|
||||
if (environmentMin) {
|
||||
return Number(environmentMin) > (number ?? 0)
|
||||
? Number(environmentMin)
|
||||
: number ?? 0;
|
||||
}
|
||||
if (environmentMin) {
|
||||
return Number(environmentMin) > (number ?? 0)
|
||||
? Number(environmentMin)
|
||||
: number ?? 0;
|
||||
}
|
||||
|
||||
if (environmentMax) {
|
||||
return Number(environmentMax);
|
||||
}
|
||||
}
|
||||
if (environmentMax) {
|
||||
return Number(environmentMax);
|
||||
}
|
||||
}
|
||||
|
||||
return number ?? 0;
|
||||
return number ?? 0;
|
||||
}
|
||||
|
||||
function loadProxyList(filename: string): string[] | undefined {
|
||||
try {
|
||||
return readFileSync(`${filename}.proxies`)
|
||||
.toString()
|
||||
.trim()
|
||||
.split('\n')
|
||||
.map(x => x.trim());
|
||||
} catch {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
const browser = {
|
||||
isHeadless: envOrBoolean(process.env.HEADLESS),
|
||||
isIncognito: envOrBoolean(process.env.INCOGNITO, false),
|
||||
isTrusted: envOrBoolean(process.env.BROWSER_TRUSTED, false),
|
||||
lowBandwidth: envOrBoolean(process.env.LOW_BANDWIDTH, false),
|
||||
maxBackoff: envOrNumberMax(
|
||||
process.env.PAGE_BACKOFF_MIN,
|
||||
process.env.PAGE_BACKOFF_MAX,
|
||||
3600000
|
||||
),
|
||||
maxSleep: envOrNumberMax(
|
||||
process.env.PAGE_SLEEP_MIN,
|
||||
process.env.PAGE_SLEEP_MAX,
|
||||
10000
|
||||
),
|
||||
minBackoff: envOrNumberMin(
|
||||
process.env.PAGE_BACKOFF_MIN,
|
||||
process.env.PAGE_BACKOFF_MAX,
|
||||
10000
|
||||
),
|
||||
minSleep: envOrNumberMin(
|
||||
process.env.PAGE_SLEEP_MIN,
|
||||
process.env.PAGE_SLEEP_MAX,
|
||||
5000
|
||||
),
|
||||
open: envOrBoolean(process.env.OPEN_BROWSER),
|
||||
userAgent: ''
|
||||
isHeadless: envOrBoolean(process.env.HEADLESS),
|
||||
isIncognito: envOrBoolean(process.env.INCOGNITO, false),
|
||||
isTrusted: envOrBoolean(process.env.BROWSER_TRUSTED, false),
|
||||
lowBandwidth: envOrBoolean(process.env.LOW_BANDWIDTH, false),
|
||||
maxBackoff: envOrNumberMax(
|
||||
process.env.PAGE_BACKOFF_MIN,
|
||||
process.env.PAGE_BACKOFF_MAX,
|
||||
3600000
|
||||
),
|
||||
maxSleep: envOrNumberMax(
|
||||
process.env.PAGE_SLEEP_MIN,
|
||||
process.env.PAGE_SLEEP_MAX,
|
||||
10000
|
||||
),
|
||||
minBackoff: envOrNumberMin(
|
||||
process.env.PAGE_BACKOFF_MIN,
|
||||
process.env.PAGE_BACKOFF_MAX,
|
||||
10000
|
||||
),
|
||||
minSleep: envOrNumberMin(
|
||||
process.env.PAGE_SLEEP_MIN,
|
||||
process.env.PAGE_SLEEP_MAX,
|
||||
5000
|
||||
),
|
||||
open: envOrBoolean(process.env.OPEN_BROWSER),
|
||||
userAgent: '',
|
||||
};
|
||||
|
||||
const docker = envOrBoolean(process.env.DOCKER, false);
|
||||
@@ -181,252 +204,273 @@ const docker = envOrBoolean(process.env.DOCKER, false);
|
||||
const logLevel = envOrString(process.env.LOG_LEVEL, 'info');
|
||||
|
||||
const notifications = {
|
||||
desktop: process.env.DESKTOP_NOTIFICATIONS === 'true',
|
||||
discord: {
|
||||
notifyGroup: envOrArray(process.env.DISCORD_NOTIFY_GROUP),
|
||||
notifyGroupSeries: {
|
||||
'3060ti': envOrArray(process.env.DISCORD_NOTIFY_GROUP_3060TI),
|
||||
3070: envOrArray(process.env.DISCORD_NOTIFY_GROUP_3070),
|
||||
3080: envOrArray(process.env.DISCORD_NOTIFY_GROUP_3080),
|
||||
3090: envOrArray(process.env.DISCORD_NOTIFY_GROUP_3090),
|
||||
darkhero: envOrArray(process.env.DISCORD_NOTIFY_GROUP_DARKHERO),
|
||||
rx6800: envOrArray(process.env.DISCORD_NOTIFY_GROUP_RX6800),
|
||||
rx6800xt: envOrArray(process.env.DISCORD_NOTIFY_GROUP_RX6800XT),
|
||||
rx6900xt: envOrArray(process.env.DISCORD_NOTIFY_GROUP_RX6900XT),
|
||||
ryzen5600: envOrArray(process.env.DISCORD_NOTIFY_GROUP_RYZEN5600),
|
||||
ryzen5800: envOrArray(process.env.DISCORD_NOTIFY_GROUP_RYZEN5800),
|
||||
ryzen5900: envOrArray(process.env.DISCORD_NOTIFY_GROUP_RYZEN5900),
|
||||
ryzen5950: envOrArray(process.env.DISCORD_NOTIFY_GROUP_RYZEN5950),
|
||||
sf: envOrArray(process.env.DISCORD_NOTIFY_GROUP_CORSAIR_SF),
|
||||
sonyps5c: envOrArray(process.env.DISCORD_NOTIFY_GROUP_SONYPS5C),
|
||||
sonyps5de: envOrArray(process.env.DISCORD_NOTIFY_GROUP_SONYPS5DE),
|
||||
'test:series': envOrArray(process.env.DISCORD_NOTIFY_GROUP_TEST),
|
||||
xboxss: envOrArray(process.env.DISCORD_NOTIFY_GROUP_XBOXSS),
|
||||
xboxsx: envOrArray(process.env.DISCORD_NOTIFY_GROUP_XBOXSX)
|
||||
},
|
||||
webhooks: envOrArray(process.env.DISCORD_WEB_HOOK)
|
||||
},
|
||||
email: {
|
||||
password: envOrString(process.env.EMAIL_PASSWORD),
|
||||
smtpAddress: envOrString(process.env.SMTP_ADDRESS),
|
||||
smtpPort: envOrNumber(process.env.SMTP_PORT, 25),
|
||||
to: envOrString(
|
||||
process.env.EMAIL_TO,
|
||||
envOrString(process.env.EMAIL_USERNAME)
|
||||
),
|
||||
username: envOrString(process.env.EMAIL_USERNAME)
|
||||
},
|
||||
mqtt: {
|
||||
broker: envOrString(process.env.MQTT_BROKER_ADDRESS),
|
||||
clientId: envOrString(process.env.MQTT_CLIENT_ID),
|
||||
password: envOrString(process.env.MQTT_PASSWORD),
|
||||
port: envOrNumber(process.env.MQTT_BROKER_PORT, 1883),
|
||||
qos: envOrNumber(process.env.MQTT_QOS, 0),
|
||||
topic: envOrString(process.env.MQTT_TOPIC, 'streetmerchant/alert'),
|
||||
username: envOrString(process.env.MQTT_USERNAME)
|
||||
},
|
||||
pagerduty: {
|
||||
integrationKey: envOrString(process.env.PAGERDUTY_INTEGRATION_KEY),
|
||||
severity: envOrString(process.env.PAGERDUTY_SEVERITY, 'info')
|
||||
},
|
||||
philips_hue: {
|
||||
accessToken: envOrString(process.env.PHILIPS_HUE_CLOUD_ACCESS_TOKEN),
|
||||
apiKey: envOrString(process.env.PHILIPS_HUE_API_KEY),
|
||||
bridgeIp: envOrString(process.env.PHILIPS_HUE_LAN_BRIDGE_IP),
|
||||
clientId: envOrString(process.env.PHILIPS_HUE_CLOUD_CLIENT_ID),
|
||||
clientSecret: envOrString(process.env.PHILIPS_HUE_CLOUD_CLIENT_SECRET),
|
||||
lightColor: envOrString(process.env.PHILIPS_HUE_LIGHT_COLOR),
|
||||
lightIds: envOrString(process.env.PHILIPS_HUE_LIGHT_IDS),
|
||||
lightPattern: envOrString(process.env.PHILIPS_HUE_LIGHT_PATTERN),
|
||||
refreshToken: envOrString(process.env.PHILIPS_HUE_CLOUD_REFRESH_TOKEN),
|
||||
remoteApiUsername: envOrString(process.env.PHILIPS_HUE_API_KEY)
|
||||
},
|
||||
phone: {
|
||||
availableCarriers: new Map([
|
||||
['att', 'txt.att.net'],
|
||||
['attgo', 'mms.att.net'],
|
||||
['bell', 'txt.bell.ca'],
|
||||
['fido', 'fido.ca'],
|
||||
['google', 'msg.fi.google.com'],
|
||||
['koodo', 'msg.koodomobile.com'],
|
||||
['mint', 'mailmymobile.net'],
|
||||
['rogers', 'pcs.rogers.com'],
|
||||
['sprint', 'messaging.sprintpcs.com'],
|
||||
['telus', 'msg.telus.com'],
|
||||
['tmobile', 'tmomail.net'],
|
||||
['verizon', 'vtext.com'],
|
||||
['virgin', 'vmobl.com'],
|
||||
['virgin-ca', 'vmobile.ca'],
|
||||
['visible', 'vtext.com']
|
||||
]),
|
||||
carrier: envOrArray(process.env.PHONE_CARRIER),
|
||||
number: envOrArray(process.env.PHONE_NUMBER)
|
||||
},
|
||||
playSound: envOrString(process.env.PLAY_SOUND),
|
||||
pushbullet: envOrString(process.env.PUSHBULLET),
|
||||
pushover: {
|
||||
expire: envOrNumber(process.env.PUSHOVER_EXPIRE),
|
||||
priority: envOrNumber(process.env.PUSHOVER_PRIORITY),
|
||||
retry: envOrNumber(process.env.PUSHOVER_RETRY),
|
||||
token: envOrString(process.env.PUSHOVER_TOKEN),
|
||||
username: envOrString(process.env.PUSHOVER_USER)
|
||||
},
|
||||
slack: {
|
||||
channel: envOrString(process.env.SLACK_CHANNEL),
|
||||
token: envOrString(process.env.SLACK_TOKEN)
|
||||
},
|
||||
soundPlayer: envOrString(process.env.SOUND_PLAYER),
|
||||
telegram: {
|
||||
accessToken: envOrString(process.env.TELEGRAM_ACCESS_TOKEN),
|
||||
chatId: envOrArray(process.env.TELEGRAM_CHAT_ID)
|
||||
},
|
||||
twilio: {
|
||||
accountSid: envOrString(process.env.TWILIO_ACCOUNT_SID),
|
||||
authToken: envOrString(process.env.TWILIO_AUTH_TOKEN),
|
||||
from: envOrString(process.env.TWILIO_FROM_NUMBER),
|
||||
to: envOrString(process.env.TWILIO_TO_NUMBER)
|
||||
},
|
||||
twitch: {
|
||||
accessToken: envOrString(process.env.TWITCH_ACCESS_TOKEN),
|
||||
channel: envOrString(process.env.TWITCH_CHANNEL),
|
||||
clientId: envOrString(process.env.TWITCH_CLIENT_ID),
|
||||
clientSecret: envOrString(process.env.TWITCH_CLIENT_SECRET),
|
||||
refreshToken: envOrString(process.env.TWITCH_REFRESH_TOKEN)
|
||||
},
|
||||
twitter: {
|
||||
accessTokenKey: envOrString(process.env.TWITTER_ACCESS_TOKEN_KEY),
|
||||
accessTokenSecret: envOrString(process.env.TWITTER_ACCESS_TOKEN_SECRET),
|
||||
consumerKey: envOrString(process.env.TWITTER_CONSUMER_KEY),
|
||||
consumerSecret: envOrString(process.env.TWITTER_CONSUMER_SECRET),
|
||||
tweetTags: envOrString(process.env.TWITTER_TWEET_TAGS)
|
||||
}
|
||||
desktop: process.env.DESKTOP_NOTIFICATIONS === 'true',
|
||||
discord: {
|
||||
notifyGroup: envOrArray(process.env.DISCORD_NOTIFY_GROUP),
|
||||
notifyGroupSeries: {
|
||||
3060: envOrArray(process.env.DISCORD_NOTIFY_GROUP_3060),
|
||||
'3060ti': envOrArray(process.env.DISCORD_NOTIFY_GROUP_3060TI),
|
||||
3070: envOrArray(process.env.DISCORD_NOTIFY_GROUP_3070),
|
||||
3080: envOrArray(process.env.DISCORD_NOTIFY_GROUP_3080),
|
||||
3090: envOrArray(process.env.DISCORD_NOTIFY_GROUP_3090),
|
||||
'captcha-deterrent': [],
|
||||
darkhero: envOrArray(process.env.DISCORD_NOTIFY_GROUP_DARKHERO),
|
||||
rx6800: envOrArray(process.env.DISCORD_NOTIFY_GROUP_RX6800),
|
||||
rx6800xt: envOrArray(process.env.DISCORD_NOTIFY_GROUP_RX6800XT),
|
||||
rx6900xt: envOrArray(process.env.DISCORD_NOTIFY_GROUP_RX6900XT),
|
||||
ryzen5600: envOrArray(process.env.DISCORD_NOTIFY_GROUP_RYZEN5600),
|
||||
ryzen5800: envOrArray(process.env.DISCORD_NOTIFY_GROUP_RYZEN5800),
|
||||
ryzen5900: envOrArray(process.env.DISCORD_NOTIFY_GROUP_RYZEN5900),
|
||||
ryzen5950: envOrArray(process.env.DISCORD_NOTIFY_GROUP_RYZEN5950),
|
||||
sf: envOrArray(process.env.DISCORD_NOTIFY_GROUP_CORSAIR_SF),
|
||||
sonyps5c: envOrArray(process.env.DISCORD_NOTIFY_GROUP_SONYPS5C),
|
||||
sonyps5de: envOrArray(process.env.DISCORD_NOTIFY_GROUP_SONYPS5DE),
|
||||
'test:series': envOrArray(process.env.DISCORD_NOTIFY_GROUP_TEST),
|
||||
xboxss: envOrArray(process.env.DISCORD_NOTIFY_GROUP_XBOXSS),
|
||||
xboxsx: envOrArray(process.env.DISCORD_NOTIFY_GROUP_XBOXSX),
|
||||
},
|
||||
webhooks: envOrArray(process.env.DISCORD_WEB_HOOK),
|
||||
},
|
||||
email: {
|
||||
password: envOrString(process.env.EMAIL_PASSWORD),
|
||||
smtpAddress: envOrString(process.env.SMTP_ADDRESS),
|
||||
smtpPort: envOrNumber(process.env.SMTP_PORT, 25),
|
||||
to: envOrString(
|
||||
process.env.EMAIL_TO,
|
||||
envOrString(process.env.EMAIL_USERNAME)
|
||||
),
|
||||
username: envOrString(process.env.EMAIL_USERNAME),
|
||||
},
|
||||
mqtt: {
|
||||
broker: envOrString(process.env.MQTT_BROKER_ADDRESS),
|
||||
clientId: envOrString(process.env.MQTT_CLIENT_ID),
|
||||
password: envOrString(process.env.MQTT_PASSWORD),
|
||||
port: envOrNumber(process.env.MQTT_BROKER_PORT, 1883),
|
||||
qos: envOrNumber(process.env.MQTT_QOS, 0),
|
||||
topic: envOrString(process.env.MQTT_TOPIC, 'streetmerchant/alert'),
|
||||
username: envOrString(process.env.MQTT_USERNAME),
|
||||
},
|
||||
pagerduty: {
|
||||
integrationKey: envOrString(process.env.PAGERDUTY_INTEGRATION_KEY),
|
||||
severity: envOrString(process.env.PAGERDUTY_SEVERITY, 'info'),
|
||||
},
|
||||
philips_hue: {
|
||||
accessToken: envOrString(process.env.PHILIPS_HUE_CLOUD_ACCESS_TOKEN),
|
||||
apiKey: envOrString(process.env.PHILIPS_HUE_API_KEY),
|
||||
bridgeIp: envOrString(process.env.PHILIPS_HUE_LAN_BRIDGE_IP),
|
||||
clientId: envOrString(process.env.PHILIPS_HUE_CLOUD_CLIENT_ID),
|
||||
clientSecret: envOrString(process.env.PHILIPS_HUE_CLOUD_CLIENT_SECRET),
|
||||
lightColor: envOrString(process.env.PHILIPS_HUE_LIGHT_COLOR),
|
||||
lightIds: envOrString(process.env.PHILIPS_HUE_LIGHT_IDS),
|
||||
lightPattern: envOrString(process.env.PHILIPS_HUE_LIGHT_PATTERN),
|
||||
refreshToken: envOrString(process.env.PHILIPS_HUE_CLOUD_REFRESH_TOKEN),
|
||||
remoteApiUsername: envOrString(process.env.PHILIPS_HUE_API_KEY),
|
||||
},
|
||||
phone: {
|
||||
availableCarriers: new Map([
|
||||
['att', 'txt.att.net'],
|
||||
['attgo', 'mms.att.net'],
|
||||
['bell', 'txt.bell.ca'],
|
||||
['fido', 'fido.ca'],
|
||||
['google', 'msg.fi.google.com'],
|
||||
['koodo', 'msg.koodomobile.com'],
|
||||
['mint', 'mailmymobile.net'],
|
||||
['rogers', 'pcs.rogers.com'],
|
||||
['sprint', 'messaging.sprintpcs.com'],
|
||||
['telus', 'msg.telus.com'],
|
||||
['tmobile', 'tmomail.net'],
|
||||
['uscc', 'mms.uscc.net'],
|
||||
['verizon', 'vtext.com'],
|
||||
['virgin', 'vmobl.com'],
|
||||
['virgin-ca', 'vmobile.ca'],
|
||||
['visible', 'vtext.com'],
|
||||
]),
|
||||
carrier: envOrArray(process.env.PHONE_CARRIER),
|
||||
number: envOrArray(process.env.PHONE_NUMBER),
|
||||
},
|
||||
playSound: envOrString(process.env.PLAY_SOUND),
|
||||
pushbullet: envOrString(process.env.PUSHBULLET),
|
||||
pushover: {
|
||||
expire: envOrNumber(process.env.PUSHOVER_EXPIRE),
|
||||
priority: envOrNumber(process.env.PUSHOVER_PRIORITY),
|
||||
retry: envOrNumber(process.env.PUSHOVER_RETRY),
|
||||
token: envOrString(process.env.PUSHOVER_TOKEN),
|
||||
username: envOrString(process.env.PUSHOVER_USER),
|
||||
},
|
||||
redis: {
|
||||
url: envOrString(process.env.REDIS_URL),
|
||||
},
|
||||
slack: {
|
||||
channel: envOrString(process.env.SLACK_CHANNEL),
|
||||
token: envOrString(process.env.SLACK_TOKEN),
|
||||
},
|
||||
smartthings: {
|
||||
token: envOrString(process.env.SMARTTHINGS_TOKEN),
|
||||
device: envOrString(process.env.SMARTTHINGS_SWITCH_LABEL),
|
||||
},
|
||||
soundPlayer: envOrString(process.env.SOUND_PLAYER),
|
||||
telegram: {
|
||||
accessToken: envOrString(process.env.TELEGRAM_ACCESS_TOKEN),
|
||||
chatId: envOrArray(process.env.TELEGRAM_CHAT_ID),
|
||||
},
|
||||
twilio: {
|
||||
accountSid: envOrString(process.env.TWILIO_ACCOUNT_SID),
|
||||
authToken: envOrString(process.env.TWILIO_AUTH_TOKEN),
|
||||
from: envOrString(process.env.TWILIO_FROM_NUMBER),
|
||||
to: envOrString(process.env.TWILIO_TO_NUMBER),
|
||||
},
|
||||
twitch: {
|
||||
accessToken: envOrString(process.env.TWITCH_ACCESS_TOKEN),
|
||||
channel: envOrString(process.env.TWITCH_CHANNEL),
|
||||
clientId: envOrString(process.env.TWITCH_CLIENT_ID),
|
||||
clientSecret: envOrString(process.env.TWITCH_CLIENT_SECRET),
|
||||
refreshToken: envOrString(process.env.TWITCH_REFRESH_TOKEN),
|
||||
},
|
||||
twitter: {
|
||||
accessTokenKey: envOrString(process.env.TWITTER_ACCESS_TOKEN_KEY),
|
||||
accessTokenSecret: envOrString(process.env.TWITTER_ACCESS_TOKEN_SECRET),
|
||||
consumerKey: envOrString(process.env.TWITTER_CONSUMER_KEY),
|
||||
consumerSecret: envOrString(process.env.TWITTER_CONSUMER_SECRET),
|
||||
tweetTags: envOrString(process.env.TWITTER_TWEET_TAGS),
|
||||
},
|
||||
streamlabs: {
|
||||
accessToken: envOrString(process.env.STREAMLABS_ACCESS_TOKEN),
|
||||
type: envOrString(process.env.STREAMLABS_TYPE),
|
||||
imageHref: envOrString(process.env.STREAMLABS_IMAGE),
|
||||
soundHref: envOrString(process.env.STREAMLABS_SOUND),
|
||||
duration: envOrNumber(process.env.STREAMLABS_DURATION),
|
||||
},
|
||||
};
|
||||
|
||||
const nvidia = {
|
||||
addToCardAttempts: envOrNumber(process.env.NVIDIA_ADD_TO_CART_ATTEMPTS, 10),
|
||||
sessionTtl: envOrNumber(process.env.NVIDIA_SESSION_TTL, 60000)
|
||||
addToCardAttempts: envOrNumber(process.env.NVIDIA_ADD_TO_CART_ATTEMPTS, 10),
|
||||
sessionTtl: envOrNumber(process.env.NVIDIA_SESSION_TTL, 60000),
|
||||
};
|
||||
|
||||
const page = {
|
||||
height: 1080,
|
||||
inStockWaitTime: envOrNumber(process.env.IN_STOCK_WAIT_TIME),
|
||||
screenshot: envOrBoolean(process.env.SCREENSHOT),
|
||||
timeout: envOrNumber(process.env.PAGE_TIMEOUT, 30000),
|
||||
width: 1920
|
||||
height: 1080,
|
||||
inStockWaitTime: envOrNumber(process.env.IN_STOCK_WAIT_TIME),
|
||||
screenshot: envOrBoolean(process.env.SCREENSHOT),
|
||||
timeout: envOrNumber(process.env.PAGE_TIMEOUT, 30000),
|
||||
width: 1920,
|
||||
};
|
||||
|
||||
const proxy = {
|
||||
address: envOrString(process.env.PROXY_ADDRESS),
|
||||
port: envOrNumber(process.env.PROXY_PORT, 80),
|
||||
protocol: envOrString(process.env.PROXY_PROTOCOL, 'http')
|
||||
address: envOrString(process.env.PROXY_ADDRESS),
|
||||
port: envOrNumber(process.env.PROXY_PORT, 80),
|
||||
protocol: envOrString(process.env.PROXY_PROTOCOL, 'http'),
|
||||
};
|
||||
|
||||
// Check for deprecated configuration values
|
||||
if (process.env.MAX_PRICE) {
|
||||
console.warn(
|
||||
'ℹ MAX_PRICE is deprecated, please use MAX_PRICE_SERIES_{{series}}'
|
||||
);
|
||||
console.warn(
|
||||
'ℹ MAX_PRICE is deprecated, please use MAX_PRICE_SERIES_{{series}}'
|
||||
);
|
||||
}
|
||||
|
||||
const store = {
|
||||
autoAddToCart: envOrBoolean(process.env.AUTO_ADD_TO_CART, true),
|
||||
country: envOrString(process.env.COUNTRY, 'usa'),
|
||||
maxPrice: {
|
||||
series: {
|
||||
'3060ti': envOrNumber(process.env.MAX_PRICE_SERIES_3060TI),
|
||||
3070: envOrNumber(process.env.MAX_PRICE_SERIES_3070),
|
||||
3080: envOrNumber(process.env.MAX_PRICE_SERIES_3080),
|
||||
3090: envOrNumber(process.env.MAX_PRICE_SERIES_3090),
|
||||
darkhero: envOrNumber(process.env.MAX_PRICE_SERIES_DARKHERO),
|
||||
rx6800: envOrNumber(process.env.MAX_PRICE_SERIES_RX6800),
|
||||
rx6800xt: envOrNumber(process.env.MAX_PRICE_SERIES_RX6800XT),
|
||||
rx6900xt: envOrNumber(process.env.MAX_PRICE_SERIES_RX6900XT),
|
||||
ryzen5600: envOrNumber(process.env.MAX_PRICE_SERIES_RYZEN5600),
|
||||
ryzen5800: envOrNumber(process.env.MAX_PRICE_SERIES_RYZEN5800),
|
||||
ryzen5900: envOrNumber(process.env.MAX_PRICE_SERIES_RYZEN5900),
|
||||
ryzen5950: envOrNumber(process.env.MAX_PRICE_SERIES_RYZEN5950),
|
||||
sf: envOrNumber(process.env.MAX_PRICE_SERIES_CORSAIR_SF),
|
||||
sonyps5c: envOrNumber(process.env.MAX_PRICE_SERIES_SONYPS5C),
|
||||
sonyps5de: envOrNumber(process.env.MAX_PRICE_SERIES_SONYPS5DE),
|
||||
'test:series': envOrNumber(process.env.MAX_PRICE_SERIES_TEST),
|
||||
xboxss: -1,
|
||||
xboxsx: -1
|
||||
}
|
||||
},
|
||||
microCenterLocation: envOrArray(process.env.MICROCENTER_LOCATION, ['web']),
|
||||
showOnlyBrands: envOrArray(process.env.SHOW_ONLY_BRANDS),
|
||||
showOnlyModels: envOrArray(process.env.SHOW_ONLY_MODELS).map((entry) => {
|
||||
const [name, series] = entry.match(/[^:]+/g) ?? [];
|
||||
return {
|
||||
name: envOrString(name),
|
||||
series: envOrString(series)
|
||||
};
|
||||
}),
|
||||
showOnlySeries: envOrArray(process.env.SHOW_ONLY_SERIES, [
|
||||
'3060ti',
|
||||
'3070',
|
||||
'3080',
|
||||
'3090',
|
||||
'rx6800',
|
||||
'rx6800xt',
|
||||
'rx6900xt',
|
||||
'ryzen5600',
|
||||
'ryzen5800',
|
||||
'ryzen5900',
|
||||
'ryzen5950',
|
||||
'sonyps5c',
|
||||
'sonyps5de',
|
||||
'xboxss',
|
||||
'xboxsx'
|
||||
]),
|
||||
stores: envOrArray(process.env.STORES, ['nvidia']).map((entry) => {
|
||||
const [name, minPageSleep, maxPageSleep] = entry.match(/[^:]+/g) ?? [];
|
||||
autoAddToCart: envOrBoolean(process.env.AUTO_ADD_TO_CART, true),
|
||||
country: envOrString(process.env.COUNTRY, 'usa'),
|
||||
maxPrice: {
|
||||
series: {
|
||||
3060: envOrNumber(process.env.MAX_PRICE_SERIES_3060),
|
||||
'3060ti': envOrNumber(process.env.MAX_PRICE_SERIES_3060TI),
|
||||
3070: envOrNumber(process.env.MAX_PRICE_SERIES_3070),
|
||||
3080: envOrNumber(process.env.MAX_PRICE_SERIES_3080),
|
||||
3090: envOrNumber(process.env.MAX_PRICE_SERIES_3090),
|
||||
'captcha-deterrent': 0,
|
||||
darkhero: envOrNumber(process.env.MAX_PRICE_SERIES_DARKHERO),
|
||||
rx6800: envOrNumber(process.env.MAX_PRICE_SERIES_RX6800),
|
||||
rx6800xt: envOrNumber(process.env.MAX_PRICE_SERIES_RX6800XT),
|
||||
rx6900xt: envOrNumber(process.env.MAX_PRICE_SERIES_RX6900XT),
|
||||
ryzen5600: envOrNumber(process.env.MAX_PRICE_SERIES_RYZEN5600),
|
||||
ryzen5800: envOrNumber(process.env.MAX_PRICE_SERIES_RYZEN5800),
|
||||
ryzen5900: envOrNumber(process.env.MAX_PRICE_SERIES_RYZEN5900),
|
||||
ryzen5950: envOrNumber(process.env.MAX_PRICE_SERIES_RYZEN5950),
|
||||
sf: envOrNumber(process.env.MAX_PRICE_SERIES_CORSAIR_SF),
|
||||
sonyps5c: envOrNumber(process.env.MAX_PRICE_SERIES_SONYPS5C),
|
||||
sonyps5de: envOrNumber(process.env.MAX_PRICE_SERIES_SONYPS5DE),
|
||||
'test:series': envOrNumber(process.env.MAX_PRICE_SERIES_TEST),
|
||||
xboxss: envOrNumber(process.env.MAX_PRICE_SERIES_XBOXSS),
|
||||
xboxsx: envOrNumber(process.env.MAX_PRICE_SERIES_XBOXSX),
|
||||
},
|
||||
},
|
||||
microCenterLocation: envOrArray(process.env.MICROCENTER_LOCATION, ['web']),
|
||||
showOnlyBrands: envOrArray(process.env.SHOW_ONLY_BRANDS),
|
||||
showOnlyModels: envOrArray(process.env.SHOW_ONLY_MODELS).map(entry => {
|
||||
const [name, series] = entry.match(/[^:]+/g) ?? [];
|
||||
return {
|
||||
name: envOrString(name),
|
||||
series: envOrString(series),
|
||||
};
|
||||
}),
|
||||
showOnlySeries: envOrArray(process.env.SHOW_ONLY_SERIES, [
|
||||
'3060',
|
||||
'3060ti',
|
||||
'3070',
|
||||
'3080',
|
||||
'3090',
|
||||
'rx6800',
|
||||
'rx6800xt',
|
||||
'rx6900xt',
|
||||
'ryzen5600',
|
||||
'ryzen5800',
|
||||
'ryzen5900',
|
||||
'ryzen5950',
|
||||
'sf',
|
||||
'sonyps5c',
|
||||
'sonyps5de',
|
||||
'xboxss',
|
||||
'xboxsx',
|
||||
]),
|
||||
stores: envOrArray(process.env.STORES, ['amazon', 'bestbuy']).map(entry => {
|
||||
const [name, minPageSleep, maxPageSleep] = entry.match(/[^:]+/g) ?? [];
|
||||
|
||||
let proxyList;
|
||||
try {
|
||||
proxyList = readFileSync(`${name}.proxies`)
|
||||
.toString()
|
||||
.trim()
|
||||
.split('\n')
|
||||
.map((x) => x.trim());
|
||||
} catch {}
|
||||
let proxyList = loadProxyList(name);
|
||||
|
||||
return {
|
||||
maxPageSleep: envOrNumberMax(
|
||||
minPageSleep,
|
||||
maxPageSleep,
|
||||
browser.maxSleep
|
||||
),
|
||||
minPageSleep: envOrNumberMin(
|
||||
minPageSleep,
|
||||
maxPageSleep,
|
||||
browser.minSleep
|
||||
),
|
||||
name: envOrString(name),
|
||||
proxyList
|
||||
};
|
||||
})
|
||||
if (!proxyList) {
|
||||
proxyList = loadProxyList('global');
|
||||
}
|
||||
|
||||
return {
|
||||
maxPageSleep: envOrNumberMax(
|
||||
minPageSleep,
|
||||
maxPageSleep,
|
||||
browser.maxSleep
|
||||
),
|
||||
minPageSleep: envOrNumberMin(
|
||||
minPageSleep,
|
||||
maxPageSleep,
|
||||
browser.minSleep
|
||||
),
|
||||
name: envOrString(name),
|
||||
proxyList,
|
||||
};
|
||||
}),
|
||||
};
|
||||
|
||||
const restartTime = envOrNumber(process.env.RESTART_TIME, 0);
|
||||
|
||||
export const defaultStoreData = {
|
||||
maxPageSleep: browser.maxSleep,
|
||||
minPageSleep: browser.minSleep
|
||||
maxPageSleep: browser.maxSleep,
|
||||
minPageSleep: browser.minSleep,
|
||||
};
|
||||
|
||||
export const config = {
|
||||
browser,
|
||||
docker,
|
||||
logLevel,
|
||||
notifications,
|
||||
nvidia,
|
||||
page,
|
||||
proxy,
|
||||
store
|
||||
browser,
|
||||
docker,
|
||||
logLevel,
|
||||
notifications,
|
||||
nvidia,
|
||||
page,
|
||||
proxy,
|
||||
store,
|
||||
restartTime,
|
||||
};
|
||||
|
||||
export function setConfig(newConfig: any) {
|
||||
const writeConfig = config as any;
|
||||
for (const key of Object.keys(newConfig)) {
|
||||
writeConfig[key] = newConfig[key];
|
||||
}
|
||||
const writeConfig = config as any;
|
||||
for (const key of Object.keys(newConfig)) {
|
||||
writeConfig[key] = newConfig[key];
|
||||
}
|
||||
}
|
||||
|
||||
+80
-68
@@ -1,105 +1,117 @@
|
||||
import * as Process from 'process';
|
||||
import {config} from './config'; // Needs to be loaded first
|
||||
import {startAPIServer, stopAPIServer} from './web'; // eslint-disable-line sort-imports
|
||||
import {Browser} from 'puppeteer';
|
||||
import {startAPIServer, stopAPIServer} from './web';
|
||||
import {Browser, launch} from 'puppeteer';
|
||||
import {getSleepTime} from './util';
|
||||
import {logger} from './logger';
|
||||
import puppeteer from 'puppeteer-extra';
|
||||
import stealthPlugin from 'puppeteer-extra-plugin-stealth';
|
||||
import {storeList} from './store/model';
|
||||
import {tryLookupAndLoop} from './store';
|
||||
|
||||
puppeteer.use(stealthPlugin());
|
||||
|
||||
let browser: Browser | undefined;
|
||||
|
||||
async function sleep(ms: number) {
|
||||
return new Promise(resolve => setTimeout(resolve, ms));
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedules a restart of the bot
|
||||
*/
|
||||
async function restartMain() {
|
||||
if (config.restartTime > 0) {
|
||||
await sleep(config.restartTime);
|
||||
await stop();
|
||||
loopMain();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the bot.
|
||||
*/
|
||||
async function main() {
|
||||
const args: string[] = [];
|
||||
const args: string[] = [];
|
||||
|
||||
// Skip Chromium Linux Sandbox
|
||||
// https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md#setting-up-chrome-linux-sandbox
|
||||
if (config.browser.isTrusted) {
|
||||
args.push('--no-sandbox');
|
||||
args.push('--disable-setuid-sandbox');
|
||||
}
|
||||
// Skip Chromium Linux Sandbox
|
||||
// https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md#setting-up-chrome-linux-sandbox
|
||||
if (config.browser.isTrusted) {
|
||||
args.push('--no-sandbox');
|
||||
args.push('--disable-setuid-sandbox');
|
||||
}
|
||||
|
||||
// https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md#tips
|
||||
// https://stackoverflow.com/questions/48230901/docker-alpine-with-node-js-and-chromium-headless-puppeter-failed-to-launch-c
|
||||
if (config.docker) {
|
||||
args.push('--disable-dev-shm-usage');
|
||||
args.push('--no-sandbox');
|
||||
args.push('--disable-setuid-sandbox');
|
||||
args.push('--headless');
|
||||
args.push('--disable-gpu');
|
||||
}
|
||||
// https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md#tips
|
||||
// https://stackoverflow.com/questions/48230901/docker-alpine-with-node-js-and-chromium-headless-puppeter-failed-to-launch-c
|
||||
if (config.docker) {
|
||||
args.push('--disable-dev-shm-usage');
|
||||
args.push('--no-sandbox');
|
||||
args.push('--disable-setuid-sandbox');
|
||||
args.push('--headless');
|
||||
args.push('--disable-gpu');
|
||||
}
|
||||
|
||||
// Add the address of the proxy server if defined
|
||||
if (config.proxy.address) {
|
||||
args.push(
|
||||
`--proxy-server=${config.proxy.protocol}://${config.proxy.address}:${config.proxy.port}`
|
||||
);
|
||||
}
|
||||
// Add the address of the proxy server if defined
|
||||
if (config.proxy.address) {
|
||||
args.push(
|
||||
`--proxy-server=${config.proxy.protocol}://${config.proxy.address}:${config.proxy.port}`
|
||||
);
|
||||
}
|
||||
|
||||
if (args.length > 0) {
|
||||
logger.info('ℹ puppeteer config: ', args);
|
||||
}
|
||||
if (args.length > 0) {
|
||||
logger.info('ℹ puppeteer config: ', args);
|
||||
}
|
||||
|
||||
await stop();
|
||||
browser = await puppeteer.launch({
|
||||
args,
|
||||
defaultViewport: {
|
||||
height: config.page.height,
|
||||
width: config.page.width
|
||||
},
|
||||
headless: config.browser.isHeadless
|
||||
});
|
||||
await stop();
|
||||
browser = await launch({
|
||||
args,
|
||||
defaultViewport: {
|
||||
height: config.page.height,
|
||||
width: config.page.width,
|
||||
},
|
||||
headless: config.browser.isHeadless,
|
||||
});
|
||||
|
||||
config.browser.userAgent = await browser.userAgent();
|
||||
config.browser.userAgent = await browser.userAgent();
|
||||
|
||||
for (const store of storeList.values()) {
|
||||
logger.debug('store links', {meta: {links: store.links}});
|
||||
if (store.setupAction !== undefined) {
|
||||
store.setupAction(browser);
|
||||
}
|
||||
for (const store of storeList.values()) {
|
||||
logger.debug('store links', {meta: {links: store.links}});
|
||||
if (store.setupAction !== undefined) {
|
||||
store.setupAction(browser);
|
||||
}
|
||||
|
||||
setTimeout(tryLookupAndLoop, getSleepTime(store), browser, store);
|
||||
}
|
||||
setTimeout(tryLookupAndLoop, getSleepTime(store), browser, store);
|
||||
}
|
||||
|
||||
await startAPIServer();
|
||||
await startAPIServer();
|
||||
}
|
||||
|
||||
async function stop() {
|
||||
await stopAPIServer();
|
||||
await stopAPIServer();
|
||||
|
||||
if (browser) {
|
||||
// Use temporary swap variable to avoid any race condition
|
||||
const browserTemporary = browser;
|
||||
browser = undefined;
|
||||
await browserTemporary.close();
|
||||
}
|
||||
if (browser) {
|
||||
// Use temporary swap variable to avoid any race condition
|
||||
const browserTemporary = browser;
|
||||
browser = undefined;
|
||||
await browserTemporary.close();
|
||||
}
|
||||
}
|
||||
|
||||
async function stopAndExit() {
|
||||
await stop();
|
||||
// eslint-disable-next-line unicorn/no-process-exit
|
||||
process.exit(0);
|
||||
await stop();
|
||||
Process.exit(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Will continually run until user interferes.
|
||||
*/
|
||||
async function loopMain() {
|
||||
try {
|
||||
await main();
|
||||
} catch (error: unknown) {
|
||||
logger.error(
|
||||
'✖ something bad happened, resetting streetmerchant in 5 seconds',
|
||||
error
|
||||
);
|
||||
setTimeout(loopMain, 5000);
|
||||
}
|
||||
try {
|
||||
restartMain();
|
||||
await main();
|
||||
} catch (error: unknown) {
|
||||
logger.error(
|
||||
'✖ something bad happened, resetting streetmerchant in 5 seconds',
|
||||
error
|
||||
);
|
||||
setTimeout(loopMain, 5000);
|
||||
}
|
||||
}
|
||||
|
||||
void loopMain();
|
||||
|
||||
+227
-191
@@ -3,227 +3,263 @@ import chalk from 'chalk';
|
||||
import {config} from './config';
|
||||
import winston from 'winston';
|
||||
|
||||
const prettyJson = winston.format.printf((info) => {
|
||||
const timestamp = new Date().toLocaleTimeString();
|
||||
const prettyJson = winston.format.printf(info => {
|
||||
const timestamp = new Date().toLocaleTimeString();
|
||||
|
||||
let out = `${chalk.grey(`[${timestamp}]`)} ${info.level} ${chalk.grey(
|
||||
'::'
|
||||
)} ${info.message}`;
|
||||
let out = `${chalk.grey(`[${timestamp}]`)} ${info.level} ${chalk.grey(
|
||||
'::'
|
||||
)} ${info.message}`;
|
||||
|
||||
if (Object.keys(info.metadata).length > 0) {
|
||||
out = `${out} ${chalk.magenta(JSON.stringify(info.metadata, null, 2))}`;
|
||||
}
|
||||
if (Object.keys(info.metadata).length > 0) {
|
||||
out = `${out} ${chalk.magenta(JSON.stringify(info.metadata, null, 2))}`;
|
||||
}
|
||||
|
||||
return out;
|
||||
return out;
|
||||
});
|
||||
|
||||
export const logger = winston.createLogger({
|
||||
format: winston.format.combine(
|
||||
winston.format.colorize(),
|
||||
winston.format.metadata({
|
||||
fillExcept: ['level', 'message', 'timestamp']
|
||||
}),
|
||||
prettyJson
|
||||
),
|
||||
level: config.logLevel,
|
||||
transports: [new winston.transports.Console({})]
|
||||
format: winston.format.combine(
|
||||
winston.format.colorize(),
|
||||
winston.format.metadata({
|
||||
fillExcept: ['level', 'message', 'timestamp'],
|
||||
}),
|
||||
prettyJson
|
||||
),
|
||||
level: config.logLevel,
|
||||
transports: [new winston.transports.Console({})],
|
||||
});
|
||||
|
||||
export const Print = {
|
||||
backoff(
|
||||
link: Link,
|
||||
store: Store,
|
||||
parameters: {delay: number; statusCode: number},
|
||||
color?: boolean
|
||||
): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow(
|
||||
`BACKOFF DELAY status=${parameters.statusCode} delay=${parameters.delay}`
|
||||
)
|
||||
);
|
||||
}
|
||||
backoff(
|
||||
link: Link,
|
||||
store: Store,
|
||||
parameters: {delay: number; statusCode: number},
|
||||
color?: boolean
|
||||
): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow(
|
||||
`BACKOFF DELAY status=${parameters.statusCode} delay=${parameters.delay}`
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
return `✖ ${buildProductString(link, store)} :: BACKOFF DELAY status=${
|
||||
parameters.statusCode
|
||||
} delay=${parameters.delay}`;
|
||||
},
|
||||
badStatusCode(
|
||||
link: Link,
|
||||
store: Store,
|
||||
statusCode: number,
|
||||
color?: boolean
|
||||
): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow(`STATUS CODE ERROR ${statusCode}`)
|
||||
);
|
||||
}
|
||||
return `✖ ${buildProductString(link, store)} :: BACKOFF DELAY status=${
|
||||
parameters.statusCode
|
||||
} delay=${parameters.delay}`;
|
||||
},
|
||||
badStatusCode(
|
||||
link: Link,
|
||||
store: Store,
|
||||
statusCode: number,
|
||||
color?: boolean
|
||||
): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow(`STATUS CODE ERROR ${statusCode}`)
|
||||
);
|
||||
}
|
||||
|
||||
return `✖ ${buildProductString(
|
||||
link,
|
||||
store
|
||||
)} :: STATUS CODE ERROR ${statusCode}`;
|
||||
},
|
||||
bannedSeller(link: Link, store: Store, color?: boolean): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow('BANNED SELLER')
|
||||
);
|
||||
}
|
||||
return `✖ ${buildProductString(
|
||||
link,
|
||||
store
|
||||
)} :: STATUS CODE ERROR ${statusCode}`;
|
||||
},
|
||||
bannedSeller(link: Link, store: Store, color?: boolean): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow('BANNED SELLER')
|
||||
);
|
||||
}
|
||||
|
||||
return `✖ ${buildProductString(link, store)} :: BANNED SELLER`;
|
||||
},
|
||||
captcha(link: Link, store: Store, color?: boolean): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow('CAPTCHA')
|
||||
);
|
||||
}
|
||||
return `✖ ${buildProductString(link, store)} :: BANNED SELLER`;
|
||||
},
|
||||
captcha(link: Link, store: Store, color?: boolean): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow('CAPTCHA')
|
||||
);
|
||||
}
|
||||
|
||||
return `✖ ${buildProductString(link, store)} :: CAPTCHA`;
|
||||
},
|
||||
inStock(link: Link, store: Store, color?: boolean, sms?: boolean): string {
|
||||
const productString = `${buildProductString(link, store)} :: IN STOCK`;
|
||||
return `✖ ${buildProductString(link, store)} :: CAPTCHA`;
|
||||
},
|
||||
cloudflare(link: Link, store: Store, color?: boolean): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow('CLOUDFLARE, WAITING')
|
||||
);
|
||||
}
|
||||
|
||||
if (color) {
|
||||
return chalk.bgGreen.white.bold(`🚀🚨 ${productString} 🚨🚀`);
|
||||
}
|
||||
return `✖ ${buildProductString(link, store)} :: CLOUDFLARE, WAITING`;
|
||||
},
|
||||
inStock(link: Link, store: Store, color?: boolean, sms?: boolean): string {
|
||||
const productString = `${buildProductString(link, store)} :: IN STOCK`;
|
||||
|
||||
if (sms) {
|
||||
return productString;
|
||||
}
|
||||
if (color) {
|
||||
return chalk.bgGreen.white.bold(`🚀🚨 ${productString} 🚨🚀`);
|
||||
}
|
||||
|
||||
return `🚀🚨 ${productString} 🚨🚀`;
|
||||
},
|
||||
inStockWaiting(link: Link, store: Store, color?: boolean): string {
|
||||
if (color) {
|
||||
return (
|
||||
'ℹ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow('IN STOCK, WAITING')
|
||||
);
|
||||
}
|
||||
if (sms) {
|
||||
return productString;
|
||||
}
|
||||
|
||||
return `ℹ ${buildProductString(link, store)} :: IN STOCK, WAITING`;
|
||||
},
|
||||
maxPrice(
|
||||
link: Link,
|
||||
store: Store,
|
||||
maxPrice: number,
|
||||
color?: boolean
|
||||
): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow(
|
||||
`PRICE ${link.price ?? ''} EXCEEDS LIMIT ${maxPrice}`
|
||||
)
|
||||
);
|
||||
}
|
||||
return `🚀🚨 ${productString} 🚨🚀`;
|
||||
},
|
||||
inStockWaiting(link: Link, store: Store, color?: boolean): string {
|
||||
if (color) {
|
||||
return (
|
||||
'ℹ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow('IN STOCK, WAITING')
|
||||
);
|
||||
}
|
||||
|
||||
return `✖ ${buildProductString(link, store)} :: PRICE ${
|
||||
link.price ?? ''
|
||||
} EXCEEDS LIMIT ${maxPrice}`;
|
||||
},
|
||||
message(
|
||||
message: string,
|
||||
topic: string,
|
||||
store: Store,
|
||||
color?: boolean
|
||||
): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildSetupString(topic, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow(message)
|
||||
);
|
||||
}
|
||||
return `ℹ ${buildProductString(link, store)} :: IN STOCK, WAITING`;
|
||||
},
|
||||
maxPrice(
|
||||
link: Link,
|
||||
store: Store,
|
||||
maxPrice: number,
|
||||
color?: boolean
|
||||
): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow(`PRICE ${link.price ?? ''} EXCEEDS LIMIT ${maxPrice}`)
|
||||
);
|
||||
}
|
||||
|
||||
return `✖ ${buildSetupString(topic, store)} :: ${message}`;
|
||||
},
|
||||
noResponse(link: Link, store: Store, color?: boolean): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow('NO RESPONSE')
|
||||
);
|
||||
}
|
||||
return `✖ ${buildProductString(link, store)} :: PRICE ${
|
||||
link.price ?? ''
|
||||
} EXCEEDS LIMIT ${maxPrice}`;
|
||||
},
|
||||
message(
|
||||
message: string,
|
||||
topic: string,
|
||||
store: Store,
|
||||
color?: boolean
|
||||
): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildSetupString(topic, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow(message)
|
||||
);
|
||||
}
|
||||
|
||||
return `✖ ${buildProductString(link, store)} :: NO RESPONSE`;
|
||||
},
|
||||
outOfStock(link: Link, store: Store, color?: boolean): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.red('OUT OF STOCK')
|
||||
);
|
||||
}
|
||||
return `✖ ${buildSetupString(topic, store)} :: ${message}`;
|
||||
},
|
||||
noResponse(link: Link, store: Store, color?: boolean): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow('NO RESPONSE')
|
||||
);
|
||||
}
|
||||
|
||||
return `✖ ${buildProductString(link, store)} :: OUT OF STOCK`;
|
||||
},
|
||||
productInStock(link: Link): string {
|
||||
let productString = `Product Page: ${link.url}`;
|
||||
if (link.cartUrl)
|
||||
productString += `\nAdd To Cart Link: ${link.cartUrl}`;
|
||||
return `✖ ${buildProductString(link, store)} :: NO RESPONSE`;
|
||||
},
|
||||
outOfStock(link: Link, store: Store, color?: boolean): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.red('OUT OF STOCK')
|
||||
);
|
||||
}
|
||||
|
||||
return productString;
|
||||
},
|
||||
rateLimit(link: Link, store: Store, color?: boolean): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow('RATE LIMIT EXCEEDED')
|
||||
);
|
||||
}
|
||||
return `✖ ${buildProductString(link, store)} :: OUT OF STOCK`;
|
||||
},
|
||||
productInStock(link: Link): string {
|
||||
let productString = `Product Page: ${link.url}`;
|
||||
if (link.cartUrl) productString += `\nAdd To Cart Link: ${link.cartUrl}`;
|
||||
|
||||
return `✖ ${buildProductString(link, store)} :: RATE LIMIT EXCEEDED`;
|
||||
}
|
||||
return productString;
|
||||
},
|
||||
rateLimit(link: Link, store: Store, color?: boolean): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow('RATE LIMIT EXCEEDED')
|
||||
);
|
||||
}
|
||||
|
||||
return `✖ ${buildProductString(link, store)} :: RATE LIMIT EXCEEDED`;
|
||||
},
|
||||
recursionLimit(link: Link, store: Store, color?: boolean): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow('CLOUDFLARE RETRY LIMIT REACHED, ABORT')
|
||||
);
|
||||
}
|
||||
|
||||
return `✖ ${buildProductString(
|
||||
link,
|
||||
store
|
||||
)} :: CLOUDFLARE RETRY LIMIT REACHED, ABORT`;
|
||||
},
|
||||
};
|
||||
|
||||
function buildSetupString(
|
||||
topic: string,
|
||||
store: Store,
|
||||
color?: boolean
|
||||
topic: string,
|
||||
store: Store,
|
||||
color?: boolean
|
||||
): string {
|
||||
if (color) {
|
||||
return (
|
||||
chalk.cyan(`[${store.name}]`) + chalk.grey(` [setup (${topic})]`)
|
||||
);
|
||||
}
|
||||
if (color) {
|
||||
return chalk.cyan(`[${store.name}]`) + chalk.grey(` [setup (${topic})]`);
|
||||
}
|
||||
|
||||
return `[${store.name}] [setup (${topic})]`;
|
||||
return `[${store.name}] [setup (${topic})]`;
|
||||
}
|
||||
|
||||
function buildProductString(link: Link, store: Store, color?: boolean): string {
|
||||
if (color) {
|
||||
return (
|
||||
chalk.cyan(`[${store.name}]`) +
|
||||
chalk.grey(` [${link.brand} (${link.series})] ${link.model}`)
|
||||
);
|
||||
}
|
||||
if (color) {
|
||||
if (store.currentProxyIndex !== undefined && store.proxyList) {
|
||||
const proxy = `${store.currentProxyIndex + 1}/${store.proxyList.length}`;
|
||||
return (
|
||||
chalk.gray(`[${proxy}]`) +
|
||||
chalk.cyan(` [${store.name}]`) +
|
||||
chalk.grey(` [${link.brand} (${link.series})] ${link.model}`)
|
||||
);
|
||||
} else {
|
||||
return (
|
||||
chalk.cyan(`[${store.name}]`) +
|
||||
chalk.grey(` [${link.brand} (${link.series})] ${link.model}`)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return `[${store.name}] [${link.brand} (${link.series})] ${link.model}`;
|
||||
if (store.currentProxyIndex !== undefined && store.proxyList) {
|
||||
const proxy = `${store.currentProxyIndex + 1}/${store.proxyList.length}`;
|
||||
return `[${proxy}] [${store.name}] [${link.brand} (${link.series})] ${link.model}`;
|
||||
} else {
|
||||
return `[${store.name}] [${link.brand} (${link.series})] ${link.model}`;
|
||||
}
|
||||
}
|
||||
|
||||
+17
-11
@@ -1,20 +1,26 @@
|
||||
import {Link, Store} from '../store/model';
|
||||
import {Print, logger} from '../logger';
|
||||
import {config} from '../config';
|
||||
import {join} from 'path';
|
||||
import notifier from 'node-notifier';
|
||||
|
||||
const desktop = config.notifications.desktop;
|
||||
const {desktop} = config.notifications;
|
||||
|
||||
export function sendDesktopNotification(link: Link, store: Store) {
|
||||
if (desktop) {
|
||||
logger.debug('↗ sending desktop notification');
|
||||
(async () => {
|
||||
notifier.notify({
|
||||
message: link.cartUrl ? link.cartUrl : link.url,
|
||||
title: Print.inStock(link, store)
|
||||
});
|
||||
if (desktop) {
|
||||
logger.debug('↗ sending desktop notification');
|
||||
(async () => {
|
||||
notifier.notify({
|
||||
icon: join(
|
||||
__dirname,
|
||||
'../../../docs/assets/images/streetmerchant-logo.png'
|
||||
),
|
||||
message: link.cartUrl ? link.cartUrl : link.url,
|
||||
open: link.cartUrl ? link.cartUrl : link.url,
|
||||
title: Print.inStock(link, store),
|
||||
});
|
||||
|
||||
logger.info('✔ desktop notification sent');
|
||||
})();
|
||||
}
|
||||
logger.info('✔ desktop notification sent');
|
||||
})();
|
||||
}
|
||||
}
|
||||
|
||||
+58
-67
@@ -3,88 +3,79 @@ import Discord from 'discord.js';
|
||||
import {config} from '../config';
|
||||
import {logger} from '../logger';
|
||||
|
||||
const discord = config.notifications.discord;
|
||||
const {notifyGroup, webhooks, notifyGroupSeries} = discord;
|
||||
const {notifyGroup, webhooks, notifyGroupSeries} = config.notifications.discord;
|
||||
|
||||
function getIdAndToken(webhook: string) {
|
||||
const match = /.*\/webhooks\/(\d+)\/(.+)/.exec(webhook);
|
||||
const match = /.*\/webhooks\/(\d+)\/(.+)/.exec(webhook);
|
||||
|
||||
if (!match) {
|
||||
throw new Error('could not get discord webhook');
|
||||
}
|
||||
if (!match) {
|
||||
throw new Error('could not get discord webhook');
|
||||
}
|
||||
|
||||
return {
|
||||
id: match[1],
|
||||
token: match[2]
|
||||
};
|
||||
return {
|
||||
id: match[1],
|
||||
token: match[2],
|
||||
};
|
||||
}
|
||||
|
||||
export function sendDiscordMessage(link: Link, store: Store) {
|
||||
if (webhooks.length > 0) {
|
||||
logger.debug('↗ sending discord message');
|
||||
if (webhooks.length > 0) {
|
||||
logger.debug('↗ sending discord message');
|
||||
|
||||
(async () => {
|
||||
try {
|
||||
const embed = new Discord.MessageEmbed()
|
||||
.setTitle('_**Stock alert!**_')
|
||||
.setDescription(
|
||||
'> provided by [streetmerchant](https://github.com/jef/streetmerchant) with :heart:'
|
||||
)
|
||||
.setThumbnail(
|
||||
'https://raw.githubusercontent.com/jef/streetmerchant/main/docs/assets/images/streetmerchant-logo.png'
|
||||
)
|
||||
.setColor('#52b788')
|
||||
.setTimestamp();
|
||||
(async () => {
|
||||
try {
|
||||
const embed = new Discord.MessageEmbed()
|
||||
.setTitle('_**Stock alert!**_')
|
||||
.setDescription(
|
||||
'> provided by [streetmerchant](https://github.com/jef/streetmerchant) with :heart:'
|
||||
)
|
||||
.setThumbnail(
|
||||
'https://raw.githubusercontent.com/jef/streetmerchant/main/docs/assets/images/streetmerchant-logo.png'
|
||||
)
|
||||
.setColor('#52b788')
|
||||
.setTimestamp();
|
||||
|
||||
embed.addField('Store', store.name, true);
|
||||
if (link.price)
|
||||
embed.addField(
|
||||
'Price',
|
||||
`${store.currency}${link.price}`,
|
||||
true
|
||||
);
|
||||
embed.addField('Product Page', link.url);
|
||||
if (link.cartUrl) embed.addField('Add to Cart', link.cartUrl);
|
||||
embed.addField('Brand', link.brand, true);
|
||||
embed.addField('Model', link.model, true);
|
||||
embed.addField('Series', link.series, true);
|
||||
embed.addField('Store', store.name, true);
|
||||
if (link.price)
|
||||
embed.addField('Price', `${store.currency}${link.price}`, true);
|
||||
embed.addField('Product Page', link.url);
|
||||
if (link.cartUrl) embed.addField('Add to Cart', link.cartUrl);
|
||||
embed.addField('Brand', link.brand, true);
|
||||
embed.addField('Model', link.model, true);
|
||||
embed.addField('Series', link.series, true);
|
||||
|
||||
embed.setTimestamp();
|
||||
embed.setTimestamp();
|
||||
|
||||
let notifyText: string[] = [];
|
||||
let notifyText: string[] = [];
|
||||
|
||||
if (notifyGroup) {
|
||||
notifyText = notifyText.concat(notifyGroup);
|
||||
}
|
||||
if (notifyGroup) {
|
||||
notifyText = notifyText.concat(notifyGroup);
|
||||
}
|
||||
|
||||
if (Object.keys(notifyGroupSeries).indexOf(link.series) !== 0) {
|
||||
notifyText = notifyText.concat(
|
||||
notifyGroupSeries[link.series]
|
||||
);
|
||||
}
|
||||
if (Object.keys(notifyGroupSeries).indexOf(link.series) !== -1) {
|
||||
notifyText = notifyText.concat(notifyGroupSeries[link.series]);
|
||||
}
|
||||
|
||||
const promises = [];
|
||||
for (const webhook of webhooks) {
|
||||
const {id, token} = getIdAndToken(webhook);
|
||||
const client = new Discord.WebhookClient(id, token);
|
||||
const promises = [];
|
||||
for (const webhook of webhooks) {
|
||||
const {id, token} = getIdAndToken(webhook);
|
||||
const client = new Discord.WebhookClient(id, token);
|
||||
|
||||
promises.push({
|
||||
client,
|
||||
message: client.send(notifyText.join(' '), {
|
||||
embeds: [embed],
|
||||
username: 'streetmerchant'
|
||||
})
|
||||
});
|
||||
}
|
||||
promises.push({
|
||||
client,
|
||||
message: client.send(notifyText.join(' '), {
|
||||
embeds: [embed],
|
||||
username: 'streetmerchant',
|
||||
}),
|
||||
});
|
||||
}
|
||||
|
||||
(await Promise.all(promises)).forEach(({client}) =>
|
||||
client.destroy()
|
||||
);
|
||||
(await Promise.all(promises)).forEach(({client}) => client.destroy());
|
||||
|
||||
logger.info('✔ discord message sent');
|
||||
} catch (error: unknown) {
|
||||
logger.error("✖ couldn't send discord message", error);
|
||||
}
|
||||
})();
|
||||
}
|
||||
logger.info('✔ discord message sent');
|
||||
} catch (error: unknown) {
|
||||
logger.error("✖ couldn't send discord message", error);
|
||||
}
|
||||
})();
|
||||
}
|
||||
}
|
||||
|
||||
+32
-32
@@ -4,52 +4,52 @@ import Mail from 'nodemailer/lib/mailer';
|
||||
import {config} from '../config';
|
||||
import nodemailer from 'nodemailer';
|
||||
|
||||
const email = config.notifications.email;
|
||||
const {email} = config.notifications;
|
||||
|
||||
const transportOptions: any = {};
|
||||
|
||||
if (email.username && (email.password || email.smtpAddress)) {
|
||||
transportOptions.auth = {};
|
||||
transportOptions.auth.user = email.username;
|
||||
transportOptions.auth.pass = email.password;
|
||||
transportOptions.auth = {};
|
||||
transportOptions.auth.user = email.username;
|
||||
transportOptions.auth.pass = email.password;
|
||||
}
|
||||
|
||||
if (email.smtpAddress) {
|
||||
transportOptions.host = email.smtpAddress;
|
||||
transportOptions.port = email.smtpPort;
|
||||
transportOptions.host = email.smtpAddress;
|
||||
transportOptions.port = email.smtpPort;
|
||||
} else {
|
||||
transportOptions.service = 'gmail';
|
||||
transportOptions.service = 'gmail';
|
||||
}
|
||||
|
||||
export const transporter = nodemailer.createTransport({
|
||||
...transportOptions
|
||||
...transportOptions,
|
||||
});
|
||||
|
||||
export function sendEmail(link: Link, store: Store) {
|
||||
if (email.username && (email.password || email.smtpAddress)) {
|
||||
logger.debug('↗ sending email');
|
||||
if (email.username && (email.password || email.smtpAddress)) {
|
||||
logger.debug('↗ sending email');
|
||||
|
||||
const mailOptions: Mail.Options = {
|
||||
attachments: link.screenshot
|
||||
? [
|
||||
{
|
||||
filename: link.screenshot,
|
||||
path: `./${link.screenshot}`
|
||||
}
|
||||
]
|
||||
: undefined,
|
||||
from: email.username,
|
||||
subject: Print.inStock(link, store),
|
||||
text: Print.productInStock(link),
|
||||
to: email.to
|
||||
};
|
||||
const mailOptions: Mail.Options = {
|
||||
attachments: link.screenshot
|
||||
? [
|
||||
{
|
||||
filename: link.screenshot,
|
||||
path: `./${link.screenshot}`,
|
||||
},
|
||||
]
|
||||
: undefined,
|
||||
from: email.username,
|
||||
subject: Print.inStock(link, store),
|
||||
text: Print.productInStock(link),
|
||||
to: email.to,
|
||||
};
|
||||
|
||||
transporter.sendMail(mailOptions, (error) => {
|
||||
if (error) {
|
||||
logger.error("✖ couldn't send email", error);
|
||||
} else {
|
||||
logger.info('✔ email sent');
|
||||
}
|
||||
});
|
||||
}
|
||||
transporter.sendMail(mailOptions, error => {
|
||||
if (error) {
|
||||
logger.error("✖ couldn't send email", error);
|
||||
} else {
|
||||
logger.info('✔ email sent');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
+68
-68
@@ -3,64 +3,64 @@ import MqttClient, {IClientOptions, IClientPublishOptions} from 'mqtt';
|
||||
import {Print, logger} from '../logger';
|
||||
import {config} from '../config';
|
||||
|
||||
const mqtt = config.notifications.mqtt;
|
||||
const {mqtt} = config.notifications;
|
||||
let client: MqttClient.Client;
|
||||
|
||||
if (mqtt.broker) {
|
||||
if (checkInsecureUsage(mqtt.password, mqtt.broker)) {
|
||||
logger.warn(
|
||||
'✖ Insecure transport of password - Only use credentials with MQTT brokers on private networks.'
|
||||
);
|
||||
} else {
|
||||
const clientOptions: IClientOptions = {
|
||||
clean: mqtt.clientId === '',
|
||||
clientId: mqtt.clientId === '' ? undefined : mqtt.clientId,
|
||||
password: mqtt.password === '' ? undefined : mqtt.password,
|
||||
username: mqtt.username === '' ? undefined : mqtt.username
|
||||
};
|
||||
client = MqttClient.connect(
|
||||
`mqtt://${mqtt.broker}:${mqtt.port}`,
|
||||
clientOptions
|
||||
);
|
||||
}
|
||||
if (checkInsecureUsage(mqtt.password, mqtt.broker)) {
|
||||
logger.warn(
|
||||
'✖ Insecure transport of password - Only use credentials with MQTT brokers on private networks.'
|
||||
);
|
||||
} else {
|
||||
const clientOptions: IClientOptions = {
|
||||
clean: mqtt.clientId === '',
|
||||
clientId: mqtt.clientId === '' ? undefined : mqtt.clientId,
|
||||
password: mqtt.password === '' ? undefined : mqtt.password,
|
||||
username: mqtt.username === '' ? undefined : mqtt.username,
|
||||
};
|
||||
client = MqttClient.connect(
|
||||
`mqtt://${mqtt.broker}:${mqtt.port}`,
|
||||
clientOptions
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export function sendMqttMessage(link: Link, store: Store) {
|
||||
if (client) {
|
||||
logger.debug('↗ sending mqtt message');
|
||||
if (client) {
|
||||
logger.debug('↗ sending mqtt message');
|
||||
|
||||
(async () => {
|
||||
const givenUrl = link.cartUrl ? link.cartUrl : link.url;
|
||||
const message = `{"msg":"${Print.inStock(
|
||||
link,
|
||||
store
|
||||
)}", "url":"${givenUrl}"}`;
|
||||
const topic = generateTopic(link, store, mqtt.topic);
|
||||
const pubOptions: IClientPublishOptions = {
|
||||
qos: mqtt.qos as 0 | 1 | 2,
|
||||
retain: false
|
||||
};
|
||||
(async () => {
|
||||
const givenUrl = link.cartUrl ? link.cartUrl : link.url;
|
||||
const message = `{"msg":"${Print.inStock(
|
||||
link,
|
||||
store
|
||||
)}", "url":"${givenUrl}"}`;
|
||||
const topic = generateTopic(link, store, mqtt.topic);
|
||||
const pubOptions: IClientPublishOptions = {
|
||||
qos: mqtt.qos as 0 | 1 | 2,
|
||||
retain: false,
|
||||
};
|
||||
|
||||
try {
|
||||
client.publish(topic, message, pubOptions);
|
||||
logger.info('✔ mqtt message sent');
|
||||
} catch (error: unknown) {
|
||||
logger.error("✖ couldn't send mqtt message", error);
|
||||
}
|
||||
})();
|
||||
}
|
||||
try {
|
||||
client.publish(topic, message, pubOptions);
|
||||
logger.info('✔ mqtt message sent');
|
||||
} catch (error: unknown) {
|
||||
logger.error("✖ couldn't send mqtt message", error);
|
||||
}
|
||||
})();
|
||||
}
|
||||
}
|
||||
|
||||
function generateTopic(link: Link, store: Store, topic: string): string {
|
||||
topic.trim();
|
||||
topic = topic.replace(/^\//, '');
|
||||
topic = topic
|
||||
.replace(/%series%/g, link.series)
|
||||
.replace(/%brand%/g, link.brand)
|
||||
.replace(/%model%/g, link.model)
|
||||
.replace(/%store%/g, store.name);
|
||||
topic.trim();
|
||||
topic = topic.replace(/^\//, '');
|
||||
topic = topic
|
||||
.replace(/%series%/g, link.series)
|
||||
.replace(/%brand%/g, link.brand)
|
||||
.replace(/%model%/g, link.model)
|
||||
.replace(/%store%/g, store.name);
|
||||
|
||||
return topic;
|
||||
return topic;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -72,43 +72,43 @@ function generateTopic(link: Link, store: Store, topic: string): string {
|
||||
*
|
||||
*/
|
||||
function checkInsecureUsage(pass: string, address: string): boolean {
|
||||
if (pass !== '') {
|
||||
if (
|
||||
isClassANet(address) ||
|
||||
isClassBNet(address) ||
|
||||
isClassCNet(address) ||
|
||||
isLinkLocal(address)
|
||||
) {
|
||||
logger.debug(`MQTT using private network broker: ${address}`);
|
||||
} else {
|
||||
logger.debug(`MQTT using public network broker: ${address}`);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (pass !== '') {
|
||||
if (
|
||||
isClassANet(address) ||
|
||||
isClassBNet(address) ||
|
||||
isClassCNet(address) ||
|
||||
isLinkLocal(address)
|
||||
) {
|
||||
logger.debug(`MQTT using private network broker: ${address}`);
|
||||
} else {
|
||||
logger.debug(`MQTT using public network broker: ${address}`);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
function isClassANet(address: string): boolean {
|
||||
const classRegex = /^(10\.(\d|[1-9]\d|[12][0-5]{2})\.(\d|[1-9]\d|[12][0-5]{2})\.(\d|[1-9]\d|[12][0-5]{2}))$/;
|
||||
const classRegex = /^(10\.(\d|[1-9]\d|[12][0-5]{2})\.(\d|[1-9]\d|[12][0-5]{2})\.(\d|[1-9]\d|[12][0-5]{2}))$/;
|
||||
|
||||
return Boolean(classRegex.exec(address));
|
||||
return Boolean(classRegex.exec(address));
|
||||
}
|
||||
|
||||
function isClassBNet(address: string): boolean {
|
||||
const classRegex = /^(172\.(1[6-9]|2\d|3[01])\.(\d|[1-9]\d|[12][0-5]{2})\.(\d|[1-9]\d|[12][0-5]{2}))$/;
|
||||
const classRegex = /^(172\.(1[6-9]|2\d|3[01])\.(\d|[1-9]\d|[12][0-5]{2})\.(\d|[1-9]\d|[12][0-5]{2}))$/;
|
||||
|
||||
return Boolean(classRegex.exec(address));
|
||||
return Boolean(classRegex.exec(address));
|
||||
}
|
||||
|
||||
function isClassCNet(address: string): boolean {
|
||||
const classRegex = /^(192\.168\.(\d|[1-9]\d|[12][0-5]{2})\.(\d|[1-9]\d|[12][0-5]{2}))$/;
|
||||
const classRegex = /^(192\.168\.(\d|[1-9]\d|[12][0-5]{2})\.(\d|[1-9]\d|[12][0-5]{2}))$/;
|
||||
|
||||
return Boolean(classRegex.exec(address));
|
||||
return Boolean(classRegex.exec(address));
|
||||
}
|
||||
|
||||
function isLinkLocal(address: string): boolean {
|
||||
const linkLocal = /.+\.local$/;
|
||||
const linkLocal = /.+\.local$/;
|
||||
|
||||
return Boolean(linkLocal.exec(address));
|
||||
return Boolean(linkLocal.exec(address));
|
||||
}
|
||||
|
||||
@@ -14,23 +14,29 @@ import {sendTelegramMessage} from './telegram';
|
||||
import {sendTweet} from './twitter';
|
||||
import {sendTwilioMessage} from './twilio';
|
||||
import {sendTwitchMessage} from './twitch';
|
||||
import {updateRedis} from './redis';
|
||||
import {activateSmartthingsSwitch} from './smartthings';
|
||||
import {sendStreamLabsAlert} from './streamlabs';
|
||||
|
||||
export function sendNotification(link: Link, store: Store) {
|
||||
// Priority
|
||||
playSound();
|
||||
sendDiscordMessage(link, store);
|
||||
sendDesktopNotification(link, store);
|
||||
sendEmail(link, store);
|
||||
sendSms(link, store);
|
||||
// Non-priority
|
||||
adjustPhilipsHueLights();
|
||||
sendMqttMessage(link, store);
|
||||
sendPagerDutyNotification(link, store);
|
||||
sendPushbulletNotification(link, store);
|
||||
sendPushoverNotification(link, store);
|
||||
sendSlackMessage(link, store);
|
||||
sendTelegramMessage(link, store);
|
||||
sendTweet(link, store);
|
||||
sendTwilioMessage(link, store);
|
||||
sendTwitchMessage(link, store);
|
||||
// Priority
|
||||
playSound();
|
||||
sendDiscordMessage(link, store);
|
||||
sendDesktopNotification(link, store);
|
||||
sendEmail(link, store);
|
||||
sendSms(link, store);
|
||||
// Non-priority
|
||||
activateSmartthingsSwitch();
|
||||
adjustPhilipsHueLights();
|
||||
sendMqttMessage(link, store);
|
||||
sendPagerDutyNotification(link, store);
|
||||
sendPushbulletNotification(link, store);
|
||||
sendPushoverNotification(link, store);
|
||||
sendSlackMessage(link, store);
|
||||
sendTelegramMessage(link, store);
|
||||
sendTweet(link, store);
|
||||
sendTwilioMessage(link, store);
|
||||
sendTwitchMessage(link, store);
|
||||
updateRedis(link, store);
|
||||
sendStreamLabsAlert(link, store);
|
||||
}
|
||||
|
||||
@@ -6,26 +6,26 @@ import {config} from '../config';
|
||||
const pd = new PDClient('');
|
||||
|
||||
export function sendPagerDutyNotification(link: Link, store: Store) {
|
||||
if (config.notifications.pagerduty.integrationKey) {
|
||||
logger.debug('↗ sending pagerduty message');
|
||||
const links = [{href: link.url, text: 'Visit Store'}];
|
||||
if (link.cartUrl) {
|
||||
links.push({
|
||||
href: link.cartUrl,
|
||||
text: 'Add to Cart'
|
||||
});
|
||||
}
|
||||
if (config.notifications.pagerduty.integrationKey) {
|
||||
logger.debug('↗ sending pagerduty message');
|
||||
const links = [{href: link.url, text: 'Visit Store'}];
|
||||
if (link.cartUrl) {
|
||||
links.push({
|
||||
href: link.cartUrl,
|
||||
text: 'Add to Cart',
|
||||
});
|
||||
}
|
||||
|
||||
pd.events.sendEvent({
|
||||
dedup_key: link.url,
|
||||
event_action: 'trigger',
|
||||
payload: {
|
||||
links,
|
||||
severity: config.notifications.pagerduty.severity,
|
||||
source: store.name,
|
||||
summary: Print.inStock(link, store)
|
||||
},
|
||||
routing_key: config.notifications.pagerduty.integrationKey
|
||||
});
|
||||
}
|
||||
pd.events.sendEvent({
|
||||
dedup_key: link.url,
|
||||
event_action: 'trigger',
|
||||
payload: {
|
||||
links,
|
||||
severity: config.notifications.pagerduty.severity,
|
||||
source: store.name,
|
||||
summary: Print.inStock(link, store),
|
||||
},
|
||||
routing_key: config.notifications.pagerduty.integrationKey,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
+111
-122
@@ -3,136 +3,125 @@ import {config} from '../config';
|
||||
import {v3 as hueAPI} from 'node-hue-api';
|
||||
import {logger} from '../logger';
|
||||
|
||||
const hue = config.notifications.philips_hue;
|
||||
const apiKey = hue.apiKey;
|
||||
const bridgeIp = hue.bridgeIp;
|
||||
const lightIds = hue.lightIds;
|
||||
const lightColor = hue.lightColor;
|
||||
const lightPattern = hue.lightPattern;
|
||||
const LightState = hueAPI.lightStates.LightState;
|
||||
const clientId = hue.clientId;
|
||||
const clientSecret = hue.clientSecret;
|
||||
const accessToken = hue.accessToken;
|
||||
const refreshToken = hue.refreshToken;
|
||||
const remoteApiUsername = hue.remoteApiUsername;
|
||||
const {LightState} = hueAPI.lightStates;
|
||||
const {
|
||||
apiKey,
|
||||
bridgeIp,
|
||||
lightIds,
|
||||
lightColor,
|
||||
lightPattern,
|
||||
clientId,
|
||||
clientSecret,
|
||||
accessToken,
|
||||
refreshToken,
|
||||
remoteApiUsername,
|
||||
} = config.notifications.philips_hue;
|
||||
|
||||
// Default Light State
|
||||
const lightState = new LightState()
|
||||
.on(true)
|
||||
.brightness(100)
|
||||
.rgb(46.27, 72.55, 0);
|
||||
.on(true)
|
||||
.brightness(100)
|
||||
.rgb(46.27, 72.55, 0);
|
||||
|
||||
const adjustLightsWithAPI = (hueBridge: Api) => {
|
||||
logger.debug('Connected to Philips Hue bridge.');
|
||||
// Set the custom light state (COLOR and METHOD here)
|
||||
if (lightColor) {
|
||||
const rgbArray = lightColor.split(',');
|
||||
// If there's not three values, must not be RGB
|
||||
if (rgbArray.length === 3) {
|
||||
lightState.rgb(rgbArray[0], rgbArray[1], rgbArray[2]);
|
||||
} else {
|
||||
logger.debug('✖ Error assigning RGB Values');
|
||||
}
|
||||
}
|
||||
logger.debug('Connected to Philips Hue bridge.');
|
||||
// Set the custom light state (COLOR and METHOD here)
|
||||
if (lightColor) {
|
||||
const rgbArray = lightColor.split(',');
|
||||
// If there's not three values, must not be RGB
|
||||
if (rgbArray.length === 3) {
|
||||
lightState.rgb(rgbArray[0], rgbArray[1], rgbArray[2]);
|
||||
} else {
|
||||
logger.debug('✖ Error assigning RGB Values');
|
||||
}
|
||||
}
|
||||
|
||||
// If blink is specified, then blink the lights
|
||||
if (lightPattern === 'blink') {
|
||||
lightState.alertLong();
|
||||
}
|
||||
// If blink is specified, then blink the lights
|
||||
if (lightPattern === 'blink') {
|
||||
lightState.alertLong();
|
||||
}
|
||||
|
||||
// If we've been given light IDs, then only adjust those IDs
|
||||
if (lightIds) {
|
||||
const arrayOfIDs = lightIds.split(',');
|
||||
arrayOfIDs.forEach((light) => {
|
||||
logger.debug('adjusting all hue lights');
|
||||
(hueBridge.lights.setLightState(
|
||||
light,
|
||||
lightState
|
||||
) as Promise<any>).catch((error: Error) => {
|
||||
logger.error('Failed to adjust all lights.');
|
||||
logger.error(error);
|
||||
throw error;
|
||||
});
|
||||
});
|
||||
} else {
|
||||
// Adjust all light IDs
|
||||
hueBridge.lights
|
||||
.getAll()
|
||||
.then((allLights: any[]) => {
|
||||
allLights.forEach((light: any) => {
|
||||
logger.debug('adjusting specified lights');
|
||||
(hueBridge.lights.setLightState(
|
||||
light,
|
||||
lightState
|
||||
) as Promise<any>).catch((error: Error) => {
|
||||
logger.error('Failed to adjust specified lights.');
|
||||
logger.error(error);
|
||||
throw error;
|
||||
});
|
||||
});
|
||||
})
|
||||
.catch((error: Error) => {
|
||||
logger.error('Failed to get all lights.');
|
||||
logger.error(error);
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
// If we've been given light IDs, then only adjust those IDs
|
||||
if (lightIds) {
|
||||
const arrayOfIDs = lightIds.split(',');
|
||||
arrayOfIDs.forEach(light => {
|
||||
logger.debug('adjusting specified lights');
|
||||
(hueBridge.lights.setLightState(light, lightState) as Promise<any>).catch(
|
||||
(error: Error) => {
|
||||
logger.error('Failed to adjust specified lights.');
|
||||
logger.error(error);
|
||||
throw error;
|
||||
}
|
||||
);
|
||||
});
|
||||
} else {
|
||||
// Adjust all light IDs
|
||||
hueBridge.lights
|
||||
.getAll()
|
||||
.then((allLights: any[]) => {
|
||||
allLights.forEach((light: any) => {
|
||||
logger.debug('adjusting all hue lights');
|
||||
(hueBridge.lights.setLightState(
|
||||
light,
|
||||
lightState
|
||||
) as Promise<any>).catch((error: Error) => {
|
||||
logger.error('Failed to adjust all lights.');
|
||||
logger.error(error);
|
||||
throw error;
|
||||
});
|
||||
});
|
||||
})
|
||||
.catch((error: Error) => {
|
||||
logger.error('Failed to get all lights.');
|
||||
logger.error(error);
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export function adjustPhilipsHueLights() {
|
||||
// Check if the required variables have been set
|
||||
if (hue.apiKey && hue.bridgeIp) {
|
||||
logger.info('↗ adjusting Philips Hue lights over LAN');
|
||||
(async () => {
|
||||
logger.debug(
|
||||
'Attempting to connect to Philips Hue bridge at ' + bridgeIp
|
||||
);
|
||||
hueAPI.api
|
||||
.createLocal(bridgeIp)
|
||||
.connect(apiKey)
|
||||
.then(
|
||||
(hueBridge) => {
|
||||
adjustLightsWithAPI(hueBridge);
|
||||
logger.info('✔ adjusted Philips Hue lights over LAN');
|
||||
},
|
||||
(error: Error) => {
|
||||
logger.error("✖ couldn't adjust hue lights.", error);
|
||||
}
|
||||
);
|
||||
})();
|
||||
} else if (hue.apiKey && hue.clientId && hue.clientSecret) {
|
||||
logger.info('↗ adjusting Philips Hue lights over cloud');
|
||||
(async () => {
|
||||
logger.debug(
|
||||
'Attempting to connect to Philips Hue bridge over cloud'
|
||||
);
|
||||
const remoteBootstrap = hueAPI.api.createRemote(
|
||||
clientId,
|
||||
clientSecret
|
||||
);
|
||||
if (hue.accessToken && hue.refreshToken) {
|
||||
remoteBootstrap
|
||||
.connectWithTokens(
|
||||
accessToken,
|
||||
refreshToken,
|
||||
remoteApiUsername
|
||||
)
|
||||
.then(
|
||||
(hueBridge) => {
|
||||
adjustLightsWithAPI(hueBridge);
|
||||
logger.info(
|
||||
'✔ adjusted Philips Hue lights over cloud'
|
||||
);
|
||||
},
|
||||
(error: Error) => {
|
||||
logger.error(
|
||||
'Failed to get a remote Philips Hue connection using supplied tokens.'
|
||||
);
|
||||
logger.error(error);
|
||||
throw error;
|
||||
}
|
||||
);
|
||||
}
|
||||
})();
|
||||
}
|
||||
// Check if the required variables have been set
|
||||
if (apiKey && bridgeIp) {
|
||||
logger.info('↗ adjusting Philips Hue lights over LAN');
|
||||
(async () => {
|
||||
logger.debug(
|
||||
'Attempting to connect to Philips Hue bridge at ' + bridgeIp
|
||||
);
|
||||
hueAPI.api
|
||||
.createLocal(bridgeIp)
|
||||
.connect(apiKey)
|
||||
.then(
|
||||
hueBridge => {
|
||||
adjustLightsWithAPI(hueBridge);
|
||||
logger.info('✔ adjusted Philips Hue lights over LAN');
|
||||
},
|
||||
(error: Error) => {
|
||||
logger.error("✖ couldn't adjust hue lights.", error);
|
||||
}
|
||||
);
|
||||
})();
|
||||
} else if (apiKey && clientId && clientSecret) {
|
||||
logger.info('↗ adjusting Philips Hue lights over cloud');
|
||||
(async () => {
|
||||
logger.debug('Attempting to connect to Philips Hue bridge over cloud');
|
||||
const remoteBootstrap = hueAPI.api.createRemote(clientId, clientSecret);
|
||||
if (accessToken && refreshToken) {
|
||||
remoteBootstrap
|
||||
.connectWithTokens(accessToken, refreshToken, remoteApiUsername)
|
||||
.then(
|
||||
hueBridge => {
|
||||
adjustLightsWithAPI(hueBridge);
|
||||
logger.info('✔ adjusted Philips Hue lights over cloud');
|
||||
},
|
||||
(error: Error) => {
|
||||
logger.error(
|
||||
'Failed to get a remote Philips Hue connection using supplied tokens.'
|
||||
);
|
||||
logger.error(error);
|
||||
throw error;
|
||||
}
|
||||
);
|
||||
}
|
||||
})();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,25 +3,25 @@ import {Print, logger} from '../logger';
|
||||
import PushBullet from '@jef/pushbullet';
|
||||
import {config} from '../config';
|
||||
|
||||
const pushbullet = config.notifications.pushbullet;
|
||||
const {pushbullet} = config.notifications;
|
||||
|
||||
export function sendPushbulletNotification(link: Link, store: Store) {
|
||||
if (pushbullet) {
|
||||
logger.debug('↗ sending pushbullet message');
|
||||
if (pushbullet) {
|
||||
logger.debug('↗ sending pushbullet message');
|
||||
|
||||
const pusher = new PushBullet(pushbullet);
|
||||
const pusher = new PushBullet(pushbullet);
|
||||
|
||||
pusher.note(
|
||||
{},
|
||||
Print.inStock(link, store),
|
||||
link.cartUrl ? link.cartUrl : link.url,
|
||||
(error: Error) => {
|
||||
if (error) {
|
||||
logger.error("✖ couldn't send pushbullet message", error);
|
||||
} else {
|
||||
logger.info('✔ pushbullet message sent');
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
pusher.note(
|
||||
{},
|
||||
Print.inStock(link, store),
|
||||
link.cartUrl ? link.cartUrl : link.url,
|
||||
(error: Error) => {
|
||||
if (error) {
|
||||
logger.error("✖ couldn't send pushbullet message", error);
|
||||
} else {
|
||||
logger.info('✔ pushbullet message sent');
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,38 +3,40 @@ import {Print, logger} from '../logger';
|
||||
import Push, {PushoverMessage} from 'pushover-notifications';
|
||||
import {config} from '../config';
|
||||
|
||||
const pushover = config.notifications.pushover;
|
||||
const {pushover} = config.notifications;
|
||||
|
||||
export function sendPushoverNotification(link: Link, store: Store) {
|
||||
if (pushover.token && pushover.username) {
|
||||
logger.debug('↗ sending pushover message');
|
||||
if (pushover.token && pushover.username) {
|
||||
logger.debug('↗ sending pushover message');
|
||||
|
||||
const push = new Push({
|
||||
token: pushover.token,
|
||||
user: pushover.username
|
||||
});
|
||||
const push = new Push({
|
||||
token: pushover.token,
|
||||
user: pushover.username,
|
||||
});
|
||||
|
||||
const message: PushoverMessage =
|
||||
pushover.priority < 2
|
||||
? {
|
||||
message: link.cartUrl ? link.cartUrl : link.url,
|
||||
priority: pushover.priority,
|
||||
title: Print.inStock(link, store)
|
||||
}
|
||||
: {
|
||||
expire: pushover.expire,
|
||||
message: link.cartUrl ? link.cartUrl : link.url,
|
||||
priority: pushover.priority,
|
||||
retry: pushover.retry,
|
||||
title: Print.inStock(link, store)
|
||||
};
|
||||
const message: PushoverMessage =
|
||||
pushover.priority < 2
|
||||
? {
|
||||
message: link.cartUrl ? link.cartUrl : link.url,
|
||||
priority: pushover.priority,
|
||||
title: Print.inStock(link, store),
|
||||
...(link.screenshot && {file: `./${link.screenshot}`}),
|
||||
}
|
||||
: {
|
||||
expire: pushover.expire,
|
||||
message: link.cartUrl ? link.cartUrl : link.url,
|
||||
priority: pushover.priority,
|
||||
retry: pushover.retry,
|
||||
title: Print.inStock(link, store),
|
||||
...(link.screenshot && {file: `./${link.screenshot}`}),
|
||||
};
|
||||
|
||||
push.send(message, (error: Error) => {
|
||||
if (error) {
|
||||
logger.error("✖ couldn't send pushover message", error);
|
||||
} else {
|
||||
logger.info('✔ pushover message sent');
|
||||
}
|
||||
});
|
||||
}
|
||||
push.send(message, (error: Error) => {
|
||||
if (error) {
|
||||
logger.error("✖ couldn't send pushover message", error);
|
||||
} else {
|
||||
logger.info('✔ pushover message sent');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
import {Link, Store} from '../store/model';
|
||||
import redis, {RedisClient} from 'redis';
|
||||
import {config} from '../config';
|
||||
import {logger} from '../logger';
|
||||
|
||||
const {url} = config.notifications.redis;
|
||||
let client: RedisClient;
|
||||
|
||||
function initRedis(): RedisClient | null {
|
||||
if (url) {
|
||||
client = redis.createClient({url});
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
export function updateRedis(link: Link, store: Store) {
|
||||
try {
|
||||
if (client) {
|
||||
const key = `${store.name}:${link.brand}:${link.model}`
|
||||
.split(' ')
|
||||
.join('-');
|
||||
|
||||
const value = {
|
||||
...link,
|
||||
labels: store.labels,
|
||||
links: store.links,
|
||||
name: store.name,
|
||||
updatedAt: new Date().toUTCString(),
|
||||
};
|
||||
|
||||
const redisUpdated = client.set(key, JSON.stringify(value));
|
||||
|
||||
if (redisUpdated) {
|
||||
logger.info('✔ redis updated');
|
||||
} else {
|
||||
logger.error(`✖ couldn't update redis for key (${key})`);
|
||||
}
|
||||
}
|
||||
} catch (error: unknown) {
|
||||
logger.error("✖ couldn't update redis", error);
|
||||
}
|
||||
}
|
||||
|
||||
initRedis();
|
||||
+20
-22
@@ -3,33 +3,31 @@ import {Print, logger} from '../logger';
|
||||
import {WebClient} from '@slack/web-api';
|
||||
import {config} from '../config';
|
||||
|
||||
const slack = config.notifications.slack;
|
||||
const channel = slack.channel.replace('#', '');
|
||||
const token = slack.token;
|
||||
const {channel, token} = config.notifications.slack;
|
||||
const web = new WebClient(token);
|
||||
|
||||
export function sendSlackMessage(link: Link, store: Store) {
|
||||
if (slack.channel && slack.token) {
|
||||
logger.debug('↗ sending slack message');
|
||||
if (channel && token) {
|
||||
logger.debug('↗ sending slack message');
|
||||
|
||||
(async () => {
|
||||
const givenUrl = link.cartUrl ? link.cartUrl : link.url;
|
||||
(async () => {
|
||||
const givenUrl = link.cartUrl ? link.cartUrl : link.url;
|
||||
|
||||
try {
|
||||
const result = await web.chat.postMessage({
|
||||
channel,
|
||||
text: `${Print.inStock(link, store)}\n${givenUrl}`
|
||||
});
|
||||
try {
|
||||
const result = await web.chat.postMessage({
|
||||
channel: channel.replace('#', ''),
|
||||
text: `${Print.inStock(link, store)}\n${givenUrl}`,
|
||||
});
|
||||
|
||||
if (!result.ok) {
|
||||
logger.error("✖ couldn't send slack message", result);
|
||||
return;
|
||||
}
|
||||
if (!result.ok) {
|
||||
logger.error("✖ couldn't send slack message", result);
|
||||
return;
|
||||
}
|
||||
|
||||
logger.info('✔ slack message sent');
|
||||
} catch (error: unknown) {
|
||||
logger.error("✖ couldn't send slack message", error);
|
||||
}
|
||||
})();
|
||||
}
|
||||
logger.info('✔ slack message sent');
|
||||
} catch (error: unknown) {
|
||||
logger.error("✖ couldn't send slack message", error);
|
||||
}
|
||||
})();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
import {SmartThings} from '@bridgerakol/samsung-smart-api';
|
||||
import {logger} from '../logger';
|
||||
import {config} from '../config';
|
||||
|
||||
const {smartthings} = config.notifications;
|
||||
|
||||
export async function activateSmartthingsSwitch() {
|
||||
if (!smartthings.token || !smartthings.device) {
|
||||
return;
|
||||
}
|
||||
const st = new SmartThings(smartthings.token);
|
||||
let match = false;
|
||||
try {
|
||||
await st.devices.getList().then(res => {
|
||||
res.data.items.forEach(
|
||||
async (item: {label: string; deviceId: string}) => {
|
||||
if (smartthings.device === item.label) {
|
||||
match = true;
|
||||
const device_status = (await st.devices.getStatus(item.deviceId))
|
||||
.data.components.main.switch.switch.value;
|
||||
if (device_status !== 'on') {
|
||||
logger.debug(`Turning on ${smartthings.device}`);
|
||||
st.devices.commands(item.deviceId, 'on');
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
} catch (TypeError) {
|
||||
logger.warn(
|
||||
'SmartThings : Problem getting data from hub, check SMARTTHINGS_TOKEN'
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (!match) {
|
||||
logger.warn(
|
||||
`SmartThings : No switch called ${smartthings.device}, check SMARTTHINGS_SWITCH_LABEL`
|
||||
);
|
||||
return;
|
||||
}
|
||||
}
|
||||
+58
-56
@@ -4,75 +4,77 @@ import Mail from 'nodemailer/lib/mailer';
|
||||
import {config} from '../config';
|
||||
import {transporter} from './email';
|
||||
|
||||
const [email, phone] = [config.notifications.email, config.notifications.phone];
|
||||
const {email, phone} = config.notifications;
|
||||
|
||||
if (phone.number.length > 0 && (!email.username || !email.password)) {
|
||||
logger.warn(
|
||||
'✖ in order to receive sms alerts, email notifications must also be configured'
|
||||
);
|
||||
logger.warn(
|
||||
'✖ in order to receive sms alerts, email notifications must also be configured'
|
||||
);
|
||||
}
|
||||
|
||||
if (phone.carrier.length !== phone.number.length) {
|
||||
logger.warn(
|
||||
'✖ the number of carriers must match the number of phone numbers',
|
||||
{carrier: phone.carrier, number: phone.number}
|
||||
);
|
||||
logger.warn(
|
||||
'✖ the number of carriers must match the number of phone numbers',
|
||||
{carrier: phone.carrier, number: phone.number}
|
||||
);
|
||||
}
|
||||
|
||||
export function sendSms(link: Link, store: Store) {
|
||||
for (
|
||||
let i = 0;
|
||||
i < Math.max(phone.number.length, phone.carrier.length);
|
||||
i++
|
||||
) {
|
||||
const currentNumber = phone.number[i];
|
||||
const currentCarrier = phone.carrier[i];
|
||||
for (
|
||||
let i = 0;
|
||||
i < Math.max(phone.number.length, phone.carrier.length);
|
||||
i++
|
||||
) {
|
||||
const currentNumber = phone.number[i];
|
||||
const currentCarrier = phone.carrier[i];
|
||||
|
||||
if (!currentNumber) {
|
||||
logger.error(`✖ ${currentCarrier} is not associated with a number`);
|
||||
continue;
|
||||
} else if (!currentCarrier) {
|
||||
logger.error(`✖ ${currentNumber} is not associated with a carrier`);
|
||||
continue;
|
||||
}
|
||||
if (!currentNumber) {
|
||||
logger.error(`✖ ${currentCarrier} is not associated with a number`);
|
||||
continue;
|
||||
} else if (!currentCarrier) {
|
||||
logger.error(`✖ ${currentNumber} is not associated with a carrier`);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!phone.availableCarriers.has(currentCarrier)) {
|
||||
logger.error(`✖ unknown carrier ${currentCarrier}`);
|
||||
continue;
|
||||
}
|
||||
if (!phone.availableCarriers.has(currentCarrier)) {
|
||||
logger.error(`✖ unknown carrier ${currentCarrier}`);
|
||||
continue;
|
||||
}
|
||||
|
||||
logger.debug('↗ sending sms');
|
||||
logger.debug('↗ sending sms');
|
||||
|
||||
const mailOptions: Mail.Options = {
|
||||
attachments: link.screenshot
|
||||
? [
|
||||
{
|
||||
filename: link.screenshot,
|
||||
path: `./${link.screenshot}`
|
||||
}
|
||||
]
|
||||
: undefined,
|
||||
from: email.username,
|
||||
subject: Print.inStock(link, store, false, true),
|
||||
text: link.cartUrl ? link.cartUrl : link.url,
|
||||
to: generateAddress(currentNumber, currentCarrier)
|
||||
};
|
||||
const mailOptions: Mail.Options = {
|
||||
attachments: link.screenshot
|
||||
? [
|
||||
{
|
||||
filename: link.screenshot,
|
||||
path: `./${link.screenshot}`,
|
||||
},
|
||||
]
|
||||
: undefined,
|
||||
from: email.username,
|
||||
subject: Print.inStock(link, store, false, true),
|
||||
text: link.cartUrl ? link.cartUrl : link.url,
|
||||
to: generateAddress(currentNumber, currentCarrier),
|
||||
};
|
||||
|
||||
transporter.sendMail(mailOptions, (error) => {
|
||||
if (error) {
|
||||
logger.error(
|
||||
`✖ couldn't send sms to ${currentNumber} for carrier ${currentCarrier}`,
|
||||
error
|
||||
);
|
||||
} else {
|
||||
logger.info('✔ sms sent');
|
||||
}
|
||||
});
|
||||
}
|
||||
transporter.sendMail(mailOptions, error => {
|
||||
if (error) {
|
||||
logger.error(
|
||||
`✖ couldn't send sms to ${currentNumber} for carrier ${currentCarrier}`,
|
||||
error
|
||||
);
|
||||
} else {
|
||||
logger.info('✔ sms sent');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function generateAddress(number: string, carrier: string) {
|
||||
if (carrier && phone.availableCarriers.has(carrier)) {
|
||||
return [number, phone.availableCarriers.get(carrier)].join('@');
|
||||
}
|
||||
function generateAddress(number: string, carrier: string): string {
|
||||
if (carrier && phone.availableCarriers.has(carrier)) {
|
||||
return [number, phone.availableCarriers.get(carrier)].join('@');
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
+24
-30
@@ -6,41 +6,35 @@ import {logger} from '../logger';
|
||||
let player: PlaySound;
|
||||
|
||||
if (config.notifications.playSound) {
|
||||
player = config.notifications.soundPlayer
|
||||
? playerLib({players: [config.notifications.soundPlayer]})
|
||||
: playerLib();
|
||||
player = config.notifications.soundPlayer
|
||||
? playerLib({players: [config.notifications.soundPlayer]})
|
||||
: playerLib();
|
||||
|
||||
if (player.player === null) {
|
||||
logger.warn("✖ couldn't find sound player");
|
||||
} else {
|
||||
const playerName = player.player;
|
||||
logger.info(`✔ sound player found: ${playerName}`);
|
||||
}
|
||||
if (player.player === null) {
|
||||
logger.warn("✖ couldn't find sound player");
|
||||
} else {
|
||||
const playerName = player.player;
|
||||
logger.info(`✔ sound player found: ${playerName}`);
|
||||
}
|
||||
}
|
||||
|
||||
export function playSound() {
|
||||
if (config.notifications.playSound && player.player !== null) {
|
||||
logger.debug('↗ playing sound');
|
||||
if (config.notifications.playSound && player.player !== null) {
|
||||
logger.debug('↗ playing sound');
|
||||
|
||||
fs.access(
|
||||
config.notifications.playSound,
|
||||
fs.constants.F_OK,
|
||||
(error) => {
|
||||
if (error) {
|
||||
logger.error(
|
||||
`✖ error opening sound file: ${error.message}`
|
||||
);
|
||||
return;
|
||||
}
|
||||
fs.access(config.notifications.playSound, fs.constants.F_OK, error => {
|
||||
if (error) {
|
||||
logger.error(`✖ error opening sound file: ${error.message}`);
|
||||
return;
|
||||
}
|
||||
|
||||
player.play(config.notifications.playSound, (error: Error) => {
|
||||
if (error) {
|
||||
logger.error("✖ couldn't play sound", error);
|
||||
}
|
||||
player.play(config.notifications.playSound, (error: Error) => {
|
||||
if (error) {
|
||||
logger.error("✖ couldn't play sound", error);
|
||||
}
|
||||
|
||||
logger.info('✔ played sound');
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
logger.info('✔ played sound');
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
import {Link, Store} from '../store/model';
|
||||
import {Print, logger} from '../logger';
|
||||
import {config} from '../config';
|
||||
import {URLSearchParams} from 'url';
|
||||
import fetch from 'node-fetch';
|
||||
|
||||
const {streamlabs} = config.notifications;
|
||||
let requestParams: URLSearchParams;
|
||||
|
||||
if (streamlabs.accessToken && streamlabs.type) {
|
||||
requestParams = new URLSearchParams();
|
||||
requestParams.append('access_token', streamlabs.accessToken);
|
||||
requestParams.append('type', streamlabs.type);
|
||||
requestParams.append('image_href', streamlabs.imageHref);
|
||||
requestParams.append('sound_href', streamlabs.soundHref);
|
||||
requestParams.append('duration', streamlabs.duration.toString());
|
||||
}
|
||||
|
||||
export function sendStreamLabsAlert(link: Link, store: Store) {
|
||||
if (requestParams) {
|
||||
logger.debug('↗ sending StreamLabs alert');
|
||||
|
||||
(async () => {
|
||||
const message = `${Print.inStock(link, store)}`;
|
||||
requestParams.set('message', message);
|
||||
|
||||
try {
|
||||
const response = await fetch('https://streamlabs.com/api/v1.0/alerts', {
|
||||
method: 'POST',
|
||||
body: requestParams,
|
||||
});
|
||||
|
||||
const json = await response.json();
|
||||
if (!json.success) throw Error(JSON.stringify(json));
|
||||
|
||||
logger.info('✔ StreamLabs alert sent');
|
||||
} catch (error: unknown) {
|
||||
logger.error("✖ couldn't send StreamLabs alert", error);
|
||||
}
|
||||
})();
|
||||
}
|
||||
}
|
||||
@@ -3,35 +3,35 @@ import {Print, logger} from '../logger';
|
||||
import {TelegramClient} from 'messaging-api-telegram';
|
||||
import {config} from '../config';
|
||||
|
||||
const telegram = config.notifications.telegram;
|
||||
const {telegram} = config.notifications;
|
||||
|
||||
const client = new TelegramClient({
|
||||
accessToken: telegram.accessToken
|
||||
accessToken: telegram.accessToken,
|
||||
});
|
||||
|
||||
export function sendTelegramMessage(link: Link, store: Store) {
|
||||
if (telegram.accessToken && telegram.chatId) {
|
||||
logger.debug('↗ sending telegram message');
|
||||
if (telegram.accessToken && telegram.chatId) {
|
||||
logger.debug('↗ sending telegram message');
|
||||
|
||||
(async () => {
|
||||
const message = Print.productInStock(link);
|
||||
const results = [];
|
||||
(async () => {
|
||||
const message = Print.productInStock(link);
|
||||
const results = [];
|
||||
|
||||
for (const chatId of telegram.chatId) {
|
||||
try {
|
||||
results.push(
|
||||
client.sendMessage(
|
||||
chatId,
|
||||
`${Print.inStock(link, store)}\n${message}`
|
||||
)
|
||||
);
|
||||
logger.info('✔ telegram message sent');
|
||||
} catch (error: unknown) {
|
||||
logger.error("✖ couldn't send telegram message", error);
|
||||
}
|
||||
}
|
||||
for (const chatId of telegram.chatId) {
|
||||
try {
|
||||
results.push(
|
||||
client.sendMessage(
|
||||
chatId,
|
||||
`${Print.inStock(link, store)}\n${message}`
|
||||
)
|
||||
);
|
||||
logger.info('✔ telegram message sent');
|
||||
} catch (error: unknown) {
|
||||
logger.error("✖ couldn't send telegram message", error);
|
||||
}
|
||||
}
|
||||
|
||||
await Promise.all(results);
|
||||
})();
|
||||
}
|
||||
await Promise.all(results);
|
||||
})();
|
||||
}
|
||||
}
|
||||
|
||||
+26
-19
@@ -3,31 +3,38 @@ import {Print, logger} from '../logger';
|
||||
import {Twilio} from 'twilio';
|
||||
import {config} from '../config';
|
||||
|
||||
const twilio = config.notifications.twilio;
|
||||
const {twilio} = config.notifications;
|
||||
let client: Twilio;
|
||||
|
||||
if (twilio.accountSid && twilio.authToken) {
|
||||
client = new Twilio(twilio.accountSid, twilio.authToken);
|
||||
client = new Twilio(twilio.accountSid, twilio.authToken);
|
||||
}
|
||||
|
||||
export function sendTwilioMessage(link: Link, store: Store) {
|
||||
if (client) {
|
||||
logger.debug('↗ sending twilio message');
|
||||
if (client) {
|
||||
logger.debug('↗ sending twilio message');
|
||||
|
||||
(async () => {
|
||||
const givenUrl = link.cartUrl ? link.cartUrl : link.url;
|
||||
const message = `${Print.inStock(link, store)}\n${givenUrl}`;
|
||||
(async () => {
|
||||
const givenUrl = link.cartUrl ? link.cartUrl : link.url;
|
||||
const message = `${Print.inStock(link, store)}\n${givenUrl}`;
|
||||
const numbers = twilio.to.split(',');
|
||||
const results = [];
|
||||
for (const number of numbers) {
|
||||
try {
|
||||
results.push(
|
||||
client.messages.create({
|
||||
body: message,
|
||||
from: twilio.from,
|
||||
to: number,
|
||||
})
|
||||
);
|
||||
logger.info('✔ twilio message sent');
|
||||
} catch (error: unknown) {
|
||||
logger.error("✖ couldn't send twilio message", error);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
await client.messages.create({
|
||||
body: message,
|
||||
from: twilio.from,
|
||||
to: twilio.to
|
||||
});
|
||||
logger.info('✔ twilio message sent');
|
||||
} catch (error: unknown) {
|
||||
logger.error("✖ couldn't send twilio message", error);
|
||||
}
|
||||
})();
|
||||
}
|
||||
await Promise.all(results);
|
||||
})();
|
||||
}
|
||||
}
|
||||
|
||||
+69
-73
@@ -5,101 +5,97 @@ import {existsSync, promises, readFileSync} from 'fs';
|
||||
import {ChatClient} from 'twitch-chat-client';
|
||||
import {config} from '../config';
|
||||
|
||||
const twitch = config.notifications.twitch;
|
||||
const {twitch} = config.notifications;
|
||||
|
||||
const messages: string[] = [];
|
||||
let alreadySaying = false;
|
||||
|
||||
let tokenData = {
|
||||
accessToken: twitch.accessToken,
|
||||
expiryTimestamp: 0,
|
||||
refreshToken: twitch.refreshToken
|
||||
accessToken: twitch.accessToken,
|
||||
expiryTimestamp: 0,
|
||||
refreshToken: twitch.refreshToken,
|
||||
};
|
||||
|
||||
if (existsSync('./twitch.json')) {
|
||||
tokenData = {
|
||||
...JSON.parse(readFileSync('./twitch.json', 'utf-8')),
|
||||
...tokenData
|
||||
};
|
||||
tokenData = {
|
||||
...JSON.parse(readFileSync('./twitch.json', 'utf-8')),
|
||||
...tokenData,
|
||||
};
|
||||
}
|
||||
|
||||
const chatClient: ChatClient = new ChatClient(
|
||||
new RefreshableAuthProvider(
|
||||
new StaticAuthProvider(twitch.clientId, tokenData.accessToken),
|
||||
{
|
||||
clientSecret: twitch.clientSecret,
|
||||
expiry:
|
||||
tokenData.expiryTimestamp === null
|
||||
? null
|
||||
: new Date(tokenData.expiryTimestamp),
|
||||
onRefresh: async ({accessToken, refreshToken, expiryDate}) => {
|
||||
return promises.writeFile(
|
||||
'./twitch.json',
|
||||
JSON.stringify(
|
||||
{
|
||||
accessToken,
|
||||
expiryTimestamp:
|
||||
expiryDate === null
|
||||
? null
|
||||
: expiryDate.getTime(),
|
||||
refreshToken
|
||||
},
|
||||
null,
|
||||
4
|
||||
),
|
||||
'utf-8'
|
||||
);
|
||||
},
|
||||
refreshToken: tokenData.refreshToken
|
||||
}
|
||||
),
|
||||
{
|
||||
channels: [twitch.channel]
|
||||
}
|
||||
new RefreshableAuthProvider(
|
||||
new StaticAuthProvider(twitch.clientId, tokenData.accessToken),
|
||||
{
|
||||
clientSecret: twitch.clientSecret,
|
||||
expiry:
|
||||
tokenData.expiryTimestamp === null
|
||||
? null
|
||||
: new Date(tokenData.expiryTimestamp),
|
||||
onRefresh: async ({accessToken, refreshToken, expiryDate}) => {
|
||||
return promises.writeFile(
|
||||
'./twitch.json',
|
||||
JSON.stringify(
|
||||
{
|
||||
accessToken,
|
||||
expiryTimestamp:
|
||||
expiryDate === null ? null : expiryDate.getTime(),
|
||||
refreshToken,
|
||||
},
|
||||
null,
|
||||
4
|
||||
),
|
||||
'utf-8'
|
||||
);
|
||||
},
|
||||
refreshToken: tokenData.refreshToken,
|
||||
}
|
||||
),
|
||||
{
|
||||
channels: [twitch.channel],
|
||||
}
|
||||
);
|
||||
|
||||
chatClient.onJoin((channel: string, user: string) => {
|
||||
if (channel === `#${twitch.channel}` && user === chatClient.currentNick) {
|
||||
while (messages.length) {
|
||||
const message: string | undefined = messages.shift();
|
||||
if (channel === `#${twitch.channel}` && user === chatClient.currentNick) {
|
||||
while (messages.length) {
|
||||
const message: string | undefined = messages.shift();
|
||||
|
||||
if (message !== undefined) {
|
||||
try {
|
||||
chatClient.say(channel, message);
|
||||
logger.info('✔ twitch message sent');
|
||||
} catch (error: unknown) {
|
||||
logger.error("✖ couldn't send twitch message", error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (message !== undefined) {
|
||||
try {
|
||||
void chatClient.say(channel, message);
|
||||
logger.info('✔ twitch message sent');
|
||||
} catch (error: unknown) {
|
||||
logger.error("✖ couldn't send twitch message", error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void chatClient.quit();
|
||||
void chatClient.quit();
|
||||
});
|
||||
|
||||
chatClient.onDisconnect(() => {
|
||||
alreadySaying = false;
|
||||
alreadySaying = false;
|
||||
});
|
||||
|
||||
export function sendTwitchMessage(link: Link, store: Store) {
|
||||
if (
|
||||
tokenData.accessToken &&
|
||||
twitch.channel &&
|
||||
twitch.clientId &&
|
||||
twitch.clientSecret &&
|
||||
tokenData.refreshToken
|
||||
) {
|
||||
logger.debug('↗ sending twitch message');
|
||||
if (
|
||||
tokenData.accessToken &&
|
||||
twitch.channel &&
|
||||
twitch.clientId &&
|
||||
twitch.clientSecret &&
|
||||
tokenData.refreshToken
|
||||
) {
|
||||
logger.debug('↗ sending twitch message');
|
||||
|
||||
messages.push(
|
||||
`${Print.inStock(link, store)}\n${
|
||||
link.cartUrl ? link.cartUrl : link.url
|
||||
}`
|
||||
);
|
||||
messages.push(
|
||||
`${Print.inStock(link, store)}\n${link.cartUrl ? link.cartUrl : link.url}`
|
||||
);
|
||||
|
||||
if (!alreadySaying) {
|
||||
alreadySaying = true;
|
||||
void chatClient.connect();
|
||||
}
|
||||
}
|
||||
if (!alreadySaying) {
|
||||
alreadySaying = true;
|
||||
void chatClient.connect();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+26
-26
@@ -3,38 +3,38 @@ import {Print, logger} from '../logger';
|
||||
import Twitter from 'twitter';
|
||||
import {config} from '../config';
|
||||
|
||||
const twitter = config.notifications.twitter;
|
||||
const {twitter} = config.notifications;
|
||||
|
||||
const client = new Twitter({
|
||||
access_token_key: twitter.accessTokenKey,
|
||||
access_token_secret: twitter.accessTokenSecret,
|
||||
consumer_key: twitter.consumerKey,
|
||||
consumer_secret: twitter.consumerSecret
|
||||
access_token_key: twitter.accessTokenKey,
|
||||
access_token_secret: twitter.accessTokenSecret,
|
||||
consumer_key: twitter.consumerKey,
|
||||
consumer_secret: twitter.consumerSecret,
|
||||
});
|
||||
|
||||
export function sendTweet(link: Link, store: Store) {
|
||||
if (
|
||||
twitter.accessTokenKey &&
|
||||
twitter.accessTokenSecret &&
|
||||
twitter.consumerKey &&
|
||||
twitter.consumerSecret
|
||||
) {
|
||||
logger.debug('↗ sending twitter message');
|
||||
if (
|
||||
twitter.accessTokenKey &&
|
||||
twitter.accessTokenSecret &&
|
||||
twitter.consumerKey &&
|
||||
twitter.consumerSecret
|
||||
) {
|
||||
logger.debug('↗ sending twitter message');
|
||||
|
||||
let status = `${Print.inStock(link, store)}\n${
|
||||
link.cartUrl ? link.cartUrl : link.url
|
||||
}`;
|
||||
let status = `${Print.inStock(link, store)}\n${
|
||||
link.cartUrl ? link.cartUrl : link.url
|
||||
}`;
|
||||
|
||||
if (twitter.tweetTags) {
|
||||
status += `\n\n${twitter.tweetTags}`;
|
||||
}
|
||||
if (twitter.tweetTags) {
|
||||
status += `\n\n${twitter.tweetTags}`;
|
||||
}
|
||||
|
||||
client.post('statuses/update', {status}, (error) => {
|
||||
if (error) {
|
||||
logger.error("✖ couldn't send twitter notification", error);
|
||||
} else {
|
||||
logger.info('✔ twitter notification sent');
|
||||
}
|
||||
});
|
||||
}
|
||||
client.post('statuses/update', {status}, error => {
|
||||
if (error) {
|
||||
logger.error("✖ couldn't send twitter notification", error);
|
||||
} else {
|
||||
logger.info('✔ twitter notification sent');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
+43
-56
@@ -6,77 +6,64 @@ import {filterSeries} from './filter';
|
||||
import {usingResponse} from '../util';
|
||||
|
||||
function addNewLinks(store: Store, links: Link[], series: Series) {
|
||||
if (links.length === 0) {
|
||||
logger.debug(
|
||||
Print.message('NO STORE LINKS FOUND', series, store, true)
|
||||
);
|
||||
if (links.length === 0) {
|
||||
logger.debug(Print.message('NO STORE LINKS FOUND', series, store, true));
|
||||
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
const existingUrls = new Set(store.links.map((link) => link.url));
|
||||
const newLinks = links.filter((link) => !existingUrls.has(link.url));
|
||||
const existingUrls = new Set(store.links.map(link => link.url));
|
||||
const newLinks = links.filter(link => !existingUrls.has(link.url));
|
||||
|
||||
if (newLinks.length === 0) {
|
||||
return;
|
||||
}
|
||||
if (newLinks.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
logger.debug(
|
||||
Print.message(
|
||||
`FOUND ${newLinks.length} STORE LINKS`,
|
||||
series,
|
||||
store,
|
||||
true
|
||||
)
|
||||
);
|
||||
logger.debug(JSON.stringify(newLinks, null, 2));
|
||||
logger.debug(
|
||||
Print.message(`FOUND ${newLinks.length} STORE LINKS`, series, store, true)
|
||||
);
|
||||
logger.debug(JSON.stringify(newLinks, null, 2));
|
||||
|
||||
store.links = store.links.concat(newLinks);
|
||||
store.links = store.links.concat(newLinks);
|
||||
}
|
||||
|
||||
export async function fetchLinks(store: Store, browser: Browser) {
|
||||
if (!store.linksBuilder) {
|
||||
return;
|
||||
}
|
||||
if (!store.linksBuilder) {
|
||||
return;
|
||||
}
|
||||
|
||||
const promises: Array<Promise<void>> = [];
|
||||
const promises: Array<Promise<void>> = [];
|
||||
|
||||
for (let {series, url} of store.linksBuilder.urls) {
|
||||
if (!filterSeries(series)) {
|
||||
continue;
|
||||
}
|
||||
// eslint-disable-next-line prefer-const
|
||||
for (let {series, url} of store.linksBuilder.urls) {
|
||||
if (!filterSeries(series)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
logger.debug(
|
||||
Print.message('DETECTING STORE LINKS', series, store, true)
|
||||
);
|
||||
logger.debug(Print.message('DETECTING STORE LINKS', series, store, true));
|
||||
|
||||
if (!Array.isArray(url)) {
|
||||
url = [url];
|
||||
}
|
||||
if (!Array.isArray(url)) {
|
||||
url = [url];
|
||||
}
|
||||
|
||||
url.map((x) =>
|
||||
promises.push(
|
||||
usingResponse(browser, x, async (response) => {
|
||||
const text = await response?.text();
|
||||
url.map(x =>
|
||||
promises.push(
|
||||
usingResponse(browser, x, async response => {
|
||||
const text = await response?.text();
|
||||
|
||||
if (!text) {
|
||||
logger.error(
|
||||
Print.message('NO RESPONSE', series, store, true)
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (!text) {
|
||||
logger.error(Print.message('NO RESPONSE', series, store, true));
|
||||
return;
|
||||
}
|
||||
|
||||
const docElement = cheerio.load(text).root();
|
||||
const links = store.linksBuilder!.builder(
|
||||
docElement,
|
||||
series
|
||||
);
|
||||
const docElement = cheerio.load(text).root();
|
||||
const links = store.linksBuilder!.builder(docElement, series);
|
||||
|
||||
addNewLinks(store, links, series);
|
||||
})
|
||||
)
|
||||
);
|
||||
}
|
||||
addNewLinks(store, links, series);
|
||||
})
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
await Promise.all(promises);
|
||||
await Promise.all(promises);
|
||||
}
|
||||
|
||||
+33
-36
@@ -7,11 +7,11 @@ import {config} from '../config';
|
||||
* @param brand The brand of the GPU
|
||||
*/
|
||||
function filterBrand(brand: Link['brand']): boolean {
|
||||
if (config.store.showOnlyBrands.length === 0) {
|
||||
return true;
|
||||
}
|
||||
if (config.store.showOnlyBrands.length === 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return config.store.showOnlyBrands.includes(brand);
|
||||
return config.store.showOnlyBrands.includes(brand);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -21,31 +21,28 @@ function filterBrand(brand: Link['brand']): boolean {
|
||||
* @param series The series of the GPU
|
||||
*/
|
||||
function filterModel(model: Link['model'], series: Link['series']): boolean {
|
||||
if (config.store.showOnlyModels.length === 0) {
|
||||
return true;
|
||||
}
|
||||
if (config.store.showOnlyModels.length === 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const sanitizedModel = model.replace(/\s/g, '');
|
||||
const sanitizedSeries = series.replace(/\s/g, '');
|
||||
for (const configModelEntry of config.store.showOnlyModels) {
|
||||
const sanitizedConfigModel = configModelEntry.name.replace(/\s/g, '');
|
||||
const sanitizedConfigSeries = configModelEntry.series.replace(
|
||||
/\s/g,
|
||||
''
|
||||
);
|
||||
if (sanitizedConfigSeries) {
|
||||
if (
|
||||
sanitizedSeries === sanitizedConfigSeries &&
|
||||
sanitizedModel === sanitizedConfigModel
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
} else if (sanitizedModel === sanitizedConfigModel) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
const sanitizedModel = model.replace(/\s/g, '');
|
||||
const sanitizedSeries = series.replace(/\s/g, '');
|
||||
for (const configModelEntry of config.store.showOnlyModels) {
|
||||
const sanitizedConfigModel = configModelEntry.name.replace(/\s/g, '');
|
||||
const sanitizedConfigSeries = configModelEntry.series.replace(/\s/g, '');
|
||||
if (sanitizedConfigSeries) {
|
||||
if (
|
||||
sanitizedSeries === sanitizedConfigSeries &&
|
||||
sanitizedModel === sanitizedConfigModel
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
} else if (sanitizedModel === sanitizedConfigModel) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -54,11 +51,11 @@ function filterModel(model: Link['model'], series: Link['series']): boolean {
|
||||
* @param series The series of the GPU
|
||||
*/
|
||||
export function filterSeries(series: Link['series']): boolean {
|
||||
if (config.store.showOnlySeries.length === 0) {
|
||||
return true;
|
||||
}
|
||||
if (config.store.showOnlySeries.length === 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return config.store.showOnlySeries.includes(series);
|
||||
return config.store.showOnlySeries.includes(series);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -67,9 +64,9 @@ export function filterSeries(series: Link['series']): boolean {
|
||||
* @param link The store link of the GPU
|
||||
*/
|
||||
export function filterStoreLink(link: Link): boolean {
|
||||
return (
|
||||
filterBrand(link.brand) &&
|
||||
filterModel(link.model, link.series) &&
|
||||
filterSeries(link.series)
|
||||
);
|
||||
return (
|
||||
filterBrand(link.brand) &&
|
||||
filterModel(link.model, link.series) &&
|
||||
filterSeries(link.series)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -3,101 +3,101 @@ import {Page} from 'puppeteer';
|
||||
import {logger} from '../logger';
|
||||
|
||||
export type Selector = {
|
||||
requireVisible: boolean;
|
||||
selector: string;
|
||||
type: 'innerHTML' | 'outerHTML' | 'textContent';
|
||||
requireVisible: boolean;
|
||||
selector: string;
|
||||
type: 'innerHTML' | 'outerHTML' | 'textContent';
|
||||
};
|
||||
|
||||
function isElementArray(query: LabelQuery): query is Element[] {
|
||||
return (
|
||||
Array.isArray(query) && query.length > 0 && typeof query[0] === 'object'
|
||||
);
|
||||
return (
|
||||
Array.isArray(query) && query.length > 0 && typeof query[0] === 'object'
|
||||
);
|
||||
}
|
||||
|
||||
function getQueryAsElementArray(
|
||||
query: LabelQuery,
|
||||
defaultContainer: string
|
||||
query: LabelQuery,
|
||||
defaultContainer: string
|
||||
): Array<Required<Element>> {
|
||||
if (isElementArray(query)) {
|
||||
return query.map((x) => ({
|
||||
container: x.container ?? defaultContainer,
|
||||
text: x.text
|
||||
}));
|
||||
}
|
||||
if (isElementArray(query)) {
|
||||
return query.map(x => ({
|
||||
container: x.container ?? defaultContainer,
|
||||
text: x.text,
|
||||
}));
|
||||
}
|
||||
|
||||
if (Array.isArray(query)) {
|
||||
return [
|
||||
{
|
||||
container: defaultContainer,
|
||||
text: query
|
||||
}
|
||||
];
|
||||
}
|
||||
if (Array.isArray(query)) {
|
||||
return [
|
||||
{
|
||||
container: defaultContainer,
|
||||
text: query,
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
return [
|
||||
{
|
||||
container: query.container ?? defaultContainer,
|
||||
text: query.text
|
||||
}
|
||||
];
|
||||
return [
|
||||
{
|
||||
container: query.container ?? defaultContainer,
|
||||
text: query.text,
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
export async function pageIncludesLabels(
|
||||
page: Page,
|
||||
query: LabelQuery,
|
||||
options: Selector
|
||||
page: Page,
|
||||
query: LabelQuery,
|
||||
options: Selector
|
||||
) {
|
||||
const elementQueries = getQueryAsElementArray(query, options.selector);
|
||||
const elementQueries = getQueryAsElementArray(query, options.selector);
|
||||
|
||||
const resolved = await Promise.all(
|
||||
elementQueries.map(async (query) => {
|
||||
const selector = {...options, selector: query.container};
|
||||
const contents = (await extractPageContents(page, selector)) ?? '';
|
||||
const resolved = await Promise.all(
|
||||
elementQueries.map(async query => {
|
||||
const selector = {...options, selector: query.container};
|
||||
const contents = (await extractPageContents(page, selector)) ?? '';
|
||||
|
||||
if (!contents) {
|
||||
return false;
|
||||
}
|
||||
if (!contents) {
|
||||
return false;
|
||||
}
|
||||
|
||||
logger.debug(contents);
|
||||
logger.debug(contents);
|
||||
|
||||
return includesLabels(contents, query.text);
|
||||
})
|
||||
);
|
||||
return includesLabels(contents, query.text);
|
||||
})
|
||||
);
|
||||
|
||||
return resolved.includes(true);
|
||||
return resolved.includes(true);
|
||||
}
|
||||
|
||||
export async function extractPageContents(
|
||||
page: Page,
|
||||
selector: Selector
|
||||
page: Page,
|
||||
selector: Selector
|
||||
): Promise<string | null> {
|
||||
return page.evaluate((options: Selector) => {
|
||||
const element: globalThis.HTMLElement | null = document.querySelector(
|
||||
options.selector
|
||||
);
|
||||
return page.evaluate((options: Selector) => {
|
||||
const element: globalThis.HTMLElement | null = document.querySelector(
|
||||
options.selector
|
||||
);
|
||||
|
||||
if (!element) {
|
||||
return null;
|
||||
}
|
||||
if (!element) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (
|
||||
options.requireVisible &&
|
||||
!(element.offsetWidth > 0 && element.offsetHeight > 0)
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
if (
|
||||
options.requireVisible &&
|
||||
!(element.offsetWidth > 0 && element.offsetHeight > 0)
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
|
||||
switch (options.type) {
|
||||
case 'innerHTML':
|
||||
return element.innerHTML;
|
||||
case 'outerHTML':
|
||||
return element.outerHTML;
|
||||
case 'textContent':
|
||||
return element.textContent;
|
||||
default:
|
||||
return 'Error: selector.type is unknown';
|
||||
}
|
||||
}, selector);
|
||||
switch (options.type) {
|
||||
case 'innerHTML':
|
||||
return element.innerHTML;
|
||||
case 'outerHTML':
|
||||
return element.outerHTML;
|
||||
case 'textContent':
|
||||
return element.textContent;
|
||||
default:
|
||||
return 'Error: selector.type is unknown';
|
||||
}
|
||||
}, selector);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -107,32 +107,32 @@ export async function extractPageContents(
|
||||
* @param searchLabels Search labels for a match.
|
||||
*/
|
||||
export function includesLabels(
|
||||
domText: string,
|
||||
searchLabels: string[]
|
||||
domText: string,
|
||||
searchLabels: string[]
|
||||
): boolean {
|
||||
const domTextLowerCase = domText.toLowerCase();
|
||||
return searchLabels.some((label) =>
|
||||
domTextLowerCase.includes(label.toLowerCase())
|
||||
);
|
||||
const domTextLowerCase = domText.toLowerCase();
|
||||
return searchLabels.some(label =>
|
||||
domTextLowerCase.includes(label.toLowerCase())
|
||||
);
|
||||
}
|
||||
|
||||
export async function getPrice(
|
||||
page: Page,
|
||||
query: Pricing,
|
||||
options: Selector
|
||||
page: Page,
|
||||
query: Pricing,
|
||||
options: Selector
|
||||
): Promise<number | null> {
|
||||
const selector = {...options, selector: query.container};
|
||||
const priceString = await extractPageContents(page, selector);
|
||||
const selector = {...options, selector: query.container};
|
||||
const priceString = await extractPageContents(page, selector);
|
||||
|
||||
if (priceString) {
|
||||
const priceSeparator = query.euroFormat ? /\./g : /,/g;
|
||||
const price = Number.parseFloat(
|
||||
priceString.replace(priceSeparator, '').match(/\d+/g)!.join('.')
|
||||
);
|
||||
if (priceString) {
|
||||
const priceSeparator = query.euroFormat ? /\./g : /,/g;
|
||||
const price = Number.parseFloat(
|
||||
priceString.replace(priceSeparator, '').match(/\d+/g)!.join('.')
|
||||
);
|
||||
|
||||
logger.debug('received price', price);
|
||||
return price;
|
||||
}
|
||||
logger.debug('received price', price);
|
||||
return price;
|
||||
}
|
||||
|
||||
return null;
|
||||
return null;
|
||||
}
|
||||
|
||||
+439
-315
@@ -1,20 +1,20 @@
|
||||
import {
|
||||
Browser,
|
||||
Page,
|
||||
PageEventObj,
|
||||
Request,
|
||||
RespondOptions,
|
||||
Response
|
||||
Browser,
|
||||
Page,
|
||||
HTTPRequest,
|
||||
HTTPResponse,
|
||||
ResponseForRequest,
|
||||
} from 'puppeteer';
|
||||
import {Link, Store, getStores} from './model';
|
||||
import {Print, logger} from '../logger';
|
||||
import {Selector, getPrice, pageIncludesLabels} from './includes-labels';
|
||||
import {
|
||||
closePage,
|
||||
delay,
|
||||
getRandomUserAgent,
|
||||
getSleepTime,
|
||||
isStatusCodeInRange
|
||||
closePage,
|
||||
delay,
|
||||
getRandomUserAgent,
|
||||
getSleepTime,
|
||||
isStatusCodeInRange,
|
||||
noop,
|
||||
} from '../util';
|
||||
import {disableBlockerInPage, enableBlockerInPage} from '../adblocker';
|
||||
import {config} from '../config';
|
||||
@@ -23,113 +23,124 @@ import {filterStoreLink} from './filter';
|
||||
import open from 'open';
|
||||
import {processBackoffDelay} from './model/helpers/backoff';
|
||||
import {sendNotification} from '../notification';
|
||||
import useProxy from 'puppeteer-page-proxy';
|
||||
import useProxy from '@doridian/puppeteer-page-proxy';
|
||||
|
||||
const inStock: Record<string, boolean> = {};
|
||||
|
||||
const linkBuilderLastRunTimes: Record<string, number> = {};
|
||||
|
||||
function nextProxy(store: Store) {
|
||||
if (!store.proxyList) {
|
||||
return;
|
||||
}
|
||||
if (!store.proxyList) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (store.currentProxyIndex === undefined) {
|
||||
store.currentProxyIndex = 0;
|
||||
}
|
||||
if (store.currentProxyIndex === undefined) {
|
||||
store.currentProxyIndex = 0;
|
||||
} else {
|
||||
store.currentProxyIndex++;
|
||||
}
|
||||
|
||||
store.currentProxyIndex++;
|
||||
if (store.currentProxyIndex >= store.proxyList.length) {
|
||||
store.currentProxyIndex = 0;
|
||||
}
|
||||
if (store.currentProxyIndex >= store.proxyList.length) {
|
||||
store.currentProxyIndex = 0;
|
||||
}
|
||||
|
||||
logger.info(
|
||||
`ℹ [${store.name}] Next proxy index: ${store.currentProxyIndex} / Count: ${store.proxyList.length}`
|
||||
);
|
||||
logger.debug(
|
||||
`ℹ [${store.name}] Next proxy index: ${store.currentProxyIndex} / Count: ${
|
||||
store.proxyList.length
|
||||
} (${store.proxyList[store.currentProxyIndex]})`
|
||||
);
|
||||
|
||||
return store.proxyList[store.currentProxyIndex];
|
||||
return store.proxyList[store.currentProxyIndex];
|
||||
}
|
||||
|
||||
async function handleLowBandwidth(request: Request) {
|
||||
if (!config.browser.lowBandwidth) {
|
||||
return false;
|
||||
}
|
||||
async function handleLowBandwidth(request: HTTPRequest) {
|
||||
if (!config.browser.lowBandwidth) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const typ = request.resourceType();
|
||||
if (typ === 'font' || typ === 'image') {
|
||||
try {
|
||||
await request.abort();
|
||||
} catch {}
|
||||
const typ = request.resourceType();
|
||||
if (typ === 'font' || typ === 'image') {
|
||||
try {
|
||||
await request.abort();
|
||||
} catch {
|
||||
logger.debug('Failed to abort request.');
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
async function handleProxy(request: Request, proxy?: string) {
|
||||
if (!proxy) {
|
||||
return false;
|
||||
}
|
||||
async function handleProxy(request: HTTPRequest, proxy?: string) {
|
||||
if (!proxy) {
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
await useProxy(request, proxy);
|
||||
} catch (error: unknown) {
|
||||
logger.error(error);
|
||||
try {
|
||||
await request.abort();
|
||||
} catch {}
|
||||
}
|
||||
try {
|
||||
await useProxy(request, proxy);
|
||||
} catch (error: unknown) {
|
||||
logger.error('handleProxy', error);
|
||||
try {
|
||||
await request.abort();
|
||||
} catch {
|
||||
logger.debug('Failed to abort request.');
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
async function handleAdBlock(request: Request, adBlockRequestHandler: any) {
|
||||
if (!adBlockRequestHandler) {
|
||||
return false;
|
||||
}
|
||||
async function handleAdBlock(request: HTTPRequest, adBlockRequestHandler: any) {
|
||||
if (!adBlockRequestHandler) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return new Promise((resolve) => {
|
||||
const continueFunc = async () => {
|
||||
resolve(false);
|
||||
};
|
||||
return new Promise(resolve => {
|
||||
const continueFunc = async () => {
|
||||
resolve(false);
|
||||
};
|
||||
|
||||
const abortFunc = async () => {
|
||||
try {
|
||||
await request.abort();
|
||||
} catch {}
|
||||
const abortFunc = async () => {
|
||||
try {
|
||||
await request.abort();
|
||||
} catch {
|
||||
logger.debug('Failed to abort request.');
|
||||
}
|
||||
|
||||
resolve(true);
|
||||
};
|
||||
resolve(true);
|
||||
};
|
||||
|
||||
const respondFunc = async (response: RespondOptions) => {
|
||||
try {
|
||||
await request.respond(response);
|
||||
} catch {}
|
||||
const respondFunc = async (response: ResponseForRequest) => {
|
||||
try {
|
||||
await request.respond(response);
|
||||
} catch {
|
||||
logger.debug('Failed to abort request.');
|
||||
}
|
||||
|
||||
resolve(true);
|
||||
};
|
||||
resolve(true);
|
||||
};
|
||||
|
||||
const requestProxy = new Proxy(request, {
|
||||
get(target, prop, receiver) {
|
||||
if (prop === 'continue') {
|
||||
return continueFunc;
|
||||
}
|
||||
const requestProxy = new Proxy(request, {
|
||||
get(target, prop, receiver) {
|
||||
if (prop === 'continue') {
|
||||
return continueFunc;
|
||||
}
|
||||
|
||||
if (prop === 'abort') {
|
||||
return abortFunc;
|
||||
}
|
||||
if (prop === 'abort') {
|
||||
return abortFunc;
|
||||
}
|
||||
|
||||
if (prop === 'respond') {
|
||||
return respondFunc;
|
||||
}
|
||||
if (prop === 'respond') {
|
||||
return respondFunc;
|
||||
}
|
||||
|
||||
return Reflect.get(target, prop, receiver);
|
||||
}
|
||||
});
|
||||
return Reflect.get(target, prop, receiver);
|
||||
},
|
||||
});
|
||||
|
||||
adBlockRequestHandler(requestProxy);
|
||||
});
|
||||
adBlockRequestHandler(requestProxy);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -141,286 +152,399 @@ async function handleAdBlock(request: Request, adBlockRequestHandler: any) {
|
||||
* @param store Vendor of graphics cards.
|
||||
*/
|
||||
async function lookup(browser: Browser, store: Store) {
|
||||
if (!getStores().has(store.name)) {
|
||||
return;
|
||||
}
|
||||
if (!getStores().has(store.name)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (store.linksBuilder) {
|
||||
const lastRunTime = linkBuilderLastRunTimes[store.name] ?? -1;
|
||||
const ttl = store.linksBuilder.ttl ?? Number.MAX_SAFE_INTEGER;
|
||||
if (lastRunTime === -1 || Date.now() - lastRunTime > ttl) {
|
||||
logger.info(`[${store.name}] Running linksBuilder...`);
|
||||
try {
|
||||
await fetchLinks(store, browser);
|
||||
linkBuilderLastRunTimes[store.name] = Date.now();
|
||||
} catch (error: unknown) {
|
||||
logger.error(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (store.linksBuilder) {
|
||||
const lastRunTime = linkBuilderLastRunTimes[store.name] ?? -1;
|
||||
const ttl = store.linksBuilder.ttl ?? Number.MAX_SAFE_INTEGER;
|
||||
if (lastRunTime === -1 || Date.now() - lastRunTime > ttl) {
|
||||
logger.info(`[${store.name}] Running linksBuilder...`);
|
||||
try {
|
||||
await fetchLinks(store, browser);
|
||||
linkBuilderLastRunTimes[store.name] = Date.now();
|
||||
} catch (error: unknown) {
|
||||
logger.error(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* eslint-disable no-await-in-loop */
|
||||
for (const link of store.links) {
|
||||
if (!filterStoreLink(link)) {
|
||||
continue;
|
||||
}
|
||||
/* eslint-disable no-await-in-loop */
|
||||
for (const link of store.links) {
|
||||
if (!filterStoreLink(link)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (config.page.inStockWaitTime && inStock[link.url]) {
|
||||
logger.info(Print.inStockWaiting(link, store, true));
|
||||
continue;
|
||||
}
|
||||
if (config.page.inStockWaitTime && inStock[link.url]) {
|
||||
logger.info(Print.inStockWaiting(link, store, true));
|
||||
continue;
|
||||
}
|
||||
|
||||
const proxy = nextProxy(store);
|
||||
const proxy = nextProxy(store);
|
||||
|
||||
const useAdBlock =
|
||||
!config.browser.lowBandwidth && !store.disableAdBlocker;
|
||||
const customContext = config.browser.isIncognito;
|
||||
const useAdBlock = !config.browser.lowBandwidth && !store.disableAdBlocker;
|
||||
const customContext = config.browser.isIncognito;
|
||||
|
||||
const context = customContext
|
||||
? await browser.createIncognitoBrowserContext()
|
||||
: browser.defaultBrowserContext();
|
||||
const page = await context.newPage();
|
||||
await page.setRequestInterception(true);
|
||||
const context = customContext
|
||||
? await browser.createIncognitoBrowserContext()
|
||||
: browser.defaultBrowserContext();
|
||||
const page = await context.newPage();
|
||||
await page.setRequestInterception(true);
|
||||
|
||||
page.setDefaultNavigationTimeout(config.page.timeout);
|
||||
await page.setUserAgent(await getRandomUserAgent());
|
||||
page.setDefaultNavigationTimeout(config.page.timeout);
|
||||
await page.setUserAgent(await getRandomUserAgent());
|
||||
|
||||
let adBlockRequestHandler: any;
|
||||
let pageProxy;
|
||||
if (useAdBlock) {
|
||||
const onProxyFunc = (event: keyof PageEventObj, handler: any) => {
|
||||
if (event !== 'request') {
|
||||
page.on(event, handler);
|
||||
return;
|
||||
}
|
||||
let adBlockRequestHandler: any;
|
||||
let pageProxy;
|
||||
if (useAdBlock) {
|
||||
const onProxyFunc = (event: string, handler: any) => {
|
||||
if (event !== 'request') {
|
||||
page.on(event, handler);
|
||||
return;
|
||||
}
|
||||
|
||||
adBlockRequestHandler = handler;
|
||||
};
|
||||
adBlockRequestHandler = handler;
|
||||
};
|
||||
|
||||
pageProxy = new Proxy(page, {
|
||||
get(target, prop, receiver) {
|
||||
if (prop === 'on') {
|
||||
return onProxyFunc;
|
||||
}
|
||||
pageProxy = new Proxy(page, {
|
||||
get(target, prop, receiver) {
|
||||
if (prop === 'on') {
|
||||
return onProxyFunc;
|
||||
}
|
||||
|
||||
return Reflect.get(target, prop, receiver);
|
||||
}
|
||||
});
|
||||
await enableBlockerInPage(pageProxy);
|
||||
}
|
||||
// Give dummy setRequestInterception to avoid AdBlock from messing with it
|
||||
if (prop === 'setRequestInterception') {
|
||||
return noop;
|
||||
}
|
||||
|
||||
await page.setRequestInterception(true);
|
||||
page.on('request', async (request) => {
|
||||
if (await handleLowBandwidth(request)) {
|
||||
return;
|
||||
}
|
||||
return Reflect.get(target, prop, receiver);
|
||||
},
|
||||
});
|
||||
await enableBlockerInPage(pageProxy);
|
||||
}
|
||||
|
||||
if (await handleAdBlock(request, adBlockRequestHandler)) {
|
||||
return;
|
||||
}
|
||||
await page.setRequestInterception(true);
|
||||
page.on('request', async request => {
|
||||
if (await handleLowBandwidth(request)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (await handleProxy(request, proxy)) {
|
||||
return;
|
||||
}
|
||||
if (await handleAdBlock(request, adBlockRequestHandler)) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await request.continue();
|
||||
} catch {}
|
||||
});
|
||||
if (await handleProxy(request, proxy)) {
|
||||
return;
|
||||
}
|
||||
|
||||
let statusCode = 0;
|
||||
try {
|
||||
await request.continue();
|
||||
} catch {
|
||||
logger.debug('Failed to continue request.');
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
statusCode = await lookupCard(browser, store, page, link);
|
||||
} catch (error: unknown) {
|
||||
logger.error(
|
||||
`✖ [${store.name}] ${link.brand} ${link.series} ${
|
||||
link.model
|
||||
} - ${(error as Error).message}`
|
||||
);
|
||||
const client = await page.target().createCDPSession();
|
||||
await client.send('Network.clearBrowserCookies');
|
||||
}
|
||||
if (store.captchaDeterrent) {
|
||||
await runCaptchaDeterrent(browser, store, page);
|
||||
}
|
||||
|
||||
if (pageProxy) {
|
||||
await disableBlockerInPage(pageProxy);
|
||||
}
|
||||
let statusCode = 0;
|
||||
|
||||
// Must apply backoff before closing the page, e.g. if CloudFlare is
|
||||
// used to detect bot traffic, it introduces a 5 second page delay
|
||||
// before redirecting to the next page
|
||||
await processBackoffDelay(store, link, statusCode);
|
||||
await closePage(page);
|
||||
if (customContext) {
|
||||
await context.close();
|
||||
}
|
||||
}
|
||||
/* eslint-enable no-await-in-loop */
|
||||
try {
|
||||
statusCode = await lookupCard(browser, store, page, link);
|
||||
} catch (error: unknown) {
|
||||
if (store.currentProxyIndex !== undefined && store.proxyList) {
|
||||
const proxy = `${store.currentProxyIndex + 1}/${
|
||||
store.proxyList.length
|
||||
}`;
|
||||
logger.error(
|
||||
`✖ [${proxy}] [${store.name}] ${link.brand} ${link.series} ${
|
||||
link.model
|
||||
} - ${(error as Error).message}`
|
||||
);
|
||||
} else {
|
||||
logger.error(
|
||||
`✖ [${store.name}] ${link.brand} ${link.series} ${link.model} - ${
|
||||
(error as Error).message
|
||||
}`
|
||||
);
|
||||
}
|
||||
const client = await page.target().createCDPSession();
|
||||
await client.send('Network.clearBrowserCookies');
|
||||
}
|
||||
|
||||
if (pageProxy) {
|
||||
await disableBlockerInPage(pageProxy);
|
||||
}
|
||||
|
||||
// Must apply backoff before closing the page, e.g. if CloudFlare is
|
||||
// used to detect bot traffic, it introduces a 5 second page delay
|
||||
// before redirecting to the next page
|
||||
await processBackoffDelay(store, link, statusCode);
|
||||
await closePage(page);
|
||||
if (customContext) {
|
||||
await context.close();
|
||||
}
|
||||
}
|
||||
/* eslint-enable no-await-in-loop */
|
||||
}
|
||||
|
||||
async function lookupCard(
|
||||
browser: Browser,
|
||||
store: Store,
|
||||
page: Page,
|
||||
link: Link
|
||||
browser: Browser,
|
||||
store: Store,
|
||||
page: Page,
|
||||
link: Link
|
||||
): Promise<number> {
|
||||
const givenWaitFor = store.waitUntil ? store.waitUntil : 'networkidle0';
|
||||
const response: Response | null = await page.goto(link.url, {
|
||||
waitUntil: givenWaitFor
|
||||
});
|
||||
const givenWaitFor = store.waitUntil ? store.waitUntil : 'networkidle0';
|
||||
const response: HTTPResponse | null = await page.goto(link.url, {
|
||||
waitUntil: givenWaitFor,
|
||||
});
|
||||
|
||||
if (!response) {
|
||||
logger.debug(Print.noResponse(link, store, true));
|
||||
}
|
||||
const successStatusCodes = store.successStatusCodes ?? [[0, 399]];
|
||||
const statusCode = await handleResponse(browser, store, page, link, response);
|
||||
|
||||
const successStatusCodes = store.successStatusCodes ?? [[0, 399]];
|
||||
const statusCode = response?.status() ?? 0;
|
||||
if (!isStatusCodeInRange(statusCode, successStatusCodes)) {
|
||||
if (statusCode === 429) {
|
||||
logger.warn(Print.rateLimit(link, store, true));
|
||||
} else {
|
||||
logger.warn(Print.badStatusCode(link, store, statusCode, true));
|
||||
}
|
||||
if (!isStatusCodeInRange(statusCode, successStatusCodes)) {
|
||||
return statusCode;
|
||||
}
|
||||
|
||||
return statusCode;
|
||||
}
|
||||
if (await lookupCardInStock(store, page, link)) {
|
||||
const givenUrl =
|
||||
link.cartUrl && config.store.autoAddToCart ? link.cartUrl : link.url;
|
||||
logger.info(`${Print.inStock(link, store, true)}\n${givenUrl}`);
|
||||
|
||||
if (await lookupCardInStock(store, page, link)) {
|
||||
const givenUrl =
|
||||
link.cartUrl && config.store.autoAddToCart
|
||||
? link.cartUrl
|
||||
: link.url;
|
||||
logger.info(`${Print.inStock(link, store, true)}\n${givenUrl}`);
|
||||
if (config.browser.open) {
|
||||
await (link.openCartAction === undefined
|
||||
? open(givenUrl)
|
||||
: link.openCartAction(browser));
|
||||
}
|
||||
|
||||
if (config.browser.open) {
|
||||
await (link.openCartAction === undefined
|
||||
? open(givenUrl)
|
||||
: link.openCartAction(browser));
|
||||
}
|
||||
sendNotification(link, store);
|
||||
|
||||
sendNotification(link, store);
|
||||
if (config.page.inStockWaitTime) {
|
||||
inStock[link.url] = true;
|
||||
|
||||
if (config.page.inStockWaitTime) {
|
||||
inStock[link.url] = true;
|
||||
setTimeout(() => {
|
||||
inStock[link.url] = false;
|
||||
}, 1000 * config.page.inStockWaitTime);
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
inStock[link.url] = false;
|
||||
}, 1000 * config.page.inStockWaitTime);
|
||||
}
|
||||
if (config.page.screenshot) {
|
||||
logger.debug('ℹ saving screenshot');
|
||||
|
||||
if (config.page.screenshot) {
|
||||
logger.debug('ℹ saving screenshot');
|
||||
link.screenshot = `success-${Date.now()}.png`;
|
||||
await page.screenshot({path: link.screenshot});
|
||||
}
|
||||
}
|
||||
|
||||
link.screenshot = `success-${Date.now()}.png`;
|
||||
await page.screenshot({path: link.screenshot});
|
||||
}
|
||||
}
|
||||
return statusCode;
|
||||
}
|
||||
|
||||
return statusCode;
|
||||
// eslint-disable-next-line max-params
|
||||
async function handleResponse(
|
||||
browser: Browser,
|
||||
store: Store,
|
||||
page: Page,
|
||||
link: Link,
|
||||
response?: HTTPResponse | null,
|
||||
recursionDepth = 0
|
||||
) {
|
||||
if (!response) {
|
||||
logger.debug(Print.noResponse(link, store, true));
|
||||
}
|
||||
|
||||
const successStatusCodes = store.successStatusCodes ?? [[0, 399]];
|
||||
let statusCode = response?.status() ?? 0;
|
||||
if (!isStatusCodeInRange(statusCode, successStatusCodes)) {
|
||||
if (statusCode === 429) {
|
||||
logger.warn(Print.rateLimit(link, store, true));
|
||||
} else if (statusCode === 503) {
|
||||
if (await checkIsCloudflare(store, page, link)) {
|
||||
if (recursionDepth > 4) {
|
||||
logger.warn(Print.recursionLimit(link, store, true));
|
||||
} else {
|
||||
const response: HTTPResponse | null = await page.waitForNavigation({
|
||||
waitUntil: 'networkidle0',
|
||||
});
|
||||
recursionDepth++;
|
||||
statusCode = await handleResponse(
|
||||
browser,
|
||||
store,
|
||||
page,
|
||||
link,
|
||||
response,
|
||||
recursionDepth
|
||||
);
|
||||
}
|
||||
} else {
|
||||
logger.warn(Print.badStatusCode(link, store, statusCode, true));
|
||||
}
|
||||
} else {
|
||||
logger.warn(Print.badStatusCode(link, store, statusCode, true));
|
||||
}
|
||||
}
|
||||
|
||||
return statusCode;
|
||||
}
|
||||
|
||||
async function checkIsCloudflare(store: Store, page: Page, link: Link) {
|
||||
const baseOptions: Selector = {
|
||||
requireVisible: true,
|
||||
selector: 'body',
|
||||
type: 'textContent',
|
||||
};
|
||||
|
||||
const cloudflareLabel = {
|
||||
container: 'div[class="attribution"] a[rel="noopener noreferrer"]',
|
||||
text: ['Cloudflare'],
|
||||
};
|
||||
|
||||
if (await pageIncludesLabels(page, cloudflareLabel, baseOptions)) {
|
||||
logger.warn(Print.cloudflare(link, store, true));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
async function lookupCardInStock(store: Store, page: Page, link: Link) {
|
||||
const baseOptions: Selector = {
|
||||
requireVisible: false,
|
||||
selector: store.labels.container ?? 'body',
|
||||
type: 'textContent'
|
||||
};
|
||||
const baseOptions: Selector = {
|
||||
requireVisible: false,
|
||||
selector: store.labels.container ?? 'body',
|
||||
type: 'textContent',
|
||||
};
|
||||
|
||||
if (store.labels.captcha) {
|
||||
if (await pageIncludesLabels(page, store.labels.captcha, baseOptions)) {
|
||||
logger.warn(Print.captcha(link, store, true));
|
||||
await delay(getSleepTime(store));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (store.labels.captcha) {
|
||||
if (await pageIncludesLabels(page, store.labels.captcha, baseOptions)) {
|
||||
logger.warn(Print.captcha(link, store, true));
|
||||
await delay(getSleepTime(store));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (store.labels.bannedSeller) {
|
||||
if (
|
||||
await pageIncludesLabels(
|
||||
page,
|
||||
store.labels.bannedSeller,
|
||||
baseOptions
|
||||
)
|
||||
) {
|
||||
logger.warn(Print.bannedSeller(link, store, true));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (store.labels.bannedSeller) {
|
||||
if (
|
||||
await pageIncludesLabels(page, store.labels.bannedSeller, baseOptions)
|
||||
) {
|
||||
logger.warn(Print.bannedSeller(link, store, true));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (store.labels.maxPrice) {
|
||||
const maxPrice = config.store.maxPrice.series[link.series];
|
||||
if (store.labels.outOfStock) {
|
||||
if (await pageIncludesLabels(page, store.labels.outOfStock, baseOptions)) {
|
||||
logger.info(Print.outOfStock(link, store, true));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
link.price = await getPrice(page, store.labels.maxPrice, baseOptions);
|
||||
if (store.labels.maxPrice) {
|
||||
const maxPrice = config.store.maxPrice.series[link.series];
|
||||
|
||||
if (link.price && link.price > maxPrice && maxPrice > 0) {
|
||||
logger.info(Print.maxPrice(link, store, maxPrice, true));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
link.price = await getPrice(page, store.labels.maxPrice, baseOptions);
|
||||
|
||||
// Fixme: currently causing issues
|
||||
// Do API inventory validation in realtime (no cache) if available
|
||||
// if (
|
||||
// store.realTimeInventoryLookup !== undefined &&
|
||||
// link.itemNumber !== undefined
|
||||
// ) {
|
||||
// return store.realTimeInventoryLookup(link.itemNumber);
|
||||
// }
|
||||
if (link.price && link.price > maxPrice && maxPrice > 0) {
|
||||
logger.info(Print.maxPrice(link, store, maxPrice, true));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (store.labels.outOfStock) {
|
||||
if (
|
||||
await pageIncludesLabels(page, store.labels.outOfStock, baseOptions)
|
||||
) {
|
||||
logger.info(Print.outOfStock(link, store, true));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (link.labels?.inStock) {
|
||||
const options = {
|
||||
...baseOptions,
|
||||
requireVisible: true,
|
||||
type: 'outerHTML' as const,
|
||||
};
|
||||
|
||||
if (store.labels.inStock) {
|
||||
const options = {
|
||||
...baseOptions,
|
||||
requireVisible: true,
|
||||
type: 'outerHTML' as const
|
||||
};
|
||||
if (!(await pageIncludesLabels(page, link.labels.inStock, options))) {
|
||||
logger.info(Print.outOfStock(link, store, true));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(await pageIncludesLabels(page, store.labels.inStock, options))) {
|
||||
logger.info(Print.outOfStock(link, store, true));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (store.labels.inStock) {
|
||||
const options = {
|
||||
...baseOptions,
|
||||
requireVisible: true,
|
||||
type: 'outerHTML' as const,
|
||||
};
|
||||
|
||||
if (link.labels?.inStock) {
|
||||
const options = {
|
||||
...baseOptions,
|
||||
requireVisible: true,
|
||||
type: 'outerHTML' as const
|
||||
};
|
||||
if (!(await pageIncludesLabels(page, store.labels.inStock, options))) {
|
||||
logger.info(Print.outOfStock(link, store, true));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(await pageIncludesLabels(page, link.labels.inStock, options))) {
|
||||
logger.info(Print.outOfStock(link, store, true));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
return true;
|
||||
async function runCaptchaDeterrent(browser: Browser, store: Store, page: Page) {
|
||||
const successStatusCodes = store.successStatusCodes ?? [[0, 399]];
|
||||
let statusCode = 0;
|
||||
let deterrentLinks: string[] = [];
|
||||
|
||||
logger.debug(`[${store.name}] Navigating to random anti-captcha page...`);
|
||||
|
||||
if (store.captchaDeterrent?.hardLinks?.length) {
|
||||
deterrentLinks = deterrentLinks.concat(store.captchaDeterrent.hardLinks);
|
||||
}
|
||||
|
||||
if (store.captchaDeterrent?.searchUrl) {
|
||||
if (store.captchaDeterrent.searchTerms) {
|
||||
store.captchaDeterrent.searchTerms.forEach(element =>
|
||||
deterrentLinks.push(
|
||||
store.captchaDeterrent?.searchUrl
|
||||
? store.captchaDeterrent.searchUrl.replace('%%s', element)
|
||||
: ''
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (deterrentLinks.length > 0) {
|
||||
const link: Link = {
|
||||
brand: 'captcha-deterrent',
|
||||
model: 'captcha-deterrent',
|
||||
series: 'captcha-deterrent',
|
||||
url: deterrentLinks[Math.floor(Math.random() * deterrentLinks.length)],
|
||||
};
|
||||
logger.debug(`Selected captcha-deterrent link: ${link.url}`);
|
||||
|
||||
try {
|
||||
const givenWaitFor = store.waitUntil ? store.waitUntil : 'networkidle0';
|
||||
const response: HTTPResponse | null = await page.goto(link.url, {
|
||||
waitUntil: givenWaitFor,
|
||||
});
|
||||
statusCode = await handleResponse(browser, store, page, link, response);
|
||||
setTimeout(() => {
|
||||
// Do nothing
|
||||
}, 3000);
|
||||
} catch (error: unknown) {
|
||||
logger.error(error);
|
||||
}
|
||||
|
||||
if (!isStatusCodeInRange(statusCode, successStatusCodes)) {
|
||||
logger.warn(
|
||||
`✖ [${store.name}] - Failed to navigate to anti-captcha target: ${link.url}`
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export async function tryLookupAndLoop(browser: Browser, store: Store) {
|
||||
if (!browser.isConnected()) {
|
||||
logger.debug(
|
||||
`[${store.name}] Ending this loop as browser is disposed...`
|
||||
);
|
||||
return;
|
||||
}
|
||||
if (!browser.isConnected()) {
|
||||
logger.debug(`[${store.name}] Ending this loop as browser is disposed...`);
|
||||
return;
|
||||
}
|
||||
|
||||
logger.debug(`[${store.name}] Starting lookup...`);
|
||||
try {
|
||||
await lookup(browser, store);
|
||||
} catch (error: unknown) {
|
||||
logger.error(error);
|
||||
}
|
||||
logger.debug(`[${store.name}] Starting lookup...`);
|
||||
try {
|
||||
await lookup(browser, store);
|
||||
} catch (error: unknown) {
|
||||
logger.error(error);
|
||||
}
|
||||
|
||||
const sleepTime = getSleepTime(store);
|
||||
logger.debug(`[${store.name}] Lookup done, next one in ${sleepTime} ms`);
|
||||
setTimeout(tryLookupAndLoop, sleepTime, browser, store);
|
||||
const sleepTime = getSleepTime(store);
|
||||
logger.debug(`[${store.name}] Lookup done, next one in ${sleepTime} ms`);
|
||||
setTimeout(tryLookupAndLoop, sleepTime, browser, store);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,234 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AComPC: Store = {
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.filial_stock',
|
||||
text: ['lagernd', 'im Zulauf'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.price',
|
||||
euroFormat: true,
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '.filial_stock',
|
||||
text: ['nicht lieferbar'],
|
||||
},
|
||||
],
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/ASUS-ROG-STRIX-RTX3080-10G-GAMING-Grafikkarten-GF-RTX-3080-10-GB-GDDR6X-PCIe-4.0-2-x-HDMI-3-x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/ASUS-ROG-STRIX-RTX3080-O10G-GAMING-OC-Edition-Grafikkarten-GF-RTX-3080-10-GB-GDDR6X-PCIe-4.0-2-x-HDMI-3-x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/ASUS-TUF-Gaming-GeForce-RTX-3080-Grafikkarten-GF-RTX-3080-10-GB-GDDR6X-PCIe-4.0-x16-2x-HDMI-3x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/ASUS-TUF-Gaming-GeForce-RTX-3080-OC-Grafikkarten-GF-RTX-3080-10-GB-GDDR6X-PCIe-4.0-x16-2x-HDMI-3x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus master',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/Gigabyte-AORUS-GeForce-RTX-3080-MASTER-10G-Grafikkarten-GF-RTX-3080-10-GB-GDDR6X-PCIe-4.0-x16-3-x-DisplayPort-3-x-HDMI.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus xtreme',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/Gigabyte-AORUS-GeForce-RTX-3080-XTREME-10G-Grafikkarten-GF-RTX-3080-10-GB-GDDR6X-PCIe-4.0-x16-3-x-DisplayPort-3-x-HDMI.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/Gigabyte-GeForce-RTX-3080-Eagle-OC-10G-Grafikkarten-GF-RTX-3080-10-GB-GDDR6X-PCIe-4.0-x16-2x-HDMI-3x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/Gigabyte-GeForce-RTX-3080-Eagle-10G-Grafikkarte-10.240-MB.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/Gigabyte-GeForce-RTX-3080-GAMING-OC-10G-Grafikkarten-GF-RTX-3080-10-GB-GDDR6X-PCIe-4.0-x16-2x-HDMI-3x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'vision oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/Gigabyte-GeForce-RTX-3080-Vision-OC-10G-Grafikkarten-GF-RTX-3080-10GB-GDDR6X-PCIe-4.0-x16-2x-HDMI-3x-DP-weiss.html',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'twin x2 oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/Inno3D-GeForce-RTX-3080-Twin-X2-OC-Grafikkarten-GF-RTX-3080-10-GB-GDDR6-PCIe-4.0-x16-HDMI-3x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/MSI-GeForce-RTX-3080-Gaming-X-Trio-10G-Grafikkarten-GF-RTX-3080-10-GB-GDDR6X-HDMI-3x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/MSI-GeForce-RTX-3080-Ventus-3X-10G-OC-Grafikkarten-GF-RTX-3080-10-GB-GDDR6X-PCIe-4.0-x16-HDMI-3x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'amp holo',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/ZOTAC-GAMING-GeForce-RTX-3080-AMP-Holo-Grafikkarten-GF-RTX-3080-10-GB-GDDR6X-PCIe-4.0-HDMI-3-x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/ZOTAC-GAMING-GeForce-RTX-3080-Trinity-OC-Grafikkarten-GF-RTX-3080-10-GB-GDDR6X-PCIe-4.0-HDMI-3-x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/ZOTAC-GAMING-GeForce-RTX-3080-Trinity-Grafikkarten-GF-RTX-3080-10-GB-GDDR6X-PCIe-4.0-HDMI-3x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.acom-pc.de/Peripherie-Zubehoer/noch-nicht-kategorisierte-Artikel/ASUS-ROG-Strix-GeForce-RTX-3090-ROG-STRIX-RTX3090-24G-GAMING-24GB-GDDR6X-2x-HDMI-3x-DP-90YV0F90-M0NM00-.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/ASUS-ROG-STRIX-RTX3090-O24G-GAMING-OC-Edition-Grafikkarten-GF-RTX-3090-24-GB-GDDR6X-PCIe-4.0-2-x-HDMI-3-x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/ASUS-TUF-Gaming-GeForce-RTX-3090-Grafikkarten-GF-RTX-3090-24-GB-GDDR6X-PCIe-4.0-x16-2x-HDMI-3x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/ASUS-TUF-Gaming-GeForce-RTX-3090-OC-Grafikkarten-GF-RTX-3090-24-GB-GDDR6X-PCIe-4.0-x16-2x-HDMI-3x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus master',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/Gigabyte-Aorus-GeForce-RTX-3090-Master-24G-Grafikkarten-GF-RTX-3090-24-GB-GDDR6X-PCIe-4.0-x16-HDMI-3x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/Gigabyte-GeForce-RTX-3090-Eagle-OC-24G-Grafikkarten-GF-RTX-3090-24-GB-GDDR6X-PCIe-4.0-x16-2x-HDMI-3x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/Gigabyte-GeForce-RTX-3090-Gaming-OC-24G-Grafikkarten-GF-RTX-3090-24-GB-GDDR6X-PCIe-4.0-x16-2x-HDMI-3x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/MSI-RTX-3090-GAMING-X-TRIO-Grafikkarten-GF-RTX-3090-24-GB-GDDR6X-PCIe-4.0-x16-HDMI-3x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/MSI-GeForce-RTX-3090-Ventus-3X-24G-OC-Grafikkarten-GF-RTX-3090-24-GB-GDDR6X-PCIe-4.0-x16-HDMI-3x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/Grafikkarten-Zubehoer/Grafikkarten-NVIDIA-PCI-Express/ZOTAC-GAMING-GeForce-RTX-3090-Trinity-Grafikkarten-GF-RTX-3090-24-GB-GDDR6X-PCIe-4.0-HDMI-3x-DisplayPort.html',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/CPU-Prozessor-/-CPU-Kuehler-Zubehoer/AMD-CPU/AMD-CPU-Socket-AM4/AMD-RYZEN-5-5600X-4.60GHZ-6-CORE-SKT-AM4-35MB-65W-PIB.html',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/CPU-Prozessor-/-CPU-Kuehler-Zubehoer/AMD-CPU/AMD-CPU-Socket-AM4/AMD-RYZEN-7-5800X-4.70GHZ-8-CORE-SKT-AM4-36MB-105W-WOF.html',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/CPU-Prozessor-/-CPU-Kuehler-Zubehoer/AMD-CPU/AMD-CPU-Socket-AM4/AMD-Ryzen-9-5900X-AMD-Ryzen-9-Socket-AM4-PC-7nm-AMD-3-7-GHz-AM4.html',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url:
|
||||
'https://www.acom-pc.de/Hardware-Software/CPU-Prozessor-/-CPU-Kuehler-Zubehoer/AMD-CPU/AMD-CPU-Socket-AM4/AMD-RYZEN-9-5950X-4.90GHZ-16-CORE-SKT-AM4-72MB-105W-WOF.html',
|
||||
},
|
||||
],
|
||||
name: 'acompc',
|
||||
};
|
||||
+126
-126
@@ -1,130 +1,130 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const Adorama: Store = {
|
||||
currency: '$',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['please verify you are a human']
|
||||
},
|
||||
inStock: {
|
||||
container: '.buy-section.purchase',
|
||||
text: ['add to cart']
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.your-price',
|
||||
euroFormat: false
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.adorama.com/ev08gp43067k.html'
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/pnv301tfxmpb.html'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/msig380gxt1.html'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/ev10g53897kr.html'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/ev10g53885kr.html'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/ev10g53895kr.html'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/ev10g53883kr.html'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/ev10g53881kr.html'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/msig38v3x10c.html'
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/png30801tfxb.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/asrx3080o10g.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/astr3080o10g.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/astrx308010g.html'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3090',
|
||||
url: 'https://www.adorama.com/msig390gxt24.html'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url: 'https://www.adorama.com/msig39v3x24c.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url: 'https://www.adorama.com/asrtx309024g.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.adorama.com/ast3090o24g.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3090',
|
||||
url: 'https://www.adorama.com/asrx3090o24g.html'
|
||||
}
|
||||
],
|
||||
name: 'adorama'
|
||||
currency: '$',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['please verify you are a human'],
|
||||
},
|
||||
inStock: {
|
||||
container: '.buy-section.purchase',
|
||||
text: ['add to cart'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.your-price',
|
||||
euroFormat: false,
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.adorama.com/ev08gp43067k.html',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/pnv301tfxmpb.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/msig380gxt1.html',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/ev10g53897kr.html',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/ev10g53885kr.html',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/ev10g53895kr.html',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/ev10g53883kr.html',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/ev10g53881kr.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/msig38v3x10c.html',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/png30801tfxb.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/asrx3080o10g.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/astr3080o10g.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/astrx308010g.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3090',
|
||||
url: 'https://www.adorama.com/msig390gxt24.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url: 'https://www.adorama.com/msig39v3x24c.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url: 'https://www.adorama.com/asrtx309024g.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.adorama.com/ast3090o24g.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3090',
|
||||
url: 'https://www.adorama.com/asrx3090o24g.html',
|
||||
},
|
||||
],
|
||||
name: 'adorama',
|
||||
};
|
||||
|
||||
@@ -0,0 +1,329 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const Akinformatica: Store = {
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: [
|
||||
{
|
||||
container: '#dispOnLine .available',
|
||||
text: ['Disponibile Online'],
|
||||
},
|
||||
{
|
||||
container: '#addCartLinkButton',
|
||||
text: ['Aggiungi al carrello'],
|
||||
},
|
||||
],
|
||||
maxPrice: {
|
||||
container: '#PrezzoListinoIvatoLabel',
|
||||
euroFormat: true,
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '#dispOnLine .available .disabled',
|
||||
text: ['Disponibile Online'],
|
||||
},
|
||||
{
|
||||
container: '#preOrderPanel > label',
|
||||
text: ['PRE-ORDINI APERTI'],
|
||||
},
|
||||
],
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/adata-xpg/mouse-gaming-adata-xpg-primer---wired--rgb_4710273777139.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'gaming pro',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3070/vga-palit-geforce-rtx3070-gamingpro-oc-8gb-gddr6x_4710562242089.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'twin edge',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3070/vga-zotac-gaming-geforce-rtx-3070-twin-edge-8g_4895173622472.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3070/vga-msi-geforce-rtx-3070-ventus-2x-oc-8g_4719072763091.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'dual',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3070/vga-asus-geforce-rtx-3070-dual-o8g-8g_4718017927864.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3070/vga-gigabyte-geforce-rtx-3070-eagle-8gb_4719331307738.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3070/vga-msi-geforce-rtx-3070-ventus-3x-oc-8g_4719072763084.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3070/vga-msi-geforce-rtx-3070-gaming-x-trio-8g_4719072763053.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'twin edge oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3070/vga-zotac-gaming-geforce-rtx-3070-twin-edge-oc-8g_4895173622489.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3070/vga-gigabyte-geforce-rtx-3070-eagle-oc-8gb_4719331307677.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3070/vga-asus-geforce-rtx-3070-tuf-o8g-8g_4718017948678.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3070/vga-gigabyte-geforce-rtx-3070-gaming-oc-8gb_4719331307691.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3070/vga-asus-geforce-rtx-3070-rog-strix-gaming-oc-8g_4718017938150.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3090/vga-msi-geforce-rtx-3090-gaming-x-trio-24g_4719072762506.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3090/vga-zotac-geforce-rtx-3090-trinity-24g_4895173622427.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'suprim x',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3090/vga-msi-geforce-rtx-3090-suprim-x-24g_4719072762490.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
model: 'xlr8 epic x',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3090/vga-pny-geforce-rtx-3090-epic-x-xlr8-gaming-24g_0751492639536.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3090/vga-msi-geforce-rtx-3090-ventus-3x-24g-oc--consegne-da-marzo_4719072762476.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'gamerock',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3090/vga-palit-geforce-rtx3090-gamerock-24gb-gddr6x_4710562242041.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'gaming pro',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3090/vga-palit-geforce-rtx3090-gamingpro-24gb-gddr6x_4710562241969.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'gamerock oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3090/vga-palit-geforce-rtx3090-gamerock-oc-24gb-gddr6x_4710562242065.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'gaming pro oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3090/vga-palit-geforce-rtx3090-gamingpro-oc-24gb-gddr6x_4710562242027.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/amd-am4/cpu-amd-ryzen-5-5600x---6-core--max-boost-4-60-ghz--socket-am4_0730143312042.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/amd-am4/cpu-amd-ryzen-7-5800x---8-core--max-boost-4-70-ghz--socket-am4_0730143312714.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/amd-am4/cpu-amd-ryzen-9-5950x---16-core--max-boost-4-90-ghz--socket-am4_0730143312745.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
model: 'nitro+ se',
|
||||
series: 'rx6800',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/amd-rx-6800-6800-xt/vga-sapphire-radeon-rx-6800-xt-nitro--oc-se-16g_4895106289901.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
model: 'nitro+',
|
||||
series: 'rx6800',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/amd-rx-6800-6800-xt/vga-sapphire-radeon-rx-6800-xt-nitro--16g_4895106289925.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
model: 'amd reference',
|
||||
series: 'rx6900xt',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/amd-rx-6900-xt/vga-sapphire-radeon-rx-6900-xt-16g_4895106290136.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3080/vga-msi-geforce-rtx-3080-ventus-3x-10g-oc--consegne-da-marzo_4719072762520.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3080/vga-zotac-geforce-rtx-3080-trinity-10g_4895173622403.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3080/vga-asus-geforce-rtx-3080-rog-strix-gaming-oc-10g_4718017928786.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3080/vga-msi-geforce-rtx-3080-gaming-x-trio-10g_4719072762544.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3080/vga-asus-geforce-rtx-3080-rog-strix-gaming-10g_4718017909150.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
model: 'xlr8 epic x',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3080/vga-pny-geforce-rtx-3080-epic-x-xlr8-gaming-10g_0751492639567.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
model: 'xlr8 epic x',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3080/vga-pny-geforce-rtx-3080-epic-x-xlr8-gaming-10g_0751492639550.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'gaming pro oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3080/vga-palit-geforce-rtx3080-gamingpro-oc-10gb-gddr6x_4710562242003.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3060ti/vga-msi-geforce-rtx-3060ti-ventus-2x-oc-8g-_4719072763121.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3060ti/vga-msi-geforce-rtx-3060ti-gaming-x-trio-8g-_4719072763145.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'dual oc',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3060ti/vga-palit-geforce-rtx-3060ti-dual-oc-8g-gddr6-256bit-3xdp--hdmi-_4710562242287.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3060ti/vga-msi-geforce-rtx-3060ti-ventus-3x-oc-8g_4719072763152.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'twin edge',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3060ti/vga-zotac-gaming-geforce-rtx-3060ti-twin-edge-8g_4895173622502.aspx',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'twin edge oc',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://shop.akinformatica.it/catalogo/nvidia-rtx-3060ti/vga-zotac-gaming-geforce-rtx-3060ti-twin-edge-oc-8g_4895173622519.aspx',
|
||||
},
|
||||
],
|
||||
name: 'akinformatica',
|
||||
successStatusCodes: [[0, 399], 404],
|
||||
};
|
||||
@@ -0,0 +1,64 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const Allneeds: Store = {
|
||||
backoffStatusCodes: [403, 429],
|
||||
currency: '$',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.amstockstatus',
|
||||
text: ['In Stock'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: 'span.price',
|
||||
euroFormat: false,
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.amstockstatus',
|
||||
text: ['sold out'],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc white',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://allneeds.com.au/asus-geforce-rtx-3080-rog-strix-gaming-oc-10gb-video-card-white-edition-limited-edition',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
model: 'nitro+',
|
||||
series: 'rx6900xt',
|
||||
url:
|
||||
'https://allneeds.com.au/sapphire-nitro-radeon-rx-6900-xt-16gb-video-card-11308-01-20g',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url:
|
||||
'https://allneeds.com.au/amd-ryzen-9-5950x-processor-100-100000059wof',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url:
|
||||
'https://allneeds.com.au/amd-ryzen-9-5900x-processor-100-100000061wof',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://allneeds.com.au/amd-ryzen-7-5800x-processor',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url:
|
||||
'https://allneeds.com.au/amd-ryzen-5-5600x-with-wraith-stealth-100-100000065box',
|
||||
},
|
||||
],
|
||||
name: 'allneeds',
|
||||
};
|
||||
+168
-168
@@ -1,172 +1,172 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AlternateNL: Store = {
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.stockStatus',
|
||||
text: ['Direct leverbaar']
|
||||
},
|
||||
maxPrice: {
|
||||
container: 'div.price > span',
|
||||
euroFormat: true
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.stockStatus',
|
||||
text: ['Levertermijn onbekend', 'pre-order']
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.alternate.nl/product/1516616'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672756'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672345'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672251'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672753'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672343'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672634'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672867'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673512'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672612'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1674164'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672868'
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'gaming pro oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673431'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1677989'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'vision oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1681134'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673520'
|
||||
},
|
||||
{
|
||||
brand: 'gainward',
|
||||
model: 'phoenix gs',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673442'
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x3',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673136'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673524'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus master',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1680168'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673517'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'amp holo',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1677985'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'amp extreme holo',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1677982'
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'twin x2 oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673137'
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x4',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673134'
|
||||
}
|
||||
],
|
||||
name: 'alternate-nl'
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.stockStatus',
|
||||
text: ['Direct leverbaar'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: 'div.price > span',
|
||||
euroFormat: true,
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.stockStatus',
|
||||
text: ['Levertermijn onbekend', 'pre-order'],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.alternate.nl/product/1516616',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672756',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672345',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672251',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672753',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672343',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672634',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672867',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673512',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672612',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1674164',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672868',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'gaming pro oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673431',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1677989',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'vision oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1681134',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673520',
|
||||
},
|
||||
{
|
||||
brand: 'gainward',
|
||||
model: 'phoenix gs',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673442',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x3',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673136',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673524',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus master',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1680168',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673517',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'amp holo',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1677985',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'amp extreme holo',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1677982',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'twin x2 oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673137',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x4',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673134',
|
||||
},
|
||||
],
|
||||
name: 'alternate-nl',
|
||||
};
|
||||
|
||||
+431
-425
@@ -1,429 +1,435 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const Alternate: Store = {
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.stockStatus',
|
||||
text: [
|
||||
'auf lager',
|
||||
'ware neu eingetroffen',
|
||||
'in kürze versandfertig',
|
||||
'ware im zulauf'
|
||||
]
|
||||
},
|
||||
maxPrice: {
|
||||
container: 'div.price > span',
|
||||
euroFormat: true
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '.stockStatus',
|
||||
text: ['liefertermin unbekannt']
|
||||
},
|
||||
{
|
||||
container: '.stockStatus',
|
||||
text: ['Artikel kann nicht gekauft werden']
|
||||
}
|
||||
]
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.alternate.de/product/1662088'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1672868'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1672867'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1672251'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1672634'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1673517'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1673524'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1673512'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1673520'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1674164'
|
||||
},
|
||||
{
|
||||
brand: 'gainward',
|
||||
model: 'phantom gs',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1688597'
|
||||
},
|
||||
{
|
||||
brand: 'gainward',
|
||||
model: 'phoenix gs',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1673442'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus master',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1680168'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus xtreme',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1680168'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1672756'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1672753'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'vision oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1681134'
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x3',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1673136'
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x4',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1673134'
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'twin x2 oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1673137'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1672343'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1672345'
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'gamerock oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1688594'
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'gaming pro oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1673431'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'amp extreme holo',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1677982'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'amp holo',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1677985'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1677989'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1672612'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1672870'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1672872'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1672259'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1672629'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673530'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673531'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673521'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673525'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673529'
|
||||
},
|
||||
{
|
||||
brand: 'gainward',
|
||||
model: 'phoenix gs',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673440'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus xtreme',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1680670'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus master',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1687793'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1672744'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1672749'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'turbo',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1687703'
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'gaming x3',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673131'
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x3',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673135'
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x4',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673129'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1672341'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1672346'
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'gaming pro oc',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673434'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1672611'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.alternate.de/product/1685588'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.alternate.de/product/1685585'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.alternate.de/product/1685590'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.alternate.de/product/1685584'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.alternate.de/product/1651220'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.alternate.de/product/1651221'
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
model: 'merc',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.alternate.de/product/1698792'
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
model: 'nitro oc se',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.alternate.de/product/1696478'
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
model: 'nitro oc',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.alternate.de/product/1696482'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix lc',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.alternate.de/product/1695392'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.alternate.de/product/1697044'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://www.alternate.de/product/1702773'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'amd reference',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://www.alternate.de/product/1700508'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.alternate.de/product/1675115'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.alternate.de/product/1675117'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.alternate.de/product/1676874'
|
||||
}
|
||||
],
|
||||
name: 'alternate'
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.stockStatus',
|
||||
text: [
|
||||
'auf lager',
|
||||
'ware neu eingetroffen',
|
||||
'in kürze versandfertig',
|
||||
'ware im zulauf',
|
||||
],
|
||||
},
|
||||
maxPrice: {
|
||||
container: 'div.price > span',
|
||||
euroFormat: true,
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '.stockStatus',
|
||||
text: ['liefertermin unbekannt'],
|
||||
},
|
||||
{
|
||||
container: '.stockStatus',
|
||||
text: ['Artikel kann nicht gekauft werden'],
|
||||
},
|
||||
],
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.alternate.de/html/product/1662088',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1672868',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1672867',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1672251',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1672634',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1673517',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1673524',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1673512',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1673520',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1674164',
|
||||
},
|
||||
{
|
||||
brand: 'gainward',
|
||||
model: 'phantom gs',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1688597',
|
||||
},
|
||||
{
|
||||
brand: 'gainward',
|
||||
model: 'phoenix gs',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1673442',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus master',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1680168',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus xtreme',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1680168',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1672756',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1672753',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'vision oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1681134',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x3',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1673136',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x4',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1673134',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'twin x2 oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1673137',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1672343',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1672345',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'gamerock oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1688594',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'gaming pro oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1673431',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'amp extreme holo',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1677982',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'amp holo',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1677985',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1677989',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/html/product/1672612',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1672870',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1672872',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1672259',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1672629',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1673530',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1673531',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1673521',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1673525',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1673529',
|
||||
},
|
||||
{
|
||||
brand: 'gainward',
|
||||
model: 'phoenix gs',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1673440',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus xtreme',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1680670',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus master',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1687793',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1672744',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1672749',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'turbo',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1687703',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'gaming x3',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1673131',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x3',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1673135',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x4',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1673129',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1672341',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1672346',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'gaming pro oc',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1673434',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/html/product/1672611',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.alternate.de/html/product/1685588',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.alternate.de/html/product/1685585',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.alternate.de/html/product/1685590',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.alternate.de/html/product/1685584',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.alternate.de/html/product/1651220',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.alternate.de/html/product/1651221',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
model: 'merc',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.alternate.de/html/product/1698792',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
model: 'nitro oc se',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.alternate.de/html/product/1696478',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
model: 'nitro oc',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.alternate.de/html/product/1696482',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix lc',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.alternate.de/html/product/1695392',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.alternate.de/html/product/1697044',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://www.alternate.de/html/product/1702773',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'amd reference',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://www.alternate.de/html/product/1700508',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
model: 'merc',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://www.alternate.de/html/product/1704614',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.alternate.de/html/product/1675115',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.alternate.de/html/product/1675117',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.alternate.de/html/product/1651220',
|
||||
},
|
||||
],
|
||||
name: 'alternate',
|
||||
};
|
||||
|
||||
+293
-273
@@ -1,277 +1,297 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AmazonCa: Store = {
|
||||
currency: '$',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['enter the characters you see below']
|
||||
},
|
||||
inStock: {
|
||||
container: '#desktop_buybox',
|
||||
text: ['add to cart']
|
||||
},
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice'
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B07PBLD2MX&Quantity.1=1',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amazon.ca/dp/B07PBLD2MX'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08KWN2LZG&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.ca/dp/B08KWN2LZG'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08KWLMZV4&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.ca/dp/B08KWLMZV4'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08LW46GH2&Quantity.1=1',
|
||||
model: 'xc3',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.ca/dp/B08LW46GH2'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08L8L71SM&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.ca/dp/B08L8L71SM'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08L8L9TCZ&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.ca/dp/B08L8L9TCZ'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HR7SV3M&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HR7SV3M'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HR5SXPS&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HR5SXPS'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HR3DPGW&Quantity.1=1',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HR3DPGW'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HR3Y5GQ&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HR3Y5GQ'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HR55YB5&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HR55YB5'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HR4RJ3Q&Quantity.1=1',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HR4RJ3Q'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HR6FMF3&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HR6FMF3'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HJTH61J&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HJTH61J'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HJS2JLJ&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HJS2JLJ'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HHDP9DW&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HHDP9DW'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HH5WF97&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HH5WF97'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HJNKT3P&Quantity.1=1',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HJNKT3P'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HJQ182D&Quantity.1=1',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.ca/dp/B08HJQ182D'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HR9D2JS&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.ca/dp/B08HR9D2JS'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HJRF2CN&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.ca/dp/B08HJRF2CN'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HJPDJTY&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.ca/dp/B08HJPDJTY'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HJGNJ81&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.ca/dp/B08HJGNJ81'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HJLLF7G&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.ca/dp/B08HJLLF7G'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08166SLDF&Quantity.1=1',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amazon.ca/dp/B08166SLDF'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B0815XFSGK&Quantity.1=1',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amazon.ca/dp/B0815XFSGK'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08164VTWH&Quantity.1=1',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amazon.ca/dp/B08164VTWH'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B0815Y8J9N&Quantity.1=1',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amazon.ca/dp/B0815Y8J9N'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08GSC5D9G&Quantity.1=1',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.amazon.ca/dp/B08GSC5D9G'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08GS1N24H&Quantity.1=1',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.amazon.ca/dp/B08GS1N24H'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08H75RTZ8&Quantity.1=1',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.amazon.ca/dp/B08H75RTZ8'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08G9J44ZN&Quantity.1=1',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.amazon.ca/dp/B08G9J44ZN'
|
||||
}
|
||||
],
|
||||
name: 'amazon-ca'
|
||||
currency: '$',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['enter the characters you see below'],
|
||||
},
|
||||
inStock: {
|
||||
container: '#desktop_buybox',
|
||||
text: ['add to cart'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.a-color-price',
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.a-color-price',
|
||||
text: ['currently unavailable.'],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B07PBLD2MX&Quantity.1=1',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amazon.ca/dp/B07PBLD2MX',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08KWN2LZG&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.ca/dp/B08KWN2LZG',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08KWLMZV4&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.ca/dp/B08KWLMZV4',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08LW46GH2&Quantity.1=1',
|
||||
model: 'xc3',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.ca/dp/B08LW46GH2',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08L8L71SM&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.ca/dp/B08L8L71SM',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08L8L9TCZ&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.ca/dp/B08L8L9TCZ',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HR7SV3M&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HR7SV3M',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HR5SXPS&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HR5SXPS',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HR3DPGW&Quantity.1=1',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HR3DPGW',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HR3Y5GQ&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HR3Y5GQ',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HR55YB5&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HR55YB5',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HR4RJ3Q&Quantity.1=1',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HR4RJ3Q',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HR6FMF3&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HR6FMF3',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HJTH61J&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HJTH61J',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HJS2JLJ&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HJS2JLJ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HHDP9DW&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HHDP9DW',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HH5WF97&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HH5WF97',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HJNKT3P&Quantity.1=1',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.ca/dp/B08HJNKT3P',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HJQ182D&Quantity.1=1',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.ca/dp/B08HJQ182D',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HR9D2JS&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.ca/dp/B08HR9D2JS',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HJRF2CN&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.ca/dp/B08HJRF2CN',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HJPDJTY&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.ca/dp/B08HJPDJTY',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HJGNJ81&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.ca/dp/B08HJGNJ81',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08HJLLF7G&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.ca/dp/B08HJLLF7G',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08166SLDF&Quantity.1=1',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amazon.ca/dp/B08166SLDF',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B0815XFSGK&Quantity.1=1',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amazon.ca/dp/B0815XFSGK',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08164VTWH&Quantity.1=1',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amazon.ca/dp/B08164VTWH',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B0815Y8J9N&Quantity.1=1',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amazon.ca/dp/B0815Y8J9N',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08GSC5D9G&Quantity.1=1',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.amazon.ca/dp/B08GSC5D9G',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08GS1N24H&Quantity.1=1',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.amazon.ca/dp/B08GS1N24H',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08H75RTZ8&Quantity.1=1',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.amazon.ca/dp/B08H75RTZ8',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08G9J44ZN&Quantity.1=1',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.amazon.ca/dp/B08G9J44ZN',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08NX14LV1&Quantity.1=1',
|
||||
model: 'merc',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.ca/dp/B08NX14LV1',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
cartUrl:
|
||||
'https://www.amazon.ca/gp/aws/cart/add.html?ASIN.1=B08PQ585CX&Quantity.1=1',
|
||||
model: 'pulse',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.ca/dp/B08PQ585CX',
|
||||
},
|
||||
],
|
||||
name: 'amazon-ca',
|
||||
};
|
||||
|
||||
@@ -1,64 +1,64 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AmazonDeWarehouse: Store = {
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '€',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: [
|
||||
'geben sie die unten angezeigten zeichen ein',
|
||||
'geben sie die zeichen unten ein'
|
||||
]
|
||||
},
|
||||
inStock: {
|
||||
container: '#a-autoid-0-announce',
|
||||
text: ['In den Einkaufswagen']
|
||||
},
|
||||
maxPrice: {
|
||||
container: 'a-size-large a-color-price olpOfferPrice a-text-bold',
|
||||
euroFormat: true
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '.a-size-medium',
|
||||
text: [
|
||||
'Derzeit gibt es keine Verkäufer, die diesen Artikel an Ihren Standort liefern können'
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amazon.de/gp/offer-listing/B07PW9VBK5'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.amazon.de/gp/offer-listing/B08H93ZRK9'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.amazon.de/gp/offer-listing/B08H98GVK8'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.amazon.de/gp/offer-listing/B087VM5XC6'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.amazon.de/gp/offer-listing/B08H93ZRLL'
|
||||
}
|
||||
],
|
||||
name: 'amazon-de-warehouse'
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '€',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: [
|
||||
'geben sie die unten angezeigten zeichen ein',
|
||||
'geben sie die zeichen unten ein',
|
||||
],
|
||||
},
|
||||
inStock: {
|
||||
container: '#a-autoid-0-announce',
|
||||
text: ['In den Einkaufswagen'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.olpOfferPrice',
|
||||
euroFormat: true,
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '.a-size-medium',
|
||||
text: [
|
||||
'Derzeit gibt es keine Verkäufer, die diesen Artikel an Ihren Standort liefern können',
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amazon.de/gp/offer-listing/B07PW9VBK5',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.amazon.de/gp/offer-listing/B08H93ZRK9',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.amazon.de/gp/offer-listing/B08H98GVK8',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.amazon.de/gp/offer-listing/B087VM5XC6',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.amazon.de/gp/offer-listing/B08H93ZRLL',
|
||||
},
|
||||
],
|
||||
name: 'amazon-de-warehouse',
|
||||
};
|
||||
|
||||
+554
-554
File diff suppressed because it is too large
Load Diff
+200
-200
@@ -1,204 +1,204 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AmazonEs: Store = {
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '€',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['introduzca los caracteres que ve a continuación']
|
||||
},
|
||||
inStock: {
|
||||
container: '#desktop_buybox',
|
||||
text: ['añadir a la cesta']
|
||||
},
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice'
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '#availability',
|
||||
text: ['No disponible']
|
||||
}
|
||||
]
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B07PW9VBK5&Quantity.1=1',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amazon.es/dp/B07PW9VBK5'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HM4V2DH&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HM4V2DH'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HGYXP4C&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HGYXP4C'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HJ9XFNM&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HJ9XFNM'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HGBYWQ6&Quantity.1=1',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HGBYWQ6'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HGLN78Q&Quantity.1=1',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HGLN78Q'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HH1BMQQ&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HH1BMQQ'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HLZXHZY&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HLZXHZY'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HHZVZ3N&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HHZVZ3N'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HN37VQK&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HN37VQK'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HN4DSTC&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HN4DSTC'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HN6KYS3&Quantity.1=1',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HN6KYS3'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HM4M621&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HM4M621'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HR1NPPQ&Quantity.1=1',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HR1NPPQ'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08166SLDF&Quantity.1=1',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amazon.es/dp/B08166SLDF'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B0815XFSGK&Quantity.1=1',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amazon.es/dp/B0815XFSGK'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08164VTWH&Quantity.1=1',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amazon.es/dp/B08164VTWH'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B0815Y8J9N&Quantity.1=1',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amazon.es/dp/B0815Y8J9N'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08KKJ37F7&Quantity.1=1',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.amazon.es/dp/B08KKJ37F7'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08KJF2D25&Quantity.1=1',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.amazon.es/dp/B08KJF2D25'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08H93ZRLL&Quantity.1=1',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.amazon.es/dp/B08H93ZRLL'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B087VM5XC6&Quantity.1=1',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.amazon.es/dp/B087VM5XC6'
|
||||
}
|
||||
],
|
||||
name: 'amazon-es'
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '€',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['introduzca los caracteres que ve a continuación'],
|
||||
},
|
||||
inStock: {
|
||||
container: '#desktop_buybox',
|
||||
text: ['añadir a la cesta'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice',
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '#availability',
|
||||
text: ['No disponible'],
|
||||
},
|
||||
],
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B07PW9VBK5&Quantity.1=1',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amazon.es/dp/B07PW9VBK5',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HM4V2DH&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HM4V2DH',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HGYXP4C&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HGYXP4C',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HJ9XFNM&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HJ9XFNM',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HGBYWQ6&Quantity.1=1',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HGBYWQ6',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HGLN78Q&Quantity.1=1',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HGLN78Q',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HH1BMQQ&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HH1BMQQ',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HLZXHZY&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HLZXHZY',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HHZVZ3N&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HHZVZ3N',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HN37VQK&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HN37VQK',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HN4DSTC&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HN4DSTC',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HN6KYS3&Quantity.1=1',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HN6KYS3',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HM4M621&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HM4M621',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08HR1NPPQ&Quantity.1=1',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.es/dp/B08HR1NPPQ',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08166SLDF&Quantity.1=1',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amazon.es/dp/B08166SLDF',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B0815XFSGK&Quantity.1=1',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amazon.es/dp/B0815XFSGK',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08164VTWH&Quantity.1=1',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amazon.es/dp/B08164VTWH',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B0815Y8J9N&Quantity.1=1',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amazon.es/dp/B0815Y8J9N',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08KKJ37F7&Quantity.1=1',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.amazon.es/dp/B08KKJ37F7',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08KJF2D25&Quantity.1=1',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.amazon.es/dp/B08KJF2D25',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B08H93ZRLL&Quantity.1=1',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.amazon.es/dp/B08H93ZRLL',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
cartUrl:
|
||||
'https://www.amazon.es/gp/aws/cart/add.html?ASIN.1=B087VM5XC6&Quantity.1=1',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.amazon.es/dp/B087VM5XC6',
|
||||
},
|
||||
],
|
||||
name: 'amazon-es',
|
||||
};
|
||||
|
||||
+187
-187
@@ -1,191 +1,191 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AmazonFr: Store = {
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '€',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['entrez les caractères que vous voyez ci-dessous']
|
||||
},
|
||||
inStock: {
|
||||
container: '#desktop_buybox',
|
||||
text: ['ajouter au panier']
|
||||
},
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice',
|
||||
euroFormat: true
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '#availability',
|
||||
text: ['Actuellement indisponible']
|
||||
}
|
||||
]
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amazon.fr/dp/B07PW9VBK5'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR7SV3M'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR5SXPS'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR3DPGW'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR3Y5GQ'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR55YB5'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR4RJ3Q'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR6FMF3'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HJTH61J'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HJS2JLJ'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HHDP9DW'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HH5WF97'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HJNKT3P'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.fr/dp/B08HJQ182D'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.fr/dp/B08HR9D2JS'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.fr/dp/B08HJRF2CN'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.fr/dp/B08HJPDJTY'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.fr/dp/B08HJGNJ81'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.fr/dp/B08HJLLF7G'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amazon.fr/dp/B08166SLDF'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amazon.fr/dp/B0815XFSGK'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amazon.fr/dp/B08164VTWH'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amazon.fr/dp/B0815Y8J9N'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.amazon.fr/dp/B08H93ZRK9'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.amazon.fr/dp/B08H98GVK8'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.amazon.fr/dp/B08H93ZRLL'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.amazon.fr/dp/B087VM5XC6'
|
||||
}
|
||||
],
|
||||
name: 'amazon-fr'
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '€',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['entrez les caractères que vous voyez ci-dessous'],
|
||||
},
|
||||
inStock: {
|
||||
container: '#desktop_buybox',
|
||||
text: ['ajouter au panier'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice',
|
||||
euroFormat: true,
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '#availability',
|
||||
text: ['Actuellement indisponible'],
|
||||
},
|
||||
],
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amazon.fr/dp/B07PW9VBK5',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR7SV3M',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR5SXPS',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR3DPGW',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR3Y5GQ',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR55YB5',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR4RJ3Q',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR6FMF3',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HJTH61J',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HJS2JLJ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HHDP9DW',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HH5WF97',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HJNKT3P',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.fr/dp/B08HJQ182D',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.fr/dp/B08HR9D2JS',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.fr/dp/B08HJRF2CN',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.fr/dp/B08HJPDJTY',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.fr/dp/B08HJGNJ81',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.fr/dp/B08HJLLF7G',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amazon.fr/dp/B08166SLDF',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amazon.fr/dp/B0815XFSGK',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amazon.fr/dp/B08164VTWH',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amazon.fr/dp/B0815Y8J9N',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.amazon.fr/dp/B08H93ZRK9',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.amazon.fr/dp/B08H98GVK8',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.amazon.fr/dp/B08H93ZRLL',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.amazon.fr/dp/B087VM5XC6',
|
||||
},
|
||||
],
|
||||
name: 'amazon-fr',
|
||||
};
|
||||
|
||||
+411
-413
@@ -1,417 +1,415 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AmazonIt: Store = {
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '€',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: [
|
||||
'Inserisci i caratteri visualizzati nello spazio sottostante'
|
||||
]
|
||||
},
|
||||
inStock: {
|
||||
container: '#desktop_buybox',
|
||||
text: ['Aggiungi al carrello']
|
||||
},
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice',
|
||||
euroFormat: true
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08KHFZN9P&Quantity.1=1',
|
||||
model: 'dual',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08KHFZN9P'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08L8HPKR6&Quantity.1=1',
|
||||
model: 'dual',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08L8HPKR6'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08L8JNTXQ&Quantity.1=1',
|
||||
model: 'strix',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08L8JNTXQ'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08L8KC1J7&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08L8KC1J7'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08KY266MG&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08KY266MG'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08KWN2LZG&Quantity.1=1',
|
||||
model: 'gaming',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08KWN2LZG'
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HBJB7YD&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08HBJB7YD'
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HBF5L3K&Quantity.1=1',
|
||||
model: 'xlr8 uprising',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08HBF5L3K'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08KWPDXJZ&Quantity.1=1',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08KWPDXJZ'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08KWLMZV4&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08KWLMZV4'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08LF32LJ6&Quantity.1=1',
|
||||
model: 'gaming',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08LF32LJ6'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08L8L71SM&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08L8L71SM'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08L8L9TCZ&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08L8L9TCZ'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08KY266MG&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08KY266MG'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08M13DXSZ&Quantity.1=1',
|
||||
model: 'vision oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08M13DXSZ'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08KXZV626&Quantity.1=1',
|
||||
model: 'eagle',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08KXZV626'
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HBR7QBM&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HBR7QBM'
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HBTJMLJ&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HBTJMLJ'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HR3Y5GQ&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HR3Y5GQ'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HR55YB5&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HR55YB5'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HR4RJ3Q&Quantity.1=1',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HR4RJ3Q'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HR6FMF3&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HR6FMF3'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HJTH61J&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HJTH61J'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HJS2JLJ&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HJS2JLJ'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HH5WF97&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HH5WF97'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HHDP9DW&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HHDP9DW'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08J6GMWCQ&Quantity.1=1',
|
||||
model: 'strix oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08J6GMWCQ'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HR5SXPS&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HR5SXPS'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HJNKT3P&Quantity.1=1',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HJNKT3P'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HJQ182D&Quantity.1=1',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08HJQ182D'
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HBQWBHH&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08HBQWBHH'
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HBVX53D&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08HBVX53D'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HRBW6VB&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08HRBW6VB'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HR9D2JS&Quantity.1=1',
|
||||
model: 'ventus 3x',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08HR9D2JS'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HJRF2CN&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08HJRF2CN'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HJPDJTY&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08HJPDJTY'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HJGNJ81&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08HJGNJ81'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HJLLF7G&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08HJLLF7G'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08166SLDF&Quantity.1=1',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amazon.it/dp/B08166SLDF'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B0815XFSGK&Quantity.1=1',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amazon.it/dp/product/B0815XFSGK'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08164VTWH&Quantity.1=1',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amazon.it/dp/B08164VTWH'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B0815Y8J9N&Quantity.1=1',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amazon.it/dp/B0815Y8J9N'
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08MVC76SR&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.it/dp/B08MVC76SR'
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08MVCLBWK&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amazon.it/dp/B08MVCLBWK'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08KKJ37F7&Quantity.1=1',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.amazon.it/dp/B08KKJ37F7'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08KJF2D25&Quantity.1=1',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.amazon.it/dp/B08KJF2D25'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08JDSW1ZW&Quantity.1=1',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.amazon.it/dp/B08JDSW1ZW'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08JDTCXRG&Quantity.1=1',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.amazon.it/dp/B08JDTCXRG'
|
||||
},
|
||||
{
|
||||
brand: 'corsair',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B07M63H81H&Quantity.1=1',
|
||||
model: '750 platinum',
|
||||
series: 'sf',
|
||||
url: 'https://www.amazon.it/dp/B07M63H81H'
|
||||
}
|
||||
],
|
||||
name: 'amazon-it'
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '€',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['Inserisci i caratteri visualizzati nello spazio sottostante'],
|
||||
},
|
||||
inStock: {
|
||||
container: '#desktop_buybox',
|
||||
text: ['Aggiungi al carrello'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice',
|
||||
euroFormat: true,
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08KHFZN9P&Quantity.1=1',
|
||||
model: 'dual',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08KHFZN9P',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08L8HPKR6&Quantity.1=1',
|
||||
model: 'dual',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08L8HPKR6',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08L8JNTXQ&Quantity.1=1',
|
||||
model: 'strix',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08L8JNTXQ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08L8KC1J7&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08L8KC1J7',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08KY266MG&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08KY266MG',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08KWN2LZG&Quantity.1=1',
|
||||
model: 'gaming',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08KWN2LZG',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HBJB7YD&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08HBJB7YD',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HBF5L3K&Quantity.1=1',
|
||||
model: 'xlr8 uprising',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08HBF5L3K',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08KWPDXJZ&Quantity.1=1',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08KWPDXJZ',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08KWLMZV4&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08KWLMZV4',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08LF32LJ6&Quantity.1=1',
|
||||
model: 'gaming',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08LF32LJ6',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08L8L71SM&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08L8L71SM',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08L8L9TCZ&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08L8L9TCZ',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08KY266MG&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08KY266MG',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08M13DXSZ&Quantity.1=1',
|
||||
model: 'vision oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08M13DXSZ',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08KXZV626&Quantity.1=1',
|
||||
model: 'eagle',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08KXZV626',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HBR7QBM&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HBR7QBM',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HBTJMLJ&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HBTJMLJ',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HR3Y5GQ&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HR3Y5GQ',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HR55YB5&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HR55YB5',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HR4RJ3Q&Quantity.1=1',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HR4RJ3Q',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HR6FMF3&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HR6FMF3',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HJTH61J&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HJTH61J',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HJS2JLJ&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HJS2JLJ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HH5WF97&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HH5WF97',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HHDP9DW&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HHDP9DW',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08J6GMWCQ&Quantity.1=1',
|
||||
model: 'strix oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08J6GMWCQ',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HR5SXPS&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HR5SXPS',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HJNKT3P&Quantity.1=1',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.it/dp/B08HJNKT3P',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HJQ182D&Quantity.1=1',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08HJQ182D',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HBQWBHH&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08HBQWBHH',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HBVX53D&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08HBVX53D',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HRBW6VB&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08HRBW6VB',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HR9D2JS&Quantity.1=1',
|
||||
model: 'ventus 3x',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08HR9D2JS',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HJRF2CN&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08HJRF2CN',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HJPDJTY&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08HJPDJTY',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HJGNJ81&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08HJGNJ81',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08HJLLF7G&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.it/dp/B08HJLLF7G',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08166SLDF&Quantity.1=1',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amazon.it/dp/B08166SLDF',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B0815XFSGK&Quantity.1=1',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amazon.it/dp/product/B0815XFSGK',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08164VTWH&Quantity.1=1',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amazon.it/dp/B08164VTWH',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B0815Y8J9N&Quantity.1=1',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amazon.it/dp/B0815Y8J9N',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08MVC76SR&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.it/dp/B08MVC76SR',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08MVCLBWK&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amazon.it/dp/B08MVCLBWK',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08KKJ37F7&Quantity.1=1',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.amazon.it/dp/B08KKJ37F7',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08KJF2D25&Quantity.1=1',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.amazon.it/dp/B08KJF2D25',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08JDSW1ZW&Quantity.1=1',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.amazon.it/dp/B08JDSW1ZW',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B08JDTCXRG&Quantity.1=1',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.amazon.it/dp/B08JDTCXRG',
|
||||
},
|
||||
{
|
||||
brand: 'corsair',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B07M63H81H&Quantity.1=1',
|
||||
model: '750 platinum',
|
||||
series: 'sf',
|
||||
url: 'https://www.amazon.it/dp/B07M63H81H',
|
||||
},
|
||||
],
|
||||
name: 'amazon-it',
|
||||
};
|
||||
|
||||
+234
-236
@@ -1,240 +1,238 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AmazonNl: Store = {
|
||||
currency: '€',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['voer de karakters in die u hieronder ziet']
|
||||
},
|
||||
inStock: [
|
||||
{
|
||||
container: '#add-to-cart-button',
|
||||
text: ['in winkelwagen']
|
||||
},
|
||||
{
|
||||
container: '#buy-now-button',
|
||||
text: ['nu kopen']
|
||||
}
|
||||
],
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice',
|
||||
euroFormat: true
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '#availability',
|
||||
text: ['tijdelijk niet']
|
||||
},
|
||||
{
|
||||
container: '#outOfStock',
|
||||
text: [
|
||||
'we weten niet of en wanneer dit item weer op voorraad is'
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B085K45C3S&Quantity.1=1',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amazon.nl/dp/B085K45C3S'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08HM4M621&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.nl/dp/B08HM4M621'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08HM4V2DH&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.nl/dp/B08HM4V2DH'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08HJ9XFNM&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.nl/dp/B08HJ9XFNM'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08HH1BMQQ&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.nl/dp/B08HH1BMQQ'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08HN7VVLJ&Quantity.1=1',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.nl/dp/B08HN7VVLJ'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08P2DQ28S&Quantity.1=1',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08P2DQ28S'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08NW2YJB2&Quantity.1=1',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08NW2YJB2'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08P3XJLJJ&Quantity.1=1',
|
||||
model: 'twin edge',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08P3XJLJJ'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08P3V572B&Quantity.1=1',
|
||||
model: 'twin edge oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08P3V572B'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08P3BJ9Y8&Quantity.1=1',
|
||||
model: 'twin edge oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08P3BJ9Y8'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08P3JPX8P&Quantity.1=1',
|
||||
model: 'eagle',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08P3JPX8P'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08NW2X37Z&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08NW2X37Z'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08NW528S1&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08NW528S1'
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08NW693LG&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08NW693LG'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B083Z5P6TX&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B083Z5P6TX'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08NZ4G4T2&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08NZ4G4T2'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08P2HBBLX&Quantity.1=1',
|
||||
model: 'dual oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08P2HBBLX'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08PDN36R3&Quantity.1=1',
|
||||
model: 'ftw3',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08PDN36R3'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08PDP837W&Quantity.1=1',
|
||||
model: 'xc gaming',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08PDP837W'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08PDMVPZ4&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08PDMVPZ4'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08166SLDF&Quantity.1=1',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amazon.nl/dp/B08166SLDF'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B0815XFSGK&Quantity.1=1',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amazon.nl/dp/B0815XFSGK'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08164VTWH&Quantity.1=1',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amazon.nl/dp/B08164VTWH'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B0815Y8J9N&Quantity.1=1',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amazon.nl/dp/B0815Y8J9N'
|
||||
}
|
||||
],
|
||||
name: 'amazon-nl'
|
||||
currency: '€',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['voer de karakters in die u hieronder ziet'],
|
||||
},
|
||||
inStock: [
|
||||
{
|
||||
container: '#add-to-cart-button',
|
||||
text: ['in winkelwagen'],
|
||||
},
|
||||
{
|
||||
container: '#buy-now-button',
|
||||
text: ['nu kopen'],
|
||||
},
|
||||
],
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice',
|
||||
euroFormat: true,
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '#availability',
|
||||
text: ['tijdelijk niet'],
|
||||
},
|
||||
{
|
||||
container: '#outOfStock',
|
||||
text: ['we weten niet of en wanneer dit item weer op voorraad is'],
|
||||
},
|
||||
],
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B085K45C3S&Quantity.1=1',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amazon.nl/dp/B085K45C3S',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08HM4M621&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.nl/dp/B08HM4M621',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08HM4V2DH&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.nl/dp/B08HM4V2DH',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08HJ9XFNM&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.nl/dp/B08HJ9XFNM',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08HH1BMQQ&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.nl/dp/B08HH1BMQQ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08HN7VVLJ&Quantity.1=1',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.nl/dp/B08HN7VVLJ',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08P2DQ28S&Quantity.1=1',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08P2DQ28S',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08NW2YJB2&Quantity.1=1',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08NW2YJB2',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08P3XJLJJ&Quantity.1=1',
|
||||
model: 'twin edge',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08P3XJLJJ',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08P3V572B&Quantity.1=1',
|
||||
model: 'twin edge oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08P3V572B',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08P3BJ9Y8&Quantity.1=1',
|
||||
model: 'twin edge oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08P3BJ9Y8',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08P3JPX8P&Quantity.1=1',
|
||||
model: 'eagle',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08P3JPX8P',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08NW2X37Z&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08NW2X37Z',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08NW528S1&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08NW528S1',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08NW693LG&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08NW693LG',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B083Z5P6TX&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B083Z5P6TX',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08NZ4G4T2&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08NZ4G4T2',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08P2HBBLX&Quantity.1=1',
|
||||
model: 'dual oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08P2HBBLX',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08PDN36R3&Quantity.1=1',
|
||||
model: 'ftw3',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08PDN36R3',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08PDP837W&Quantity.1=1',
|
||||
model: 'xc gaming',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08PDP837W',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08PDMVPZ4&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.nl/dp/B08PDMVPZ4',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08166SLDF&Quantity.1=1',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amazon.nl/dp/B08166SLDF',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B0815XFSGK&Quantity.1=1',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amazon.nl/dp/B0815XFSGK',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B08164VTWH&Quantity.1=1',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amazon.nl/dp/B08164VTWH',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.nl/gp/aws/cart/add.html?ASIN.1=B0815Y8J9N&Quantity.1=1',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amazon.nl/dp/B0815Y8J9N',
|
||||
},
|
||||
],
|
||||
name: 'amazon-nl',
|
||||
};
|
||||
|
||||
@@ -0,0 +1,760 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AmazonSg: Store = {
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '$',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['enter the characters you see below'],
|
||||
},
|
||||
inStock: [
|
||||
{
|
||||
container: '#add-to-cart-button',
|
||||
text: ['add to cart'],
|
||||
},
|
||||
{
|
||||
container: '#buy-now-button',
|
||||
text: ['buy now'],
|
||||
},
|
||||
],
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice',
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B083248S3B&Quantity.1=1',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amazon.sg/dp/B083248S3B',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08P2HBBLX&Quantity.1=1',
|
||||
model: 'dual',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.sg/dp/B08P2HBBLX',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08NYP7KG6&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.sg/dp/B08NYP7KG6',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08NYPLXPJ&Quantity.1=1',
|
||||
model: 'gaming oc pro',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.sg/dp/B08NYPLXPJ',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08NYNJ6RC&Quantity.1=1',
|
||||
model: 'eagle',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.sg/dp/B08NYNJ6RC',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B083Z5P6TX&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.sg/dp/B083Z5P6TX',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08P2D3JSG&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.sg/dp/B08P2D3JSG',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08P2DQ28S&Quantity.1=1',
|
||||
model: 'ventus 2x',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.sg/dp/B08P2DQ28S',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08P3XJLJJ&Quantity.1=1',
|
||||
model: 'twin edge oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.sg/dp/B08P3XJLJJ',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08P3V572B&Quantity.1=1',
|
||||
model: 'twin edge',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.sg/dp/B08P3V572B',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08P2D1JZZ&Quantity.1=1',
|
||||
model: 'ko',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.sg/dp/B08P2D1JZZ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B083Z7TR8Z&Quantity.1=1',
|
||||
model: 'strix',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.sg/dp/B083Z7TR8Z',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08P2H5LW2&Quantity.1=1',
|
||||
model: 'ftw3',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.sg/dp/B08P2H5LW2',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08NYPKW1Z&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.sg/dp/B08NYPKW1Z',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08L8LG4M3&Quantity.1=1',
|
||||
model: 'dual',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08L8LG4M3',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08L8HPKR6&Quantity.1=1',
|
||||
model: 'dual',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08L8HPKR6',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08LW46GH2&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08LW46GH2',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08L8JNTXQ&Quantity.1=1',
|
||||
model: 'strix',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08L8JNTXQ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08L8KC1J7&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08L8KC1J7',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08KY266MG&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08KY266MG',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08KWN2LZG&Quantity.1=1',
|
||||
model: 'gaming',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08KWN2LZG',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HBJB7YD&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08HBJB7YD',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HBF5L3K&Quantity.1=1',
|
||||
model: 'xlr8 uprising',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08HBF5L3K',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08KWPDXJZ&Quantity.1=1',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08KWPDXJZ',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08KWLMZV4&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08KWLMZV4',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08LF1CWT2&Quantity.1=1',
|
||||
model: 'twin edge oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08LF1CWT2',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08LF32LJ6&Quantity.1=1',
|
||||
model: 'gaming',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08LF32LJ6',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08L8L71SM&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08L8L71SM',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08L8L9TCZ&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08L8L9TCZ',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08LW46GH2&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08LW46GH2',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08KY266MG&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08KY266MG',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08M13DXSZ&Quantity.1=1',
|
||||
model: 'vision oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08M13DXSZ',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08M4YFNX2&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08M4YFNX2',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08KXZV626&Quantity.1=1',
|
||||
model: 'eagle',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08KXZV626',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08KY322TH&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.sg/dp/B08KY322TH',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HBR7QBM&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.sg/dp/B08HBR7QBM',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HBTJMLJ&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.sg/dp/B08HBTJMLJ',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HR7SV3M&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.sg/dp/B08HR7SV3M',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HR3Y5GQ&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.sg/dp/B08HR3Y5GQ',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HR55YB5&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.sg/dp/B08HR55YB5',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HR3DPGW&Quantity.1=1',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.sg/dp/B08HR3DPGW',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HR4RJ3Q&Quantity.1=1',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.sg/dp/B08HR4RJ3Q',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HR6FMF3&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.sg/dp/B08HR6FMF3',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HJTH61J&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.sg/dp/B08HJTH61J',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HJS2JLJ&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.sg/dp/B08HJS2JLJ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HH5WF97&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.sg/dp/B08HH5WF97',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HHDP9DW&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.sg/dp/B08HHDP9DW',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08J6F174Z&Quantity.1=1',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.sg/dp/B08J6F174Z',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08J6GMWCQ&Quantity.1=1',
|
||||
model: 'strix oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.sg/dp/B08J6GMWCQ',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HR5SXPS&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.sg/dp/B08HR5SXPS',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HJNKT3P&Quantity.1=1',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.sg/dp/B08HJNKT3P',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HVV2P4Z&Quantity.1=1',
|
||||
model: 'trinity oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.sg/dp/B08HVV2P4Z',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HJQ182D&Quantity.1=1',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.sg/dp/B08HJQ182D',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HBQWBHH&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.sg/dp/B08HBQWBHH',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HBVX53D&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.sg/dp/B08HBVX53D',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HRBW6VB&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.sg/dp/B08HRBW6VB',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HR9D2JS&Quantity.1=1',
|
||||
model: 'ventus 3x',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.sg/dp/B08HR9D2JS',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08J5F3G18&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.sg/dp/B08J5F3G18',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HJRF2CN&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.sg/dp/B08HJRF2CN',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HJPDJTY&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.sg/dp/B08HJPDJTY',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HJGNJ81&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.sg/dp/B08HJGNJ81',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HJLLF7G&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.sg/dp/B08HJLLF7G',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08166SLDF&Quantity.1=1',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amazon.sg/dp/B08166SLDF',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B0815XFSGK&Quantity.1=1',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amazon.sg/dp/product/B0815XFSGK',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08164VTWH&Quantity.1=1',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amazon.sg/dp/B08164VTWH',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B0815Y8J9N&Quantity.1=1',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amazon.sg/dp/B0815Y8J9N',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08PHWJC8X&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://www.amazon.sg/dp/B08PHWJC8X',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08PDQJVD9&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://www.amazon.sg/dp/B08PDQJVD9',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08NS4W2ZY&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.sg/dp/B08NS4W2ZY',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08MVC76SR&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.sg/dp/B08MVC76SR',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08NXXT7WN&Quantity.1=1',
|
||||
model: 'nitro+',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.sg/dp/B08NXXT7WN',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08NXYNLMR&Quantity.1=1',
|
||||
model: 'pulse',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.sg/dp/B08NXYNLMR',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08NXVNMPQ&Quantity.1=1',
|
||||
model: 'nitro+',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.sg/dp/B08NXVNMPQ',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08N6ZLX9B&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.sg/dp/B08N6ZLX9B',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08NX14LV1&Quantity.1=1',
|
||||
model: 'merc',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.sg/dp/B08NX14LV1',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08NN76VJD&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amazon.sg/dp/B08NN76VJD',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08P5YFZCY&Quantity.1=1',
|
||||
model: 'merc',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amazon.sg/dp/B08P5YFZCY',
|
||||
},
|
||||
{
|
||||
brand: 'powercolor',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08MNZM5TK&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amazon.sg/dp/B08MNZM5TK',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08MVCLBWK&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amazon.sg/dp/B08MVCLBWK',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08NXZSPMY&Quantity.1=1',
|
||||
model: 'nitro+',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amazon.sg/dp/B08NXZSPMY',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08NXYBVDB&Quantity.1=1',
|
||||
model: 'pulse',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amazon.sg/dp/B08NXYBVDB',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08NWJ29NB&Quantity.1=1',
|
||||
model: 'strix oc',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amazon.sg/dp/B08NWJ29NB',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08P3YT3MY&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amazon.sg/dp/B08P3YT3MY',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08NWHKGS9&Quantity.1=1',
|
||||
model: 'strix lc',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.sg/dp/B08NWHKGS9',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08FC5L3RG&Quantity.1=1',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.amazon.sg/dp/B08FC5L3RG',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HNRSVQP&Quantity.1=1',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.amazon.sg/dp/B08HNRSVQP',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08FC6MR62&Quantity.1=1',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.amazon.sg/dp/B08FC6MR62',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B08HNSWWT7&Quantity.1=1',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.amazon.sg/dp/B08HNSWWT7',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.amazon.sg/dp/B08H75RTZ8',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.amazon.sg/dp/B08G9J44ZN',
|
||||
},
|
||||
{
|
||||
brand: 'corsair',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B07M63H81H&Quantity.1=1',
|
||||
model: '750 platinum',
|
||||
series: 'sf',
|
||||
url: 'https://www.amazon.sg/dp/B07M63H81H',
|
||||
},
|
||||
{
|
||||
brand: 'corsair',
|
||||
cartUrl:
|
||||
'https://www.amazon.sg/gp/aws/cart/add.html?ASIN.1=B07F84FJ1G&Quantity.1=1',
|
||||
model: '600 platinum',
|
||||
series: 'sf',
|
||||
url: 'https://www.amazon.sg/dp/B07F84FJ1G',
|
||||
},
|
||||
],
|
||||
name: 'amazon-sg',
|
||||
};
|
||||
+496
-139
@@ -1,143 +1,500 @@
|
||||
import {Link, Store} from './store';
|
||||
import {logger} from '../../logger';
|
||||
import {parseCard} from './helpers/card';
|
||||
|
||||
export const AmazonUk: Store = {
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '£',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['enter the characters you see below']
|
||||
},
|
||||
inStock: {
|
||||
container: '#availability',
|
||||
text: ['in stock']
|
||||
},
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice'
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '#availability',
|
||||
text: ['out of stock', 'unavailable']
|
||||
},
|
||||
{
|
||||
container: '#backInStock',
|
||||
text: ['unavailable']
|
||||
}
|
||||
]
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B0753R2TWC&Quantity.1=1',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amazon.co.uk/dp/B0753R2TWC/'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08H95Y452&Quantity.1=1',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.amazon.co.uk/dp/B08H95Y452'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08H97NYGP&Quantity.1=1',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.amazon.co.uk/dp/B08H97NYGP'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08H93GKNJ&Quantity.1=1',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.amazon.co.uk/dp/B08H93GKNJ'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08GD9MNZB&Quantity.1=1',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.amazon.co.uk/dp/B08GD9MNZB'
|
||||
}
|
||||
],
|
||||
linksBuilder: {
|
||||
builder: (docElement, series) => {
|
||||
const productElements = docElement.find(
|
||||
'.s-result-list .s-result-item[data-asin]'
|
||||
);
|
||||
const links: Link[] = [];
|
||||
for (let i = 0; i < productElements.length; i++) {
|
||||
const productElement = productElements.eq(i);
|
||||
const asin = productElement.attr()['data-asin'];
|
||||
|
||||
if (!asin) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const url = `https://www.amazon.co.uk/dp/${asin}/`;
|
||||
const titleElement = productElement
|
||||
.find('.sg-col-inner h2 a.a-text-normal[href] span')
|
||||
.first();
|
||||
const title = titleElement.text().trim();
|
||||
|
||||
if (!title || !new RegExp(`RTX.*${series}`, 'i').exec(title)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const card = parseCard(title);
|
||||
|
||||
if (card) {
|
||||
links.push({
|
||||
brand: card.brand as any,
|
||||
cartUrl: `https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=${asin}&Quantity.1=1`,
|
||||
model: card.model,
|
||||
series,
|
||||
url
|
||||
});
|
||||
} else {
|
||||
logger.error(`Failed to parse card: ${title}`, {url});
|
||||
}
|
||||
}
|
||||
|
||||
return links;
|
||||
},
|
||||
ttl: 300000,
|
||||
urls: [
|
||||
{
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.amazon.co.uk/s?k=%2B%22RTX+3060+TI%22+-2060+-2070+-2080+-SUPER+-GTX&i=computers&rh=n%3A430500031%2Cp_n_availability%3A419162031&s=relevancerank&dc&qid=1601675291sb_noss'
|
||||
},
|
||||
{
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.amazon.co.uk/s?k=%2B%22RTX+3070%22+-2060+-2070+-2080+-SUPER+-GTX+-3080&rh=n%3A430500031&ref=nb_sb_noss'
|
||||
},
|
||||
{
|
||||
series: '3080',
|
||||
url: [
|
||||
'https://www.amazon.co.uk/s?k=%2B%22RTX+3080%22+-2080+-GTX&i=computers&rh=n%3A430500031%2Cp_n_availability%3A419162031&s=relevancerank&dc&qid=1601675291',
|
||||
'https://www.amazon.co.uk/s?k=%2B%22RTX+3080%22+-2080+-GTX&i=computers&rh=n%3A430500031%2Cp_n_availability%3A419162031&s=relevancerank&dc&qid=1601675594&page=2'
|
||||
]
|
||||
},
|
||||
{
|
||||
series: '3090',
|
||||
url: [
|
||||
'https://www.amazon.co.uk/s?k=%2B%22RTX+3090%22+-3080+-GTX&i=computers&rh=n%3A430500031%2Cp_n_availability%3A419162031&s=relevancerank&dc&qid=1601675291',
|
||||
'https://www.amazon.co.uk/s?k=%2B%22RTX+3090%22+-3080+-GTX&i=computers&rh=n%3A430500031%2Cp_n_availability%3A419162031&s=relevancerank&dc&qid=1601675594&page=2'
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
name: 'amazon-uk'
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '£',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['enter the characters you see below'],
|
||||
},
|
||||
inStock: {
|
||||
container: '#availability',
|
||||
text: ['in stock'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice',
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '#availability',
|
||||
text: ['out of stock', 'unavailable'],
|
||||
},
|
||||
{
|
||||
container: '#backInStock',
|
||||
text: ['unavailable'],
|
||||
},
|
||||
],
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B0753R2TWC&Quantity.1=1',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amazon.co.uk/dp/B0753R2TWC/',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08H95Y452&Quantity.1=1',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.amazon.co.uk/dp/B08H95Y452',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08H97NYGP&Quantity.1=1',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.amazon.co.uk/dp/B08H97NYGP',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08H93GKNJ&Quantity.1=1',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.amazon.co.uk/dp/B08H93GKNJ',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08GD9MNZB&Quantity.1=1',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.amazon.co.uk/dp/B08GD9MNZB',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url:
|
||||
'https://www.amazon.co.uk/AMD-Ryzen-5600X-Processor-Cache/dp/B08166SLDF',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url:
|
||||
'https://www.amazon.co.uk/AMD-Ryzen-5800X-Processor-Cache/dp/B0815XFSGK',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url:
|
||||
'https://www.amazon.co.uk/AMD-Ryzen-5900X-Processor-Cache/dp/B08164VTWH',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url:
|
||||
'https://www.amazon.co.uk/AMD-Ryzen-5950X-Processor-Cache/dp/B0815Y8J9N',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08HN7VVLJ&Quantity.1=1',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08HN7VVLJ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08HN6KYS3&Quantity.1=1',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08HN6KYS3',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08HN37VQK&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08HN37VQK',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08HN4DSTC&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08HN4DSTC',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08HGBYWQ6&Quantity.1=1',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08HGBYWQ6',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08HGYXP4C&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08HGYXP4C',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08HGLN78Q&Quantity.1=1',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08HGLN78Q',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08HH1BMQQ&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08HH1BMQQ',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08HJ9XFNM&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08HJ9XFNM',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08KHLDS72&Quantity.1=1',
|
||||
model: 'aorus master',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08KHLDS72',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08HHZVZ3N&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08HHZVZ3N',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08HLZXHZY&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08HLZXHZY',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08KH7RL89&Quantity.1=1',
|
||||
model: 'vision oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08KH7RL89',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08JD6QPXD&Quantity.1=1',
|
||||
model: 'twin x2 oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08JD6QPXD',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08HM4V2DH&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08HM4V2DH',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08HM4M621&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08HM4M621',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08JCVWTQY&Quantity.1=1',
|
||||
model: 'gaming pro',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08JCVWTQY',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08JCKYYL8&Quantity.1=1',
|
||||
model: 'gaming pro oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08JCKYYL8',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08HR1NPPQ&Quantity.1=1',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.co.uk/dp/B08HR1NPPQ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08KHFZN9P&Quantity.1=1',
|
||||
model: 'dual',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.co.uk/dp/B08KHFZN9P',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08L8HPKR6&Quantity.1=1',
|
||||
model: 'dual',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.co.uk/dp/B08L8HPKR6',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08L8JNTXQ&Quantity.1=1',
|
||||
model: 'strix',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.co.uk/dp/B08L8JNTXQ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08L8KC1J7&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.co.uk/dp/B08L8KC1J7',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08KY266MG&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.co.uk/dp/B08KY266MG',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08KWN2LZG&Quantity.1=1',
|
||||
model: 'gaming',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.co.uk/dp/B08KWN2LZG',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08HBJB7YD&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.co.uk/dp/B08HBJB7YD',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08HBF5L3K&Quantity.1=1',
|
||||
model: 'xlr8 uprising',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.co.uk/dp/B08HBF5L3K',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08KWPDXJZ&Quantity.1=1',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.co.uk/dp/B08KWPDXJZ',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08KWLMZV4&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.co.uk/dp/B08KWLMZV4',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08LF32LJ6&Quantity.1=1',
|
||||
model: 'gaming',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.co.uk/dp/B08LF32LJ6',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08L8L71SM&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.co.uk/dp/B08L8L71SM',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08L8L9TCZ&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.co.uk/dp/B08L8L9TCZ',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08KY266MG&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.co.uk/dp/B08KY266MG',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08M13DXSZ&Quantity.1=1',
|
||||
model: 'vision oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.co.uk/dp/B08M13DXSZ',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08KXZV626&Quantity.1=1',
|
||||
model: 'eagle',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.co.uk/dp/B08KXZV626',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08P2DQ28S&Quantity.1=1',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.co.uk/dp/B08P2DQ28S',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08NW2YJB2&Quantity.1=1',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.co.uk/dp/B08NW2YJB2',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08P3XJLJJ&Quantity.1=1',
|
||||
model: 'twin edge',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.co.uk/dp/B08P3XJLJJ',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08P3V572B&Quantity.1=1',
|
||||
model: 'twin edge oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.co.uk/dp/B08P3V572B',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08P3BJ9Y8&Quantity.1=1',
|
||||
model: 'twin edge oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.co.uk/dp/B08P3BJ9Y8',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08P3JPX8P&Quantity.1=1',
|
||||
model: 'eagle',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.co.uk/dp/B08P3JPX8P',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08NW2X37Z&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.co.uk/dp/B08NW2X37Z',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08NW528S1&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.co.uk/dp/B08NW528S1',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08NW693LG&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.co.uk/dp/B08NW693LG',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B083Z5P6TX&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.co.uk/dp/B083Z5P6TX',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08NZ4G4T2&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.co.uk/dp/B08NZ4G4T2',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08P2HBBLX&Quantity.1=1',
|
||||
model: 'dual oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.co.uk/dp/B08P2HBBLX',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08PDN36R3&Quantity.1=1',
|
||||
model: 'ftw3',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.co.uk/dp/B08PDN36R3',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08PDP837W&Quantity.1=1',
|
||||
model: 'xc gaming',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.co.uk/dp/B08PDP837W',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.co.uk/gp/aws/cart/add.html?ASIN.1=B08PDMVPZ4&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.co.uk/dp/B08PDMVPZ4',
|
||||
},
|
||||
],
|
||||
name: 'amazon-uk',
|
||||
};
|
||||
|
||||
+755
-708
File diff suppressed because it is too large
Load Diff
+44
-36
@@ -1,40 +1,48 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AmdCa: Store = {
|
||||
currency: '$',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.btn-shopping-cart',
|
||||
text: ['add to cart']
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.product-page-description h4',
|
||||
euroFormat: false
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458373400/ca'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458373400/ca?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458373400/ca'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458372800/ca?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458372800/ca'
|
||||
}
|
||||
],
|
||||
name: 'amd-ca'
|
||||
currency: '$',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.btn-shopping-cart',
|
||||
text: ['add to cart'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.product-page-description h4',
|
||||
euroFormat: false,
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458373400/ca',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458373400/ca?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458373400/ca',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458372800/ca?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458372800/ca',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458372200/ca?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458372200/ca',
|
||||
},
|
||||
],
|
||||
name: 'amd-ca',
|
||||
};
|
||||
|
||||
+80
-80
@@ -1,84 +1,84 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AmdDe: Store = {
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.btn-shopping-cart',
|
||||
text: ['add to cart']
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.product-page-description h4',
|
||||
euroFormat: true
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.btn-radeon',
|
||||
text: ['ausverkauft']
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amd.com/de/direct-buy/5450881400/de'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/de/direct-buy/5450881400/de?add-to-cart=true',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amd.com/de/direct-buy/5450881400/de'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/de/direct-buy/5450881500/de?add-to-cart=true',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amd.com/de/direct-buy/5450881500/de'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/de/direct-buy/5450881600/de?add-to-cart=true',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amd.com/de/direct-buy/5450881600/de'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/de/direct-buy/5450881700/de?add-to-cart=true',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amd.com/de/direct-buy/5450881700/de'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/de/direct-buy/5458374000/de?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amd.com/de/direct-buy/5458374000/de'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/de/direct-buy/5458374100/de?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amd.com/de/direct-buy/5458374100/de'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/de/direct-buy/5458374200/de?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://www.amd.com/de/direct-buy/5458374200/de'
|
||||
}
|
||||
],
|
||||
name: 'amd-de'
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.btn-shopping-cart',
|
||||
text: ['add to cart'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.product-page-description h4',
|
||||
euroFormat: true,
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.btn-radeon',
|
||||
text: ['ausverkauft'],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amd.com/de/direct-buy/5450881400/de',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/de/direct-buy/5450881400/de?add-to-cart=true',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amd.com/de/direct-buy/5450881400/de',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/de/direct-buy/5450881500/de?add-to-cart=true',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amd.com/de/direct-buy/5450881500/de',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/de/direct-buy/5450881600/de?add-to-cart=true',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amd.com/de/direct-buy/5450881600/de',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/de/direct-buy/5450881700/de?add-to-cart=true',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amd.com/de/direct-buy/5450881700/de',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/de/direct-buy/5458374000/de?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amd.com/de/direct-buy/5458374000/de',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/de/direct-buy/5458374100/de?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amd.com/de/direct-buy/5458374100/de',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/de/direct-buy/5458374200/de?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://www.amd.com/de/direct-buy/5458374200/de',
|
||||
},
|
||||
],
|
||||
name: 'amd-de',
|
||||
};
|
||||
|
||||
+60
-60
@@ -1,64 +1,64 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AmdIt: Store = {
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.btn-shopping-cart',
|
||||
text: ['add to cart']
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.product-page-description h4',
|
||||
euroFormat: true
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881400/it'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881400/it?add-to-cart=true',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881400/it'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881500/it?add-to-cart=true',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881500/it'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881600/it?add-to-cart=true',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881600/it'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881700/it?add-to-cart=true',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881700/it'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458374100/it?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458374100/it'
|
||||
}
|
||||
],
|
||||
name: 'amd-it'
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.btn-shopping-cart',
|
||||
text: ['add to cart'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.product-page-description h4',
|
||||
euroFormat: true,
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881400/it',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881400/it?add-to-cart=true',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881400/it',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881500/it?add-to-cart=true',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881500/it',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881600/it?add-to-cart=true',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881600/it',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881700/it?add-to-cart=true',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881700/it',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458374100/it?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458374100/it',
|
||||
},
|
||||
],
|
||||
name: 'amd-it',
|
||||
};
|
||||
|
||||
+92
-92
@@ -1,96 +1,96 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AmdUk: Store = {
|
||||
currency: '£',
|
||||
labels: {
|
||||
inStock: [
|
||||
{
|
||||
container: '.btn-shopping-cart',
|
||||
text: ['add to cart']
|
||||
},
|
||||
{
|
||||
container: '.btn-radeon',
|
||||
text: ['add to cart']
|
||||
}
|
||||
],
|
||||
maxPrice: {
|
||||
container: '.product-page-description h4',
|
||||
euroFormat: false
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '.product-out-of-stock',
|
||||
text: ['out of stock']
|
||||
},
|
||||
{
|
||||
container: '.btn-radeon',
|
||||
text: ['sold out']
|
||||
}
|
||||
]
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881400/gb'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881400/gb?add-to-cart=true',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881400/gb'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881500/gb?add-to-cart=true',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881500/gb'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881600/gb?add-to-cart=true',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881600/gb'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881700/gb?add-to-cart=true',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881700/gb'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458374000/gb?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458374000/gb'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458374100/gb?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458374100/gb'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458374200/gb?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458374200/gb'
|
||||
}
|
||||
],
|
||||
name: 'amd-uk'
|
||||
currency: '£',
|
||||
labels: {
|
||||
inStock: [
|
||||
{
|
||||
container: '.btn-shopping-cart',
|
||||
text: ['add to cart'],
|
||||
},
|
||||
{
|
||||
container: '.btn-radeon',
|
||||
text: ['add to cart'],
|
||||
},
|
||||
],
|
||||
maxPrice: {
|
||||
container: '.product-page-description h4',
|
||||
euroFormat: false,
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '.product-out-of-stock',
|
||||
text: ['out of stock'],
|
||||
},
|
||||
{
|
||||
container: '.btn-radeon',
|
||||
text: ['sold out'],
|
||||
},
|
||||
],
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881400/gb',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881400/gb?add-to-cart=true',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881400/gb',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881500/gb?add-to-cart=true',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881500/gb',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881600/gb?add-to-cart=true',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881600/gb',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881700/gb?add-to-cart=true',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881700/gb',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458374000/gb?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458374000/gb',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458374100/gb?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458374100/gb',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458374200/gb?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458374200/gb',
|
||||
},
|
||||
],
|
||||
name: 'amd-uk',
|
||||
};
|
||||
|
||||
+76
-76
@@ -1,80 +1,80 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const Amd: Store = {
|
||||
currency: '$',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.btn-shopping-cart',
|
||||
text: ['add to cart']
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.product-page-description h4',
|
||||
euroFormat: false
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881400/us'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881400/us?add-to-cart=true',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881400/us'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881500/us?add-to-cart=true',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881500/us'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881600/us?add-to-cart=true',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881600/us'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881700/us?add-to-cart=true',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881700/us'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458372200/us?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458372200/us'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458372800/us?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458372800/us'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458373400/us?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458373400/us'
|
||||
}
|
||||
],
|
||||
name: 'amd'
|
||||
currency: '$',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.btn-shopping-cart',
|
||||
text: ['add to cart'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.product-page-description h4',
|
||||
euroFormat: false,
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881400/us',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881400/us?add-to-cart=true',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881400/us',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881500/us?add-to-cart=true',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881500/us',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881600/us?add-to-cart=true',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881600/us',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5450881700/us?add-to-cart=true',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881700/us',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458372200/us?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458372200/us',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458372800/us?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458372800/us',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl:
|
||||
'https://www.amd.com/en/direct-buy/5458373400/us?add-to-cart=true',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458373400/us',
|
||||
},
|
||||
],
|
||||
name: 'amd',
|
||||
};
|
||||
|
||||
@@ -1,43 +1,43 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AntOnline: Store = {
|
||||
currency: '$',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.uk-button',
|
||||
text: ['Add to Cart']
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.cPrice',
|
||||
euroFormat: false
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.priceView-price .priceView-hero-price span',
|
||||
text: ['Sold Out']
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url:
|
||||
'https://www.antonline.com/Sony/Electronics/Gaming_Devices/Gaming_Consoles/1409507'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url:
|
||||
'https://www.antonline.com/Microsoft/Electronics/Gaming_Devices/Gaming_Consoles/1414487'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url:
|
||||
'https://www.antonline.com/Microsoft/Electronics/Gaming_Devices/Gaming_Consoles/1409527'
|
||||
}
|
||||
],
|
||||
name: 'antonline'
|
||||
currency: '$',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.uk-button',
|
||||
text: ['Add to Cart'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.cPrice',
|
||||
euroFormat: false,
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.priceView-price .priceView-hero-price span',
|
||||
text: ['Sold Out'],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url:
|
||||
'https://www.antonline.com/Sony/Electronics/Gaming_Devices/Gaming_Consoles/1409507',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url:
|
||||
'https://www.antonline.com/Microsoft/Electronics/Gaming_Devices/Gaming_Consoles/1414487',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url:
|
||||
'https://www.antonline.com/Microsoft/Electronics/Gaming_Devices/Gaming_Consoles/1409527',
|
||||
},
|
||||
],
|
||||
name: 'antonline',
|
||||
};
|
||||
|
||||
+31
-31
@@ -1,35 +1,35 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const ArgosIE: Store = {
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.btnbuyreserve',
|
||||
text: ['buy or reserve']
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.price'
|
||||
},
|
||||
outOfStock: {
|
||||
container: '#subCopy',
|
||||
text: ["We're working hard to get more stock."]
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url:
|
||||
'http://www.argos.ie/static/Product/partNumber/8448262/Trail/searchtext%3EXBOX+SERIES+X.htm'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url:
|
||||
'http://www.argos.ie/static/Product/partNumber/8349000/Trail/searchtext%3EPS5+CONSOLE.htm'
|
||||
}
|
||||
],
|
||||
name: 'argos-ie'
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.btnbuyreserve',
|
||||
text: ['buy or reserve'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.price',
|
||||
},
|
||||
outOfStock: {
|
||||
container: '#subCopy',
|
||||
text: ["We're working hard to get more stock."],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url:
|
||||
'http://www.argos.ie/static/Product/partNumber/8448262/Trail/searchtext%3EXBOX+SERIES+X.htm',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url:
|
||||
'http://www.argos.ie/static/Product/partNumber/8349000/Trail/searchtext%3EPS5+CONSOLE.htm',
|
||||
},
|
||||
],
|
||||
name: 'argos-ie',
|
||||
};
|
||||
|
||||
+43
-43
@@ -1,47 +1,47 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const Argos: Store = {
|
||||
currency: '£',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: 'button[data-test="add-to-trolley-button-button"',
|
||||
text: ['to trolley']
|
||||
},
|
||||
maxPrice: {
|
||||
container: 'li[itemprop="price"]'
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.argos.co.uk/product/5718469'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.argos.co.uk/product/8349000'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.argos.co.uk/product/8349024'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.argos.co.uk/product/8448262'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.argos.co.uk/product/8448248'
|
||||
}
|
||||
],
|
||||
name: 'argos'
|
||||
currency: '£',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: 'button[data-test="add-to-trolley-button-button"',
|
||||
text: ['to trolley'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: 'li[itemprop="price"]',
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.argos.co.uk/product/5718469',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.argos.co.uk/product/8349000',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.argos.co.uk/product/8349024',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.argos.co.uk/product/8448262',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.argos.co.uk/product/8448248',
|
||||
},
|
||||
],
|
||||
name: 'argos',
|
||||
};
|
||||
|
||||
+67
-62
@@ -2,66 +2,71 @@ import {Store} from './store';
|
||||
import {getProductLinksBuilder} from './helpers/card';
|
||||
|
||||
export const Aria: Store = {
|
||||
currency: '£',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '#addQuantity',
|
||||
text: ['add to shopping basket']
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.priceBig',
|
||||
euroFormat: false // Note: Aria uses non-euroFromat as price seperator
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.fBox',
|
||||
text: ['out of stock', 'there is currently no stock of this item']
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://www.aria.co.uk/Products/Components/Graphics+Cards/NVIDIA+GeForce/GeForce+RTX+2060+Super/Gigabyte+NVIDIA+GeForce+RTX+2060+SUPER+8GB+WINDFORCE+OC+Turing+Graphics+Card+%2B+RTX+Bundle%21?productId=71541'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url:
|
||||
'https://www.aria.co.uk/Products/Components/Processors/AMD+CPUs/Ryzen+9+-+Socket+AM4/AMD+Ryzen+9+5950X+16+Core+AM4+CPU%2FProcessor?productId=72868'
|
||||
}
|
||||
],
|
||||
linksBuilder: {
|
||||
builder: getProductLinksBuilder({
|
||||
productsSelector: '#productListingInner .listTable .listTableTr',
|
||||
sitePrefix: 'https://www.aria.co.uk',
|
||||
titleSelector: 'strong > a[href]'
|
||||
}),
|
||||
urls: [
|
||||
{
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.aria.co.uk/Products/Components/Graphics+Cards/NVIDIA+GeForce/GeForce+RTX+3060+Ti'
|
||||
},
|
||||
{
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.aria.co.uk/Products/Components/Graphics+Cards/NVIDIA+GeForce/GeForce+RTX+3070'
|
||||
},
|
||||
{
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.aria.co.uk/Products/Components/Graphics+Cards/NVIDIA+GeForce/GeForce+RTX+3080'
|
||||
},
|
||||
{
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.aria.co.uk/Products/Components/Graphics+Cards/NVIDIA+GeForce/GeForce+RTX+3090'
|
||||
}
|
||||
]
|
||||
},
|
||||
name: 'aria',
|
||||
waitUntil: 'domcontentloaded'
|
||||
currency: '£',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '#addQuantity',
|
||||
text: ['add to shopping basket'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.priceBig',
|
||||
euroFormat: false, // Note: Aria uses non-euroFromat as price seperator
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.fBox',
|
||||
text: ['out of stock', 'there is currently no stock of this item'],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://www.aria.co.uk/Products/Components/Graphics+Cards/NVIDIA+GeForce/GeForce+RTX+2060+Super/Gigabyte+NVIDIA+GeForce+RTX+2060+SUPER+8GB+WINDFORCE+OC+Turing+Graphics+Card+%2B+RTX+Bundle%21?productId=71541',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url:
|
||||
'https://www.aria.co.uk/Products/Components/Processors/AMD+CPUs/Ryzen+9+-+Socket+AM4/AMD+Ryzen+9+5950X+16+Core+AM4+CPU%2FProcessor?productId=72868',
|
||||
},
|
||||
],
|
||||
linksBuilder: {
|
||||
builder: getProductLinksBuilder({
|
||||
productsSelector: '#productListingInner .listTable .listTableTr',
|
||||
sitePrefix: 'https://www.aria.co.uk',
|
||||
titleSelector: 'strong > a[href]',
|
||||
}),
|
||||
urls: [
|
||||
{
|
||||
series: '3060',
|
||||
url:
|
||||
'https://www.aria.co.uk/Products/Components/Graphics+Cards/NVIDIA+GeForce/GeForce+RTX+3060',
|
||||
},
|
||||
{
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.aria.co.uk/Products/Components/Graphics+Cards/NVIDIA+GeForce/GeForce+RTX+3060+Ti',
|
||||
},
|
||||
{
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.aria.co.uk/Products/Components/Graphics+Cards/NVIDIA+GeForce/GeForce+RTX+3070',
|
||||
},
|
||||
{
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.aria.co.uk/Products/Components/Graphics+Cards/NVIDIA+GeForce/GeForce+RTX+3080',
|
||||
},
|
||||
{
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.aria.co.uk/Products/Components/Graphics+Cards/NVIDIA+GeForce/GeForce+RTX+3090',
|
||||
},
|
||||
],
|
||||
},
|
||||
name: 'aria',
|
||||
waitUntil: 'domcontentloaded',
|
||||
};
|
||||
|
||||
+137
-137
@@ -1,141 +1,141 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const Arlt: Store = {
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.articleDesc .shippingtext',
|
||||
text: ['auf Lager', 'Lieferzeit 2-3 Werktage', 'Ware im Zulauf']
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.articleprice .price',
|
||||
euroFormat: true
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.articleDesc .shippingtext',
|
||||
text: ['Neuer Artikel in Kürze verfügbar', 'Liefertermin unbekannt']
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://www.arlt.com/ASUS-GeForce-GTX1650-Super-TUF-GTX1650S-O4G-GAMING.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'dual',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.arlt.com/Gaming/Gaming-Hardware/Grafikkarten/ASUS-Dual-GeForce-RTX-3070.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'dual oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Grafikkarten/NVIDIA/ASUS-Dual-GeForce-RTX-3070-OC.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.arlt.com/Gaming/Gaming-Hardware/Grafikkarten/ASUS-TUF-Gaming-GeForce-RTX-3070-OC.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Grafikkarten/NVIDIA/GeForce-RTX/RTX-3070/ASUS-ROG-Strix-GeForce-RTX-3070.html'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Grafikkarten/NVIDIA/GeForce-RTX/RTX-3070/MSI-GeForce-RTX-3070-Ventus-2X-OC.html'
|
||||
},
|
||||
{
|
||||
brand: 'gainward',
|
||||
model: 'phoenix',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Grafikkarten/NVIDIA/GeForce-RTX/Gainward-GeForce-RTX-3070-Phoenix.html'
|
||||
},
|
||||
{
|
||||
brand: 'gainward',
|
||||
model: 'phoenix gs',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.arlt.com/Gaming/Gaming-Hardware/Gainward-GeForce-RTX-3070-Phoenix-GS.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Grafikkarten/ASUS-TUF-Gaming-GeForce-RTX-3080-OC.html'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Grafikkarten/NVIDIA/GeForce-RTX/RTX-3080/MSI-GeForce-RTX-3080-Ventus-3X-OC.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Grafikkarten/NVIDIA/GeForce-RTX/RTX-3090/ASUS-TUF-Gaming-GeForce-RTX-3090-OC.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Grafikkarten/NVIDIA/GeForce-RTX/RTX-3090/ASUS-ROG-Strix-GeForce-RTX-3090-OC.html'
|
||||
},
|
||||
{
|
||||
brand: 'gainward',
|
||||
model: 'phoenix gs',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.arlt.com/Gaming/Gaming-Hardware/Gainward-GeForce-RTX-3090-Phoenix-GS.html'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Prozessoren-arlt/AMD-Ryzen-5-5600X-boxed.html'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Prozessoren-arlt/AMD-Ryzen-7-5800X-boxed.html'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Prozessoren-arlt/AMD-Ryzen-9-5900X-boxed.html'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Prozessoren-arlt/AMD-Ryzen-9-5950X-boxed.html'
|
||||
}
|
||||
],
|
||||
name: 'arlt'
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.articleDesc .shippingtext',
|
||||
text: ['auf Lager', 'Lieferzeit 2-3 Werktage', 'Ware im Zulauf'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.articleprice .price',
|
||||
euroFormat: true,
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.articleDesc .shippingtext',
|
||||
text: ['Neuer Artikel in Kürze verfügbar', 'Liefertermin unbekannt'],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://www.arlt.com/ASUS-GeForce-GTX1650-Super-TUF-GTX1650S-O4G-GAMING.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'dual',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.arlt.com/Gaming/Gaming-Hardware/Grafikkarten/ASUS-Dual-GeForce-RTX-3070.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'dual oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Grafikkarten/NVIDIA/ASUS-Dual-GeForce-RTX-3070-OC.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.arlt.com/Gaming/Gaming-Hardware/Grafikkarten/ASUS-TUF-Gaming-GeForce-RTX-3070-OC.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Grafikkarten/NVIDIA/GeForce-RTX/RTX-3070/ASUS-ROG-Strix-GeForce-RTX-3070.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Grafikkarten/NVIDIA/GeForce-RTX/RTX-3070/MSI-GeForce-RTX-3070-Ventus-2X-OC.html',
|
||||
},
|
||||
{
|
||||
brand: 'gainward',
|
||||
model: 'phoenix',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Grafikkarten/NVIDIA/GeForce-RTX/Gainward-GeForce-RTX-3070-Phoenix.html',
|
||||
},
|
||||
{
|
||||
brand: 'gainward',
|
||||
model: 'phoenix gs',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.arlt.com/Gaming/Gaming-Hardware/Gainward-GeForce-RTX-3070-Phoenix-GS.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Grafikkarten/ASUS-TUF-Gaming-GeForce-RTX-3080-OC.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Grafikkarten/NVIDIA/GeForce-RTX/RTX-3080/MSI-GeForce-RTX-3080-Ventus-3X-OC.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Grafikkarten/NVIDIA/GeForce-RTX/RTX-3090/ASUS-TUF-Gaming-GeForce-RTX-3090-OC.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Grafikkarten/NVIDIA/GeForce-RTX/RTX-3090/ASUS-ROG-Strix-GeForce-RTX-3090-OC.html',
|
||||
},
|
||||
{
|
||||
brand: 'gainward',
|
||||
model: 'phoenix gs',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.arlt.com/Gaming/Gaming-Hardware/Gainward-GeForce-RTX-3090-Phoenix-GS.html',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Prozessoren-arlt/AMD-Ryzen-5-5600X-boxed.html',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Prozessoren-arlt/AMD-Ryzen-7-5800X-boxed.html',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Prozessoren-arlt/AMD-Ryzen-9-5900X-boxed.html',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url:
|
||||
'https://www.arlt.com/Hardware/PC-Komponenten/Prozessoren-arlt/AMD-Ryzen-9-5950X-boxed.html',
|
||||
},
|
||||
],
|
||||
name: 'arlt',
|
||||
};
|
||||
|
||||
+73
-73
@@ -1,77 +1,77 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AsusDe: Store = {
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.buybox--button',
|
||||
text: ['in den warenkorb']
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://webshop.asus.com/de/komponenten/grafikkarten/nvidia-serie/2766/asus-rog-strix-rtx2060s-o8g-evo-v2-gaming'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://webshop.asus.com/de/komponenten/grafikkarten/nvidia-serie/2828/asus-rog-strix-rtx3080-10g-gaming'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://webshop.asus.com/de/komponenten/grafikkarten/nvidia-serie/2829/asus-rog-strix-rtx3080-o10g-gaming'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://webshop.asus.com/de/komponenten/grafikkarten/nvidia-serie/2824/asus-tuf-rtx3080-10g-gaming'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://webshop.asus.com/de/komponenten/grafikkarten/nvidia-serie/2825/asus-tuf-rtx3080-o10g-gaming'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://webshop.asus.com/de/komponenten/grafikkarten/nvidia-serie/2826/asus-rog-strix-rtx3090-24g-gaming'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://webshop.asus.com/de/komponenten/grafikkarten/nvidia-serie/2827/asus-rog-strix-rtx3090-o24g-gaming'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://webshop.asus.com/de/komponenten/grafikkarten/nvidia-serie/2822/asus-tuf-rtx3090-24g-gaming'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://webshop.asus.com/de/komponenten/grafikkarten/nvidia-serie/2823/asus-tuf-rtx3090-o24g-gaming'
|
||||
}
|
||||
],
|
||||
name: 'asus-de'
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.buybox--button',
|
||||
text: ['in den warenkorb'],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://webshop.asus.com/de/komponenten/grafikkarten/nvidia-serie/2766/asus-rog-strix-rtx2060s-o8g-evo-v2-gaming',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://webshop.asus.com/de/komponenten/grafikkarten/nvidia-serie/2828/asus-rog-strix-rtx3080-10g-gaming',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://webshop.asus.com/de/komponenten/grafikkarten/nvidia-serie/2829/asus-rog-strix-rtx3080-o10g-gaming',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://webshop.asus.com/de/komponenten/grafikkarten/nvidia-serie/2824/asus-tuf-rtx3080-10g-gaming',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://webshop.asus.com/de/komponenten/grafikkarten/nvidia-serie/2825/asus-tuf-rtx3080-o10g-gaming',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://webshop.asus.com/de/komponenten/grafikkarten/nvidia-serie/2826/asus-rog-strix-rtx3090-24g-gaming',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://webshop.asus.com/de/komponenten/grafikkarten/nvidia-serie/2827/asus-rog-strix-rtx3090-o24g-gaming',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://webshop.asus.com/de/komponenten/grafikkarten/nvidia-serie/2822/asus-tuf-rtx3090-24g-gaming',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://webshop.asus.com/de/komponenten/grafikkarten/nvidia-serie/2823/asus-tuf-rtx3090-o24g-gaming',
|
||||
},
|
||||
],
|
||||
name: 'asus-de',
|
||||
};
|
||||
|
||||
+183
-83
@@ -2,89 +2,189 @@ import {Store} from './store';
|
||||
import fetch from 'node-fetch';
|
||||
|
||||
export const Asus: Store = {
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '$',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '#item_add_cart',
|
||||
text: ['add to cart']
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
itemNumber: '202007AM020000005',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://store.asus.com/us/item/202007AM020000005'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202009AM160000001',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://store.asus.com/us/item/202009AM160000001'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202009AM150000004',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://store.asus.com/us/item/202009AM150000004'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202009AM150000003',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url: 'https://store.asus.com/us/item/202009AM150000003'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202009AM150000001',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://store.asus.com/us/item/202009AM150000001'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202009AM290000002',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url: 'https://store.asus.com/us/item/202009AM290000002'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202011AM200000003',
|
||||
model: 'crosshair viii',
|
||||
series: 'darkhero',
|
||||
url: 'https://store.asus.com/us/item/202011AM200000003'
|
||||
}
|
||||
],
|
||||
name: 'asus',
|
||||
realTimeInventoryLookup: async (itemNumber: string) => {
|
||||
const request_url =
|
||||
'https://store.asus.com/us/category/get_real_time_data';
|
||||
const response = await fetch(request_url, {
|
||||
body: 'sm_seq_list%5B%5D=' + itemNumber,
|
||||
headers: {
|
||||
'accept-language': 'en-US,en;q=0.9',
|
||||
'cache-control': 'no-cache',
|
||||
'content-type':
|
||||
'application/x-www-form-urlencoded; charset=UTF-8'
|
||||
},
|
||||
method: 'POST'
|
||||
});
|
||||
const response_json = await response.json();
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '$',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '#item_add_cart',
|
||||
text: ['add to cart'],
|
||||
},
|
||||
outOfStock: {
|
||||
container: '#off_sale',
|
||||
text: ['sold out'],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
itemNumber: '202006AM260000003',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://store.asus.com/us/item/202006AM260000003',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202012AM030000004',
|
||||
model: 'tuf oc',
|
||||
series: '3060ti',
|
||||
url: 'https://store.asus.com/us/item/202012AM030000004',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202012AM030000003',
|
||||
model: 'dual',
|
||||
series: '3060ti',
|
||||
url: 'https://store.asus.com/us/item/202012AM030000003',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202012AM030000005',
|
||||
model: 'strix oc',
|
||||
series: '3060ti',
|
||||
url: 'https://store.asus.com/us/item/202012AM030000005',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202012AM030000002',
|
||||
model: 'ko',
|
||||
series: '3060ti',
|
||||
url: 'https://store.asus.com/us/item/202012AM030000002',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202010AM310000002',
|
||||
model: 'tuf oc',
|
||||
series: '3070',
|
||||
url: 'https://store.asus.com/us/item/202010AM310000002',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202011AM240000001',
|
||||
model: 'dual',
|
||||
series: '3070',
|
||||
url: 'https://store.asus.com/us/item/202011AM240000001',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202010AM310000001',
|
||||
model: 'strix',
|
||||
series: '3070',
|
||||
url: 'https://store.asus.com/us/item/202010AM310000001',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202011AM070000002',
|
||||
model: 'ko oc',
|
||||
series: '3070',
|
||||
url: 'https://store.asus.com/us/item/202011AM070000002',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202011AM070000003',
|
||||
model: 'dual',
|
||||
series: '3070',
|
||||
url: 'https://store.asus.com/us/item/202011AM070000003',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202101AM070000001',
|
||||
model: 'strix oc',
|
||||
series: '3070',
|
||||
url: 'https://store.asus.com/us/item/202101AM070000001',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202012AM160000002',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url: 'https://store.asus.com/us/item/202012AM160000002',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202011AM190000001',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://store.asus.com/us/item/202011AM190000001',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202012AM220000002',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url: 'https://store.asus.com/us/item/202012AM220000002',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202009AM150000004',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://store.asus.com/us/item/202009AM150000004',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202101AM070000002',
|
||||
model: 'ekwb',
|
||||
series: '3080',
|
||||
url: 'https://store.asus.com/us/item/202101AM070000002',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202011AM190000002',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://store.asus.com/us/item/202011AM190000002',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202009AM150000003',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url: 'https://store.asus.com/us/item/202009AM150000003',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202010AM310000004',
|
||||
model: 'strix oc',
|
||||
series: '3090',
|
||||
url: 'https://store.asus.com/us/item/202010AM310000004',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202012AM220000001',
|
||||
model: 'strix oc',
|
||||
series: '3090',
|
||||
url: 'https://store.asus.com/us/item/202012AM220000001',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
itemNumber: '202011AM200000003',
|
||||
model: 'crosshair viii',
|
||||
series: 'darkhero',
|
||||
url: 'https://store.asus.com/us/item/202011AM200000003',
|
||||
},
|
||||
],
|
||||
name: 'asus',
|
||||
realTimeInventoryLookup: async (itemNumber: string) => {
|
||||
const request_url = 'https://store.asus.com/us/category/get_real_time_data';
|
||||
const response = await fetch(request_url, {
|
||||
body: 'sm_seq_list%5B%5D=' + itemNumber,
|
||||
headers: {
|
||||
'accept-language': 'en-US,en;q=0.9',
|
||||
'cache-control': 'no-cache',
|
||||
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
|
||||
},
|
||||
method: 'POST',
|
||||
});
|
||||
const response_json = await response.json();
|
||||
|
||||
if (response_json.data[itemNumber] !== undefined) {
|
||||
const item_info = response_json.data[itemNumber].market_info;
|
||||
if (item_info.buy === true || item_info.quantity > 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (response_json.data[itemNumber] !== undefined) {
|
||||
const item_info = response_json.data[itemNumber].market_info;
|
||||
if (item_info.buy === true || item_info.quantity > 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
successStatusCodes: [[0, 399], 404]
|
||||
return false;
|
||||
},
|
||||
successStatusCodes: [[0, 399], 404],
|
||||
};
|
||||
|
||||
+88
-88
@@ -2,92 +2,92 @@ import {Store} from './store';
|
||||
import {getProductLinksBuilder} from './helpers/card';
|
||||
|
||||
export const Awd: Store = {
|
||||
currency: '£',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.vs-stock .ty-qty-in-stock',
|
||||
text: ['item(s)']
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.ty-price',
|
||||
euroFormat: false // Note: Awd uses non-euroFromat as price seperator
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.vs-stock.ty-float-left',
|
||||
text: ['Out-of-stock']
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/asus-nvidia-geforce-gt-710-silent-low-profile-2gb-gddr5-graphics-card-pci-e.html'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/amd-ryzen-5-5600x-cpu-six-core-3.7ghz-processor-socket-am4-retail.html'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/amd-ryzen-7-5800x-cpu-eight-core-3.8ghz-processor-socket-am4-retail.html'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/amd-ryzen-9-5900x-cpu-twelve-core-3.7ghz-processor-socket-am4-retail.html'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/amd-ryzen-9-5950x-sixteen-core-socket-am4-3.4ghz-processor.html'
|
||||
}
|
||||
],
|
||||
linksBuilder: {
|
||||
builder: getProductLinksBuilder({
|
||||
productsSelector: '.grid-list .ty-grid-list__item',
|
||||
sitePrefix: 'https://www.awd-it.co.uk',
|
||||
titleSelector: '.product-title'
|
||||
}),
|
||||
urls: [
|
||||
{
|
||||
series: 'rx6800',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/components/graphics-cards/ati/amd-radeon-6800-6800xt.html'
|
||||
},
|
||||
{
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/components/graphics-cards/nvidia/nvidia-geforce-rtx-3060ti.html'
|
||||
},
|
||||
{
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/components/graphics-cards/nvidia/nvidia-geforce-rtx-3070.html'
|
||||
},
|
||||
{
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/components/graphics-cards/nvidia/nvidia-geforce-rtx-3080.html'
|
||||
},
|
||||
{
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/components/graphics-cards/nvidia/nvidia-geforce-rtx-3090.html'
|
||||
}
|
||||
]
|
||||
},
|
||||
name: 'awd',
|
||||
waitUntil: 'domcontentloaded'
|
||||
currency: '£',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.vs-stock .ty-qty-in-stock',
|
||||
text: ['item(s)'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.ty-price',
|
||||
euroFormat: false, // Note: Awd uses non-euroFromat as price seperator
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.vs-stock.ty-float-left',
|
||||
text: ['Out-of-stock'],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/asus-nvidia-geforce-gt-710-silent-low-profile-2gb-gddr5-graphics-card-pci-e.html',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/amd-ryzen-5-5600x-cpu-six-core-3.7ghz-processor-socket-am4-retail.html',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/amd-ryzen-7-5800x-cpu-eight-core-3.8ghz-processor-socket-am4-retail.html',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/amd-ryzen-9-5900x-cpu-twelve-core-3.7ghz-processor-socket-am4-retail.html',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/amd-ryzen-9-5950x-sixteen-core-socket-am4-3.4ghz-processor.html',
|
||||
},
|
||||
],
|
||||
linksBuilder: {
|
||||
builder: getProductLinksBuilder({
|
||||
productsSelector: '.grid-list .ty-grid-list__item',
|
||||
sitePrefix: 'https://www.awd-it.co.uk',
|
||||
titleSelector: '.product-title',
|
||||
}),
|
||||
urls: [
|
||||
{
|
||||
series: 'rx6800',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/components/graphics-cards/ati/amd-radeon-6800-6800xt.html',
|
||||
},
|
||||
{
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/components/graphics-cards/nvidia/nvidia-geforce-rtx-3060ti.html',
|
||||
},
|
||||
{
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/components/graphics-cards/nvidia/nvidia-geforce-rtx-3070.html',
|
||||
},
|
||||
{
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/components/graphics-cards/nvidia/nvidia-geforce-rtx-3080.html',
|
||||
},
|
||||
{
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.awd-it.co.uk/components/graphics-cards/nvidia/nvidia-geforce-rtx-3090.html',
|
||||
},
|
||||
],
|
||||
},
|
||||
name: 'awd',
|
||||
waitUntil: 'domcontentloaded',
|
||||
};
|
||||
|
||||
+214
-186
@@ -1,190 +1,218 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const Azerty: Store = {
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.orderdelay',
|
||||
text: ['Volgende werkdag in huis', '1 werkdag', '2-3 werkdagen']
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.mod_article .price',
|
||||
euroFormat: true
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.orderdelay',
|
||||
text: ['Onbekend', 'meer dan 10 werkdagen', 'Pre-order']
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://azerty.nl/product/gigabyte/3756757/geforce-rtx-2060-oc-6g-grafische-kaart-geforce-rtx-2060'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus xtreme',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://azerty.nl/product/gigabyte/4349658/aorus-geforce-rtx-3080-xtreme-10g-grafische-kaart-gf-rtx-3080'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://azerty.nl/product/msi/4346262/geforce-rtx-3080-ventus-3x-10g-oc-grafische-kaart-rtx-3080'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://azerty.nl/product/asus/4346679/tuf-gaming-geforce-rtx-3080-grafische-kaart-gf-rtx-3080'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://azerty.nl/product/msi/4346263/geforce-rtx-3080-gaming-x-trio-10g-grafische-kaart-rtx-3080'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://azerty.nl/product/asus/4348176/tuf-gaming-geforce-rtx-3080-oc-grafische-kaart-gf-rtx-3080'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://azerty.nl/product/asus/4348174/rog-strix-geforce-rtx-3080-oc-grafische-kaart-gf-rtx-3080'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://azerty.nl/product/zotac/4352301/gaming-geforce-rtx-3080-trinity-oc-grafische-kaart-gf-rtx-3080'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus master',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://azerty.nl/product/gigabyte/4349651/aorus-geforce-rtx-3080-master-10g-grafische-kaart-gf-rtx-3080'
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://azerty.nl/product/pny/4342269/geforce-rtx-3080-xlr8-gaming-revel-epic-x-rgb-triple-fan-gaming-edition-grafische-kaart-gf-rtx-3080'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/asus/4363892/rog-strix-gaming-geforce-rtx-3070-o8g-videokaart-8-gb-gddr6'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/asus/4373096/rog-strix-gaming-geforce-rtx-3070-8g-videokaart-8-gb-gddr6'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/asus/4363910/tuf-gaming-geforce-rtx-3070-oc-videokaart-8-gb-gddr6'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/asus/4373099/tuf-gaming-geforce-rtx-3070-videokaart-8-gb-gddr6'
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x4',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/inno3d/4369725/geforce-rtx-3070-ichill-x4-videokaart-8-gb-ddr6'
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x3',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/inno3d/4369726/geforce-rtx-3070-ichill-x3-videokaart-8-gb-ddr6'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/msi/4374747/geforce-rtx-3070-ventus-3x-oc-videokaart-8-gb-gddr6'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/msi/4365398/geforce-rtx-3070-gaming-x-trio-videokaart-8-gb-gddr6'
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
model: 'dual fan',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/pny/4342270/uprising-dual-fan-geforce-rtx-3070'
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
model: 'xlr8 revel',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/pny/4342271/epic-x-rgb-geforce-rtx-3070-triple-fan-gaming-edition-xlr8--videokaart-8-gb-gddr6x'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/evga/4377247/geforce-rtx-3070-ftw3-videokaart-8-gb-gddr6'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/evga/4377248/xc3-geforce-rtx-3070-xc3-videokaart-8-gb-gddr6'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/evga/4377250/ftw3-ultra-geforce-rtx-3070-videokaart-8-gb-gddr6'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/evga/4377252/xc3-black-geforce-rtx-3070-videokaart-8-gb-gddr6'
|
||||
}
|
||||
],
|
||||
name: 'azerty'
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.orderdelay',
|
||||
text: ['Volgende werkdag in huis', '1 werkdag', '2-3 werkdagen'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.mod_article .price',
|
||||
euroFormat: true,
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.orderdelay',
|
||||
text: ['Onbekend', 'meer dan 10 werkdagen', 'Pre-order'],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://azerty.nl/product/gigabyte/3756757/geforce-rtx-2060-oc-6g-grafische-kaart-geforce-rtx-2060',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus xtreme',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://azerty.nl/product/gigabyte/4349658/aorus-geforce-rtx-3080-xtreme-10g-grafische-kaart-gf-rtx-3080',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://azerty.nl/product/msi/4346262/geforce-rtx-3080-ventus-3x-10g-oc-grafische-kaart-rtx-3080',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://azerty.nl/product/asus/4346679/tuf-gaming-geforce-rtx-3080-grafische-kaart-gf-rtx-3080',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://azerty.nl/product/msi/4346263/geforce-rtx-3080-gaming-x-trio-10g-grafische-kaart-rtx-3080',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://azerty.nl/product/asus/4348176/tuf-gaming-geforce-rtx-3080-oc-grafische-kaart-gf-rtx-3080',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://azerty.nl/product/asus/4348174/rog-strix-geforce-rtx-3080-oc-grafische-kaart-gf-rtx-3080',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://azerty.nl/product/zotac/4352301/gaming-geforce-rtx-3080-trinity-oc-grafische-kaart-gf-rtx-3080',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus master',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://azerty.nl/product/gigabyte/4349651/aorus-geforce-rtx-3080-master-10g-grafische-kaart-gf-rtx-3080',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://azerty.nl/product/pny/4342269/geforce-rtx-3080-xlr8-gaming-revel-epic-x-rgb-triple-fan-gaming-edition-grafische-kaart-gf-rtx-3080',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/asus/4363892/rog-strix-gaming-geforce-rtx-3070-o8g-videokaart-8-gb-gddr6',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/asus/4373096/rog-strix-gaming-geforce-rtx-3070-8g-videokaart-8-gb-gddr6',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/asus/4363910/tuf-gaming-geforce-rtx-3070-oc-videokaart-8-gb-gddr6',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/asus/4373099/tuf-gaming-geforce-rtx-3070-videokaart-8-gb-gddr6',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x4',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/inno3d/4369725/geforce-rtx-3070-ichill-x4-videokaart-8-gb-ddr6',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x3',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/inno3d/4369726/geforce-rtx-3070-ichill-x3-videokaart-8-gb-ddr6',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/msi/4374747/geforce-rtx-3070-ventus-3x-oc-videokaart-8-gb-gddr6',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/msi/4365398/geforce-rtx-3070-gaming-x-trio-videokaart-8-gb-gddr6',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
model: 'dual fan',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/pny/4342270/uprising-dual-fan-geforce-rtx-3070',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
model: 'xlr8 revel',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/pny/4342271/epic-x-rgb-geforce-rtx-3070-triple-fan-gaming-edition-xlr8--videokaart-8-gb-gddr6x',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/evga/4377247/geforce-rtx-3070-ftw3-videokaart-8-gb-gddr6',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/evga/4377248/xc3-geforce-rtx-3070-xc3-videokaart-8-gb-gddr6',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/evga/4377250/ftw3-ultra-geforce-rtx-3070-videokaart-8-gb-gddr6',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://azerty.nl/product/evga/4377252/xc3-black-geforce-rtx-3070-videokaart-8-gb-gddr6',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url:
|
||||
'https://azerty.nl/product/amd/4368019/ryzen-5-5600x-processor-3-7-ghz-4-6-ghz-',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url:
|
||||
'https://azerty.nl/product/amd/4368018/ryzen-7-5800x-processor-3-8-ghz-4-7-ghz-',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url:
|
||||
'https://azerty.nl/product/amd/4368017/ryzen-9-5900x-processor-3-7-ghz-4-8-ghz-',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url:
|
||||
'https://azerty.nl/product/amd/4368016/ryzen-9-5950x-processor-3-4-ghz-4-9-ghz-',
|
||||
},
|
||||
],
|
||||
name: 'azerty',
|
||||
};
|
||||
|
||||
+334
-239
@@ -1,244 +1,339 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const BAndH: Store = {
|
||||
backoffStatusCodes: [403, 429],
|
||||
currency: '$',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: 'div[data-selenium="addToCartSection"]',
|
||||
text: ['add to cart']
|
||||
},
|
||||
maxPrice: {
|
||||
container: 'div[data-selenium="pricingPrice"]',
|
||||
euroFormat: false
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1452927-REG/evga_06g_p4_2063_kr_geforce_rtx_2060_xc.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'dual',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1602755-REG/asus_dualrtx30708g_geforce_rtx_3070_8g.html'
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
model: 'dual fan',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1595984-REG/pny_technologies_vcg30708tfxppb_geforce_rtx_3070_epic_x.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1602756-REG/asus_strixrtx3070o8_rog_strix_geforce_rtx.html'
|
||||
},
|
||||
// TUF was removed from BH, not sure why so commenting out listing for now
|
||||
// {
|
||||
// brand: 'asus',
|
||||
// model: 'tuf',
|
||||
// series: '3080',
|
||||
// url: 'https://www.bhphotovideo.com/c/product/1593649-REG/asus_tuf_rtx3080_10g_gaming_tuf_gaming_geforce_rtx.html'
|
||||
// },
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593333-REG/gigabyte_gv_n3080gaming_oc_10gd_geforce_rtx_3080_gaming.html'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1592969-REG/zotac_zt_a30800d_10p_gaming_geforce_rtx_3080.html'
|
||||
},
|
||||
// TUF was removed from BH, not sure why so commenting out listing for now
|
||||
// {
|
||||
// brand: 'asus',
|
||||
// model: 'tuf oc',
|
||||
// series: '3080',
|
||||
// url: 'https://www.bhphotovideo.com/c/product/1593650-REG/asus_tuf_rtx3080_o10g_gaming_tuf_gaming_geforce_rtx.html'
|
||||
// },
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1606948-REG/gigabyte_gv_n306teagle_oc_8gd_rtx_3060_ti_eagle.html'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1606949-REG/gigabyte_gv_n306teagle_8gd_rtx_3060_ti_eagle.html'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1606945-REG/gigabyte_gv_n306taorus_m_8gd_aorus_rtx_3060_ti.html'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1606947-REG/gigabyte_gv_n306tgaming_oc_8gd_rtx_3060_ti_gaming.html'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming pro',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1606946-REG/gigabyte_gv_n306tgamingoc_pro_8gd_rtx_3060_ti_gaming.html'
|
||||
},
|
||||
backoffStatusCodes: [403, 429],
|
||||
currency: '$',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: 'div[data-selenium="addToCartSection"]',
|
||||
text: ['add to cart'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: 'div[data-selenium="pricingPrice"]',
|
||||
euroFormat: false,
|
||||
},
|
||||
outOfStock: {
|
||||
container: 'button[data-selenium="notifyAvailabilityButton"]',
|
||||
text: ['notify when available'],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1452927-REG/evga_06g_p4_2063_kr_geforce_rtx_2060_xc.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'dual',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1602755-REG/asus_dualrtx30708g_geforce_rtx_3070_8g.html',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
model: 'dual fan',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1595984-REG/pny_technologies_vcg30708tfxppb_geforce_rtx_3070_epic_x.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1602756-REG/asus_strixrtx3070o8_rog_strix_geforce_rtx.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'dual oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1603974-REG/asus_dualrtx3070o8g_dual_geforce_rtx_3070.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'ko oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1606745-REG/asus_90yv0fq2_m0aa00_ko_nvidia_geforce_rtx.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1606746-REG/asus_tuf_rtx3070_o8g_gaming_tuf_gaming_nvidia_geforce.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'ekwb',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1614305-REG/asus_rtx3070_8g_ek_ekwb_geforce_rtx_3070.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix white',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1614300-REG/asus_rog_strix_rtx3070_o8g_white_rog_strix_geforce_rtx.html',
|
||||
},
|
||||
// TUF was removed from BH, not sure why so commenting out listing for now
|
||||
// {
|
||||
// brand: 'asus',
|
||||
// model: 'tuf',
|
||||
// series: '3080',
|
||||
// url: 'https://www.bhphotovideo.com/c/product/1593649-REG/asus_tuf_rtx3080_10g_gaming_tuf_gaming_geforce_rtx.html'
|
||||
// },
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593333-REG/gigabyte_gv_n3080gaming_oc_10gd_geforce_rtx_3080_gaming.html',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1592969-REG/zotac_zt_a30800d_10p_gaming_geforce_rtx_3080.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593650-REG/asus_tuf_rtx3080_o10g_gaming_tuf_gaming_geforce_rtx.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1603617-REG/asus_rog_strix_rtx3080_o10g_gaming_rog_strix_geforce_rtx.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix white',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1614301-REG/asus_rog_strix_rtx3080_o10g_white_rog_strix_geforce_rtx.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'ekwb',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1614303-REG/asus_rtx3080_10g_ek_ekwb_geforce_rtx_3080.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'ko oc',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1609756-REG/asus_ko_rtx3060ti_o8g_gaming_ko_geforce_rtx_3060.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1607025-REG/asus_tuf_rtx3060ti_o8g_gaming_geforce_rtx_3060_ti.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1606948-REG/gigabyte_gv_n306teagle_oc_8gd_rtx_3060_ti_eagle.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1606949-REG/gigabyte_gv_n306teagle_8gd_rtx_3060_ti_eagle.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1606945-REG/gigabyte_gv_n306taorus_m_8gd_aorus_rtx_3060_ti.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1606947-REG/gigabyte_gv_n306tgaming_oc_8gd_rtx_3060_ti_gaming.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming pro',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1606946-REG/gigabyte_gv_n306tgamingoc_pro_8gd_rtx_3060_ti_gaming.html',
|
||||
},
|
||||
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593996-REG/msi_g3080gxt10_geforce_rtx_3080_gaming.html'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593997-REG/msi_g3080v3x10c_geforce_rtx_3080_ventus.html'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593645-REG/msi_geforce_rtx_3080_gaming.html'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593646-REG/msi_geforce_rtx_3080_ventus.html'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1592970-REG/zotac_zt_a30900d_10p_gaming_geforce_rtx_3090.html'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593647-REG/msi_geforce_rtx_3090_gaming.html'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593994-REG/msi_g3090gxt24_geforce_rtx_3090_gaming.html'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593648-REG/msi_geforce_rtx_3090_ventus.html'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593995-REG/msi_g3090v3x24c_geforce_rtx_3090_ventus.html'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593334-REG/gigabyte_gv_n3090eagle_oc_24gd_geforce_rtx_3090_eagle.html'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593335-REG/gigabyte_gv_n3090gaming_oc_24gd_geforce_rtx3090_gaming_oc.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1594454-REG/asus_90yv0fd0_m0am00_tuf_gaming_geforce_rtx.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1594451-REG/asus_90yv0fd1_m0am00_tuf_gaming_geforce_rtx.html'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1598372-REG/amd_100_100000059wof_ryzen_9_5950x_3_4.html'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1598373-REG/amd_100_100000061wof_ryzen_9_5900x_3_7.html'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1598376-REG/amd_100_100000063wof_ryzen_7_5800x_3_8.html'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1598377-REG/amd_100_100000065box_ryzen_5_5600x_3_7.html'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1598377-REG/amd_100_100000065box_ryzen_5_5600x_3_7.html'
|
||||
},
|
||||
{
|
||||
brand: 'corsair',
|
||||
model: '750 platinum',
|
||||
series: 'sf',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1560680-REG/corsair_cp_9020186_na_corsair_sf750_power_supply.html'
|
||||
}
|
||||
],
|
||||
name: 'bandh'
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593996-REG/msi_g3080gxt10_geforce_rtx_3080_gaming.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593997-REG/msi_g3080v3x10c_geforce_rtx_3080_ventus.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593645-REG/msi_geforce_rtx_3080_gaming.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593646-REG/msi_geforce_rtx_3080_ventus.html',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1592970-REG/zotac_zt_a30900d_10p_gaming_geforce_rtx_3090.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593647-REG/msi_geforce_rtx_3090_gaming.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593994-REG/msi_g3090gxt24_geforce_rtx_3090_gaming.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593648-REG/msi_geforce_rtx_3090_ventus.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593995-REG/msi_g3090v3x24c_geforce_rtx_3090_ventus.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593334-REG/gigabyte_gv_n3090eagle_oc_24gd_geforce_rtx_3090_eagle.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1593335-REG/gigabyte_gv_n3090gaming_oc_24gd_geforce_rtx3090_gaming_oc.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1594454-REG/asus_90yv0fd0_m0am00_tuf_gaming_geforce_rtx.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1594451-REG/asus_90yv0fd1_m0am00_tuf_gaming_geforce_rtx.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'ekwb',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1607043-REG/asus_rtx3090_24g_ek_geforce_rtx_3090_24g.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1601764-REG/asus_rog_strix_rtx3090_o24g_gaming_rog_strix_geforce_rtx.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix white',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1614302-REG/asus_rog_strix_rtx3090_o24g_white_rog_strix_geforce_rtx.html',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1598372-REG/amd_100_100000059wof_ryzen_9_5950x_3_4.html',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1598373-REG/amd_100_100000061wof_ryzen_9_5900x_3_7.html',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1598376-REG/amd_100_100000063wof_ryzen_7_5800x_3_8.html',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1598377-REG/amd_100_100000065box_ryzen_5_5600x_3_7.html',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1598377-REG/amd_100_100000065box_ryzen_5_5600x_3_7.html',
|
||||
},
|
||||
{
|
||||
brand: 'corsair',
|
||||
model: '750 platinum',
|
||||
series: 'sf',
|
||||
url:
|
||||
'https://www.bhphotovideo.com/c/product/1560680-REG/corsair_cp_9020186_na_corsair_sf750_power_supply.html',
|
||||
},
|
||||
],
|
||||
name: 'bandh',
|
||||
};
|
||||
|
||||
+225
-176
@@ -1,180 +1,229 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const BestBuyCa: Store = {
|
||||
currency: '$',
|
||||
labels: {
|
||||
maxPrice: {
|
||||
container: 'div[class*="pricingContainer"]',
|
||||
euroFormat: false
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.addToCartButton:disabled',
|
||||
text: ['add to cart']
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/zotac-nvidia-geforce-gtx-1660-super-twin-fan-6gb-gddr6-video-card/14415897'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/msi-nvidia-geforce-rtx-3060-ti-ventus-2x-oc-8gb-gddr6-video-card/15178453?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'nvidia',
|
||||
model: 'founders edition',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/nvidia-geforce-rtx-3060-ti-8gb-gddr6-video-card/15166285?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'twin edge oc',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/zotac-geforce-rtx-3060-ti-twin-edge-oc-8gb-gddr6-video-card/15178452?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'twin edge',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/zotac-geforce-rtx-3060-ti-twin-edge-8gb-gddr6-video-card/15178583?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/evga-geforce-rtx-3060-ti-ftw3-ultra-8gb-gddr6-video-card/15200164?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/zotac-geforce-rtx-3080-trinity-10gb-gddr6x-video-card/14953249?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/msi-nvidia-geforce-rtx-3080-ventus-3x-10gb-gddr6x-video-card/14950588?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/evga-geforce-rtx-3080-xc3-ultra-gaming-10gb-gddr6x-video-card/15084753?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/asus-tuf-gaming-geforce-rtx-3080-10gb-gddr6x-video-card/14953248?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/asus-rog-strix-geforce-rtx-3080-10gb-gddr6x-video-card/14954116?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/zotac-geforce-rtx-3090-trinity-24gb-gddr6x-video-card/14953250?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/asus-tuf-gaming-geforce-rtx-3090-24gb-gddr6x-video-card/14953247?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/asus-rog-strix-geforce-rtx-3090-24gb-gddr6x-video-card/14954117?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/msi-nvidia-geforce-rtx-3090-ventus-3x-oc-24gb-gddr6x-video-card/14966477?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/msi-nvidia-geforce-rtx-3070-ventus-3x-oc-8gb-gddr6x-video-card/15038016?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'twin edge oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/zotac-nvidia-geforce-rtx-3070-twin-edge-oc-8gb-gddr6x-video-card/15000078?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'twin edge',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/zotac-nvidia-geforce-rtx-3070-twin-edge-8gb-gddr6x-video-card/15000079?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'nvidia',
|
||||
model: 'founders edition',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/nvidia-geforce-rtx-3070-8gb-gddr6-video-card-only-at-best-buy/15078017?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/playstation-5-console-online-only/14962185?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5de',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/playstation-5-digital-edition-console-online-only/14962184?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/xbox-series-x-1tb-console-new-model-online-only/14964951'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/xbox-series-s-512gb-console-new-model-online-only/14964950'
|
||||
}
|
||||
],
|
||||
name: 'bestbuy-ca',
|
||||
waitUntil: 'domcontentloaded'
|
||||
currency: '$',
|
||||
labels: {
|
||||
maxPrice: {
|
||||
container: 'div[class*="pricingContainer"]',
|
||||
euroFormat: false,
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.addToCartButton:disabled',
|
||||
text: ['add to cart'],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/google-nest-hello-wi-fi-video-doorbell-black-white/12222651',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x',
|
||||
series: '3060',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/msi-nvidia-geforce-rtx-3060-ventus-3x-12gb-gddr6-video-card/15324508',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'twin edge oc',
|
||||
series: '3060',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/zotac-nvidia-geforce-rtx-3060-twin-edge-oc-12gb-gddr6-video-card/15309503',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'twin edge',
|
||||
series: '3060',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/zotac-nvidia-geforce-rtx-3060-twin-edge-12gb-gddr6-video-card/15309504',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/msi-nvidia-geforce-rtx-3060-ti-ventus-2x-oc-8gb-gddr6-video-card/15178453?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'nvidia',
|
||||
model: 'founders edition',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/nvidia-geforce-rtx-3060-ti-8gb-gddr6-video-card/15166285?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'twin edge oc',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/zotac-geforce-rtx-3060-ti-twin-edge-oc-8gb-gddr6-video-card/15178452?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/evga-geforce-rtx-3060-ti-ftw3-ultra-8gb-gddr6-video-card/15200164?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/zotac-geforce-rtx-3080-trinity-10gb-gddr6x-video-card/14953249?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/zotac-nvidia-geforce-rtx-3080-trinity-oc-10gb-gddr6x-video-card/15000077?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/msi-nvidia-geforce-rtx-3080-ventus-3x-10gb-gddr6x-video-card/14950588?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/evga-geforce-rtx-3080-xc3-ultra-gaming-10gb-gddr6x-video-card/15084753?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/evga-geforce-rtx-3080-xc3-ultra-gaming-10gb-gddr6x-video-card-english/14961449?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/asus-tuf-gaming-geforce-rtx-3080-10gb-gddr6x-video-card/14953248?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/asus-rog-strix-geforce-rtx-3080-10gb-gddr6x-video-card/14954116?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/zotac-geforce-rtx-3090-trinity-24gb-gddr6x-video-card/14953250?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/asus-tuf-gaming-geforce-rtx-3090-24gb-gddr6x-video-card/14953247?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/asus-rog-strix-geforce-rtx-3090-24gb-gddr6x-video-card/14954117?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/msi-nvidia-geforce-rtx-3090-ventus-3x-oc-24gb-gddr6x-video-card/14966477?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/evga-nvidia-geforce-rtx-3090-xc3-ultra-gaming-24gb-gddr6x-video-card/14967857?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/msi-nvidia-geforce-rtx-3070-ventus-3x-oc-8gb-gddr6x-video-card/15038016?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'twin edge oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/zotac-nvidia-geforce-rtx-3070-twin-edge-oc-8gb-gddr6x-video-card/15000078?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'twin edge',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/zotac-nvidia-geforce-rtx-3070-twin-edge-8gb-gddr6x-video-card/15000079?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'nvidia',
|
||||
model: 'founders edition',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/nvidia-geforce-rtx-3070-8gb-gddr6-video-card-only-at-best-buy/15078017?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/evga-geforce-rtx-3070-xc3-ultra-8gb-gddr6-video-card/15147122?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/evga-geforce-rtx-3070-xc3-black-8gb-gddr6-video-card/15081879?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/playstation-5-console-online-only/14962185?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5de',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/playstation-5-digital-edition-console-online-only/14962184?intl=nosplash',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/xbox-series-x-1tb-console-new-model-online-only/14964951',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url:
|
||||
'https://www.bestbuy.ca/en-ca/product/xbox-series-s-512gb-console-new-model-online-only/14964950',
|
||||
},
|
||||
],
|
||||
name: 'bestbuy-ca',
|
||||
waitUntil: 'domcontentloaded',
|
||||
};
|
||||
|
||||
+475
-502
@@ -1,506 +1,479 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const BestBuy: Store = {
|
||||
currency: '$',
|
||||
labels: {
|
||||
inStock: {
|
||||
container:
|
||||
'[data-sticky-media-gallery] .fulfillment-add-to-cart-button',
|
||||
text: ['add to cart']
|
||||
},
|
||||
maxPrice: {
|
||||
container:
|
||||
'[data-sticky-media-gallery] .priceView-price .priceView-hero-price span'
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/insignia-8qt-digital-multi-cooker-stainless-steel/6258941.p?skuId=6258941&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'nvidia',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6429442/cart',
|
||||
model: 'founders edition',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/nvidia-geforce-rtx-3070-8gb-gddr6-pci-express-4-0-graphics-card-dark-platinum-and-black/6429442.p?skuId=6429442&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439300/cart',
|
||||
model: 'xc3 black',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/evga-geforce-rtx-3070-xc3-black-gaming-8gb-gddr6x-pci-express-4-0-graphics-card/6439300.p?skuId=6439300&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6437912/cart',
|
||||
model: 'eagle',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/gigabyte-geforce-rtx-3070-8g-gddr6-pci-express-4-0-graphics-card-black/6437912.p?skuId=6437912&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6437909/cart',
|
||||
model: 'gaming oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/gigabyte-geforce-rtx-3070-8g-gddr6-pci-express-4-0-graphics-card-black/6437909.p?skuId=6437909&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432654/cart',
|
||||
model: 'dual fan',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/pny-geforce-rtx-3070-8gb-dual-fan-graphics-card/6432654.p?skuId=6432654&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432653/cart',
|
||||
model: 'xlr8 revel',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/pny-geforce-rtx-3070-8gb-xlr8-gaming-epic-x-rgb-triple-fan-graphics-card/6432653.p?skuId=6432653&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439384/cart',
|
||||
model: 'aorus',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/gigabyte-geforce-rtx-3070-8g-gddr6-pci-express-4-0-graphics-card-black/6439384.p?skuId=6439384'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439385/cart',
|
||||
model: 'vision',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/gigabyte-geforce-rtx-3070-8g-gddr6-pci-express-4-0-graphics-card-white/6439385.p?skuId=6439385'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439128/cart',
|
||||
model: 'tuf',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/asus-tuf-rtx3070-8gb-gddr6-pci-express-4-0-graphics-card-black/6439128.p?skuId=6439128'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6438278/cart',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/msi-geforce-rtx-3070-ventus-3x-oc-bv-8gb-gddr6-pci-express-4-0-graphics-card-black/6438278.p?skuId=6438278'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439127/cart',
|
||||
model: 'strix',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/asus-rog-strix-rtx3070-8gb-gddr6-pci-express-4-0-graphics-card-black/6439127.p?skuId=6439127'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439301/cart',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/evga-geforce-rtx-3070-ftw3-ultra-gaming-8gb-gddr6x-pci-express-4-0-graphics-card/6439301.p?skuId=6439301'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439299/cart',
|
||||
model: 'xc3 ultra',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/evga-geforce-rtx-3070-xc3-ultra-gaming-8gb-gddr6x-pci-express-4-0-graphics-card/6439299.p?skuId=6439299'
|
||||
},
|
||||
{
|
||||
brand: 'nvidia',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6429440/cart',
|
||||
model: 'founders edition',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/nvidia-geforce-rtx-3080-10gb-gddr6x-pci-express-4-0-graphics-card-titanium-and-black/6429440.p?skuId=6429440&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432445/cart',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/asus-geforce-rtx-3080-10gb-gddr6x-pci-express-4-0-strix-graphics-card-black/6432445.p?skuId=6432445&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432399/cart',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/evga-geforce-rtx-3080-10gb-gddr6x-pci-express-4-0-graphics-card/6432399.p?skuId=6432399&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6436194/cart',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/evga-geforce-rtx-3080-10gb-gddr6x-pci-express-4-0-graphics-card/6436194.p?skuId=6436194&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432400/cart',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/evga-geforce-rtx-3080-10gb-gddr6x-pci-express-4-0-graphics-card/6432400.p?skuId=6432400&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6436196/cart',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/evga-geforce-rtx-3080-10gb-gddr6x-pci-express-4-0-graphics-card/6436196.p?skuId=6436196&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6436191/cart',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/evga-geforce-rtx-3080-10gb-gddr6x-pci-express-4-0-graphics-card/6436191.p?skuId=6436191&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6430620/cart',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/gigabyte-geforce-rtx-3080-10g-gddr6x-pci-express-4-0-graphics-card-black/6430620.p?acampID=0&cmp=RMX&loc=Hatch&ref=198&skuId=6430620&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6430621/cart',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/gigabyte-geforce-rtx-3080-10g-gddr6x-pci-express-4-0-graphics-card-black/6430621.p?skuId=6430621&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6436219/cart',
|
||||
model: 'vision oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/gigabyte-geforce-rtx-3080-10g-gddr6x-pci-express-4-0-graphics-card-white/6436219.p?skuId=6436219&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6436223/cart',
|
||||
model: 'aorus master',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/gigabyte-geforce-rtx-3080-10g-gddr6x-pci-express-4-0-graphics-card-black/6436223.p?skuId=6436223&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6430175/cart',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/msi-geforce-rtx-3080-ventus-3x-10g-oc-bv-gddr6x-pci-express-4-0-graphic-card-black-silver/6430175.p?skuId=6430175&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432655/cart',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/pny-geforce-rtx-3080-10gb-xlr8-gaming-epic-x-rgb-triple-fan-graphics-card/6432655.p?skuId=6432655&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432658/cart',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/pny-geforce-rtx-3080-10gb-xlr8-gaming-epic-x-rgb-triple-fan-graphics-card/6432658.p?skuId=6432658&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'nvidia',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6429434/cart',
|
||||
model: 'founders edition',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/nvidia-geforce-rtx-3090-24gb-gddr6x-pci-express-4-0-graphics-card-titanium-and-black/6429434.p?skuId=6429434&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432447/cart',
|
||||
model: 'strix',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/asus-geforce-rtx-3090-24gb-gddr6x-pci-express-4-0-strix-graphics-card-black/6432447.p?skuId=6432447&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432446/cart',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/asus-tuf-rtx-3090-24gb-gddr6x-pci-express-4-0-graphics-card-black/6432446.p?skuId=6432446&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6430215/cart',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/msi-geforce-rtx-3090-ventus-3x-24g-oc-bv-24gb-gddr6x-pci-express-4-0-graphics-card-black-silver/6430215.p?skuId=6430215&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6430623/cart',
|
||||
model: 'gaming',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/gigabyte-geforce-rtx-3090-24g-gddr6x-pci-express-4-0-graphics-card-black/6430623.p?skuId=6430623&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6430624/cart',
|
||||
model: 'eagle',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/gigabyte-geforce-rtx-3090-24g-gddr6x-pci-express-4-0-graphics-card-black/6430624.p?skuId=6430624&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6434363/cart',
|
||||
model: 'xc3',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/evga-geforce-rtx-3090-24gb-gddr6x-pci-express-4-0-graphics-card/6434363.p?skuId=6434363&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6436193/cart',
|
||||
model: 'ftw3',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/evga-geforce-rtx-3090-24gb-gddr6x-pci-express-4-0-graphics-card/6436193.p?skuId=6436193&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6436192/cart',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/evga-geforce-rtx-3090-24gb-gddr6x-pci-express-4-0-graphics-card/6436192.p?skuId=6436192&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432657/cart',
|
||||
model: 'xlr8 revel',
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/pny-geforce-rtx-3090-24gb-xlr8-gaming-epic-x-rgb-triple-fan-graphics-card/6432657.p?skuId=6432657&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'nvidia',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439402/cart',
|
||||
model: 'founders edition',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/nvidia-geforce-rtx-3060-ti-8gb-gddr6-pci-express-4-0-graphics-card-steel-and-black/6439402.p?skuId=6439402&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6441172/cart',
|
||||
model: 'ventus 2x',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/msi-geforce-rtx-3060-ti-ventus-2x-oc-bv-8gb-gddr6-pci-express-4-0-graphics-card-black-black/6441172.p?skuId=6441172&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6442484/cart',
|
||||
model: 'gaming oc',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/gigabyte-nvidia-geforce-rtx-3060-ti-gaming-oc-8g-gddr6-pci-express-4-0-graphics-card-black/6442484.p?skuId=6442484?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6442485/cart',
|
||||
model: 'eagle',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/gigabyte-nvidia-geforce-rtx-3060-ti-eagle-oc-8g-gddr6-pci-express-4-0-graphics-card-black/6442485.p?skuId=6442485?intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6438942/cart',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/amd-ryzen-9-5900x-4th-gen-12-core-24-threads-unlocked-desktop-processor-without-cooler/6438942.p?skuId=6438942&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6438941/cart',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/amd-ryzen-9-5950x-4th-gen-16-core-32-threads-unlocked-desktop-processor-without-cooler/6438941.p?skuId=6438941&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439000/cart',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/amd-ryzen-7-5800x-4th-gen-8-core-16-threads-unlocked-desktop-processor-without-cooler/6439000.p?skuId=6439000&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6438943/cart',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/amd-ryzen-5-5600x-4th-gen-6-core-12-threads-unlocked-desktop-processor-with-wraith-stealth-cooler/6438943.p?skuId=6438943&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6426149/cart',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/sony-playstation-5-console/6426149.p?skuId=6426149&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6430161/cart',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/sony-playstation-5-digital-edition-console/6430161.p?skuId=6430161&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/microsoft-xbox-series-x-1tb-console-black/6428324.p?skuId=6428324'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/microsoft-xbox-series-s-512-gb-all-digital-console-disc-free-gaming-white/6430277.p?skuId=6430277'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/msi-radeon-rx-6800-xt-16g-16gb-gddr6-pci-express-4-0-graphics-card-black-black/6440913.p?skuId=6440913'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/msi-radeon-rx-6800-16g-16gb-gddr6-pci-express-4-0-graphics-card-black-black/6441020.p?skuId=6441020'
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/xfx-amd-radeon-rx-6800-16gb-gddr6-pci-express-4-0-gaming-graphics-card-black/6442077.p?skuId=6442077'
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/xfx-amd-radeon-rx-6800xt-16gb-gddr6-pci-express-4-0-gaming-graphics-card-black/6441226.p?skuId=6441226'
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
model: 'merc',
|
||||
series: 'rx6800xt',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/xfx-merc-319-amd-radeon-rx-6800xt-16gb-gddr6-pci-express-4-0-gaming-graphics-card-black/6442585.p?skuId=6442585'
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
model: 'amd reference',
|
||||
series: 'rx6900xt',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/xfx-amd-radeon-rx-6900-xt-16gb-gddr6-pci-express-4-0-gaming-graphics-card-black/6444358.p?skuId=6444358'
|
||||
},
|
||||
{
|
||||
brand: 'corsair',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6351845/cart',
|
||||
model: '750 platinum',
|
||||
series: 'sf',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/corsair-sf-series-750w-atx12v-2-4-eps12v-2-92-sfx12v-80-plus-platinum-modular-power-supply-black/6351845.p?skuId=6351845'
|
||||
},
|
||||
{
|
||||
brand: 'corsair',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6351844/cart',
|
||||
model: '600 platinum',
|
||||
series: 'sf',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/corsair-sf-series-600w-atx12v-2-4-eps12v-2-92-sfx12v-80-plus-platinum-modular-power-supply-black/6351844.p?skuId=6351844'
|
||||
},
|
||||
{
|
||||
brand: 'nvidia',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439402/cart',
|
||||
model: 'founders edition',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/nvidia-geforce-rtx-3060-ti-8gb-gddr6-pci-express-4-0-graphics-card-steel-and-black/6439402.p?skuId=6439402&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6442484/cart',
|
||||
model: 'gaming oc',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/gigabyte-nvidia-geforce-rtx-3060-ti-gaming-oc-8g-gddr6-pci-express-4-0-graphics-card-black/6442484.p?skuId=6442484&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6442485/cart',
|
||||
model: 'eagle oc',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/gigabyte-nvidia-geforce-rtx-3060-ti-eagle-oc-8g-gddr6-pci-express-4-0-graphics-card-black/6442485.p?skuId=6442485&intl=nosplash'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6441172/cart',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.bestbuy.com/site/msi-geforce-rtx-3060-ti-ventus-2x-oc-bv-8gb-gddr6-pci-express-4-0-graphics-card-black-black/6441172.p?skuId=6441172&intl=nosplash'
|
||||
}
|
||||
],
|
||||
name: 'bestbuy'
|
||||
currency: '$',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '[data-sticky-media-gallery] .fulfillment-add-to-cart-button',
|
||||
text: ['add to cart'],
|
||||
},
|
||||
maxPrice: {
|
||||
container:
|
||||
'[data-sticky-media-gallery] .priceView-price .priceView-hero-price span',
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://api.bestbuy.com/click/-/6258941/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'nvidia',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6429442/cart',
|
||||
model: 'founders edition',
|
||||
series: '3070',
|
||||
url: 'https://api.bestbuy.com/click/-/6429442/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439300/cart',
|
||||
model: 'xc3 black',
|
||||
series: '3070',
|
||||
url: 'https://api.bestbuy.com/click/-/6439300/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6437912/cart',
|
||||
model: 'eagle',
|
||||
series: '3070',
|
||||
url: 'https://api.bestbuy.com/click/-/6437912/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6437909/cart',
|
||||
model: 'gaming oc',
|
||||
series: '3070',
|
||||
url: 'https://api.bestbuy.com/click/-/6437909/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432654/cart',
|
||||
model: 'dual fan',
|
||||
series: '3070',
|
||||
url: 'https://api.bestbuy.com/click/-/6432654/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432653/cart',
|
||||
model: 'xlr8 revel',
|
||||
series: '3070',
|
||||
url: 'https://api.bestbuy.com/click/-/6432653/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439384/cart',
|
||||
model: 'aorus',
|
||||
series: '3070',
|
||||
url: 'https://api.bestbuy.com/click/-/6439384/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439385/cart',
|
||||
model: 'vision',
|
||||
series: '3070',
|
||||
url: 'https://api.bestbuy.com/click/-/6439385/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439128/cart',
|
||||
model: 'tuf',
|
||||
series: '3070',
|
||||
url: 'https://api.bestbuy.com/click/-/6439128/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6438278/cart',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3070',
|
||||
url: 'https://api.bestbuy.com/click/-/6438278/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439127/cart',
|
||||
model: 'strix',
|
||||
series: '3070',
|
||||
url: 'https://api.bestbuy.com/click/-/6439127/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439301/cart',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3070',
|
||||
url: 'https://api.bestbuy.com/click/-/6439301/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439299/cart',
|
||||
model: 'xc3 ultra',
|
||||
series: '3070',
|
||||
url: 'https://api.bestbuy.com/click/-/6439299/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'nvidia',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6429440/cart',
|
||||
model: 'founders edition',
|
||||
series: '3080',
|
||||
url: 'https://api.bestbuy.com/click/-/6429440/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432445/cart',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url: 'https://api.bestbuy.com/click/-/6432445/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432399/cart',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://api.bestbuy.com/click/-/6432399/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6436194/cart',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://api.bestbuy.com/click/-/6436194/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432400/cart',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://api.bestbuy.com/click/-/6432400/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6436196/cart',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://api.bestbuy.com/click/-/6436196/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6436191/cart',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://api.bestbuy.com/click/-/6436191/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6430620/cart',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://api.bestbuy.com/click/-/6430620/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6430621/cart',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://api.bestbuy.com/click/-/6430621/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6436219/cart',
|
||||
model: 'vision oc',
|
||||
series: '3080',
|
||||
url: 'https://api.bestbuy.com/click/-/6436219/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6436223/cart',
|
||||
model: 'aorus master',
|
||||
series: '3080',
|
||||
url: 'https://api.bestbuy.com/click/-/6436223/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6430175/cart',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://api.bestbuy.com/click/-/6430175/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432655/cart',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url: 'https://api.bestbuy.com/click/-/6432655/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432658/cart',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url: 'https://api.bestbuy.com/click/-/6432658/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'nvidia',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6429434/cart',
|
||||
model: 'founders edition',
|
||||
series: '3090',
|
||||
url: 'https://api.bestbuy.com/click/-/6429434/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432447/cart',
|
||||
model: 'strix',
|
||||
series: '3090',
|
||||
url: 'https://api.bestbuy.com/click/-/6432447/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432446/cart',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url: 'https://api.bestbuy.com/click/-/6432446/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6430215/cart',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url: 'https://api.bestbuy.com/click/-/6430215/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6430623/cart',
|
||||
model: 'gaming',
|
||||
series: '3090',
|
||||
url: 'https://api.bestbuy.com/click/-/6430623/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6430624/cart',
|
||||
model: 'eagle',
|
||||
series: '3090',
|
||||
url: 'https://api.bestbuy.com/click/-/6430624/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6434363/cart',
|
||||
model: 'xc3',
|
||||
series: '3090',
|
||||
url: 'https://api.bestbuy.com/click/-/6434363/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6436193/cart',
|
||||
model: 'ftw3',
|
||||
series: '3090',
|
||||
url: 'https://api.bestbuy.com/click/-/6436193/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6436192/cart',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3090',
|
||||
url: 'https://api.bestbuy.com/click/-/6436192/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6432657/cart',
|
||||
model: 'xlr8 revel',
|
||||
series: '3090',
|
||||
url: 'https://api.bestbuy.com/click/-/6432657/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'nvidia',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439402/cart',
|
||||
model: 'founders edition',
|
||||
series: '3060ti',
|
||||
url: 'https://api.bestbuy.com/click/-/6439402/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6441172/cart',
|
||||
model: 'ventus 2x',
|
||||
series: '3060ti',
|
||||
url: 'https://api.bestbuy.com/click/-/6441172/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6442484/cart',
|
||||
model: 'gaming oc',
|
||||
series: '3060ti',
|
||||
url: 'https://api.bestbuy.com/click/-/6442484/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6442485/cart',
|
||||
model: 'eagle',
|
||||
series: '3060ti',
|
||||
url: 'https://api.bestbuy.com/click/-/6442485/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6452940/cart',
|
||||
model: 'ventus 3x',
|
||||
series: '3060',
|
||||
url: 'https://api.bestbuy.com/click/-/6452940/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6454328/cart',
|
||||
model: 'xc gaming',
|
||||
series: '3060',
|
||||
url: 'https://api.bestbuy.com/click/-/6454328/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6438942/cart',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://api.bestbuy.com/click/-/6438942/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6438941/cart',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://api.bestbuy.com/click/-/6438941/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6439000/cart',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://api.bestbuy.com/click/-/6439000/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6438943/cart',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://api.bestbuy.com/click/-/6438943/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6426149/cart',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://api.bestbuy.com/click/-/6426149/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6430161/cart',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://api.bestbuy.com/click/-/6430161/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6428324/cart',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://api.bestbuy.com/click/-/6428324/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6430277/cart',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://api.bestbuy.com/click/-/6430277/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6440913/cart',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://api.bestbuy.com/click/-/6440913/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6441020/cart',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url: 'https://api.bestbuy.com/click/-/6441020/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6442077/cart',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url: 'https://api.bestbuy.com/click/-/6442077/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6441226/cart',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://api.bestbuy.com/click/-/6441226/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6442585/cart',
|
||||
model: 'merc',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://api.bestbuy.com/click/-/6442585/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6444358/cart',
|
||||
model: 'amd reference',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://api.bestbuy.com/click/-/6444358/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6444716/cart',
|
||||
model: 'amd reference',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://api.bestbuy.com/click/-/6444716/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6445157/cart',
|
||||
model: 'merc',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://api.bestbuy.com/click/-/6445157/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'corsair',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6351845/cart',
|
||||
model: '750 platinum',
|
||||
series: 'sf',
|
||||
url: 'https://api.bestbuy.com/click/-/6351845/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'corsair',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6351844/cart',
|
||||
model: '600 platinum',
|
||||
series: 'sf',
|
||||
url: 'https://api.bestbuy.com/click/-/6351844/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6446660/cart',
|
||||
model: 'xlr8 uprising',
|
||||
series: '3060ti',
|
||||
url: 'https://api.bestbuy.com/click/-/6446660/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6444445/cart',
|
||||
model: 'xc gaming',
|
||||
series: '3060ti',
|
||||
url: 'https://api.bestbuy.com/click/-/6444445/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6444444/cart',
|
||||
model: 'ftw3',
|
||||
series: '3060ti',
|
||||
url: 'https://api.bestbuy.com/click/-/6444444/pdp',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl: 'https://api.bestbuy.com/click/-/6444449/cart',
|
||||
model: 'ftw3',
|
||||
series: '3060ti',
|
||||
url: 'https://api.bestbuy.com/click/-/6444449/pdp',
|
||||
},
|
||||
],
|
||||
name: 'bestbuy',
|
||||
};
|
||||
|
||||
+89
-87
@@ -2,91 +2,93 @@ import {Store} from './store';
|
||||
import {getProductLinksBuilder} from './helpers/card';
|
||||
|
||||
export const Box: Store = {
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '£',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '#divBuyButton',
|
||||
text: ['add to basket']
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.p-price',
|
||||
euroFormat: false // Note: Box uses non-euroFromat as price seperator
|
||||
},
|
||||
outOfStock: {
|
||||
container: '#divBuyButton',
|
||||
text: ['request stock alert', 'coming soon']
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://www.box.co.uk/Gigabyte-GeForce-RTX-2080-Super-8GB-Wind_2724554.html'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url:
|
||||
'https://www.box.co.uk/CFI-1015A-Sony-Playstation-5-Console_3199689.html'
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url:
|
||||
'https://www.box.co.uk/CFI-1015B-Sony-PlayStation-5-Digital-Edition-Conso_3199692.html'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url:
|
||||
'https://www.box.co.uk/RRT-00007-Xbox-Series-X-Console_3201195.html'
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url:
|
||||
'https://www.box.co.uk/RRS-00007-Xbox-Series-S-Console_3201197.html'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: 'tuf oc',
|
||||
series: 'rx6900xt',
|
||||
url:
|
||||
'https://www.box.co.uk/90YV0GE0-M0NM00-ASUS-Radeon-RX-X6900XT-16GB-OC-Gaming-Gr_3561243.html'
|
||||
}
|
||||
],
|
||||
linksBuilder: {
|
||||
builder: getProductLinksBuilder({
|
||||
productsSelector: '.products-right .p-list',
|
||||
sitePrefix: 'https://www.box.co.uk',
|
||||
titleSelector: '.p-list-section > h3 > a[href]'
|
||||
}),
|
||||
urls: [
|
||||
{
|
||||
series: '3060ti',
|
||||
url: 'https://www.box.co.uk/rtx-3060-ti-graphics-cards'
|
||||
},
|
||||
{
|
||||
series: '3070',
|
||||
url: 'https://www.box.co.uk/rtx-3070-graphics-cards'
|
||||
},
|
||||
{
|
||||
series: '3080',
|
||||
url: 'https://www.box.co.uk/rtx-3080-graphics-cards'
|
||||
},
|
||||
{
|
||||
series: '3090',
|
||||
url: 'https://www.box.co.uk/rtx-3090-graphics-cards'
|
||||
}
|
||||
]
|
||||
},
|
||||
name: 'box',
|
||||
waitUntil: 'domcontentloaded'
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '£',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '#divBuyButton',
|
||||
text: ['add to basket'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.p-price',
|
||||
euroFormat: false, // Note: Box uses non-euroFromat as price seperator
|
||||
},
|
||||
outOfStock: {
|
||||
container: '#divBuyButton',
|
||||
text: ['request stock alert', 'coming soon'],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://www.box.co.uk/Gigabyte-GeForce-RTX-2080-Super-8GB-Wind_2724554.html',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url:
|
||||
'https://www.box.co.uk/CFI-1015A-Sony-Playstation-5-Console_3199689.html',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url:
|
||||
'https://www.box.co.uk/CFI-1015B-Sony-PlayStation-5-Digital-Edition-Conso_3199692.html',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.box.co.uk/RRT-00007-Xbox-Series-X-Console_3201195.html',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.box.co.uk/RRS-00007-Xbox-Series-S-Console_3201197.html',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: 'tuf oc',
|
||||
series: 'rx6900xt',
|
||||
url:
|
||||
'https://www.box.co.uk/90YV0GE0-M0NM00-ASUS-Radeon-RX-X6900XT-16GB-OC-Gaming-Gr_3561243.html',
|
||||
},
|
||||
],
|
||||
linksBuilder: {
|
||||
builder: getProductLinksBuilder({
|
||||
productsSelector: '.products-right .p-list',
|
||||
sitePrefix: 'https://www.box.co.uk',
|
||||
titleSelector: '.p-list-section > h3 > a[href]',
|
||||
}),
|
||||
urls: [
|
||||
{
|
||||
series: '3060',
|
||||
url: 'https://www.box.co.uk/rtx-3060-graphics-cards',
|
||||
},
|
||||
{
|
||||
series: '3060ti',
|
||||
url: 'https://www.box.co.uk/rtx-3060-ti-graphics-cards',
|
||||
},
|
||||
{
|
||||
series: '3070',
|
||||
url: 'https://www.box.co.uk/rtx-3070-graphics-cards',
|
||||
},
|
||||
{
|
||||
series: '3080',
|
||||
url: 'https://www.box.co.uk/rtx-3080-graphics-cards',
|
||||
},
|
||||
{
|
||||
series: '3090',
|
||||
url: 'https://www.box.co.uk/rtx-3090-graphics-cards',
|
||||
},
|
||||
],
|
||||
},
|
||||
name: 'box',
|
||||
waitUntil: 'domcontentloaded',
|
||||
};
|
||||
|
||||
+167
-167
@@ -1,171 +1,171 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const Bpctech: Store = {
|
||||
backoffStatusCodes: [403, 429],
|
||||
currency: '$',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.productStockStatus',
|
||||
text: ['in stock']
|
||||
},
|
||||
maxPrice: {
|
||||
container: 'div.price-box.price-final_price > span > span',
|
||||
euroFormat: false
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/tuf-rtx3080-10g-gaming-asus-geforce-rtx-3080-tuf-gaming-10gb-video-card.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/tuf-rtx3080-o10g-gaming-asus-geforce-rtx-3080-tuf-gaming-oc-10gb-video-card.html'
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/rog-strix-rtx3080-o10g-gaming-asus-geforce-rtx-3080-rog-strix-oc-10gb-video-card.html'
|
||||
},
|
||||
// {
|
||||
// brand: 'colorful',
|
||||
// model: 'igame advanced oc',
|
||||
// series: '3080',
|
||||
// url: 'https://www.bpctech.com.au/colorful-advancedoc10g-v-colorful-igame-geforce-rtx-3080-advanced-oc-10g-v-video-card.html'
|
||||
// },
|
||||
// {
|
||||
// brand: 'colorful',
|
||||
// model: 'igame vulcan oc',
|
||||
// series: '3080',
|
||||
// url: 'https://www.bpctech.com.au/colorful-vulcanoc10g-v-colorful-igame-geforce-rtx-3080-vulcan-oc-10g-video-card.html'
|
||||
// },
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/10g-p5-3897-kr-evga-geforce-rtx-3080-ftw3-ultra-gaming-10gb-video-card.html'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/10g-p5-3881-kr-evga-geforce-rtx-3080-xc3-black-gaming-10gb-video-card.html'
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/10g-p5-3885-kr-evga-geforce-rtx-3080-xc3-ultra-gaming-10gb-video-card.html'
|
||||
},
|
||||
{
|
||||
brand: 'galax',
|
||||
model: 'sg oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/38nwm3md99nn-galax-geforce-rtx-3080-sg-1-click-oc-10gb-video-card.html'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'vision oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/gv-n3080vision-oc-10gd-gigabyte-geforce-rtx-3080-vision-oc-10gb-video-card.html'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/gv-n3080gaming-oc-10gd-gigabyte-geforce-rtx-3080-gaming-oc-10gb-video-card.html'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus master',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/gv-n3080aorus-m-10gd-gigabyte-geforce-rtx-3080-aorus-master-10g-video-card.html'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus xtreme',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/gv-n3080aorus-x-10gd-gigabyte-aorus-geforce-rtx-3080-xtreme-10gb-video-card.html'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus xtreme waterforce',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/gv-n3080aorusx-w-10gd-gigabyte-aorus-geforce-rtx-3080-xtreme-waterforce-10gb-video-card.html'
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/gv-n3080eagle-oc-10gd-gigabyte-geforce-rtx-3080-eagle-oc-10gb-video-card.html'
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x4',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/c30804-106xx-1810va36-inno3d-geforce-rtx-3080-ichill-x4-10gb-video-card.html'
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x3',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/c30803-106xx-1810va37-inno3d-geforce-rtx-3080-ichill-x3-10gb-video-card.html'
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'twin x2 oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/n30802-106xx-1810va34-inno3d-geforce-rtx-3080-twin-x2-oc-10gb-video-card.html'
|
||||
},
|
||||
{
|
||||
brand: 'leadtek',
|
||||
model: 'hurricane',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/rtx3080-hurricane-leadtek-geforce-rtx-3080-hurricane-10gb-video-card.html'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'suprim x',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/rtx3080-suprim-x-10g-msi-geforce-rtx-3080-suprim-x-10gb-video-card.html'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/rtx3080-ventus-3x-10g-oc-msi-rtx-3080-ventus-3x-10g-oc-video-card.html'
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/rtx3080-gaming-x-trio-10g-msi-rtx-3080-gaming-x-trio-10g-video-card.html'
|
||||
}
|
||||
],
|
||||
name: 'bpctech'
|
||||
backoffStatusCodes: [403, 429],
|
||||
currency: '$',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.productStockStatus',
|
||||
text: ['in stock'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: 'div.price-box.price-final_price > span > span',
|
||||
euroFormat: false,
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/tuf-rtx3080-10g-gaming-asus-geforce-rtx-3080-tuf-gaming-10gb-video-card.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/tuf-rtx3080-o10g-gaming-asus-geforce-rtx-3080-tuf-gaming-oc-10gb-video-card.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/rog-strix-rtx3080-o10g-gaming-asus-geforce-rtx-3080-rog-strix-oc-10gb-video-card.html',
|
||||
},
|
||||
// {
|
||||
// brand: 'colorful',
|
||||
// model: 'igame advanced oc',
|
||||
// series: '3080',
|
||||
// url: 'https://www.bpctech.com.au/colorful-advancedoc10g-v-colorful-igame-geforce-rtx-3080-advanced-oc-10g-v-video-card.html'
|
||||
// },
|
||||
// {
|
||||
// brand: 'colorful',
|
||||
// model: 'igame vulcan oc',
|
||||
// series: '3080',
|
||||
// url: 'https://www.bpctech.com.au/colorful-vulcanoc10g-v-colorful-igame-geforce-rtx-3080-vulcan-oc-10g-video-card.html'
|
||||
// },
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/10g-p5-3897-kr-evga-geforce-rtx-3080-ftw3-ultra-gaming-10gb-video-card.html',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/10g-p5-3881-kr-evga-geforce-rtx-3080-xc3-black-gaming-10gb-video-card.html',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/10g-p5-3885-kr-evga-geforce-rtx-3080-xc3-ultra-gaming-10gb-video-card.html',
|
||||
},
|
||||
{
|
||||
brand: 'galax',
|
||||
model: 'sg oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/38nwm3md99nn-galax-geforce-rtx-3080-sg-1-click-oc-10gb-video-card.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'vision oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/gv-n3080vision-oc-10gd-gigabyte-geforce-rtx-3080-vision-oc-10gb-video-card.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/gv-n3080gaming-oc-10gd-gigabyte-geforce-rtx-3080-gaming-oc-10gb-video-card.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus master',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/gv-n3080aorus-m-10gd-gigabyte-geforce-rtx-3080-aorus-master-10g-video-card.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus xtreme',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/gv-n3080aorus-x-10gd-gigabyte-aorus-geforce-rtx-3080-xtreme-10gb-video-card.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus xtreme waterforce',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/gv-n3080aorusx-w-10gd-gigabyte-aorus-geforce-rtx-3080-xtreme-waterforce-10gb-video-card.html',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/gv-n3080eagle-oc-10gd-gigabyte-geforce-rtx-3080-eagle-oc-10gb-video-card.html',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x4',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/c30804-106xx-1810va36-inno3d-geforce-rtx-3080-ichill-x4-10gb-video-card.html',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x3',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/c30803-106xx-1810va37-inno3d-geforce-rtx-3080-ichill-x3-10gb-video-card.html',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'twin x2 oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/n30802-106xx-1810va34-inno3d-geforce-rtx-3080-twin-x2-oc-10gb-video-card.html',
|
||||
},
|
||||
{
|
||||
brand: 'leadtek',
|
||||
model: 'hurricane',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/rtx3080-hurricane-leadtek-geforce-rtx-3080-hurricane-10gb-video-card.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'suprim x',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/rtx3080-suprim-x-10g-msi-geforce-rtx-3080-suprim-x-10gb-video-card.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/rtx3080-ventus-3x-10g-oc-msi-rtx-3080-ventus-3x-10g-oc-video-card.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.bpctech.com.au/rtx3080-gaming-x-trio-10g-msi-rtx-3080-gaming-x-trio-10g-video-card.html',
|
||||
},
|
||||
],
|
||||
name: 'bpctech',
|
||||
};
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const BpmPower: Store = {
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.dispoSiProd >span',
|
||||
text: ['Disponibile'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: 'p.prezzoScheda:nth-child(1)',
|
||||
euroFormat: true,
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.dispoSiProd >span',
|
||||
text: ['Esaurito'],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://www.bpm-power.com/it/online/audio/auricolari-audio/apple-airpods-2-2019-b1492931',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.bpm-power.com/it/online/componenti-pc/schede-video/nvidia-msi-rtx-3070-b1710142',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url:
|
||||
'https://www.bpm-power.com/it/online/componenti-pc/processori/cpu-amd-ryzen-7-b1710075',
|
||||
},
|
||||
],
|
||||
name: 'bpm-power',
|
||||
};
|
||||
+659
-484
File diff suppressed because it is too large
Load Diff
+922
-383
File diff suppressed because it is too large
Load Diff
+105
-100
@@ -2,104 +2,109 @@ import {Store} from './store';
|
||||
import {getProductLinksBuilder} from './helpers/card';
|
||||
|
||||
export const Ccl: Store = {
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '£',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '#pnlAddToBasket',
|
||||
text: ['add to basket']
|
||||
},
|
||||
maxPrice: {
|
||||
container: '#pnlPriceText > p',
|
||||
euroFormat: false // Note: CCL uses non-euroFromat as price seperator
|
||||
},
|
||||
outOfStock: {
|
||||
container: '#pnlSoldOut',
|
||||
text: ['sold out', 'coming soon']
|
||||
}
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://www.cclonline.com/product/296443/RTX-2060-SUPER-VENTUS-GP-OC/Graphics-Cards/MSI-GeForce-RTX-2060-SUPER-VENTUS-GP-OC-8GB-Overclocked-Graphics-Card/VGA5671/'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url:
|
||||
'https://www.cclonline.com/product/331765/100-100000065BOX/CPU-Processors/AMD-Ryzen-5-5600X-3-7GHz-Hexa-Core-Processor-with-6-Cores-12-Threads-65W-TDP-35MB-Cache-4-6GHz-Turbo-Wraith-Stealth-Cooler/CPU0679/'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url:
|
||||
'https://www.cclonline.com/product/331766/100-100000063WOF/CPU-Processors/AMD-Ryzen-7-5800X-3-8GHz-Octa-Core-Processor-with-8-Cores-16-Threads-105W-TDP-36MB-Cache-4-7GHz-Turbo-No-Cooler/CPU0680/'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url:
|
||||
'https://www.cclonline.com/product/331767/100-100000061WOF/CPU-Processors/AMD-Ryzen-9-5900X-3-7GHz-Dodeca-Core-Processor-with-12-Cores-24-Threads-105W-TDP-70MB-Cache-4-8GHz-Turbo-No-Cooler/CPU0681/'
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url:
|
||||
'https://www.cclonline.com/product/331768/100-100000059WOF/CPU-Processors/AMD-Ryzen-9-5950X-3-4GHz-Hexadeca-Core-Processor-with-16-Cores-32-Threads-105W-TDP-72MB-Cache-4-9GHz-Turbo-No-Cooler/CPU0682/'
|
||||
}
|
||||
],
|
||||
linksBuilder: {
|
||||
builder: getProductLinksBuilder({
|
||||
productsSelector: '.productListingContainerOuter .productList',
|
||||
sitePrefix: 'https://www.cclonline.com',
|
||||
titleAttribute: 'title',
|
||||
titleSelector: '.productList_Detail a[title]'
|
||||
}),
|
||||
urls: [
|
||||
{
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.cclonline.com/category/430/PC-Components/Graphics-Cards/GeForce-RTX-3060-Ti-Graphics-Cards/'
|
||||
},
|
||||
{
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.cclonline.com/category/430/PC-Components/Graphics-Cards/GeForce-RTX-3070-Graphics-Cards/'
|
||||
},
|
||||
{
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.cclonline.com/category/430/PC-Components/Graphics-Cards/GeForce-RTX-3080-Graphics-Cards/'
|
||||
},
|
||||
{
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.cclonline.com/category/430/PC-Components/Graphics-Cards/GeForce-RTX-3090-Graphics-Cards/'
|
||||
},
|
||||
{
|
||||
series: 'rx6800',
|
||||
url:
|
||||
'https://www.cclonline.com/category/430/PC-Components/Graphics-Cards/AMD-Radeon-RX-6800-Graphics-Cards/'
|
||||
},
|
||||
{
|
||||
series: 'rx6800xt',
|
||||
url:
|
||||
'https://www.cclonline.com/category/430/PC-Components/Graphics-Cards/AMD-Radeon-RX-6800-XT-Graphics-Cards/'
|
||||
},
|
||||
{
|
||||
series: 'rx6900xt',
|
||||
url:
|
||||
'https://www.cclonline.com/category/430/PC-Components/Graphics-Cards/attributeslist/1268064/'
|
||||
}
|
||||
]
|
||||
},
|
||||
name: 'ccl',
|
||||
waitUntil: 'domcontentloaded'
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '£',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '#pnlAddToBasket',
|
||||
text: ['add to basket'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '#pnlPriceText > p',
|
||||
euroFormat: false, // Note: CCL uses non-euroFromat as price seperator
|
||||
},
|
||||
outOfStock: {
|
||||
container: '#pnlSoldOut',
|
||||
text: ['sold out', 'coming soon'],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url:
|
||||
'https://www.cclonline.com/product/296443/RTX-2060-SUPER-VENTUS-GP-OC/Graphics-Cards/MSI-GeForce-RTX-2060-SUPER-VENTUS-GP-OC-8GB-Overclocked-Graphics-Card/VGA5671/',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url:
|
||||
'https://www.cclonline.com/product/331765/100-100000065BOX/CPU-Processors/AMD-Ryzen-5-5600X-3-7GHz-Hexa-Core-Processor-with-6-Cores-12-Threads-65W-TDP-35MB-Cache-4-6GHz-Turbo-Wraith-Stealth-Cooler/CPU0679/',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url:
|
||||
'https://www.cclonline.com/product/331766/100-100000063WOF/CPU-Processors/AMD-Ryzen-7-5800X-3-8GHz-Octa-Core-Processor-with-8-Cores-16-Threads-105W-TDP-36MB-Cache-4-7GHz-Turbo-No-Cooler/CPU0680/',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url:
|
||||
'https://www.cclonline.com/product/331767/100-100000061WOF/CPU-Processors/AMD-Ryzen-9-5900X-3-7GHz-Dodeca-Core-Processor-with-12-Cores-24-Threads-105W-TDP-70MB-Cache-4-8GHz-Turbo-No-Cooler/CPU0681/',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url:
|
||||
'https://www.cclonline.com/product/331768/100-100000059WOF/CPU-Processors/AMD-Ryzen-9-5950X-3-4GHz-Hexadeca-Core-Processor-with-16-Cores-32-Threads-105W-TDP-72MB-Cache-4-9GHz-Turbo-No-Cooler/CPU0682/',
|
||||
},
|
||||
],
|
||||
linksBuilder: {
|
||||
builder: getProductLinksBuilder({
|
||||
productsSelector: '.productListingContainerOuter .productList',
|
||||
sitePrefix: 'https://www.cclonline.com',
|
||||
titleAttribute: 'title',
|
||||
titleSelector: '.productList_Detail a[title]',
|
||||
}),
|
||||
urls: [
|
||||
{
|
||||
series: '3060',
|
||||
url:
|
||||
'https://www.cclonline.com/category/430/PC-Components/Graphics-Cards/GeForce-RTX-3060-Graphics-Cards/',
|
||||
},
|
||||
{
|
||||
series: '3060ti',
|
||||
url:
|
||||
'https://www.cclonline.com/category/430/PC-Components/Graphics-Cards/GeForce-RTX-3060-Ti-Graphics-Cards/',
|
||||
},
|
||||
{
|
||||
series: '3070',
|
||||
url:
|
||||
'https://www.cclonline.com/category/430/PC-Components/Graphics-Cards/GeForce-RTX-3070-Graphics-Cards/',
|
||||
},
|
||||
{
|
||||
series: '3080',
|
||||
url:
|
||||
'https://www.cclonline.com/category/430/PC-Components/Graphics-Cards/GeForce-RTX-3080-Graphics-Cards/',
|
||||
},
|
||||
{
|
||||
series: '3090',
|
||||
url:
|
||||
'https://www.cclonline.com/category/430/PC-Components/Graphics-Cards/GeForce-RTX-3090-Graphics-Cards/',
|
||||
},
|
||||
{
|
||||
series: 'rx6800',
|
||||
url:
|
||||
'https://www.cclonline.com/category/430/PC-Components/Graphics-Cards/AMD-Radeon-RX-6800-Graphics-Cards/',
|
||||
},
|
||||
{
|
||||
series: 'rx6800xt',
|
||||
url:
|
||||
'https://www.cclonline.com/category/430/PC-Components/Graphics-Cards/AMD-Radeon-RX-6800-XT-Graphics-Cards/',
|
||||
},
|
||||
{
|
||||
series: 'rx6900xt',
|
||||
url:
|
||||
'https://www.cclonline.com/category/430/PC-Components/Graphics-Cards/attributeslist/1268064/',
|
||||
},
|
||||
],
|
||||
},
|
||||
name: 'ccl',
|
||||
waitUntil: 'domcontentloaded',
|
||||
};
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user