mirror of
https://github.com/opelly27/streetmerchant.git
synced 2026-05-20 02:57:34 +00:00
Compare commits
293 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| afe7a70900 | |||
| f65aab87da | |||
| c2a22716cc | |||
| 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 | |||
| b97d581607 | |||
| eb700762a4 | |||
| 38630d478a | |||
| 2a5e2e8733 | |||
| 579cb97a0d | |||
| f70998f0d9 | |||
| 02825d009b | |||
| 0d75025cbb | |||
| db47827e6e | |||
| c3beedced8 | |||
| 0525119b9b | |||
| b6964b02f3 | |||
| 7329c6ede0 | |||
| cccfde245a | |||
| ad0b2fe525 | |||
| 064ce83f03 | |||
| ef452d8e58 | |||
| dca916b64e | |||
| e2bf5749c1 | |||
| da78362045 | |||
| c74ea28014 | |||
| 67b19a7a8b | |||
| 5786481b31 | |||
| 9b7c7e2881 | |||
| 7e3020a927 | |||
| 3386e8f50d | |||
| 7bfcc81fdc | |||
| 37962f00e5 | |||
| d92d58d235 | |||
| 9b3906ca00 | |||
| 0683430768 | |||
| b6ea0ea991 | |||
| 68eede5487 | |||
| 29175c77a8 | |||
| a44621f8f5 | |||
| 27cfb94de8 | |||
| b599c23b51 | |||
| 2115c0c906 | |||
| 4f60ad2a82 | |||
| 8d192317ba | |||
| 3841666d03 | |||
| 2632386a5b | |||
| 9dc04b3638 | |||
| b2738370b4 | |||
| 54ef0ef995 | |||
| ba5c50495b | |||
| 0e7de05fd2 | |||
| 578027a36b | |||
| 5e1dfc3568 | |||
| 5955d10a7f | |||
| 64f55c1b86 | |||
| 1538937661 | |||
| 46bed1ef3c | |||
| b56d214059 | |||
| 625ae0ee53 | |||
| d7602f3a0f | |||
| b806e1bb9c | |||
| 58f0a9c774 | |||
| 48a46d0217 | |||
| 53eeff0bfc | |||
| ac0bd2ac14 | |||
| 0072dda90b | |||
| d56bcddb05 | |||
| 5aa4fdc7b9 | |||
| 60508e2ddb | |||
| 4f7c9ed84f | |||
| e3eb38655a | |||
| b535b470ca | |||
| 30bed2ac01 | |||
| 84a6ff5973 | |||
| 84f2cb7d52 | |||
| d5bd7e3db2 | |||
| 1f63e99804 | |||
| 243109a4ff |
+4
-4
@@ -1,12 +1,12 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = tab
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[*.{yml, json, md}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
[*.md]
|
||||
indent_size = 4
|
||||
|
||||
@@ -1,98 +0,0 @@
|
||||
# ** All configuration variables are optional **
|
||||
# Read https://github.com/jef/streetmerchant#customization for help on customizing this file
|
||||
#############################################################################################
|
||||
|
||||
ASCII_BANNER=""
|
||||
ASCII_COLOR=""
|
||||
AUTO_ADD_TO_CART=""
|
||||
BROWSER_TRUSTED=""
|
||||
COUNTRY=""
|
||||
DESKTOP_NOTIFICATIONS=""
|
||||
DISCORD_NOTIFY_GROUP=""
|
||||
DISCORD_WEB_HOOK=""
|
||||
EMAIL_PASSWORD=""
|
||||
EMAIL_TO=""
|
||||
EMAIL_USERNAME=""
|
||||
HEADLESS=""
|
||||
IN_STOCK_WAIT_TIME=""
|
||||
LOG_LEVEL=""
|
||||
LOW_BANDWIDTH=""
|
||||
MAX_PRICE_SERIES_3060TI=""
|
||||
MAX_PRICE_SERIES_3070=""
|
||||
MAX_PRICE_SERIES_3080=""
|
||||
MAX_PRICE_SERIES_3090=""
|
||||
MAX_PRICE_SERIES_CORSAIR_SF=""
|
||||
MAX_PRICE_SERIES_RX6800=""
|
||||
MAX_PRICE_SERIES_RX6800XT=""
|
||||
MAX_PRICE_SERIES_RX6900XT=""
|
||||
MAX_PRICE_SERIES_RYZEN5600=""
|
||||
MAX_PRICE_SERIES_RYZEN5800=""
|
||||
MAX_PRICE_SERIES_RYZEN5900=""
|
||||
MAX_PRICE_SERIES_RYZEN5950=""
|
||||
MAX_PRICE_SERIES_SONYPS5C=""
|
||||
MAX_PRICE_SERIES_SONYPS5DE=""
|
||||
MAX_PRICE_SERIES_TEST=""
|
||||
MICROCENTER_LOCATION=""
|
||||
MQTT_BROKER_ADDRESS=""
|
||||
MQTT_BROKER_PORT=""
|
||||
MQTT_CLIENT_ID=""
|
||||
MQTT_PASSWORD=""
|
||||
MQTT_QOS=""
|
||||
MQTT_TOPIC=""
|
||||
MQTT_USERNAME=""
|
||||
NVIDIA_ADD_TO_CART_ATTEMPTS=""
|
||||
NVIDIA_SESSION_TTL=""
|
||||
OPEN_BROWSER=""
|
||||
PAGE_BACKOFF_MIN=""
|
||||
PAGE_BACKOFF_MAX=""
|
||||
PAGE_SLEEP_MIN=""
|
||||
PAGE_SLEEP_MAX=""
|
||||
PAGE_TIMEOUT=""
|
||||
PAGERDUTY_INTEGRATION_KEY=""
|
||||
PAGERDUTY_SEVERITY=""
|
||||
PHILIPS_HUE_API_KEY=""
|
||||
PHILIPS_HUE_CLOUD_ACCESS_TOKEN=""
|
||||
PHILIPS_HUE_CLOUD_CLIENT_ID=""
|
||||
PHILIPS_HUE_CLOUD_CLIENT_SECRET=""
|
||||
PHILIPS_HUE_CLOUD_REFRESH_TOKEN=""
|
||||
PHILIPS_HUE_LAN_BRIDGE_IP=""
|
||||
PHILIPS_HUE_LIGHT_COLOR=""
|
||||
PHILIPS_HUE_LIGHT_IDS=""
|
||||
PHILIPS_HUE_LIGHT_PATTERN=""
|
||||
PHONE_CARRIER=""
|
||||
PHONE_NUMBER=""
|
||||
PLAY_SOUND=""
|
||||
PROXY_ADDRESS=""
|
||||
PROXY_PROTOCOL=""
|
||||
PROXY_PORT=""
|
||||
PUSHBULLET=""
|
||||
PUSHOVER_TOKEN=""
|
||||
PUSHOVER_USER=""
|
||||
PUSHOVER_PRIORITY=""
|
||||
SCREENSHOT=""
|
||||
SHOW_ONLY_BRANDS=""
|
||||
SHOW_ONLY_MODELS=""
|
||||
SHOW_ONLY_SERIES=""
|
||||
SLACK_CHANNEL=""
|
||||
SLACK_TOKEN=""
|
||||
SMTP_ADDRESS=""
|
||||
SMTP_PORT=""
|
||||
STORES=""
|
||||
TELEGRAM_ACCESS_TOKEN=""
|
||||
TELEGRAM_CHAT_ID=""
|
||||
TWILIO_ACCOUNT_SID=""
|
||||
TWILIO_AUTH_TOKEN=""
|
||||
TWILIO_FROM_NUMBER=""
|
||||
TWILIO_TO_NUMBER=""
|
||||
TWITCH_ACCESS_TOKEN=""
|
||||
TWITCH_CHANNEL=""
|
||||
TWITCH_CLIENT_ID=""
|
||||
TWITCH_CLIENT_SECRET=""
|
||||
TWITCH_REFRESH_TOKEN=""
|
||||
TWITTER_ACCESS_TOKEN_KEY=""
|
||||
TWITTER_ACCESS_TOKEN_SECRET=""
|
||||
TWITTER_CONSUMER_KEY=""
|
||||
TWITTER_CONSUMER_SECRET=""
|
||||
TWITTER_TWEET_TAGS=""
|
||||
USER_AGENT=""
|
||||
WEB_PORT=""
|
||||
@@ -0,0 +1,2 @@
|
||||
build/
|
||||
docs/
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"extends": "./node_modules/gts/",
|
||||
"rules": {
|
||||
"prettier/prettier": [
|
||||
"error",
|
||||
{
|
||||
"endOfLine": "auto"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
---
|
||||
name: "\U0001F41B Bug report"
|
||||
about: Report a bug for this project
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Expected Behavior
|
||||
|
||||
<!-- Tell us what should happen -->
|
||||
|
||||
## Current 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 -->
|
||||
|
||||
## Environment
|
||||
|
||||
- OS:
|
||||
|
||||
<!-- Put your dotenv within backticks below. Be sure to remove any secrets/passwords. -->
|
||||
```dotenv
|
||||
```
|
||||
|
||||
## Logs
|
||||
|
||||
<!-- Provide a brief log -->
|
||||
@@ -1,41 +0,0 @@
|
||||
---
|
||||
name: 🐛 Bug report
|
||||
about: Report a bug for this project
|
||||
title: ''
|
||||
labels: 'type: bug'
|
||||
assignees: jef
|
||||
|
||||
---
|
||||
|
||||
<!--- Feel free to join our discord server (https://discord.gg/gbVY4vB9JF) for general support --->
|
||||
<!--- If this acts as a feature request please ask yourself if this modification is something the whole userbase will benefit from --->
|
||||
|
||||
## Expected Behavior
|
||||
|
||||
<!--- Tell us what should happen -->
|
||||
|
||||
## Current 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.
|
||||
|
||||
## Environment
|
||||
|
||||
**OS:**
|
||||
**.env file:**
|
||||
|
||||
```dotenv
|
||||
|
||||
```
|
||||
|
||||
## Logs
|
||||
|
||||
<!--- Provide a brief log -->
|
||||
@@ -0,0 +1,11 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: 💡 Have an idea for a new feature?
|
||||
url: https://github.com/jef/streetmerchant/discussions
|
||||
about: Create a new idea discussion!
|
||||
- name: 🙇 Need help with streetmerchant?
|
||||
url: https://github.com/jef/streetmerchant/discussions
|
||||
about: Create a new help discussion if it hasn't been asked before!
|
||||
- name: 💬 Want to talk with others that use streetmerchant?
|
||||
url: https://discord.gg/gbVY4vB9JF
|
||||
about: Join our Discord to hangout and talk shop!
|
||||
@@ -1,16 +0,0 @@
|
||||
---
|
||||
name: 🚀 Feature request
|
||||
about: Suggest a feature for this project
|
||||
title: ''
|
||||
labels: 'type: enhancement'
|
||||
assignees: jef
|
||||
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- Describe the feature here -->
|
||||
|
||||
## Possible solution
|
||||
|
||||
<!-- Describe the possible solution here -->
|
||||
@@ -1,12 +0,0 @@
|
||||
---
|
||||
name: 🤔 Question
|
||||
about: Open to all questions
|
||||
title: ''
|
||||
labels: 'type: question'
|
||||
assignees: jef
|
||||
|
||||
---
|
||||
|
||||
## Description
|
||||
|
||||
<!-- Describe the question here -->
|
||||
Executable
+3
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
npm run test
|
||||
@@ -1,29 +0,0 @@
|
||||
name: cd
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
jobs:
|
||||
publish:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: GoogleCloudPlatform/release-please-action@v2.10
|
||||
id: release
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
release-type: simple
|
||||
package-name: streetmerchant
|
||||
- name: login into github package registry
|
||||
run: echo ${{ secrets.CR_PAT }} | docker login ghcr.io -u $GITHUB_ACTOR --password-stdin
|
||||
- name: build latest docker image
|
||||
if: ${{ steps.release.outputs.release_created }}
|
||||
run: |
|
||||
docker build \
|
||||
-t "ghcr.io/${GITHUB_REPOSITORY}:${TAG_NAME}" \
|
||||
-t "ghcr.io/${GITHUB_REPOSITORY}:latest" .
|
||||
env:
|
||||
TAG_NAME: ${{ steps.release.outputs.tag_name }}
|
||||
- name: publish latest image
|
||||
if: ${{ steps.release.outputs.release_created }}
|
||||
run: docker push "ghcr.io/${GITHUB_REPOSITORY}"
|
||||
+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.2
|
||||
- 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.11.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 .
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
name: Documentation
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
jobs:
|
||||
build-deploy:
|
||||
name: Build and publish documentation
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.x
|
||||
- name: Install Python packages
|
||||
run: pip install mkdocs-material mkdocs-git-revision-date-plugin mkdocs-macros-plugin
|
||||
- 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,18 +0,0 @@
|
||||
name: nightly
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
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 }}
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
name: Release
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
jobs:
|
||||
build-tag-release:
|
||||
name: Build, tag, and release Docker image
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- 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: node
|
||||
changelog-path: CHANGELOG.md
|
||||
package-name: streetmerchant
|
||||
- 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 Docker image
|
||||
if: ${{ steps.release.outputs.release_created }}
|
||||
run: |
|
||||
docker build \
|
||||
-t "ghcr.io/${GITHUB_REPOSITORY}:${{ steps.release.outputs.tag_name }}" \
|
||||
-t "ghcr.io/${GITHUB_REPOSITORY}:latest" .
|
||||
- name: Release Docker image
|
||||
if: ${{ steps.release.outputs.release_created }}
|
||||
run: |
|
||||
docker push "ghcr.io/${GITHUB_REPOSITORY}:${{ steps.release.outputs.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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
+6
-3
@@ -2,11 +2,12 @@
|
||||
.vs/
|
||||
.vscode/
|
||||
build/
|
||||
coverage/
|
||||
node_modules/
|
||||
|
||||
.env*
|
||||
.*env
|
||||
!.env-example
|
||||
.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.11.0
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
module.exports = {
|
||||
...require('gts/.prettierrc.json')
|
||||
}
|
||||
+152
@@ -1,5 +1,157 @@
|
||||
# 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)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **discord:** dynamic currency symbol ([#1328](https://www.github.com/jef/streetmerchant/issues/1328)) ([cccfde2](https://www.github.com/jef/streetmerchant/commit/cccfde245affc11506c69d1ef6c30c09953307d4))
|
||||
* **docs:** add mkdocs ([243109a](https://www.github.com/jef/streetmerchant/commit/243109a4ffdfe1d1efe961af0b5cf28fd7e6ef1d))
|
||||
* **docs:** add table sorting ([#1258](https://www.github.com/jef/streetmerchant/issues/1258)) ([5955d10](https://www.github.com/jef/streetmerchant/commit/5955d10a7f2106c5ae1275fadacf2945626ca008))
|
||||
* **lookup:** use random user agents ([#1335](https://www.github.com/jef/streetmerchant/issues/1335)) ([b599c23](https://www.github.com/jef/streetmerchant/commit/b599c23b51735212e5369ce03a44bbd1bccafa42))
|
||||
* **notification:** add discord groups ([#1211](https://www.github.com/jef/streetmerchant/issues/1211)) ([2632386](https://www.github.com/jef/streetmerchant/commit/2632386a5b99f3b23166e88f92af809f0036a6b7))
|
||||
* **notification:** add sound player executable option ([#1301](https://www.github.com/jef/streetmerchant/issues/1301)) ([8d19231](https://www.github.com/jef/streetmerchant/commit/8d192317badfd71a7cd8f0115ba9e6fc951c1874))
|
||||
* **playstation:** add queuing selector ([#1173](https://www.github.com/jef/streetmerchant/issues/1173)) ([67b19a7](https://www.github.com/jef/streetmerchant/commit/67b19a7a8b3dead5f5ab9575ee2b4f09924ce851))
|
||||
* **store:** add darkhero motherboard to asus and microcenter ([#1336](https://www.github.com/jef/streetmerchant/issues/1336)) ([29175c7](https://www.github.com/jef/streetmerchant/commit/29175c77a8fcbc082c944b057a919dfcc22ba606))
|
||||
* **store:** add EBGames ([#1281](https://www.github.com/jef/streetmerchant/issues/1281)) ([27cfb94](https://www.github.com/jef/streetmerchant/commit/27cfb94de8d9ccef3c7fc76b250aee17d7c80257))
|
||||
* **store:** add Irish store variants ([#1373](https://www.github.com/jef/streetmerchant/issues/1373)) ([f70998f](https://www.github.com/jef/streetmerchant/commit/f70998f0d9a6cdfbc59fb31fecb87f801b0b3037))
|
||||
* **store:** add Megekko ([#1216](https://www.github.com/jef/streetmerchant/issues/1216)) ([30bed2a](https://www.github.com/jef/streetmerchant/commit/30bed2ac016e9e543f67b1098819a484bc1394c3))
|
||||
* **store:** add several Australian stores, add some 3080 brands/models ([#1367](https://www.github.com/jef/streetmerchant/issues/1367)) ([579cb97](https://www.github.com/jef/streetmerchant/commit/579cb97a0d151cc374a37493b043ba4a399b55db))
|
||||
* **store:** add Toys R Us ([#1257](https://www.github.com/jef/streetmerchant/issues/1257)) ([ac0bd2a](https://www.github.com/jef/streetmerchant/commit/ac0bd2ac14d686a0f30931e885da65a1d7af6856))
|
||||
* **store:** add Walmart (CA) ([#1253](https://www.github.com/jef/streetmerchant/issues/1253)) ([b535b47](https://www.github.com/jef/streetmerchant/commit/b535b470cad38af034889b4d27578b20136e166d))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **adblock:** proxy another function to produce less errors ([#1379](https://www.github.com/jef/streetmerchant/issues/1379)) ([eb70076](https://www.github.com/jef/streetmerchant/commit/eb700762a4eee3a802bd81f0fb62e76243027c42))
|
||||
* **amazon-it:** maxPrice selector and links ([#1239](https://www.github.com/jef/streetmerchant/issues/1239)) ([84f2cb7](https://www.github.com/jef/streetmerchant/commit/84f2cb7d52fac7c3dbdd31318a51330e25808784))
|
||||
* **amazon-nl:** inStock selector ([b6964b0](https://www.github.com/jef/streetmerchant/commit/b6964b02f38c947fd476d86de35d5983e5b229dd)), closes [#1366](https://www.github.com/jef/streetmerchant/issues/1366)
|
||||
* **bestbuy-ca:** add outOfStock text ([58f0a9c](https://www.github.com/jef/streetmerchant/commit/58f0a9c7740c46f3d820c8765dee5b0fc8516353)), closes [#1269](https://www.github.com/jef/streetmerchant/issues/1269)
|
||||
* **bestbuy-ca:** update selectors to help false positives ([#1278](https://www.github.com/jef/streetmerchant/issues/1278)) ([0525119](https://www.github.com/jef/streetmerchant/commit/0525119b9bae47425a6c01720d6a1ea6ab8e6a02)), closes [#895](https://www.github.com/jef/streetmerchant/issues/895)
|
||||
* **ci:** mkdocs deps ([1f63e99](https://www.github.com/jef/streetmerchant/commit/1f63e9980499ac567845473dc48e51cab78c838e))
|
||||
* **config:** disable docker by default ([dca916b](https://www.github.com/jef/streetmerchant/commit/dca916b64e9ac2d05d5e6af19e5466b8a0623ed5))
|
||||
* **config:** remove quotes ([ef452d8](https://www.github.com/jef/streetmerchant/commit/ef452d8e586536a5039ee532d655d2951d551ac3))
|
||||
* **discord:** notification groupings ([ad0b2fe](https://www.github.com/jef/streetmerchant/commit/ad0b2fe525d6403735ddcbf4ef55b91eb36ac10a))
|
||||
* **docker:** run in docker, and build scripts for docker ([#1291](https://www.github.com/jef/streetmerchant/issues/1291)) ([c74ea28](https://www.github.com/jef/streetmerchant/commit/c74ea28014ee0d827ea216083844f92e30f142c9))
|
||||
* **eprice:** inStock selector ([5e1dfc3](https://www.github.com/jef/streetmerchant/commit/5e1dfc35680029620a1de7bc7a523140f2dae8af)), closes [#1067](https://www.github.com/jef/streetmerchant/issues/1067)
|
||||
* **newegg:** dedupe nitro+ models ([#1300](https://www.github.com/jef/streetmerchant/issues/1300)) ([7329c6e](https://www.github.com/jef/streetmerchant/commit/7329c6ede0a5ab6d644b30ac878f4e7da11e43a8)), closes [#1230](https://www.github.com/jef/streetmerchant/issues/1230)
|
||||
* **newegg:** price selector and mobile inStock ([c3beedc](https://www.github.com/jef/streetmerchant/commit/c3beedced82141e6bbb0735b3edb7c573907aa7a)), closes [#1356](https://www.github.com/jef/streetmerchant/issues/1356)
|
||||
* **pushover:** add `expire` and `retry` ([0072dda](https://www.github.com/jef/streetmerchant/commit/0072dda90b637b93647cf3a35dc612cf43d89445)), closes [#983](https://www.github.com/jef/streetmerchant/issues/983)
|
||||
* **store:** update UK stores ([#1372](https://www.github.com/jef/streetmerchant/issues/1372)) ([02825d0](https://www.github.com/jef/streetmerchant/commit/02825d009bd028f6dcdca02e2c155e77a7df8654))
|
||||
* `.env` backwards compatibility ([9b7c7e2](https://www.github.com/jef/streetmerchant/commit/9b7c7e2881d756909af191094bda435ca7ef7e9b))
|
||||
* add setRequestInterception ([#1312](https://www.github.com/jef/streetmerchant/issues/1312)) ([a44621f](https://www.github.com/jef/streetmerchant/commit/a44621f8f50cac9ba6614b0f89320d210370047a)), closes [#826](https://www.github.com/jef/streetmerchant/issues/826)
|
||||
* **store:** italian store checks ([#1212](https://www.github.com/jef/streetmerchant/issues/1212)) ([e3eb386](https://www.github.com/jef/streetmerchant/commit/e3eb38655a3cefb85c4dbd573494955e06c72f71))
|
||||
|
||||
|
||||
### Reverts
|
||||
|
||||
* allow users to still use `USER_AGENT` ([3386e8f](https://www.github.com/jef/streetmerchant/commit/3386e8f50da27a800c5289c3b6bd7a1f76e77a49))
|
||||
|
||||
## [3.2.0](https://www.github.com/jef/streetmerchant/compare/v3.1.0...v3.2.0) (2020-12-06)
|
||||
|
||||
|
||||
|
||||
+3
-4
@@ -1,4 +1,4 @@
|
||||
FROM node:14.15.0-alpine3.12 AS builder
|
||||
FROM node:15.11.0-alpine3.13 AS builder
|
||||
|
||||
LABEL org.opencontainers.image.source="https://github.com/jef/streetmerchant"
|
||||
|
||||
@@ -12,10 +12,10 @@ 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.11.0-alpine3.13
|
||||
|
||||
RUN apk add --no-cache chromium
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
.DEFAULT_GOAL := run
|
||||
|
||||
.PHONY: build
|
||||
build:
|
||||
docker-compose build streetmerchant
|
||||
|
||||
.PHONY: run
|
||||
run:
|
||||
docker-compose up
|
||||
|
||||
.PHONY: run-detached
|
||||
run-detached:
|
||||
docker-compose up -d
|
||||
|
||||
.PHONY: stop
|
||||
stop:
|
||||
docker-compose down
|
||||
@@ -1,562 +1,32 @@
|
||||
<p align="center"><a href="https://github.com/jef/streetmerchant#readme"><img src="https://raw.githubusercontent.com/jef/streetmerchant/main/media/streetmerchant.png" alt="streetmerchant" /></a></p>
|
||||
<p align="center">The world's easiest, most powerful stock checker
|
||||
<br/><br/>
|
||||
<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>
|
||||
<br/><br/>
|
||||
<a href="https://github.com/jef/streetmerchant#faq">FAQ</a> |
|
||||
<a href="https://github.com/jef/streetmerchant/issues">Issues</a> |
|
||||
<a href="https://github.com/jef/streetmerchant/wiki">Wiki</a>
|
||||
<p align="center">
|
||||
<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/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>
|
||||
</p>
|
||||
|
||||
## Features
|
||||
|
||||
- Scrapes multiple websites for patterns of being stocked via API and Chromium
|
||||
- Opens browser when stock is available
|
||||
- Ability to send notifications when stock is available
|
||||
First and foremost, this service _will not_ automatically buy for you.
|
||||
|
||||
> :point_right: The bot _will not_ automatically buy for you
|
||||
- **Checks stock continuously** -- runs 24/7, 365, looking for the items you want.
|
||||
- **Ready for checkout** -- ability to add to cart when available and even opens the browser for you.
|
||||
- **Notifications galore** -- when you're not by your computer, worry free with notifications to most platforms and devices when an item comes in stock.
|
||||
|
||||
## Installation overview
|
||||
## Quick start
|
||||
|
||||
Linux, macOS, and Windows are all capable operating systems.
|
||||
streetmerchant runs on Node.js:
|
||||
|
||||
You do not need any computer skills, smarts, or anything of that nature. You are very capable as you have made it this
|
||||
far. Some basic understanding how a terminal, git, and or Node.js is a bonus, but that does not limit you to
|
||||
getting `streetmerchant` running!
|
||||
|
||||
### Installation: native
|
||||
|
||||
| Reference | Note |
|
||||
|:---:|---|
|
||||
| tag | Example, `v1.0.0`; stable |
|
||||
| `main` | Latest HEAD; not tagged, could be unstable |
|
||||
|
||||
- [Node.js 14](https://nodejs.org/en/)
|
||||
- [git](https://git-scm.com/)
|
||||
- Clone this project `git clone https://github.com/jef/streetmerchant.git`
|
||||
- To checkout a particular ref, use `git checkout <ref name>` after cloning
|
||||
- Navigate to this project by entering `cd streetmerchant`
|
||||
- Run `npm install`
|
||||
- Copy `.env-example` to a new file `.env` and edit the `.env` file to your liking using
|
||||
your [favorite text editor](https://code.visualstudio.com/)
|
||||
- More on this in [customization](#Customization)
|
||||
- Run `npm run start` to start
|
||||
|
||||
At any point you want the program to stop, use <kbd>Ctrl</kbd> + <kbd>C</kbd>.
|
||||
|
||||
> :point_right: Please visit the [wiki](https://github.com/jef/streetmerchant/wiki) if you need more help with installation.
|
||||
|
||||
### Installation: Docker
|
||||
|
||||
Available via GitHub Container Registry.
|
||||
|
||||
| Tag | Note |
|
||||
|:---:|---|
|
||||
| `latest` | Latest release; stable |
|
||||
| `nightly` | Latest HEAD each day at midnight UTC; could be unstable |
|
||||
|
||||
```sh
|
||||
# to run
|
||||
docker run --cap-add=SYS_ADMIN \
|
||||
-it --rm --env-file ./.env \
|
||||
ghcr.io/jef/streetmerchant:nightly
|
||||
|
||||
# to test notifications
|
||||
docker run --cap-add=SYS_ADMIN \
|
||||
-it --rm --env-file ./.env \
|
||||
ghcr.io/jef/streetmerchant:nightly test:notification:production
|
||||
```shell
|
||||
git clone https://github.com/jef/streetmerchant.git
|
||||
cd streetmerchant && npm i && npm run start
|
||||
```
|
||||
|
||||
### Developer notes
|
||||
|
||||
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 `.env` file.
|
||||
|
||||
## Customization
|
||||
|
||||
To customize `streetmerchant`, make a copy of `.env-example` as `.env` and make any changes to your liking. _All
|
||||
environment variables are **optional**._
|
||||
|
||||
<details>
|
||||
<summary>Expand to see all available options</summary>
|
||||
|
||||
### Application
|
||||
|
||||
| Environment variable | Description | Notes |
|
||||
|:---:|---|---|
|
||||
| `AUTO_ADD_TO_CART` | Enable auto add to cart on support stores | Default: `true` |
|
||||
| `BROWSER_TRUSTED` | Skip Chromium Sandbox | Useful for containerized environments, default: `false` |
|
||||
| `HEADLESS` | Puppeteer to run headless or not | Debugging related, default: `true` |
|
||||
| `INCOGNITO` | Puppeteer to run incognito or not | Debugging related, default: `false` |
|
||||
| `IN_STOCK_WAIT_TIME` | Time to wait between requests to the same link if it has that card in stock | In seconds, default: `0` |
|
||||
| `LOG_LEVEL` | [Logging levels](https://github.com/winstonjs/winston#logging-levels) | Debugging related, default: `info` |
|
||||
| `LOW_BANDWIDTH` | Blocks images/fonts to reduce traffic | Disables ad blocker, default: `false` |
|
||||
| `OPEN_BROWSER` | Toggle for whether or not the browser should open when item is found | Default: `true` |
|
||||
| `PAGE_BACKOFF_MIN` | Minimum backoff time between retrying requests for the same store when a forbidden response is received | Default: `10000` |
|
||||
| `PAGE_BACKOFF_MAX` | Maximum backoff time between retrying requests for the same store when a forbidden response is received | Default: `3600000` |
|
||||
| `PAGE_SLEEP_MIN` | Minimum sleep time between queries of the same product page | In milliseconds, default: `5000` |
|
||||
| `PAGE_SLEEP_MAX` | Maximum sleep time between queries of the same product page | In milliseconds, default: `10000` |
|
||||
| `PAGE_TIMEOUT` | Navigation Timeout in milliseconds | `0` for infinite, default: `30000` |
|
||||
| `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` |
|
||||
| `SCREENSHOT` | Capture screenshot of page if a card is found | Default: `true` |
|
||||
| `USER_AGENT` | Custom User-Agents headers for HTTP requests | Newline separated, e.g.: `USER_AGENT_STRING1 \n USER_AGENT_STRING2` | | Default: `Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36` |
|
||||
| `WEB_PORT` | Starts a webserver to be able to control the bot while it is running; optional | Default: disabled |
|
||||
|
||||
> :point_right: You can find your computer's user agent by [searching google for "my user agent"](http://google.com/search?q=my+user+agent)
|
||||
|
||||
> :point_right: Data usage is [known to be high](https://github.com/jef/streetmerchant/issues?q=is%3Aissue+sort%3Aupdated-desc+bandwidth). This is expected as the program scrapes many websites in parallel 24/7. To help reduce this, use `LOW_BANDWIDTH="true"`. We are looking into other solutions as well, but is low priority.
|
||||
|
||||
### Filters
|
||||
|
||||
| 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_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` |
|
||||
|
||||
<details>
|
||||
<summary>Supported stores</summary>
|
||||
|
||||
> :point_right: Used with the `STORES` variable.
|
||||
|
||||
| Stores | Environment variable |
|
||||
|:---:|:---:|
|
||||
| Adorama | `adorama`|
|
||||
| Alternate (DE) | `alternate`|
|
||||
| Alternate (NL) | `alternate-nl`|
|
||||
| Amazon | `amazon`|
|
||||
| Amazon (CA) | `amazon-ca`|
|
||||
| Amazon (DE) | `amazon-de`|
|
||||
| Amazon (DE) Warehouse | `amazon-de-warehouse`|
|
||||
| Amazon (ES) | `amazon-es`|
|
||||
| Amazon (FR) | `amazon-fr`|
|
||||
| Amazon (IT) | `amazon-it`|
|
||||
| Amazon (NL) | `amazon-nl`|
|
||||
| Amazon (UK) | `amazon-uk`|
|
||||
| AMD | `amd`|
|
||||
| AMD (CA) | `amd-ca`|
|
||||
| AMD (DE) | `amd-de`|
|
||||
| AMD (IT) | `amd-it`|
|
||||
| AntOnline | `antonline`|
|
||||
| Argos (UK) | `argos`|
|
||||
| Aria PC (UK) | `aria`|
|
||||
| ARLT (DE) | `arlt`|
|
||||
| ASUS | `asus` |
|
||||
| ASUS (DE) | `asus-de` |
|
||||
| Azerty (NL) | `azerty`|
|
||||
| B&H | `bandh`|
|
||||
| Best Buy | `bestbuy`|
|
||||
| Best Buy (CA) | `bestbuy-ca`|
|
||||
| Box (UK) | `box`|
|
||||
| CanadaComputers (CA) | `canadacomputers` |
|
||||
| Caseking (DE) | `caseking`|
|
||||
| CCL (UK) | `ccl`|
|
||||
| Comet (IT) | `comet`|
|
||||
| Computeruniverse (DE) | `computeruniverse` |
|
||||
| Coolblue (NL) | `coolblue`|
|
||||
| Coolmod (ES) | `coolmod`|
|
||||
| Corsair | `corsair`|
|
||||
| Currys (UK) | `currys`|
|
||||
| Cyberport (DE) | `cyberport` |
|
||||
| eBuyer (UK) | `ebuyer`|
|
||||
| El Corte Inglés | `elcorteingles`|
|
||||
| ePrice (IT) | `eprice`|
|
||||
| Euronics (IT) | `euronics`|
|
||||
| Euronics (DE) | `euronics-de`|
|
||||
| EVGA | `evga`|
|
||||
| EVGA (EU) | `evga-eu`|
|
||||
| Expert | `expert`|
|
||||
| Galaxus (DE) | `galaxus`|
|
||||
| Game (UK) | `game`|
|
||||
| Gamestop | `gamestop`|
|
||||
| Gamestop (DE) | `gamestop-de`|
|
||||
| Kabum (BR) | `kabum`|
|
||||
| Mediamarkt (DE) | `mediamarkt`|
|
||||
| Medimax | `medimax`|
|
||||
| MemoryExpress (CA) | `memoryexpress`|
|
||||
| Micro Center | `microcenter`|
|
||||
| Mindfactory (DE) | `mindfactory` |
|
||||
| Newegg | `newegg`|
|
||||
| Newegg (CA) | `newegg-ca`|
|
||||
| Notebooksbilliger (DE) |`notebooksbilliger`|
|
||||
| Novatech (UK) | `novatech`|
|
||||
| Nvidia | `nvidia`|
|
||||
| Nvidia (API) | `nvidia-api`|
|
||||
| Office Depot | `officedepot`|
|
||||
| Otto | `otto`|
|
||||
| Overclockers (UK) | `overclockers`|
|
||||
| PCComponentes (ES) | `pccomponentes`|
|
||||
| PlayStation | `playstation`|
|
||||
| PNY | `pny`|
|
||||
| Proshop (DE) | `proshop-de`|
|
||||
| Proshop (DK) | `proshop-dk`|
|
||||
| Saturn (DE) | `saturn`|
|
||||
| Scan (UK) | `scan`|
|
||||
| Smyths Toys (UK) | `smythstoys`|
|
||||
| Spielegrotte | `spielegrotte`|
|
||||
| Target | `target`|
|
||||
| Unieuro (IT) | `unieuro`|
|
||||
| Very (UK) | `very`|
|
||||
| Walmart | `walmart`|
|
||||
| Wipoid | `wipoid`|
|
||||
| Zotac | `zotac`|
|
||||
| TopAchat | `topachat`|
|
||||
|
||||
<details>
|
||||
<summary>Micro Center stores</summary>
|
||||
|
||||
> :point_right: Used with the `MICROCENTER_LOCATION` variable.
|
||||
|
||||
> :point_right: Before using `web`, please review [this issue comment](https://github.com/jef/streetmerchant/issues/442#issuecomment-703297393).
|
||||
|
||||
| Store name |
|
||||
|:---:|
|
||||
| `brooklyn` |
|
||||
| `brentwood` |
|
||||
| `cambridge` |
|
||||
| `chicago` |
|
||||
| `columbus` |
|
||||
| `dallas` |
|
||||
| `denver` |
|
||||
| `duluth` |
|
||||
| `fairfax` |
|
||||
| `flushing` |
|
||||
| `houston` |
|
||||
| `madison-heights` |
|
||||
| `marietta` |
|
||||
| `mayfield-heights` |
|
||||
| `north-jersey` |
|
||||
| `overland-park` |
|
||||
| `parkville` |
|
||||
| `rockville` |
|
||||
| `sharonville` |
|
||||
| `st-davids` |
|
||||
| `st-louis-park` |
|
||||
| `tustin` |
|
||||
| `westbury` |
|
||||
| `westmont` |
|
||||
| `yonkers` |
|
||||
|
||||
</details>
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Supported brands and models</summary>
|
||||
|
||||
> :point_right: Used with the `SHOW_ONLY_BRANDS` and `SHOW_ONLY_MODELS` variables.
|
||||
|
||||
| Brand | Model |
|
||||
|:---:|---|
|
||||
| `amd` | `5600x`, `5800x`, `5900x`, `5950x`, `amd reference` |
|
||||
| `asus` | `dual`, `dual oc`, `strix`, `strix oc`, `tuf`, `tuf oc` |
|
||||
| `corsair` | `750 platinum`, `600 platinum` |
|
||||
| `evga` | `ftw3`, `ftw3 ultra`, `xc3`, `xc3 black`, `xc3 ultra` |
|
||||
| `gainward` | `phantom gs`, `phoenix`, `phoenix gs`, `phoenix gs oc` |
|
||||
| `gigabyte` | `aorus master`, `aorus xtreme`, `eagle`, `eagle oc`, `gaming`, `gaming oc`, `turbo`, `vision`, `vision oc` |
|
||||
| `inno3d` | `gaming x3`, `ichill x3`, `ichill x4`, `twin x2 oc` |
|
||||
| `kfa2` | `sg`, `sg oc` |
|
||||
| `microsoft` | `xbox series x`, `xbox series s` |
|
||||
| `msi` | `gaming x trio`, `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` |
|
||||
| `sony` | `ps5 console`, `ps5 digital` |
|
||||
| `xfx` | `merc`, `amd reference` |
|
||||
| `zotac` | `amp holo`, `amp extreme holo`, `trinity`, `trinity oc`, `twin edge`, `twin edge oc` |
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Supported series</summary>
|
||||
|
||||
> :point_right: Used with the `SHOW_ONLY_SERIES` variable.
|
||||
|
||||
| Series | Environment variable |
|
||||
|:---:|:---:|
|
||||
| `AMD Ryzen 5600x` | `ryzen5600` |
|
||||
| `AMD Ryzen 5800x` | `ryzen5800` |
|
||||
| `AMD Ryzen 5900x` | `ryzen5900` |
|
||||
| `AMD Ryzen 5950x` | `ryzen5950` |
|
||||
| `AMD RX 6800` | `rx6800` |
|
||||
| `AMD RX 6800XT` | `rx6800xt` |
|
||||
| `AMD RX 6900XT` | `rx6900xt` |
|
||||
| `Nvidia RTX 3060 Ti` | `3060ti` |
|
||||
| `Nvidia RTX 3070` | `3070` |
|
||||
| `Nvidia RTX 3080` | `3080` |
|
||||
| `Nvidia RTX 3090` | `3090` |
|
||||
| `Corsair SFX PSU` | `sf` |
|
||||
| `Sony PS5` | `sonyps5c` |
|
||||
| `Sony PS5 Digital Edition` | `sonyps5de` |
|
||||
| `Xbox Series S` | `xboxss` |
|
||||
| `Xbox Series X` | `xboxsx` |
|
||||
|
||||
</details>
|
||||
<details>
|
||||
<summary>Supported countries (used with nvidia and nvidia-api)</summary>
|
||||
|
||||
> :point_right: Used with the `COUNTRY` variable.
|
||||
|
||||
| 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 | `✔` | `✔` | `✔` | |
|
||||
|
||||
</details>
|
||||
|
||||
### Notifications
|
||||
|
||||
> :point_right: You can test your notification configuration by running `npm run test:notification`.
|
||||
|
||||
<details>
|
||||
<summary>Desktop</summary>
|
||||
|
||||
| Environment variable | Description | Notes |
|
||||
|:---:|---|---|
|
||||
| `DESKTOP_NOTIFICATIONS` | Display desktop notifications using [node-notifier](https://www.npmjs.com/package/node-notifier) | Default: `false` |
|
||||
| `PLAY_SOUND` | Play this sound notification if a card is found | Relative path accepted, valid formats: wav, mp3, flac, E.g.: `path/to/notification.wav`, [free sounds available](https://notificationsounds.com/) |
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Discord</summary>
|
||||
|
||||
| Environment variable | Description | Notes |
|
||||
|:---:|---|---|
|
||||
| `DISCORD_NOTIFY_GROUP` | Discord group you would like to notify | Can be comma separated, use role ID, E.g.: `<@&2834729847239842>` |
|
||||
| `DISCORD_WEB_HOOK` | Discord Web Hook URL | Can be comma separated, use whole webhook URL |
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Email and SMS</summary>
|
||||
|
||||
| Environment variable | Description | Notes |
|
||||
|:---:|---|---|
|
||||
| `EMAIL_PASSWORD` | Gmail password | See below if you have MFA |
|
||||
| `EMAIL_TO` | Destination Email | Defaults to username if not set. Can be comma separated |
|
||||
| `EMAIL_USERNAME` | Gmail address | E.g.: `jensen.robbed.us@gmail.com` |
|
||||
| `PHONE_CARRIER` | [Supported carriers](#supported-carriers) for SMS | E.g.: `att` or `att,verizon,google`, email configuration required. If multiple phone numbers are listed, enter a carrier for each phone number |
|
||||
| `PHONE_NUMBER` | 10 digit phone number(s) | E.g.: `1234567890` or `1234567890,0987654321,11112223333`, email configuration required |
|
||||
| `SMTP_ADDRESS` | IP Address or fqdn of smtp server |
|
||||
| `SMTP_PORT` | TCP Port number on which the smtp server is listening for connections | Default: `25` |
|
||||
|
||||
> :point_right: If you have multi-factor authentication (MFA), you will need to create an [app password](https://myaccount.google.com/apppasswords) and use this instead of your Gmail password.
|
||||
|
||||
#### Supported carriers
|
||||
|
||||
| Carrier | Environment variable | Notes |
|
||||
|:---:|:---:|:---:|
|
||||
| AT&T | `att` | |
|
||||
| AT&T Prepaid | `attgo` | |
|
||||
| Bell | `bell` | |
|
||||
| Fido | `fido` | |
|
||||
| Google | `google`| |
|
||||
| Koodo | `koodo` | |
|
||||
| Mint | `mint`| |
|
||||
| Rogers | `rogers` | |
|
||||
| Sprint | `sprint`| |
|
||||
| Telus | `telus`| |
|
||||
| T-Mobile | `tmobile`| |
|
||||
| Verizon | `verizon`| Works with Visible |
|
||||
| Virgin | `virgin`| |
|
||||
| Virgin (CA) | `virgin-ca`| |
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>MQTT</summary>
|
||||
|
||||
| Environment variable | Description | Notes |
|
||||
|:---:|---|---|
|
||||
| `MQTT_BROKER_ADDRESS` | IP address or URL of MQTT Broker | e.g 192.168.1.xxx or broker.hivemq.com |
|
||||
| `MQTT_BROKER_PORT` | Network port of MQTT Broker | Default: 1883 |
|
||||
| `MQTT_CLIENT_ID` | Unique ClientID (only if required by MQTT Broker), typically not required when only publishing alerts | eg. client-123456 |
|
||||
| `MQTT_PASSWORD` | MQTT password - only use with MQTT brokers on private networks, if required. Will not be sent over public networks for safety. | e.g mysecret |
|
||||
| `MQTT_QOS` | QoS level for published alerts to broker (https://www.npmjs.com/package/mqtt#about-qos) | Default: 0, Can be 0, 1, or 2 |
|
||||
| `MQTT_TOPIC` | Topic to publish alerts to. Can include %store%, %series%, %brand%, %model% for dynamic topics | Default: streetmerchant/alert e.g nv-alert/%store%/%series%/%brand%/%model%/alert |
|
||||
| `MQTT_USERNAME` | MQTT username - (only if required by MQTT Broker) | e.g myusername |
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>PagerDuty</summary>
|
||||
|
||||
| Environment variable | Description | Notes |
|
||||
|:---:|---|---|
|
||||
| `PAGERDUTY_INTEGRATION_KEY` | PagerDuty Events API v2 Integration Key. Obtain one in PagerDuty - <Service you want to use> - Integrations | |
|
||||
| `PAGERDUTY_SEVERITY` | Severity of PagerDuty events | Default: `info` |
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Philips Hue</summary>
|
||||
|
||||
| Environment variable | Description | Notes |
|
||||
|:---:|---|---|
|
||||
| `PHILIPS_HUE_API_KEY` | Hue Bridge API Key | **Required**, generate key using instructions [here](https://developers.meethue.com/develop/get-started-2/). This will be used for both LAN and cloud access over the official Remote Hue API. |
|
||||
| `PHILIPS_HUE_LAN_BRIDGE_IP` | LAN IP Address of your Hue Bridge | LAN only, e.g. `192.168.x.x`|
|
||||
| `PHILIPS_HUE_LIGHT_IDS` | Light IDs | Optional (all if not supplied). Comma seperated, e.g.: `1`, `2` |See Hue App → About for IDs |
|
||||
| `PHILIPS_HUE_LIGHT_COLOR` | Color in RGB Format | Optional (NVIDIA green if not supplied). Comma separated, e.g.: `255`, `255`, `255`|
|
||||
| `PHILIPS_HUE_LIGHT_PATTERN` | `blink` or empty | Optional - lights will flash for 30 seconds if `blink` is supplied. |
|
||||
| `PHILIPS_HUE_CLOUD_ACCESS_TOKEN` | Remote Access Token | Cloud only, the access token obtained from Philips's Remote Hue API. Instructions to generate [here](https://developers.meethue.com/develop/hue-api/remote-authentication/). |
|
||||
| `PHILIPS_HUE_CLOUD_REFRESH_TOKEN` | Remote Refresh Token | Cloud only, the refresh token obtained from Philips's Remote Hue API. |
|
||||
| `PHILIPS_HUE_CLOUD_CLIENT_ID` | Remote Client ID | Cloud only, the client ID to use when accessing the Remote Hue API. |
|
||||
| `PHILIPS_HUE_CLOUD_CLIENT_SECRET` | Remote Client Secret | Cloud only, the client secret to use when accessing the Remote Hue API. |
|
||||
|
||||
> :point_right: [Video demonstration](https://vimeo.com/476083242)
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Pushbullet</summary>
|
||||
|
||||
| Environment variable | Description | Notes |
|
||||
|:---:|---|---|
|
||||
| `PUSHBULLET` | PushBullet API key | Generate at https://www.pushbullet.com/#settings/account | |
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Pushover</summary>
|
||||
|
||||
| Environment variable | Description | Notes |
|
||||
|:---:|---|---|
|
||||
| `PUSHOVER_TOKEN` | Pushover access token | Generate at https://pushover.net/apps/build | |
|
||||
| `PUSHOVER_USER` | Pushover username | |
|
||||
| `PUSHOVER_PRIORITY` | Pushover message priority |
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Slack</summary>
|
||||
|
||||
| Environment variable | Description | Notes |
|
||||
|:---:|---|---|
|
||||
| `SLACK_CHANNEL` | Slack channel for posting | E.g.: `update`, no need for `#` |
|
||||
| `SLACK_TOKEN` | Slack API token | |
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Telegram</summary>
|
||||
|
||||
| Environment variable | Description | Notes |
|
||||
|:---:|---|---|
|
||||
| `TELEGRAM_ACCESS_TOKEN` | Telegram access token | |
|
||||
| `TELEGRAM_CHAT_ID` | Telegram chat ID | Comma seperated, e.g.: `123456789`, `123456789,987654321` |
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Twilio</summary>
|
||||
|
||||
| Environment variable | Description | Notes |
|
||||
|:---:|---|---|
|
||||
| `TWILIO_ACCOUNT_SID` | Twilio Account SID | Can be found on twilio.com/console |
|
||||
| `TWILIO_AUTH_TOKEN` | Twilio Auth Token | Can be found on twilio.com/console |
|
||||
| `TWILIO_FROM_NUMBER` | Twilio provided phone number to send messages from | Include country code e.g +4401234567890 |
|
||||
| `TWILIO_TO_NUMBER` | Mobile number to send SMS to | Include country code e.g +4401234567890 |
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Twitter</summary>
|
||||
|
||||
| Environment variable | Description | Notes |
|
||||
|:---:|---|---|
|
||||
| `TWITTER_ACCESS_TOKEN_KEY` | Twitter Token Key | |
|
||||
| `TWITTER_ACCESS_TOKEN_SECRET` | Twitter Token Secret | |
|
||||
| `TWITTER_CONSUMER_KEY` | Twitter Consumer Key | Generate all Twitter keys at: https://developer.twitter.com/ |
|
||||
| `TWITTER_CONSUMER_SECRET` | Twitter Consumer Secret | |
|
||||
| `TWITTER_TWEET_TAGS` | Optional list of hashtags to append to the tweet message | E.g.: `#nvidia #nvidiastock` |
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Twitch</summary>
|
||||
|
||||
| Environment variable | Description | Notes |
|
||||
|:---:|---|---|
|
||||
| `TWITCH_CLIENT_ID` | Twitch client ID | |
|
||||
| `TWITCH_CLIENT_SECRET`| Twitch client secret | |
|
||||
| `TWITCH_ACCESS_TOKEN` | Twitch access token | |
|
||||
| `TWITCH_REFRESH_TOKEN` | Twitch refresh token | |
|
||||
| `TWITCH_CHANNEL` | Twitch channel | |
|
||||
|
||||
</details>
|
||||
</details>
|
||||
|
||||
## FAQ
|
||||
|
||||
**Q: What's Node.js and how do I install it?** Visit [their website](https://nodejs.org/en/) and download and install
|
||||
it. Very straight forward. Otherwise, Google more information related to your system needs.
|
||||
|
||||
**Q: Will this harm my computer?** No.
|
||||
|
||||
**Q: Have you gotten a card yet?** YES! :tada: :rocket:
|
||||
|
||||
<details>
|
||||
<summary>Screenshot</summary>
|
||||
|
||||

|
||||
|
||||
</details>
|
||||
|
||||
**Q: Will I get banned from of the stores?** Perhaps, but it's the risk we're willing to take! To help minimize this, take a look at [#1050](https://github.com/jef/streetmerchant/issues/1050).
|
||||
|
||||
**Q: I got a problem and need help!** File an [issue](https://github.com/jef/streetmerchant/issues/new/choose). I'll do my best to get to you. I work a full time job and this is only a hobby of mine.
|
||||
|
||||
**Q: How do I get the latest code?** Take look at this [wiki page](https://github.com/jef/streetmerchant/wiki/Troubleshoot:-General:-Getting-the-latest-code).
|
||||
|
||||
**Q: Why don't my notifications work?** There is probably an [issue](https://github.com/jef/streetmerchant/issues?q=is%3Aissue+sort%3Aupdated-desc+sound+is%3Aclosed) that has [already](https://github.com/jef/streetmerchant/issues/182) [been](https://github.com/jef/streetmerchant/issues/116) [resolved](https://github.com/jef/streetmerchant/issues/155).
|
||||
|
||||
**Q: I'd love to contribute, how do I do that?** Make a [pull request](https://github.com/jef/streetmerchant/pulls?q=is%3Apr+is%3Aopen+sort%3Aupdated-desc)! All contributions are welcome.
|
||||
|
||||
**Q: How do I add a store?** Take a look at [this page](https://github.com/jef/streetmerchant/wiki/Help:-Configuration:-Adding-a-store) on the wiki.
|
||||
|
||||
**Q: Why do I have to download all this stuff just to get this bot working?** Well, I would rather you didn't either. See [#11](https://github.com/jef/streetmerchant/issues/11).
|
||||
|
||||
**Q: Why does Amazon show an error page (with a picture of an animal) instead of adding to cart or going to the detail page?** This is intended; see [#733](https://github.com/jef/streetmerchant/issues/733). This indicates that the item is out of stock and only available from a third-party seller (often at a markup).
|
||||
|
||||
**Q: I'm using streetmerchant in the cloud and X isn't working.** There is _a lot_ of undefined behavior with using streetmerchant in the cloud. Some sites may block IPs from your cloud provider. It is possible that a VPN will help circumvent these problems.
|
||||
|
||||
<p align="center"><a href="https://github.com/jef/streetmerchant#readme"><img src="https://raw.githubusercontent.com/jef/streetmerchant/main/media/terminal.gif" /></a></p>
|
||||
For more information and customization, visit [jef.codes/streetmerchant/getting-started](https://jef.codes/streetmerchant/getting-started).
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
version: '3.0'
|
||||
services:
|
||||
streetmerchant:
|
||||
image: ghcr.io/jef/streetmerchant:latest
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
container_name: streetmerchant
|
||||
env_file:
|
||||
- dotenv
|
||||
@@ -0,0 +1,11 @@
|
||||
# About
|
||||
|
||||
## Background
|
||||
|
||||
Remember on September 17th, 2020 at 9 AM EST the Nvidia site went from **Notify Me** to **Out of Stock** instantly? Well, they didn't sell any cards. The real reason was that they weren't ready to sell them to us yet. That's right, they turned off their third party storefronts because they were being overloaded with our clicks. They still kept the other cards that use those APIs online, but they removed that one. It was re-enabled at some point for a brief moment, but the same thing happened -- servers overloaded with API requests.
|
||||
|
||||
This is where streetmerchant comes in. It doesn't buy anything for you, but it makes it more of a stress free job to refresh and check sites while you go about your daily business. People took off work, missed appointments, and gave up other lively needs in hopes to buy a _graphics card_. Now we reach beyond graphics cards in hopes for other products!
|
||||
|
||||
Please enjoy,
|
||||
|
||||
jef
|
||||
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 39 KiB |
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 77 KiB |
Symlink
+1
@@ -0,0 +1 @@
|
||||
../CHANGELOG.md
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
# FAQ
|
||||
|
||||
## What's Node.js and how do I install it?
|
||||
|
||||
Visit [their website](https://nodejs.org/en/) and download and install it. Very straight forward. Otherwise, Google more information related to your system needs.
|
||||
|
||||
## Will this harm my computer?
|
||||
|
||||
No.
|
||||
|
||||
## Have you gotten a card yet?
|
||||
|
||||
[Sure did!](https://i.imgur.com/59CRzGq.png)
|
||||
|
||||
## Will I get banned from of the stores?
|
||||
|
||||
Perhaps, but it's the risk we're willing to take! To help minimize this, take a look at [#1050](https://github.com/jef/streetmerchant/issues/1050).
|
||||
|
||||
## I got a problem and need help
|
||||
|
||||
File an [issue](https://github.com/jef/streetmerchant/issues/new/choose). I'll do my best to get to you. I work a full time job and this is only a hobby of mine.
|
||||
|
||||
## How do I get the latest code?
|
||||
|
||||
Run the following commands:
|
||||
|
||||
```shell
|
||||
git pull origin main
|
||||
npm install
|
||||
npm run start
|
||||
```
|
||||
|
||||
If you changed the code at all, this will most likely fail. You can clear out your changes by doing:
|
||||
|
||||
```shell
|
||||
git checkout .
|
||||
git pull origin main
|
||||
npm install
|
||||
npm run start
|
||||
```
|
||||
|
||||
You can also to [git-stash](https://git-scm.com/docs/git-stash), but we won't expand on that here.
|
||||
|
||||
|
||||
## Why don't my notifications work?
|
||||
|
||||
There is probably an [issue](https://github.com/jef/streetmerchant/issues?q=is%3Aissue+sort%3Aupdated-desc+sound+is%3Aclosed) that has [already](https://github.com/jef/streetmerchant/issues/182) [been](https://github.com/jef/streetmerchant/issues/116) [resolved](https://github.com/jef/streetmerchant/issues/155).
|
||||
|
||||
## I'd love to contribute, how do I do that?
|
||||
|
||||
Make a [pull request](https://github.com/jef/streetmerchant/pulls?q=is%3Apr+is%3Aopen+sort%3Aupdated-desc)! All contributions are welcome.
|
||||
|
||||
## How do I add a store?
|
||||
|
||||
Here's a little write-up I did: [Adding a store](help/general.md#adding-a-store).
|
||||
|
||||
## Why do I have to download all this stuff just to get this bot working?
|
||||
|
||||
Well, I would rather you didn't either. See [#11](https://github.com/jef/streetmerchant/issues/11).
|
||||
|
||||
## Why does Amazon show an error page (with a picture of an animal) instead of adding to cart or going to the detail page?
|
||||
|
||||
This is intended; see [#733](https://github.com/jef/streetmerchant/issues/733). This indicates that the item is out of stock and only available from a third-party seller (often at a markup).
|
||||
|
||||
## I'm using streetmerchant in the cloud and X isn't working.
|
||||
|
||||
There is _a lot_ of undefined behavior with using streetmerchant in the cloud. Some sites may block IPs from your cloud provider. It is possible that a VPN will help circumvent these problems.
|
||||
@@ -0,0 +1,105 @@
|
||||
# Getting started
|
||||
|
||||
You do not need any computer skills, smarts, or anything of that nature. You are very capable as you have made it this far. Some basic understanding how a terminal, git, and or Node.js is a bonus, but that does not limit you to getting streetmerchant running!
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- [git](https://git-scm.com/)
|
||||
- Either [Node.js 15](https://nodejs.org/en/) or [Docker (1.13.0+)](https://docs.docker.com/get-docker/) (advanced users)
|
||||
|
||||
## Using Node.js
|
||||
|
||||
| Reference | Note |
|
||||
|:---:|---|
|
||||
| tag | Example, `v1.0.0`; stable |
|
||||
| `main` | Latest HEAD; not tagged, could be unstable |
|
||||
|
||||
1. Download [Node.js 15](https://nodejs.org/en/)
|
||||
1. Clone this project `git clone https://github.com/jef/streetmerchant.git`.
|
||||
1. To checkout a particular reference, use `git checkout <ref name>` after cloning.
|
||||
1. Navigate to this project by entering `cd streetmerchant`.
|
||||
1. Run `npm install`.
|
||||
1. Make a copy of `dotenv-example` and name it `dotenv`.
|
||||
1. Edit the `dotenv` file to your liking using a text editor (like [vscode](https://code.visualstudio.com/)).
|
||||
1. Run `npm run start` to start.
|
||||
|
||||
At any point you want the program to stop, use ++ctrl+c++.
|
||||
|
||||
???+ tip
|
||||
Community based help can also be found on the [wiki](https://github.com/jef/streetmerchant/wiki). Feel free to check that out if you're having problems running. If you're still having problems running, you're probably not the first. Make some searches through the [GitHub issues](https://github.com/jef/streetmerchant/issues) before making one.
|
||||
|
||||
## Using Docker
|
||||
|
||||
Available via GitHub Container Registry.
|
||||
|
||||
| Tag | Note |
|
||||
|:---:|---|
|
||||
| `latest` | Latest release; stable |
|
||||
| `nightly` | Latest HEAD each day at midnight UTC; could be unstable |
|
||||
|
||||
```sh
|
||||
# to run docker nightly
|
||||
docker run -it --rm \
|
||||
--env-file ./dotenv \
|
||||
ghcr.io/jef/streetmerchant:nightly
|
||||
|
||||
# to test notifications
|
||||
docker run -it --rm \
|
||||
--env-file ./dotenv \
|
||||
ghcr.io/jef/streetmerchant:nightly test:notification:production
|
||||
```
|
||||
|
||||
See [Developing in docker](#developing-in-docker) for more information
|
||||
|
||||
## Customization
|
||||
|
||||
To customize streetmerchant, make a copy of `dotenv-example` as `dotenv` and make any changes to your liking. View [Reference](reference/application.md) for more information on variables and their usage.
|
||||
|
||||
???+ tip
|
||||
All environment variables are optional.
|
||||
|
||||
## For developers
|
||||
|
||||
### Developing in Node.js
|
||||
|
||||
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 fix` to automatically fix the issues it can.
|
||||
|
||||
### Developing in Docker
|
||||
|
||||
#### Prerequisites
|
||||
|
||||
- [Docker (1.13.0+)](https://docs.docker.com/get-docker/)
|
||||
- [GNU Make](https://www.gnu.org/software/make/)
|
||||
- Optional, but increases quality of life
|
||||
- [Docker Compose](https://docs.docker.com/compose/install/)
|
||||
- Depending on your system, you may already have this. Check before installing.
|
||||
|
||||
#### Starting with `docker-compose`
|
||||
|
||||
1. Make a copy of `dotenv-example` and name it `dotenv`.
|
||||
1. Edit the `dotenv` file to your liking using a text editor (like [vscode](https://code.visualstudio.com/)).
|
||||
1. If you're using `make`, you can run `make run` to start and `make stop` to stop.
|
||||
1. There are more options in the `Makefile`, feel free to explore.
|
||||
1. If you do not have `make`, you can run `docker-compose` directly:
|
||||
|
||||
```shell
|
||||
# To start
|
||||
# Use `-d` if you want to run in detached mode
|
||||
# Use `--build` if you want to build the image before running (default image is latest in GitHub Container Registry).
|
||||
docker-compose up
|
||||
|
||||
# To break down
|
||||
docker-compose down
|
||||
```
|
||||
|
||||
???+ note
|
||||
If you are using `WEB_PORT`, then you will need to add the following to docker-compose:
|
||||
|
||||
```
|
||||
ports:
|
||||
- "<WEB_PORT>:<WEB_PORT>"
|
||||
```
|
||||
|
||||
Replace `<WEB_PORT>` with the value you gave in your `dotenv`.
|
||||
@@ -0,0 +1,133 @@
|
||||
# General
|
||||
|
||||
## Adding a store
|
||||
|
||||
???+ note
|
||||
This is subject to change in the future
|
||||
|
||||
In the following examples, I will be using "NewStore" as the store I'm wanting to add.
|
||||
|
||||
### Creating a store file
|
||||
|
||||
First, create a TypeScript file in `src/store/model`. In this example, I'll create a file named `new-store.ts`. At this point, you can copy and paste any of the other stores and change accordingly.
|
||||
|
||||
#### How to grab a container (aka selector)
|
||||
|
||||
For the containers, what you'll wanna do is use <kbd>F12</kbd> on the site you want to Inspect and click this button
|
||||
|
||||

|
||||
|
||||
Hover over the item you want and it should give you the context:
|
||||
|
||||

|
||||
|
||||
You can also right-click on any website element and select 'Inspect'. That should also give you the same results.
|
||||
|
||||
Some people will decide to choose a parent element as it can be unique. Like this case!
|
||||
|
||||
I'd rather use `.button.spin-button.prod-ProductCTA--primary.button--primary` instead of `.spin-button-children` as there are probably other elements on the page that are also `.spin-button-children`.
|
||||
|
||||
The reason why we use these selectors anyway is to wait for the webpage to load these specific elements, to help eliminate false positives.
|
||||
|
||||
For easily getting the selector, you can also copy it by right clicking on the tag, Copy > Copy selector.
|
||||
|
||||

|
||||
|
||||
### Updating the models
|
||||
|
||||
You'll now want to add the new store to `src/store/model/index.ts`.
|
||||
|
||||
This is what it will look like:
|
||||
|
||||
```diff
|
||||
--- a/src/store/model/index.ts
|
||||
+++ b/src/store/model/index.ts
|
||||
@@ -48,6 +48,7 @@ import {MicroCenter} from './microcenter';
|
||||
import {Mindfactory} from './mindfactory';
|
||||
import {Newegg} from './newegg';
|
||||
import {NeweggCa} from './newegg-ca';
|
||||
+import {NewStore} from './new-store';
|
||||
import {Notebooksbilliger} from './notebooksbilliger';
|
||||
import {Novatech} from './novatech';
|
||||
import {Nvidia} from './nvidia';
|
||||
@@ -123,6 +124,7 @@ export const storeList = new Map([
|
||||
[Mindfactory.name, Mindfactory],
|
||||
[Newegg.name, Newegg],
|
||||
[NeweggCa.name, NeweggCa],
|
||||
+ [NewStore.name, NewStore],
|
||||
[Notebooksbilliger.name, Notebooksbilliger],
|
||||
[Novatech.name, Novatech],
|
||||
[Nvidia.name, Nvidia],
|
||||
```
|
||||
|
||||
After that, you're pretty much set. If you plan on adding new models or series, you will have to add them to `src/store/model/store.ts` and `src/config.ts`.
|
||||
|
||||
Here's an example:
|
||||
|
||||
```diff
|
||||
--- a/src/store/model/store.ts
|
||||
+++ b/src/store/model/store.ts
|
||||
@@ -23,6 +23,7 @@ export type Brand =
|
||||
| 'kfa2'
|
||||
| 'microsoft'
|
||||
| 'msi'
|
||||
+ | 'new brand'
|
||||
| 'nvidia'
|
||||
| 'palit'
|
||||
| 'pny'
|
||||
@@ -37,6 +38,7 @@ export type Series =
|
||||
| '3070'
|
||||
| '3080'
|
||||
| '3090'
|
||||
+ | 'new series'
|
||||
| 'rx6800'
|
||||
| 'rx6800xt'
|
||||
| 'rx6900xt'
|
||||
@@ -83,6 +85,7 @@ export type Model =
|
||||
| 'ichill x2'
|
||||
| 'ichill x3'
|
||||
| 'ichill x4'
|
||||
+ | 'new model'
|
||||
| 'nitro+'
|
||||
| 'nitro oc se'
|
||||
| 'nitro oc'
|
||||
```
|
||||
|
||||
```diff
|
||||
--- a/src/config.ts
|
||||
+++ b/src/config.ts
|
||||
@@ -308,6 +308,7 @@ const store = {
|
||||
country: envOrString(process.env.COUNTRY, 'usa'),
|
||||
maxPrice: {
|
||||
series: {
|
||||
+ 'new series': -1,
|
||||
'3060ti': envOrNumber(process.env.MAX_PRICE_SERIES_3060TI),
|
||||
3070: envOrNumber(process.env.MAX_PRICE_SERIES_3070),
|
||||
3080: envOrNumber(process.env.MAX_PRICE_SERIES_3080),
|
||||
@@ -337,6 +338,7 @@ const store = {
|
||||
};
|
||||
}),
|
||||
showOnlySeries: envOrArray(process.env.SHOW_ONLY_SERIES, [
|
||||
+ 'new series',
|
||||
'3060ti',
|
||||
'3070',
|
||||
'3080',
|
||||
|
||||
```
|
||||
|
||||
And voila! You're done! If you'd like to contribute to the project, feel free to create a [Pull Request](https://github.com/jef/streetmerchant/compare)! Don't forget to add the store (and brand, model, and series if you added) to the `README.md`.
|
||||
|
||||
???+ tip
|
||||
Here's an [example](https://github.com/jef/streetmerchant/commit/af96c5f2e808af7496f3c3299e4cf173105de48b). If you'd like to include a max price, you can add `MAX_PRICE_SERIES_NEW_SERIES` to the above instead of the `-1`.
|
||||
|
||||
## Creating a Discord webhook
|
||||
|
||||
Take a look at Discord's [Intro to Webhooks](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks), that should get you going.
|
||||
|
||||
This is the main portion:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Use the full URL that you just copied and set that value to `DISCORD_WEB_HOOK`.
|
||||
@@ -0,0 +1,42 @@
|
||||
# Troubleshoot
|
||||
|
||||
## Captcha issues
|
||||
|
||||
### Option 1
|
||||
|
||||
If you're running into problems, try running in headful mode: `HEADLESS="false"`.
|
||||
|
||||
This will open a browser and run streetmerchant. Note that this isn't a great solution for those running in a headless environment, i.e.: VPS, cloud, docker. Instead, it would be a good solution for those running on separate computer that won't be blocked by running in the background.
|
||||
|
||||
### Option 2
|
||||
|
||||
As a last case scenario, use `PUPPETEER_EXECUTABLE_PATH`. This will use your computer's Chrome browser. You can run this is headless or headful mode.
|
||||
|
||||
> From the puppeteer doc:
|
||||
>
|
||||
> `PUPPETEER_EXECUTABLE_PATH` - specify an executable path to be used in `puppeteer.launch`. See [puppeteer.launch([options])](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#puppeteerlaunchoptions) on how the executable path is inferred. **BEWARE**: Puppeteer is only [guaranteed to work](https://github.com/puppeteer/puppeteer/#q-why-doesnt-puppeteer-vxxx-work-with-chromium-vyyy) with the bundled Chromium, use at your own risk.
|
||||
|
||||
For example:
|
||||
|
||||
`dotenv`:
|
||||
|
||||
```
|
||||
PUPPETEER_EXECUTABLE_PATH=/usr/bin/google-chrome-stable
|
||||
```
|
||||
|
||||
This will vary depending on your operating system and install path. Please use full paths.
|
||||
|
||||
## macOS code signing
|
||||
|
||||
If you're getting a popup like this:
|
||||
|
||||

|
||||
|
||||
Then run this command:
|
||||
|
||||
```sh
|
||||
sudo codesign --force --deep --sign - ./node_modules/puppeteer/.local-chromium/mac-800071/chrome-mac/Chromium.app
|
||||
```
|
||||
|
||||
???+ tip
|
||||
The `mac-800071` may be different on your machine, so I would start from `./node_modules/puppeteer/.local-chromium` and auto complete from there.
|
||||
@@ -0,0 +1,38 @@
|
||||
[](https://jef.codes/streetmerchant)
|
||||
|
||||
## Features
|
||||
|
||||
First and foremost, this service _will not_ automatically buy for you.
|
||||
|
||||
- **Checks stock continuously** -- runs 24/7, 365, looking for the items you want.
|
||||
- **Ready for checkout** -- ability to add to cart when available and even opens the browser for you.
|
||||
- **Notifications galore** -- when you're not by your computer, worry free with notifications to most platforms and devices when an item comes in stock.
|
||||
|
||||
## Getting started
|
||||
|
||||
You'll find most of the content on the left sidebar. The right sidebar will help you navigate a page.
|
||||
|
||||
### Contributing
|
||||
|
||||
- Give helpful tips and tricks to the [community based wiki](https://github.com/jef/streetmerchant/wiki).
|
||||
- Add to the documentation through [pull requests](https://github.com/jef/streetmerchant/pulls).
|
||||
- Fork and make a pull request to the repository.
|
||||
|
||||
### Looking for help
|
||||
|
||||
- Have an idea, question, or need help? Visit our [GitHub discussion board](https://github.com/jef/streetmerchant/discussions).
|
||||
- Ran into a bug? File a [GitHub issue](https://github.com/jef/streetmerchant/issues/new/choose).
|
||||
- Looking to hang out and talk shop? Join us on [Discord](https://discord.gg/gbVY4vB9JF).
|
||||
|
||||
### Supporting the project
|
||||
|
||||
The best way to support me is to donate to [Diabetes Research Institute](https://www.diabetesresearch.org/Give).
|
||||
|
||||
> The Diabetes Research Institute leads the world in cure-focused diabetes research.
|
||||
>
|
||||
> [diabetesresearch.org](https://www.diabetesresearch.org/about-DRI)
|
||||
|
||||
If you feel inclined to support me directly, here are those options:
|
||||
|
||||
- [GitHub Sponsors](https://github.com/sponsors/jef)
|
||||
- [Paypal](https://www.paypal.me/jxf)
|
||||
@@ -0,0 +1,6 @@
|
||||
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 %}
|
||||
@@ -0,0 +1,30 @@
|
||||
# Application
|
||||
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
| `AUTO_ADD_TO_CART` | Enable auto add to cart on support stores, default: `true` |
|
||||
| `BROWSER_TRUSTED` | Skip Chromium Sandbox. Useful for containerized environments, default: `false` |
|
||||
| `HEADLESS` | Puppeteer to run headless or not. Debugging related, default: `true` |
|
||||
| `INCOGNITO` | Puppeteer to run incognito or not. Debugging related, default: `false` |
|
||||
| `IN_STOCK_WAIT_TIME` | Time to wait between requests to the same link if it has that card in stock. In seconds, default: `0` |
|
||||
| `LOG_LEVEL` | [Logging levels](https://github.com/winstonjs/winston#logging-levels). Debugging related, default: `info` |
|
||||
| `LOW_BANDWIDTH` | Blocks images/fonts to reduce traffic. Disables ad blocker, default: `false` |
|
||||
| `OPEN_BROWSER` | Toggle for whether or not the browser should open when item is found. Default: `true` |
|
||||
| `PAGE_BACKOFF_MIN` | Minimum backoff time between retrying requests for the same store when a forbidden response is received. Default: `10000` |
|
||||
| `PAGE_BACKOFF_MAX` | Maximum backoff time between retrying requests for the same store when a forbidden response is received. Default: `3600000` |
|
||||
| `PAGE_SLEEP_MIN` | Minimum sleep time between queries of the same product page. In milliseconds, default: `5000` |
|
||||
| `PAGE_SLEEP_MAX` | Maximum sleep time between queries of the same product page. In milliseconds, default: `10000` |
|
||||
| `PAGE_TIMEOUT` | Navigation Timeout in milliseconds. `0` for infinite, default: `30000` |
|
||||
| `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
|
||||
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.
|
||||
- Data usage is [known to be high](https://github.com/jef/streetmerchant/issues?q=is%3Aissue+sort%3Aupdated-desc+bandwidth). This is expected as the program scrapes many websites in parallel 24/7. To help reduce this, use `LOW_BANDWIDTH="true"`. We are looking into other solutions as well, but is low priority.
|
||||
@@ -0,0 +1,263 @@
|
||||
# Filter
|
||||
|
||||
| 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
|
||||
|
||||
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`|
|
||||
| Amazon | CA | `amazon-ca`|
|
||||
| Amazon | DE | `amazon-de`|
|
||||
| Amazon Warehouse | DE | `amazon-de-warehouse`|
|
||||
| Amazon | ES | `amazon-es`|
|
||||
| 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`|
|
||||
| Aria PC | UK | `aria`|
|
||||
| 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`|
|
||||
| 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`|
|
||||
| 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`|
|
||||
|
||||
### Micro Center stores
|
||||
|
||||
Used with the `MICROCENTER_LOCATION` variable.
|
||||
|
||||
???+ note
|
||||
Before using `web`, please review [this issue comment](https://github.com/jef/streetmerchant/issues/442#issuecomment-703297393).
|
||||
|
||||
| | | | |
|
||||
|---|---|---|---|
|
||||
| `brooklyn` | `brentwood` | `cambridge` | `chicago` |
|
||||
| `columbus` | `dallas` | `denver` | `duluth` |
|
||||
| `fairfax` | `flushing` | `houston` | `madison-heights` |
|
||||
| `marietta` | `mayfield-heights` | `north-jersey` | `overland-park` |
|
||||
| `parkville` | `rockville` | `sharonville` | `st-davids` |
|
||||
| `st-louis-park` | `tustin` | `westbury` | `westmont` |
|
||||
| `yonkers` |
|
||||
|
||||
## Supported brands and models
|
||||
|
||||
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`, `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 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`, `gaming oc pro`, `turbo`, `vision`, `vision oc` |
|
||||
| `galax` | `sg`, `sg 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`, `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 epic x`, `xlr8 revel`, `xlr8 uprising` |
|
||||
| `sony` | `ps5 console`, `ps5 digital` |
|
||||
| `xfx` | `merc`, `amd reference` |
|
||||
| `zotac` | `amp holo`, `amp extreme holo`, `amp white`, `trinity`, `trinity oc`, `twin edge`, `twin edge oc`, `twin edge oc white` |
|
||||
|
||||
## Supported series
|
||||
|
||||
Used with the `SHOW_ONLY_SERIES` variable.
|
||||
|
||||
| Series | Value |
|
||||
|:---:|:---:|
|
||||
| AMD Ryzen 5600x | `ryzen5600` |
|
||||
| AMD Ryzen 5800x | `ryzen5800` |
|
||||
| AMD Ryzen 5900x | `ryzen5900` |
|
||||
| AMD Ryzen 5950x | `ryzen5950` |
|
||||
| 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` |
|
||||
| Nvidia RTX 3090 | `3090` |
|
||||
| Corsair SFX PSU | `sf` |
|
||||
| Crosshair VIII | `darkhero` |
|
||||
| Sony PS5 | `sonyps5c` |
|
||||
| Sony PS5 Digital Edition | `sonyps5de` |
|
||||
| Xbox Series S | `xboxss` |
|
||||
| Xbox Series X | `xboxsx` |
|
||||
|
||||
## Nvidia Store Reference
|
||||
|
||||
???+ note
|
||||
Use the Nvidia Store to check stock for Founders Edition cards only (3060 Ti/3070/3080/3090). For USA use `bestbuy` instead.
|
||||
|
||||
???+ 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 | 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 |
|
||||
@@ -0,0 +1,225 @@
|
||||
# Notification
|
||||
|
||||
You can test your notification configuration by running `npm run test:notification`.
|
||||
|
||||
## Desktop
|
||||
|
||||
| Environment variable | Description |
|
||||
|---|---|
|
||||
| `DESKTOP_NOTIFICATIONS` | Display desktop notifications using [node-notifier](https://www.npmjs.com/package/node-notifier). |
|
||||
| `PLAY_SOUND` | Play this sound notification if a product is found. Relative path accepted, valid formats: wav, mp3, flac, E.g.: `path/to/notification.wav`, [free sounds available](https://notificationsounds.com/) |
|
||||
| `SOUND_PLAYER` | Override the default sound player using the specified executable. |
|
||||
|
||||
???+ attention
|
||||
If you're on Windows, you must have the proper library to run.
|
||||
|
||||
## Discord
|
||||
|
||||
| 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 |
|
||||
| `DISCORD_NOTIFY_GROUP_3090` | Discord group to notify on 3090 stock |
|
||||
| `DISCORD_NOTIFY_GROUP_RYZEN5600` | Discord group to notify on 5600X stock |
|
||||
| `DISCORD_NOTIFY_GROUP_RYZEN5800` | Discord group to notify on 5800X stock |
|
||||
| `DISCORD_NOTIFY_GROUP_RYZEN5900` | Discord group to notify on 5900X stock |
|
||||
| `DISCORD_NOTIFY_GROUP_RYZEN5950` | Discord group to notify on 5950X stock |
|
||||
| `DISCORD_NOTIFY_GROUP_DARKHERO` | Discord group to notify on Dark Hero stock |
|
||||
| `DISCORD_NOTIFY_GROUP_CORSAIR_SF` | Discord group to notify on Corsair SF stock |
|
||||
| `DISCORD_NOTIFY_GROUP_SONYPS5C` | Discord group to notify on Sony PS5 stock |
|
||||
| `DISCORD_NOTIFY_GROUP_SONYPS5DE` | Discord group to notify on Sony PS5 Digital stock |
|
||||
| `DISCORD_NOTIFY_GROUP_XBOXSX` | Discord group to notify on Xbox Series X stock |
|
||||
| `DISCORD_NOTIFY_GROUP_XBOXSS` | Discord group to notify on Xbox Series S stock |
|
||||
| `DISCORD_NOTIFY_GROUP_TEST` | Discord group to notify on test stock |
|
||||
| `DISCORD_WEB_HOOK` | Discord Web Hook URL. Can be comma separated. Use whole webhook URL |
|
||||
|
||||
???+ note
|
||||
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>`
|
||||
|
||||
## Email and SMS
|
||||
|
||||
Default provider is Gmail. If you use a different email provider, you must provide SMTP settings.
|
||||
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
| `EMAIL_PASSWORD` | Email password. (See below for Gmail MFA users) |
|
||||
| `EMAIL_TO` | Destination Email. Defaults to username if not set. Can be comma separated |
|
||||
| `EMAIL_USERNAME` | Email address |
|
||||
| `PHONE_CARRIER` | [Supported carriers](#supported-carriers) for SMS. E.g.: `att` or `att,verizon,google`, email configuration required. If multiple phone numbers are listed, enter a carrier for each phone number |
|
||||
| `PHONE_NUMBER` | 10 digit phone number(s). E.g.: `1234567890` or `1234567890,0987654321,11112223333`, email configuration required |
|
||||
| `SMTP_ADDRESS` | IP Address or FQDN of SMTP server |
|
||||
| `SMTP_PORT` | TCP Port number on which the smtp server is listening for connections. Default: `25` |
|
||||
|
||||
???+ attention
|
||||
If you use Gmail and have multi-factor authentication (MFA), you will need to create an [app password](https://myaccount.google.com/apppasswords) and use this instead of your Gmail password.
|
||||
|
||||
### Supported carriers
|
||||
|
||||
| Carrier | Environment variable |
|
||||
|:---:|:---:|
|
||||
| AT&T | `att` |
|
||||
| AT&T Prepaid | `attgo` |
|
||||
| Bell | `bell` |
|
||||
| Fido | `fido` |
|
||||
| Google | `google`|
|
||||
| Koodo | `koodo` |
|
||||
| Mint | `mint`|
|
||||
| Rogers | `rogers` |
|
||||
| Sprint | `sprint`|
|
||||
| Telus | `telus`|
|
||||
| T-Mobile | `tmobile`|
|
||||
| USCC | `uscc`|
|
||||
| Verizon | `verizon`|
|
||||
| Virgin | `virgin`|
|
||||
| Virgin (CA) | `virgin-ca`|
|
||||
| Visible | `visible`|
|
||||
|
||||
## MQTT
|
||||
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
| `MQTT_BROKER_ADDRESS` | IP address or URL of MQTT Broker, e.g.: `192.168.1.xxx` or `broker.hivemq.com` |
|
||||
| `MQTT_BROKER_PORT` | Network port of MQTT Broker. Default: `1883` |
|
||||
| `MQTT_CLIENT_ID` | Unique Client ID (only if required by MQTT Broker), typically not required when only publishing alerts |
|
||||
| `MQTT_PASSWORD` | MQTT password - only use with MQTT brokers on private networks, if required. Will not be sent over public networks for safety |
|
||||
| `MQTT_QOS` | QoS level for published alerts to broker (https://www.npmjs.com/package/mqtt#about-qos). Default: `0`, Can be `0`, `1`, or `2` |
|
||||
| `MQTT_TOPIC` | Topic to publish alerts to. Can include `%store%`, `%series%`, `%brand%`, `%model%` for dynamic topics. Default: `streetmerchant/alert`. E.g.: `nv-alert/%store%/%series%/%brand%/%model%/alert` |
|
||||
| `MQTT_USERNAME` | MQTT username - (only if required by MQTT Broker) |
|
||||
|
||||
## PagerDuty
|
||||
|
||||
Obtained in PagerDuty - <Service you want to use> - Integrations
|
||||
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
| `PAGERDUTY_INTEGRATION_KEY` | PagerDuty Events API v2 Integration Key. |
|
||||
| `PAGERDUTY_SEVERITY` | Severity of PagerDuty events |
|
||||
|
||||
## Philips Hue
|
||||
|
||||
Generate required keys using [instructions](https://developers.meethue.com/develop/get-started-2/). This will be used for both LAN and cloud access over the official Remote Hue API.
|
||||
|
||||
For cloud only usage, instructions to generate are located [here](https://developers.meethue.com/develop/hue-api/remote-authentication/).
|
||||
|
||||
> :point_right: Here's a [video demonstration](https://vimeo.com/476083242).
|
||||
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
| `PHILIPS_HUE_API_KEY` | Hue Bridge API Key |
|
||||
| `PHILIPS_HUE_LAN_BRIDGE_IP` | LAN IP Address of your Hue Bridge. LAN only, e.g. `192.168.x.x` |
|
||||
| `PHILIPS_HUE_LIGHT_IDS` | Light IDs. All lights if not supplied. Can be comma separated, e.g.: `1,2`. See Hue App -> About for IDs |
|
||||
| `PHILIPS_HUE_LIGHT_COLOR` | Color in RGB Format. Nvidia green if not supplied. Can be comma separated, e.g.: `255,255,255` |
|
||||
| `PHILIPS_HUE_LIGHT_PATTERN` | Lights will flash for 30 seconds if `blink` is given |
|
||||
| `PHILIPS_HUE_CLOUD_ACCESS_TOKEN` | Cloud Access Token. Cloud only |
|
||||
| `PHILIPS_HUE_CLOUD_REFRESH_TOKEN` | Cloud Refresh Token. Cloud only |
|
||||
| `PHILIPS_HUE_CLOUD_CLIENT_ID` | Cloud Client ID. Cloud only |
|
||||
| `PHILIPS_HUE_CLOUD_CLIENT_SECRET` | Cloud Client Secret. Cloud only |
|
||||
|
||||
## Pushbullet
|
||||
|
||||
Generate token at [pushbullet.com/#settings/account](https://pushbullet.com/#settings/account).
|
||||
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
| `PUSHBULLET` | API key |
|
||||
|
||||
## Pushover
|
||||
|
||||
Generate token at [pushover.net/apps/build](https://pushover.net/apps/build).
|
||||
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
| `PUSHOVER_EXPIRE` | How many seconds your notification will continue to be retried for (every `PUSHOVER_RETRY` seconds) |
|
||||
| `PUSHOVER_RETRY` | How often (in seconds) the Pushover servers will send the same notification to the user |
|
||||
| `PUSHOVER_PRIORITY` | Message priority |
|
||||
| `PUSHOVER_TOKEN` | API token |
|
||||
| `PUSHOVER_USER` | Username |
|
||||
|
||||
???+ 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 |
|
||||
|:---:|---|
|
||||
| `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 |
|
||||
|:---:|---|
|
||||
| `TELEGRAM_ACCESS_TOKEN` | Access token |
|
||||
| `TELEGRAM_CHAT_ID` | Chat ID. Can be comma separated, e.g.: `123456789,987654321` |
|
||||
|
||||
## Twilio
|
||||
|
||||
Token generation can be found at [twilio.com/console](https://twilio.com/console).
|
||||
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
| `TWILIO_ACCOUNT_SID` | Account SID |
|
||||
| `TWILIO_AUTH_TOKEN` | Auth Token |
|
||||
| `TWILIO_FROM_NUMBER` | Provided phone number to send messages from |
|
||||
| `TWILIO_TO_NUMBER` | Mobile number to send SMS to |
|
||||
|
||||
???+ note
|
||||
Include country codes in phone numbers. Example: `+4401234567890`
|
||||
|
||||
## Twitter
|
||||
|
||||
Generate all Twitter keys at [developer.twitter.com](https://developer.twitter.com).
|
||||
|
||||
| Environment variable | Description |
|
||||
|:---:|---|
|
||||
| `TWITTER_ACCESS_TOKEN_KEY` | Twitter Token Key |
|
||||
| `TWITTER_ACCESS_TOKEN_SECRET` | Twitter Token Secret |
|
||||
| `TWITTER_CONSUMER_KEY` | Twitter Consumer Key |
|
||||
| `TWITTER_CONSUMER_SECRET` | Twitter Consumer Secret |
|
||||
| `TWITTER_TWEET_TAGS` | List of hashtags to append to the tweet message, e.g.: `#nvidia #nvidiastock` |
|
||||
|
||||
## 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 |
|
||||
| `TWITCH_CLIENT_SECRET`| Twitch client secret |
|
||||
| `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
|
||||
+126
@@ -0,0 +1,126 @@
|
||||
# ** All configuration variables are optional **
|
||||
# Copy this file and name it as `dotenv` (without backticks)
|
||||
# Read https://jef.codes/streetmerchant/getting-started/#customization for help on customizing this file
|
||||
########################################################################################################
|
||||
|
||||
ASCII_BANNER=
|
||||
ASCII_COLOR=
|
||||
AUTO_ADD_TO_CART=
|
||||
BROWSER_TRUSTED=
|
||||
DESKTOP_NOTIFICATIONS=
|
||||
DISCORD_NOTIFY_GROUP=
|
||||
DISCORD_NOTIFY_GROUP_3060=
|
||||
DISCORD_NOTIFY_GROUP_3060TI=
|
||||
DISCORD_NOTIFY_GROUP_3070=
|
||||
DISCORD_NOTIFY_GROUP_3080=
|
||||
DISCORD_NOTIFY_GROUP_3090=
|
||||
DISCORD_NOTIFY_GROUP_CORSAIR_SF=
|
||||
DISCORD_NOTIFY_GROUP_RX6800=
|
||||
DISCORD_NOTIFY_GROUP_RX6800XT=
|
||||
DISCORD_NOTIFY_GROUP_RX6900XT=
|
||||
DISCORD_NOTIFY_GROUP_RYZEN5600=
|
||||
DISCORD_NOTIFY_GROUP_RYZEN5800=
|
||||
DISCORD_NOTIFY_GROUP_RYZEN5900=
|
||||
DISCORD_NOTIFY_GROUP_RYZEN5950=
|
||||
DISCORD_NOTIFY_GROUP_SONYPS5C=
|
||||
DISCORD_NOTIFY_GROUP_SONYPS5DE=
|
||||
DISCORD_NOTIFY_GROUP_XBOXSX=
|
||||
DISCORD_NOTIFY_GROUP_XBOXSS=
|
||||
DISCORD_NOTIFY_GROUP_TEST=
|
||||
DISCORD_WEB_HOOK=
|
||||
EMAIL_PASSWORD=
|
||||
EMAIL_TO=
|
||||
EMAIL_USERNAME=
|
||||
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=
|
||||
MAX_PRICE_SERIES_3090=
|
||||
MAX_PRICE_SERIES_CORSAIR_SF=
|
||||
MAX_PRICE_SERIES_RX6800=
|
||||
MAX_PRICE_SERIES_RX6800XT=
|
||||
MAX_PRICE_SERIES_RX6900XT=
|
||||
MAX_PRICE_SERIES_RYZEN5600=
|
||||
MAX_PRICE_SERIES_RYZEN5800=
|
||||
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=
|
||||
MQTT_BROKER_PORT=
|
||||
MQTT_CLIENT_ID=
|
||||
MQTT_PASSWORD=
|
||||
MQTT_QOS=
|
||||
MQTT_TOPIC=
|
||||
MQTT_USERNAME=
|
||||
OPEN_BROWSER=
|
||||
PAGE_BACKOFF_MIN=
|
||||
PAGE_BACKOFF_MAX=
|
||||
PAGE_SLEEP_MIN=
|
||||
PAGE_SLEEP_MAX=
|
||||
PAGE_TIMEOUT=
|
||||
PAGERDUTY_INTEGRATION_KEY=
|
||||
PAGERDUTY_SEVERITY=
|
||||
PHILIPS_HUE_API_KEY=
|
||||
PHILIPS_HUE_CLOUD_ACCESS_TOKEN=
|
||||
PHILIPS_HUE_CLOUD_CLIENT_ID=
|
||||
PHILIPS_HUE_CLOUD_CLIENT_SECRET=
|
||||
PHILIPS_HUE_CLOUD_REFRESH_TOKEN=
|
||||
PHILIPS_HUE_LAN_BRIDGE_IP=
|
||||
PHILIPS_HUE_LIGHT_COLOR=
|
||||
PHILIPS_HUE_LIGHT_IDS=
|
||||
PHILIPS_HUE_LIGHT_PATTERN=
|
||||
PHONE_CARRIER=
|
||||
PHONE_NUMBER=
|
||||
PLAY_SOUND=
|
||||
PROXY_ADDRESS=
|
||||
PROXY_PROTOCOL=
|
||||
PROXY_PORT=
|
||||
PUSHBULLET=
|
||||
PUSHOVER_EXPIRE=
|
||||
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=
|
||||
TELEGRAM_ACCESS_TOKEN=
|
||||
TELEGRAM_CHAT_ID=
|
||||
TWILIO_ACCOUNT_SID=
|
||||
TWILIO_AUTH_TOKEN=
|
||||
TWILIO_FROM_NUMBER=
|
||||
TWILIO_TO_NUMBER=
|
||||
TWITCH_ACCESS_TOKEN=
|
||||
TWITCH_CHANNEL=
|
||||
TWITCH_CLIENT_ID=
|
||||
TWITCH_CLIENT_SECRET=
|
||||
TWITCH_REFRESH_TOKEN=
|
||||
TWITTER_ACCESS_TOKEN_KEY=
|
||||
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=
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 6.2 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 358 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 865 KiB |
+94
@@ -0,0 +1,94 @@
|
||||
# Project information
|
||||
site_name: streetmerchant
|
||||
site_url: https://jef.codes/streetmerchant
|
||||
site_author: Jef LeCompte
|
||||
site_description: 🤖 The world's easiest, most powerful stock checker
|
||||
|
||||
# Repository
|
||||
repo_name: jef/streetmerchant
|
||||
repo_url: https://github.com/jef/streetmerchant
|
||||
|
||||
# Copyright
|
||||
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: Roboto
|
||||
code: Fira Code
|
||||
icon:
|
||||
repo: octicons/octoface-24
|
||||
logo: assets/images/streetmerchant-logo.png
|
||||
language: en
|
||||
name: material
|
||||
palette:
|
||||
scheme: default
|
||||
primary: indigo
|
||||
accent: indigo
|
||||
|
||||
# Plugins
|
||||
plugins:
|
||||
- git-revision-date
|
||||
- macros
|
||||
- search
|
||||
|
||||
# Customization
|
||||
extra:
|
||||
social:
|
||||
- icon: fontawesome/brands/github
|
||||
link: https://github.com/jef
|
||||
- icon: fontawesome/brands/twitter
|
||||
link: https://twitter.com/hijxf
|
||||
- icon: fontawesome/brands/linkedin
|
||||
link: https://www.linkedin.com/in/jeflecompte
|
||||
|
||||
extra_javascript:
|
||||
- https://cdnjs.cloudflare.com/ajax/libs/tablesort/5.2.1/tablesort.min.js
|
||||
- javascripts/tables.js
|
||||
|
||||
# Extensions
|
||||
markdown_extensions:
|
||||
- admonition
|
||||
- attr_list
|
||||
- footnotes
|
||||
- meta
|
||||
- toc:
|
||||
permalink: true
|
||||
- pymdownx.caret
|
||||
- pymdownx.critic
|
||||
- pymdownx.details
|
||||
- pymdownx.emoji:
|
||||
emoji_index: !!python/name:materialx.emoji.twemoji
|
||||
emoji_generator: !!python/name:materialx.emoji.to_svg
|
||||
- pymdownx.highlight:
|
||||
linenums: true
|
||||
- pymdownx.inlinehilite
|
||||
- pymdownx.keys
|
||||
- pymdownx.mark
|
||||
- pymdownx.smartsymbols
|
||||
- pymdownx.superfences
|
||||
- pymdownx.tabbed
|
||||
- pymdownx.tasklist:
|
||||
custom_checkbox: true
|
||||
- pymdownx.tilde
|
||||
|
||||
# Page tree
|
||||
nav:
|
||||
- Home: index.md
|
||||
- Getting started: getting-started.md
|
||||
- Reference:
|
||||
- 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
|
||||
- FAQ: faq.md
|
||||
- Changelog: changelog.md
|
||||
- About: about.md
|
||||
+1
-1
@@ -3,6 +3,6 @@
|
||||
"ext": "ts",
|
||||
"watch": [
|
||||
"src/",
|
||||
".env"
|
||||
"dotenv"
|
||||
]
|
||||
}
|
||||
|
||||
Generated
+16093
-4927
File diff suppressed because it is too large
Load Diff
+51
-50
@@ -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,63 +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",
|
||||
"@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",
|
||||
"twilio": "^3.53.0",
|
||||
"twitch": "^4.3.3",
|
||||
"twitch-auth": "^4.3.3",
|
||||
"twitch-chat-client": "^4.3.3",
|
||||
"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.22",
|
||||
"@types/node": "^14.14.10",
|
||||
"@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.1",
|
||||
"@types/redis": "^2.8.28",
|
||||
"@types/sinon": "^9.0.10",
|
||||
"@types/twitter": "^1.7.0",
|
||||
"husky": "^4.3.0",
|
||||
"nodemon": "^2.0.6",
|
||||
"ts-node": "^9.1.0",
|
||||
"typescript": "^4.1.2",
|
||||
"webpack": "^5.10.0",
|
||||
"xo": "^0.35.0"
|
||||
},
|
||||
"xo": {
|
||||
"prettier": true,
|
||||
"rules": {
|
||||
"no-warning-comments": "off",
|
||||
"sort-imports": "error",
|
||||
"sort-keys": "error",
|
||||
"sort-vars": "error"
|
||||
}
|
||||
},
|
||||
"husky": {
|
||||
"hooks": {
|
||||
"pre-commit": "npm run all"
|
||||
}
|
||||
"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.2.2",
|
||||
"webpack": "^5.24.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,27 +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 = {
|
||||
labels: {
|
||||
inStock: {
|
||||
container: 'test:container',
|
||||
text: ['test:text']
|
||||
}
|
||||
},
|
||||
links: [link],
|
||||
name: 'test:name'
|
||||
};
|
||||
|
||||
/**
|
||||
* Send test email.
|
||||
*/
|
||||
sendNotification(link, store);
|
||||
+1
-1
@@ -2,7 +2,7 @@ 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) {
|
||||
|
||||
+2
-5
@@ -1,7 +1,4 @@
|
||||
import chalk from 'chalk';
|
||||
import {readFileSync} from 'fs';
|
||||
|
||||
const version = readFileSync('version.txt', 'utf8');
|
||||
|
||||
export const banner = {
|
||||
asciiVersion: `
|
||||
@@ -14,12 +11,12 @@ export const banner = {
|
||||
░ ░▒ ░ ░ ░ ░▒ ░ ▒░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░▒ ░ ▒░ ░ ▒ ▒ ░▒░ ░ ▒ ▒▒ ░░ ░░ ░ ▒░ ░
|
||||
░ ░ ░ ░ ░░ ░ ░ ░ ░ ░ ░ ░ ░░ ░ ░ ░ ░░ ░ ░ ▒ ░ ░ ░ ░
|
||||
░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
|
||||
${version}`,
|
||||
${process.env.npm_package_version}`,
|
||||
render(ascii: boolean, hexColor: string) {
|
||||
return chalk
|
||||
.hex(hexColor)
|
||||
.bold(ascii ? this.asciiVersion : this.stringVersion);
|
||||
},
|
||||
stringVersion: `STREETMERCHANT
|
||||
${version}`
|
||||
${process.env.npm_package_version}`,
|
||||
};
|
||||
|
||||
+120
-50
@@ -1,10 +1,24 @@
|
||||
import {existsSync, readFileSync} from 'fs';
|
||||
import {banner} from './banner';
|
||||
|
||||
import {config as config_} from 'dotenv';
|
||||
import dotenv from 'dotenv';
|
||||
import path from 'path';
|
||||
import {readFileSync} from 'fs';
|
||||
import * as console from 'console';
|
||||
|
||||
config_({path: path.resolve(__dirname, '../.env')});
|
||||
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')});
|
||||
}
|
||||
|
||||
console.info(
|
||||
banner.render(
|
||||
@@ -28,7 +42,7 @@ function envOrArray(
|
||||
? environment.split('\n')
|
||||
: environment.split(',')
|
||||
: array ?? []
|
||||
).map((s) => s.trim());
|
||||
).map(s => s.trim());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -66,8 +80,8 @@ function envOrNumber(environment: string | undefined, number?: number): number {
|
||||
|
||||
/**
|
||||
* Returns environment variable, given number, or default number,
|
||||
* while handling .env input errors for a Min/Max pair.
|
||||
* .env errors handled:
|
||||
* while handling dotenv input errors for a Min/Max pair.
|
||||
* dotenv errors handled:
|
||||
* - Min/Max swapped (Min larger than Max, Max smaller than Min)
|
||||
* - Min larger than default Max when no Max defined
|
||||
* - Max smaller than default Min when no Min defined
|
||||
@@ -106,8 +120,8 @@ function envOrNumberMin(
|
||||
|
||||
/**
|
||||
* Returns environment variable, given number, or default number,
|
||||
* while handling .env input errors for a Min/Max pair.
|
||||
* .env errors handled:
|
||||
* while handling dotenv input errors for a Min/Max pair.
|
||||
* dotenv errors handled:
|
||||
* - Min/Max swapped (Min larger than Max, Max smaller than Min)
|
||||
* - Min larger than default Max when no Max defined
|
||||
* - Max smaller than default Min when no Min defined
|
||||
@@ -144,6 +158,18 @@ function envOrNumberMax(
|
||||
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),
|
||||
@@ -169,10 +195,11 @@ const browser = {
|
||||
process.env.PAGE_SLEEP_MAX,
|
||||
5000
|
||||
),
|
||||
open: envOrBoolean(process.env.OPEN_BROWSER)
|
||||
open: envOrBoolean(process.env.OPEN_BROWSER),
|
||||
userAgent: '',
|
||||
};
|
||||
|
||||
const docker = envOrBoolean(process.env.DOCKER);
|
||||
const docker = envOrBoolean(process.env.DOCKER, false);
|
||||
|
||||
const logLevel = envOrString(process.env.LOG_LEVEL, 'info');
|
||||
|
||||
@@ -180,7 +207,29 @@ const notifications = {
|
||||
desktop: process.env.DESKTOP_NOTIFICATIONS === 'true',
|
||||
discord: {
|
||||
notifyGroup: envOrArray(process.env.DISCORD_NOTIFY_GROUP),
|
||||
webhooks: envOrArray(process.env.DISCORD_WEB_HOOK)
|
||||
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),
|
||||
@@ -190,7 +239,7 @@ const notifications = {
|
||||
process.env.EMAIL_TO,
|
||||
envOrString(process.env.EMAIL_USERNAME)
|
||||
),
|
||||
username: envOrString(process.env.EMAIL_USERNAME)
|
||||
username: envOrString(process.env.EMAIL_USERNAME),
|
||||
},
|
||||
mqtt: {
|
||||
broker: envOrString(process.env.MQTT_BROKER_ADDRESS),
|
||||
@@ -199,11 +248,11 @@ const notifications = {
|
||||
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)
|
||||
username: envOrString(process.env.MQTT_USERNAME),
|
||||
},
|
||||
pagerduty: {
|
||||
integrationKey: envOrString(process.env.PAGERDUTY_INTEGRATION_KEY),
|
||||
severity: envOrString(process.env.PAGERDUTY_SEVERITY, 'info')
|
||||
severity: envOrString(process.env.PAGERDUTY_SEVERITY, 'info'),
|
||||
},
|
||||
philips_hue: {
|
||||
accessToken: envOrString(process.env.PHILIPS_HUE_CLOUD_ACCESS_TOKEN),
|
||||
@@ -215,7 +264,7 @@ const notifications = {
|
||||
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)
|
||||
remoteApiUsername: envOrString(process.env.PHILIPS_HUE_API_KEY),
|
||||
},
|
||||
phone: {
|
||||
availableCarriers: new Map([
|
||||
@@ -230,53 +279,72 @@ const notifications = {
|
||||
['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']
|
||||
['virgin-ca', 'vmobile.ca'],
|
||||
['visible', 'vtext.com'],
|
||||
]),
|
||||
carrier: envOrArray(process.env.PHONE_CARRIER),
|
||||
number: envOrArray(process.env.PHONE_NUMBER)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
}
|
||||
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)
|
||||
sessionTtl: envOrNumber(process.env.NVIDIA_SESSION_TTL, 60000),
|
||||
};
|
||||
|
||||
const page = {
|
||||
@@ -284,16 +352,13 @@ const page = {
|
||||
inStockWaitTime: envOrNumber(process.env.IN_STOCK_WAIT_TIME),
|
||||
screenshot: envOrBoolean(process.env.SCREENSHOT),
|
||||
timeout: envOrNumber(process.env.PAGE_TIMEOUT, 30000),
|
||||
userAgents: envOrArray(process.env.USER_AGENT, [
|
||||
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
|
||||
]),
|
||||
width: 1920
|
||||
width: 1920,
|
||||
};
|
||||
|
||||
const proxy = {
|
||||
address: envOrString(process.env.PROXY_ADDRESS),
|
||||
port: envOrNumber(process.env.PROXY_PORT, 80),
|
||||
protocol: envOrString(process.env.PROXY_PROTOCOL, 'http')
|
||||
protocol: envOrString(process.env.PROXY_PROTOCOL, 'http'),
|
||||
};
|
||||
|
||||
// Check for deprecated configuration values
|
||||
@@ -308,10 +373,13 @@ const store = {
|
||||
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),
|
||||
@@ -323,20 +391,21 @@ const store = {
|
||||
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
|
||||
}
|
||||
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) => {
|
||||
showOnlyModels: envOrArray(process.env.SHOW_ONLY_MODELS).map(entry => {
|
||||
const [name, series] = entry.match(/[^:]+/g) ?? [];
|
||||
return {
|
||||
name: envOrString(name),
|
||||
series: envOrString(series)
|
||||
series: envOrString(series),
|
||||
};
|
||||
}),
|
||||
showOnlySeries: envOrArray(process.env.SHOW_ONLY_SERIES, [
|
||||
'3060',
|
||||
'3060ti',
|
||||
'3070',
|
||||
'3080',
|
||||
@@ -348,22 +417,20 @@ const store = {
|
||||
'ryzen5800',
|
||||
'ryzen5900',
|
||||
'ryzen5950',
|
||||
'sf',
|
||||
'sonyps5c',
|
||||
'sonyps5de',
|
||||
'xboxss',
|
||||
'xboxsx'
|
||||
'xboxsx',
|
||||
]),
|
||||
stores: envOrArray(process.env.STORES, ['nvidia']).map((entry) => {
|
||||
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);
|
||||
|
||||
if (!proxyList) {
|
||||
proxyList = loadProxyList('global');
|
||||
}
|
||||
|
||||
return {
|
||||
maxPageSleep: envOrNumberMax(
|
||||
@@ -377,14 +444,16 @@ const store = {
|
||||
browser.minSleep
|
||||
),
|
||||
name: envOrString(name),
|
||||
proxyList
|
||||
proxyList,
|
||||
};
|
||||
})
|
||||
}),
|
||||
};
|
||||
|
||||
const restartTime = envOrNumber(process.env.RESTART_TIME, 0);
|
||||
|
||||
export const defaultStoreData = {
|
||||
maxPageSleep: browser.maxSleep,
|
||||
minPageSleep: browser.minSleep
|
||||
minPageSleep: browser.minSleep,
|
||||
};
|
||||
|
||||
export const config = {
|
||||
@@ -395,7 +464,8 @@ export const config = {
|
||||
nvidia,
|
||||
page,
|
||||
proxy,
|
||||
store
|
||||
store,
|
||||
restartTime,
|
||||
};
|
||||
|
||||
export function setConfig(newConfig: any) {
|
||||
|
||||
+34
-12
@@ -1,17 +1,29 @@
|
||||
import * as Process from 'process';
|
||||
import {config} from './config'; // Needs to be loaded first
|
||||
import {startAPIServer, stopAPIServer} from './web';
|
||||
import {Browser} from 'puppeteer';
|
||||
import {config} from './config';
|
||||
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.
|
||||
*/
|
||||
@@ -26,8 +38,13 @@ async function main() {
|
||||
}
|
||||
|
||||
// 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
|
||||
@@ -37,17 +54,22 @@ async function main() {
|
||||
);
|
||||
}
|
||||
|
||||
await stop();
|
||||
if (args.length > 0) {
|
||||
logger.info('ℹ puppeteer config: ', args);
|
||||
}
|
||||
|
||||
browser = await puppeteer.launch({
|
||||
await stop();
|
||||
browser = await launch({
|
||||
args,
|
||||
defaultViewport: {
|
||||
height: config.page.height,
|
||||
width: config.page.width
|
||||
width: config.page.width,
|
||||
},
|
||||
headless: config.browser.isHeadless
|
||||
headless: config.browser.isHeadless,
|
||||
});
|
||||
|
||||
config.browser.userAgent = await browser.userAgent();
|
||||
|
||||
for (const store of storeList.values()) {
|
||||
logger.debug('store links', {meta: {links: store.links}});
|
||||
if (store.setupAction !== undefined) {
|
||||
@@ -73,8 +95,7 @@ async function stop() {
|
||||
|
||||
async function stopAndExit() {
|
||||
await stop();
|
||||
// eslint-disable-next-line unicorn/no-process-exit
|
||||
process.exit(0);
|
||||
Process.exit(0);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -82,6 +103,7 @@ async function stopAndExit() {
|
||||
*/
|
||||
async function loopMain() {
|
||||
try {
|
||||
restartMain();
|
||||
await main();
|
||||
} catch (error: unknown) {
|
||||
logger.error(
|
||||
|
||||
+46
-3
@@ -3,7 +3,7 @@ import chalk from 'chalk';
|
||||
import {config} from './config';
|
||||
import winston from 'winston';
|
||||
|
||||
const prettyJson = winston.format.printf((info) => {
|
||||
const prettyJson = winston.format.printf(info => {
|
||||
const timestamp = new Date().toLocaleTimeString();
|
||||
|
||||
let out = `${chalk.grey(`[${timestamp}]`)} ${info.level} ${chalk.grey(
|
||||
@@ -20,11 +20,13 @@ const prettyJson = winston.format.printf((info) => {
|
||||
export const logger = winston.createLogger({
|
||||
format: winston.format.combine(
|
||||
winston.format.colorize(),
|
||||
winston.format.metadata({fillExcept: ['level', 'message', 'timestamp']}),
|
||||
winston.format.metadata({
|
||||
fillExcept: ['level', 'message', 'timestamp'],
|
||||
}),
|
||||
prettyJson
|
||||
),
|
||||
level: config.logLevel,
|
||||
transports: [new winston.transports.Console({})]
|
||||
transports: [new winston.transports.Console({})],
|
||||
});
|
||||
|
||||
export const Print = {
|
||||
@@ -93,6 +95,18 @@ export const Print = {
|
||||
|
||||
return `✖ ${buildProductString(link, store)} :: CAPTCHA`;
|
||||
},
|
||||
cloudflare(link: Link, store: Store, color?: boolean): string {
|
||||
if (color) {
|
||||
return (
|
||||
'✖ ' +
|
||||
buildProductString(link, store, true) +
|
||||
' :: ' +
|
||||
chalk.yellow('CLOUDFLARE, WAITING')
|
||||
);
|
||||
}
|
||||
|
||||
return `✖ ${buildProductString(link, store)} :: CLOUDFLARE, WAITING`;
|
||||
},
|
||||
inStock(link: Link, store: Store, color?: boolean, sms?: boolean): string {
|
||||
const productString = `${buildProductString(link, store)} :: IN STOCK`;
|
||||
|
||||
@@ -195,7 +209,22 @@ export const Print = {
|
||||
}
|
||||
|
||||
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(
|
||||
@@ -212,11 +241,25 @@ function buildSetupString(
|
||||
|
||||
function buildProductString(link: Link, store: Store, color?: boolean): string {
|
||||
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}`)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
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}`;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +1,23 @@
|
||||
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({
|
||||
icon: join(
|
||||
__dirname,
|
||||
'../../../docs/assets/images/streetmerchant-logo.png'
|
||||
),
|
||||
message: link.cartUrl ? link.cartUrl : link.url,
|
||||
title: Print.inStock(link, store)
|
||||
open: link.cartUrl ? link.cartUrl : link.url,
|
||||
title: Print.inStock(link, store),
|
||||
});
|
||||
|
||||
logger.info('✔ desktop notification sent');
|
||||
|
||||
@@ -3,8 +3,7 @@ import Discord from 'discord.js';
|
||||
import {config} from '../config';
|
||||
import {logger} from '../logger';
|
||||
|
||||
const discord = config.notifications.discord;
|
||||
const {notifyGroup, webhooks} = discord;
|
||||
const {notifyGroup, webhooks, notifyGroupSeries} = config.notifications.discord;
|
||||
|
||||
function getIdAndToken(webhook: string) {
|
||||
const match = /.*\/webhooks\/(\d+)\/(.+)/.exec(webhook);
|
||||
@@ -15,7 +14,7 @@ function getIdAndToken(webhook: string) {
|
||||
|
||||
return {
|
||||
id: match[1],
|
||||
token: match[2]
|
||||
token: match[2],
|
||||
};
|
||||
}
|
||||
|
||||
@@ -31,29 +30,43 @@ export function sendDiscordMessage(link: Link, store: Store) {
|
||||
'> provided by [streetmerchant](https://github.com/jef/streetmerchant) with :heart:'
|
||||
)
|
||||
.setThumbnail(
|
||||
'https://raw.githubusercontent.com/jef/streetmerchant/main/media/streetmerchant-square.png'
|
||||
'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', `$${link.price}`, 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();
|
||||
|
||||
let notifyText: string[] = [];
|
||||
|
||||
if (notifyGroup) {
|
||||
notifyText = notifyText.concat(notifyGroup);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
promises.push({
|
||||
client,
|
||||
message: client.send(notifyGroup.join(' '), {
|
||||
message: client.send(notifyText.join(' '), {
|
||||
embeds: [embed],
|
||||
username: 'streetmerchant'
|
||||
})
|
||||
username: 'streetmerchant',
|
||||
}),
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ 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 = {};
|
||||
|
||||
@@ -22,7 +22,7 @@ if (email.smtpAddress) {
|
||||
}
|
||||
|
||||
export const transporter = nodemailer.createTransport({
|
||||
...transportOptions
|
||||
...transportOptions,
|
||||
});
|
||||
|
||||
export function sendEmail(link: Link, store: Store) {
|
||||
@@ -34,17 +34,17 @@ export function sendEmail(link: Link, store: Store) {
|
||||
? [
|
||||
{
|
||||
filename: link.screenshot,
|
||||
path: `./${link.screenshot}`
|
||||
}
|
||||
path: `./${link.screenshot}`,
|
||||
},
|
||||
]
|
||||
: undefined,
|
||||
from: email.username,
|
||||
subject: Print.inStock(link, store),
|
||||
text: Print.productInStock(link),
|
||||
to: email.to
|
||||
to: email.to,
|
||||
};
|
||||
|
||||
transporter.sendMail(mailOptions, (error) => {
|
||||
transporter.sendMail(mailOptions, error => {
|
||||
if (error) {
|
||||
logger.error("✖ couldn't send email", error);
|
||||
} else {
|
||||
|
||||
@@ -3,7 +3,7 @@ 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) {
|
||||
@@ -16,7 +16,7 @@ if (mqtt.broker) {
|
||||
clean: mqtt.clientId === '',
|
||||
clientId: mqtt.clientId === '' ? undefined : mqtt.clientId,
|
||||
password: mqtt.password === '' ? undefined : mqtt.password,
|
||||
username: mqtt.username === '' ? undefined : mqtt.username
|
||||
username: mqtt.username === '' ? undefined : mqtt.username,
|
||||
};
|
||||
client = MqttClient.connect(
|
||||
`mqtt://${mqtt.broker}:${mqtt.port}`,
|
||||
@@ -38,7 +38,7 @@ export function sendMqttMessage(link: Link, store: Store) {
|
||||
const topic = generateTopic(link, store, mqtt.topic);
|
||||
const pubOptions: IClientPublishOptions = {
|
||||
qos: mqtt.qos as 0 | 1 | 2,
|
||||
retain: false
|
||||
retain: false,
|
||||
};
|
||||
|
||||
try {
|
||||
@@ -65,7 +65,7 @@ function generateTopic(link: Link, store: Store, topic: string): string {
|
||||
|
||||
/**
|
||||
* Basic protection against sending credentials in the clear over public networks.
|
||||
* - Returns 'true' if password is supplied in .env but address/URL is not part of a private network
|
||||
* - Returns 'true' if password is supplied in dotenv but address/URL is not part of a private network
|
||||
* - Private networks evaluated: Class A, B, or C private IP's or linklocal URL ("*.local")
|
||||
* - TLS could be implemented, however, the majority of MQTT services on the internet do not require user authentication.
|
||||
* - If you find a 'cloud' MQTT broker requiring authentication for publishing alerts, consider using another MQTT service (for now).
|
||||
|
||||
@@ -14,16 +14,20 @@ 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);
|
||||
sendDesktopNotification(link, store);
|
||||
// Non-priority
|
||||
activateSmartthingsSwitch();
|
||||
adjustPhilipsHueLights();
|
||||
sendDiscordMessage(link, store);
|
||||
sendMqttMessage(link, store);
|
||||
sendPagerDutyNotification(link, store);
|
||||
sendPushbulletNotification(link, store);
|
||||
@@ -33,4 +37,6 @@ export function sendNotification(link: Link, store: Store) {
|
||||
sendTweet(link, store);
|
||||
sendTwilioMessage(link, store);
|
||||
sendTwitchMessage(link, store);
|
||||
updateRedis(link, store);
|
||||
sendStreamLabsAlert(link, store);
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ export function sendPagerDutyNotification(link: Link, store: Store) {
|
||||
if (link.cartUrl) {
|
||||
links.push({
|
||||
href: link.cartUrl,
|
||||
text: 'Add to Cart'
|
||||
text: 'Add to Cart',
|
||||
});
|
||||
}
|
||||
|
||||
@@ -23,9 +23,9 @@ export function sendPagerDutyNotification(link: Link, store: Store) {
|
||||
links,
|
||||
severity: config.notifications.pagerduty.severity,
|
||||
source: store.name,
|
||||
summary: Print.inStock(link, store)
|
||||
summary: Print.inStock(link, store),
|
||||
},
|
||||
routing_key: config.notifications.pagerduty.integrationKey
|
||||
routing_key: config.notifications.pagerduty.integrationKey,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,18 +3,19 @@ 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()
|
||||
@@ -43,11 +44,11 @@ const adjustLightsWithAPI = (hueBridge: Api) => {
|
||||
// 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');
|
||||
arrayOfIDs.forEach(light => {
|
||||
logger.debug('adjusting specified lights');
|
||||
(hueBridge.lights.setLightState(light, lightState) as Promise<any>).catch(
|
||||
(error: Error) => {
|
||||
logger.error('Failed to adjust all lights.');
|
||||
logger.error('Failed to adjust specified lights.');
|
||||
logger.error(error);
|
||||
throw error;
|
||||
}
|
||||
@@ -59,12 +60,12 @@ const adjustLightsWithAPI = (hueBridge: Api) => {
|
||||
.getAll()
|
||||
.then((allLights: any[]) => {
|
||||
allLights.forEach((light: any) => {
|
||||
logger.debug('adjusting specified lights');
|
||||
logger.debug('adjusting all hue lights');
|
||||
(hueBridge.lights.setLightState(
|
||||
light,
|
||||
lightState
|
||||
) as Promise<any>).catch((error: Error) => {
|
||||
logger.error('Failed to adjust specified lights.');
|
||||
logger.error('Failed to adjust all lights.');
|
||||
logger.error(error);
|
||||
throw error;
|
||||
});
|
||||
@@ -80,7 +81,7 @@ const adjustLightsWithAPI = (hueBridge: Api) => {
|
||||
|
||||
export function adjustPhilipsHueLights() {
|
||||
// Check if the required variables have been set
|
||||
if (hue.apiKey && hue.bridgeIp) {
|
||||
if (apiKey && bridgeIp) {
|
||||
logger.info('↗ adjusting Philips Hue lights over LAN');
|
||||
(async () => {
|
||||
logger.debug(
|
||||
@@ -90,7 +91,7 @@ export function adjustPhilipsHueLights() {
|
||||
.createLocal(bridgeIp)
|
||||
.connect(apiKey)
|
||||
.then(
|
||||
(hueBridge) => {
|
||||
hueBridge => {
|
||||
adjustLightsWithAPI(hueBridge);
|
||||
logger.info('✔ adjusted Philips Hue lights over LAN');
|
||||
},
|
||||
@@ -99,16 +100,16 @@ export function adjustPhilipsHueLights() {
|
||||
}
|
||||
);
|
||||
})();
|
||||
} else if (hue.apiKey && hue.clientId && hue.clientSecret) {
|
||||
} 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 (hue.accessToken && hue.refreshToken) {
|
||||
if (accessToken && refreshToken) {
|
||||
remoteBootstrap
|
||||
.connectWithTokens(accessToken, refreshToken, remoteApiUsername)
|
||||
.then(
|
||||
(hueBridge) => {
|
||||
hueBridge => {
|
||||
adjustLightsWithAPI(hueBridge);
|
||||
logger.info('✔ adjusted Philips Hue lights over cloud');
|
||||
},
|
||||
|
||||
@@ -3,7 +3,7 @@ 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) {
|
||||
|
||||
@@ -3,20 +3,32 @@ import {Print, logger} from '../logger';
|
||||
import Push, {PushoverMessage} from 'pushover-notifications';
|
||||
import {config} from '../config';
|
||||
|
||||
const pushover = config.notifications.pushover;
|
||||
const push = new Push({
|
||||
token: pushover.token,
|
||||
user: pushover.username
|
||||
});
|
||||
const {pushover} = config.notifications;
|
||||
|
||||
export function sendPushoverNotification(link: Link, store: Store) {
|
||||
if (pushover.token && pushover.username) {
|
||||
logger.debug('↗ sending pushover message');
|
||||
|
||||
const message: PushoverMessage = {
|
||||
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)
|
||||
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) => {
|
||||
|
||||
@@ -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();
|
||||
@@ -3,13 +3,11 @@ import {Print, logger} from '../logger';
|
||||
import {WebClient} from '@slack/web-api';
|
||||
import {config} from '../config';
|
||||
|
||||
const slack = config.notifications.slack;
|
||||
const channel = slack.channel;
|
||||
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) {
|
||||
if (channel && token) {
|
||||
logger.debug('↗ sending slack message');
|
||||
|
||||
(async () => {
|
||||
@@ -17,8 +15,8 @@ export function sendSlackMessage(link: Link, store: Store) {
|
||||
|
||||
try {
|
||||
const result = await web.chat.postMessage({
|
||||
channel,
|
||||
text: `${Print.inStock(link, store)}\n${givenUrl}`
|
||||
channel: channel.replace('#', ''),
|
||||
text: `${Print.inStock(link, store)}\n${givenUrl}`,
|
||||
});
|
||||
|
||||
if (!result.ok) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@ 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(
|
||||
@@ -48,17 +48,17 @@ export function sendSms(link: Link, store: Store) {
|
||||
? [
|
||||
{
|
||||
filename: link.screenshot,
|
||||
path: `./${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)
|
||||
to: generateAddress(currentNumber, currentCarrier),
|
||||
};
|
||||
|
||||
transporter.sendMail(mailOptions, (error) => {
|
||||
transporter.sendMail(mailOptions, error => {
|
||||
if (error) {
|
||||
logger.error(
|
||||
`✖ couldn't send sms to ${currentNumber} for carrier ${currentCarrier}`,
|
||||
@@ -71,8 +71,10 @@ export function sendSms(link: Link, store: Store) {
|
||||
}
|
||||
}
|
||||
|
||||
function generateAddress(number: string, carrier: string) {
|
||||
function generateAddress(number: string, carrier: string): string {
|
||||
if (carrier && phone.availableCarriers.has(carrier)) {
|
||||
return [number, phone.availableCarriers.get(carrier)].join('@');
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
@@ -6,7 +6,9 @@ import {logger} from '../logger';
|
||||
let player: PlaySound;
|
||||
|
||||
if (config.notifications.playSound) {
|
||||
player = playerLib();
|
||||
player = config.notifications.soundPlayer
|
||||
? playerLib({players: [config.notifications.soundPlayer]})
|
||||
: playerLib();
|
||||
|
||||
if (player.player === null) {
|
||||
logger.warn("✖ couldn't find sound player");
|
||||
@@ -20,7 +22,7 @@ export function playSound() {
|
||||
if (config.notifications.playSound && player.player !== null) {
|
||||
logger.debug('↗ playing sound');
|
||||
|
||||
fs.access(config.notifications.playSound, fs.constants.F_OK, (error) => {
|
||||
fs.access(config.notifications.playSound, fs.constants.F_OK, error => {
|
||||
if (error) {
|
||||
logger.error(`✖ error opening sound file: ${error.message}`);
|
||||
return;
|
||||
|
||||
@@ -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,10 +3,10 @@ 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) {
|
||||
|
||||
@@ -3,7 +3,7 @@ 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) {
|
||||
@@ -17,17 +17,24 @@ export function sendTwilioMessage(link: Link, store: Store) {
|
||||
(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 {
|
||||
await client.messages.create({
|
||||
results.push(
|
||||
client.messages.create({
|
||||
body: message,
|
||||
from: twilio.from,
|
||||
to: twilio.to
|
||||
});
|
||||
to: number,
|
||||
})
|
||||
);
|
||||
logger.info('✔ twilio message sent');
|
||||
} catch (error: unknown) {
|
||||
logger.error("✖ couldn't send twilio message", error);
|
||||
}
|
||||
}
|
||||
|
||||
await Promise.all(results);
|
||||
})();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ 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;
|
||||
@@ -13,13 +13,13 @@ let alreadySaying = false;
|
||||
let tokenData = {
|
||||
accessToken: twitch.accessToken,
|
||||
expiryTimestamp: 0,
|
||||
refreshToken: twitch.refreshToken
|
||||
refreshToken: twitch.refreshToken,
|
||||
};
|
||||
|
||||
if (existsSync('./twitch.json')) {
|
||||
tokenData = {
|
||||
...JSON.parse(readFileSync('./twitch.json', 'utf-8')),
|
||||
...tokenData
|
||||
...tokenData,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ const chatClient: ChatClient = new ChatClient(
|
||||
accessToken,
|
||||
expiryTimestamp:
|
||||
expiryDate === null ? null : expiryDate.getTime(),
|
||||
refreshToken
|
||||
refreshToken,
|
||||
},
|
||||
null,
|
||||
4
|
||||
@@ -48,11 +48,11 @@ const chatClient: ChatClient = new ChatClient(
|
||||
'utf-8'
|
||||
);
|
||||
},
|
||||
refreshToken: tokenData.refreshToken
|
||||
refreshToken: tokenData.refreshToken,
|
||||
}
|
||||
),
|
||||
{
|
||||
channels: [twitch.channel]
|
||||
channels: [twitch.channel],
|
||||
}
|
||||
);
|
||||
|
||||
@@ -63,7 +63,7 @@ chatClient.onJoin((channel: string, user: string) => {
|
||||
|
||||
if (message !== undefined) {
|
||||
try {
|
||||
chatClient.say(channel, message);
|
||||
void chatClient.say(channel, message);
|
||||
logger.info('✔ twitch message sent');
|
||||
} catch (error: unknown) {
|
||||
logger.error("✖ couldn't send twitch message", error);
|
||||
|
||||
@@ -3,13 +3,13 @@ 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
|
||||
consumer_secret: twitter.consumerSecret,
|
||||
});
|
||||
|
||||
export function sendTweet(link: Link, store: Store) {
|
||||
@@ -29,7 +29,7 @@ export function sendTweet(link: Link, store: Store) {
|
||||
status += `\n\n${twitter.tweetTags}`;
|
||||
}
|
||||
|
||||
client.post('statuses/update', {status}, (error) => {
|
||||
client.post('statuses/update', {status}, error => {
|
||||
if (error) {
|
||||
logger.error("✖ couldn't send twitter notification", error);
|
||||
} else {
|
||||
|
||||
@@ -12,8 +12,8 @@ function addNewLinks(store: Store, links: Link[], series: Series) {
|
||||
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;
|
||||
@@ -34,6 +34,7 @@ export async function fetchLinks(store: Store, browser: Browser) {
|
||||
|
||||
const promises: Array<Promise<void>> = [];
|
||||
|
||||
// eslint-disable-next-line prefer-const
|
||||
for (let {series, url} of store.linksBuilder.urls) {
|
||||
if (!filterSeries(series)) {
|
||||
continue;
|
||||
@@ -45,9 +46,9 @@ export async function fetchLinks(store: Store, browser: Browser) {
|
||||
url = [url];
|
||||
}
|
||||
|
||||
url.map((x) =>
|
||||
url.map(x =>
|
||||
promises.push(
|
||||
usingResponse(browser, x, async (response) => {
|
||||
usingResponse(browser, x, async response => {
|
||||
const text = await response?.text();
|
||||
|
||||
if (!text) {
|
||||
|
||||
@@ -19,9 +19,9 @@ function getQueryAsElementArray(
|
||||
defaultContainer: string
|
||||
): Array<Required<Element>> {
|
||||
if (isElementArray(query)) {
|
||||
return query.map((x) => ({
|
||||
return query.map(x => ({
|
||||
container: x.container ?? defaultContainer,
|
||||
text: x.text
|
||||
text: x.text,
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -29,16 +29,16 @@ function getQueryAsElementArray(
|
||||
return [
|
||||
{
|
||||
container: defaultContainer,
|
||||
text: query
|
||||
}
|
||||
text: query,
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
return [
|
||||
{
|
||||
container: query.container ?? defaultContainer,
|
||||
text: query.text
|
||||
}
|
||||
text: query.text,
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ export async function pageIncludesLabels(
|
||||
const elementQueries = getQueryAsElementArray(query, options.selector);
|
||||
|
||||
const resolved = await Promise.all(
|
||||
elementQueries.map(async (query) => {
|
||||
elementQueries.map(async query => {
|
||||
const selector = {...options, selector: query.container};
|
||||
const contents = (await extractPageContents(page, selector)) ?? '';
|
||||
|
||||
@@ -111,7 +111,7 @@ export function includesLabels(
|
||||
searchLabels: string[]
|
||||
): boolean {
|
||||
const domTextLowerCase = domText.toLowerCase();
|
||||
return searchLabels.some((label) =>
|
||||
return searchLabels.some(label =>
|
||||
domTextLowerCase.includes(label.toLowerCase())
|
||||
);
|
||||
}
|
||||
|
||||
+216
-61
@@ -1,4 +1,10 @@
|
||||
import {Browser, Page, PageEventObj, Request, Response} from 'puppeteer';
|
||||
import {
|
||||
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';
|
||||
@@ -7,7 +13,8 @@ import {
|
||||
delay,
|
||||
getRandomUserAgent,
|
||||
getSleepTime,
|
||||
isStatusCodeInRange
|
||||
isStatusCodeInRange,
|
||||
noop,
|
||||
} from '../util';
|
||||
import {disableBlockerInPage, enableBlockerInPage} from '../adblocker';
|
||||
import {config} from '../config';
|
||||
@@ -16,7 +23,7 @@ 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> = {};
|
||||
|
||||
@@ -29,21 +36,24 @@ function nextProxy(store: Store) {
|
||||
|
||||
if (store.currentProxyIndex === undefined) {
|
||||
store.currentProxyIndex = 0;
|
||||
} else {
|
||||
store.currentProxyIndex++;
|
||||
}
|
||||
|
||||
store.currentProxyIndex++;
|
||||
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];
|
||||
}
|
||||
|
||||
async function handleLowBandwidth(request: Request) {
|
||||
async function handleLowBandwidth(request: HTTPRequest) {
|
||||
if (!config.browser.lowBandwidth) {
|
||||
return false;
|
||||
}
|
||||
@@ -52,7 +62,9 @@ async function handleLowBandwidth(request: Request) {
|
||||
if (typ === 'font' || typ === 'image') {
|
||||
try {
|
||||
await request.abort();
|
||||
} catch {}
|
||||
} catch {
|
||||
logger.debug('Failed to abort request.');
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -60,7 +72,7 @@ async function handleLowBandwidth(request: Request) {
|
||||
return false;
|
||||
}
|
||||
|
||||
async function handleProxy(request: Request, proxy?: string) {
|
||||
async function handleProxy(request: HTTPRequest, proxy?: string) {
|
||||
if (!proxy) {
|
||||
return false;
|
||||
}
|
||||
@@ -68,21 +80,23 @@ async function handleProxy(request: Request, proxy?: string) {
|
||||
try {
|
||||
await useProxy(request, proxy);
|
||||
} catch (error: unknown) {
|
||||
logger.error(error);
|
||||
logger.error('handleProxy', error);
|
||||
try {
|
||||
await request.abort();
|
||||
} catch {}
|
||||
} catch {
|
||||
logger.debug('Failed to abort request.');
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
async function handleAdBlock(request: Request, adBlockRequestHandler: any) {
|
||||
async function handleAdBlock(request: HTTPRequest, adBlockRequestHandler: any) {
|
||||
if (!adBlockRequestHandler) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return new Promise((resolve) => {
|
||||
return new Promise(resolve => {
|
||||
const continueFunc = async () => {
|
||||
resolve(false);
|
||||
};
|
||||
@@ -90,7 +104,19 @@ async function handleAdBlock(request: Request, adBlockRequestHandler: any) {
|
||||
const abortFunc = async () => {
|
||||
try {
|
||||
await request.abort();
|
||||
} catch {}
|
||||
} catch {
|
||||
logger.debug('Failed to abort request.');
|
||||
}
|
||||
|
||||
resolve(true);
|
||||
};
|
||||
|
||||
const respondFunc = async (response: ResponseForRequest) => {
|
||||
try {
|
||||
await request.respond(response);
|
||||
} catch {
|
||||
logger.debug('Failed to abort request.');
|
||||
}
|
||||
|
||||
resolve(true);
|
||||
};
|
||||
@@ -105,9 +131,14 @@ async function handleAdBlock(request: Request, adBlockRequestHandler: any) {
|
||||
return abortFunc;
|
||||
}
|
||||
|
||||
return Reflect.get(target, prop, receiver);
|
||||
if (prop === 'respond') {
|
||||
return respondFunc;
|
||||
}
|
||||
|
||||
return Reflect.get(target, prop, receiver);
|
||||
},
|
||||
});
|
||||
|
||||
adBlockRequestHandler(requestProxy);
|
||||
});
|
||||
}
|
||||
@@ -126,10 +157,10 @@ async function lookup(browser: Browser, store: Store) {
|
||||
}
|
||||
|
||||
if (store.linksBuilder) {
|
||||
logger.info(`[${store.name}] Running 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();
|
||||
@@ -159,14 +190,15 @@ async function lookup(browser: Browser, store: Store) {
|
||||
? await browser.createIncognitoBrowserContext()
|
||||
: browser.defaultBrowserContext();
|
||||
const page = await context.newPage();
|
||||
await page.setRequestInterception(true);
|
||||
|
||||
page.setDefaultNavigationTimeout(config.page.timeout);
|
||||
await page.setUserAgent(getRandomUserAgent());
|
||||
await page.setUserAgent(await getRandomUserAgent());
|
||||
|
||||
let adBlockRequestHandler: any;
|
||||
let pageProxy;
|
||||
if (useAdBlock) {
|
||||
const onProxyFunc = (event: keyof PageEventObj, handler: any) => {
|
||||
const onProxyFunc = (event: string, handler: any) => {
|
||||
if (event !== 'request') {
|
||||
page.on(event, handler);
|
||||
return;
|
||||
@@ -181,14 +213,19 @@ async function lookup(browser: Browser, store: Store) {
|
||||
return onProxyFunc;
|
||||
}
|
||||
|
||||
return Reflect.get(target, prop, receiver);
|
||||
// Give dummy setRequestInterception to avoid AdBlock from messing with it
|
||||
if (prop === 'setRequestInterception') {
|
||||
return noop;
|
||||
}
|
||||
|
||||
return Reflect.get(target, prop, receiver);
|
||||
},
|
||||
});
|
||||
await enableBlockerInPage(pageProxy);
|
||||
}
|
||||
|
||||
await page.setRequestInterception(true);
|
||||
page.on('request', async (request) => {
|
||||
page.on('request', async request => {
|
||||
if (await handleLowBandwidth(request)) {
|
||||
return;
|
||||
}
|
||||
@@ -203,22 +240,38 @@ async function lookup(browser: Browser, store: Store) {
|
||||
|
||||
try {
|
||||
await request.continue();
|
||||
} catch {}
|
||||
} catch {
|
||||
logger.debug('Failed to continue request.');
|
||||
}
|
||||
});
|
||||
|
||||
if (store.captchaDeterrent) {
|
||||
await runCaptchaDeterrent(browser, store, page);
|
||||
}
|
||||
|
||||
let statusCode = 0;
|
||||
|
||||
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');
|
||||
// Await client.send('Network.clearBrowserCache');
|
||||
}
|
||||
|
||||
if (pageProxy) {
|
||||
@@ -244,23 +297,14 @@ async function lookupCard(
|
||||
link: Link
|
||||
): Promise<number> {
|
||||
const givenWaitFor = store.waitUntil ? store.waitUntil : 'networkidle0';
|
||||
const response: Response | null = await page.goto(link.url, {
|
||||
waitUntil: givenWaitFor
|
||||
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 = 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));
|
||||
}
|
||||
const statusCode = await handleResponse(browser, store, page, link, response);
|
||||
|
||||
if (!isStatusCodeInRange(statusCode, successStatusCodes)) {
|
||||
return statusCode;
|
||||
}
|
||||
|
||||
@@ -296,11 +340,78 @@ async function lookupCard(
|
||||
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'
|
||||
type: 'textContent',
|
||||
};
|
||||
|
||||
if (store.labels.captcha) {
|
||||
@@ -320,6 +431,13 @@ async function lookupCardInStock(store: Store, page: Page, link: Link) {
|
||||
}
|
||||
}
|
||||
|
||||
if (store.labels.outOfStock) {
|
||||
if (await pageIncludesLabels(page, store.labels.outOfStock, baseOptions)) {
|
||||
logger.info(Print.outOfStock(link, store, true));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (store.labels.maxPrice) {
|
||||
const maxPrice = config.store.maxPrice.series[link.series];
|
||||
|
||||
@@ -331,33 +449,11 @@ async function lookupCardInStock(store: Store, page: Page, link: Link) {
|
||||
}
|
||||
}
|
||||
|
||||
// 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 (store.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 (link.labels?.inStock) {
|
||||
const options = {
|
||||
...baseOptions,
|
||||
requireVisible: true,
|
||||
type: 'outerHTML' as const
|
||||
type: 'outerHTML' as const,
|
||||
};
|
||||
|
||||
if (!(await pageIncludesLabels(page, link.labels.inStock, options))) {
|
||||
@@ -366,8 +462,14 @@ async function lookupCardInStock(store: Store, page: Page, link: Link) {
|
||||
}
|
||||
}
|
||||
|
||||
if (store.labels.outOfStock) {
|
||||
if (await pageIncludesLabels(page, store.labels.outOfStock, baseOptions)) {
|
||||
if (store.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;
|
||||
}
|
||||
@@ -376,6 +478,59 @@ async function lookupCardInStock(store: Store, page: Page, link: Link) {
|
||||
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...`);
|
||||
|
||||
@@ -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',
|
||||
};
|
||||
+25
-24
@@ -1,129 +1,130 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const Adorama: Store = {
|
||||
currency: '$',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['please verify you are a human']
|
||||
text: ['please verify you are a human'],
|
||||
},
|
||||
inStock: {
|
||||
container: '.buy-section.purchase',
|
||||
text: ['add to cart']
|
||||
text: ['add to cart'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.your-price',
|
||||
euroFormat: false
|
||||
}
|
||||
euroFormat: false,
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.adorama.com/ev08gp43067k.html'
|
||||
url: 'https://www.adorama.com/ev08gp43067k.html',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/pnv301tfxmpb.html'
|
||||
url: 'https://www.adorama.com/pnv301tfxmpb.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/msig380gxt1.html'
|
||||
url: 'https://www.adorama.com/msig380gxt1.html',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/ev10g53897kr.html'
|
||||
url: 'https://www.adorama.com/ev10g53897kr.html',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/ev10g53885kr.html'
|
||||
url: 'https://www.adorama.com/ev10g53885kr.html',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/ev10g53895kr.html'
|
||||
url: 'https://www.adorama.com/ev10g53895kr.html',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/ev10g53883kr.html'
|
||||
url: 'https://www.adorama.com/ev10g53883kr.html',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/ev10g53881kr.html'
|
||||
url: 'https://www.adorama.com/ev10g53881kr.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/msig38v3x10c.html'
|
||||
url: 'https://www.adorama.com/msig38v3x10c.html',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/png30801tfxb.html'
|
||||
url: 'https://www.adorama.com/png30801tfxb.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/asrx3080o10g.html'
|
||||
url: 'https://www.adorama.com/asrx3080o10g.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/astr3080o10g.html'
|
||||
url: 'https://www.adorama.com/astr3080o10g.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.adorama.com/astrx308010g.html'
|
||||
url: 'https://www.adorama.com/astrx308010g.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3090',
|
||||
url: 'https://www.adorama.com/msig390gxt24.html'
|
||||
url: 'https://www.adorama.com/msig390gxt24.html',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url: 'https://www.adorama.com/msig39v3x24c.html'
|
||||
url: 'https://www.adorama.com/msig39v3x24c.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url: 'https://www.adorama.com/asrtx309024g.html'
|
||||
url: 'https://www.adorama.com/asrtx309024g.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.adorama.com/ast3090o24g.html'
|
||||
url: 'https://www.adorama.com/ast3090o24g.html',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3090',
|
||||
url: 'https://www.adorama.com/asrx3090o24g.html'
|
||||
}
|
||||
url: 'https://www.adorama.com/asrx3090o24g.html',
|
||||
},
|
||||
],
|
||||
name: 'adorama'
|
||||
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',
|
||||
};
|
||||
@@ -1,171 +1,172 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AlternateNL: Store = {
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.stockStatus',
|
||||
text: ['Direct leverbaar']
|
||||
text: ['Direct leverbaar'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: 'div.price > span',
|
||||
euroFormat: true
|
||||
euroFormat: true,
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.stockStatus',
|
||||
text: ['Levertermijn onbekend', 'pre-order']
|
||||
}
|
||||
text: ['Levertermijn onbekend', 'pre-order'],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.alternate.nl/product/1516616'
|
||||
url: 'https://www.alternate.nl/product/1516616',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672756'
|
||||
url: 'https://www.alternate.nl/product/1672756',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672345'
|
||||
url: 'https://www.alternate.nl/product/1672345',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672251'
|
||||
url: 'https://www.alternate.nl/product/1672251',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672753'
|
||||
url: 'https://www.alternate.nl/product/1672753',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672343'
|
||||
url: 'https://www.alternate.nl/product/1672343',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672634'
|
||||
url: 'https://www.alternate.nl/product/1672634',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672867'
|
||||
url: 'https://www.alternate.nl/product/1672867',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673512'
|
||||
url: 'https://www.alternate.nl/product/1673512',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672612'
|
||||
url: 'https://www.alternate.nl/product/1672612',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1674164'
|
||||
url: 'https://www.alternate.nl/product/1674164',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1672868'
|
||||
url: 'https://www.alternate.nl/product/1672868',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'gaming pro oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673431'
|
||||
url: 'https://www.alternate.nl/product/1673431',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1677989'
|
||||
url: 'https://www.alternate.nl/product/1677989',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'vision oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1681134'
|
||||
url: 'https://www.alternate.nl/product/1681134',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673520'
|
||||
url: 'https://www.alternate.nl/product/1673520',
|
||||
},
|
||||
{
|
||||
brand: 'gainward',
|
||||
model: 'phoenix gs',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673442'
|
||||
url: 'https://www.alternate.nl/product/1673442',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x3',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673136'
|
||||
url: 'https://www.alternate.nl/product/1673136',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673524'
|
||||
url: 'https://www.alternate.nl/product/1673524',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus master',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1680168'
|
||||
url: 'https://www.alternate.nl/product/1680168',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673517'
|
||||
url: 'https://www.alternate.nl/product/1673517',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'amp holo',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1677985'
|
||||
url: 'https://www.alternate.nl/product/1677985',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'amp extreme holo',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1677982'
|
||||
url: 'https://www.alternate.nl/product/1677982',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'twin x2 oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673137'
|
||||
url: 'https://www.alternate.nl/product/1673137',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x4',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.nl/product/1673134'
|
||||
}
|
||||
url: 'https://www.alternate.nl/product/1673134',
|
||||
},
|
||||
],
|
||||
name: 'alternate-nl'
|
||||
name: 'alternate-nl',
|
||||
};
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const Alternate: Store = {
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.stockStatus',
|
||||
@@ -8,409 +9,427 @@ export const Alternate: Store = {
|
||||
'auf lager',
|
||||
'ware neu eingetroffen',
|
||||
'in kürze versandfertig',
|
||||
'ware im zulauf'
|
||||
]
|
||||
'ware im zulauf',
|
||||
],
|
||||
},
|
||||
maxPrice: {
|
||||
container: 'div.price > span',
|
||||
euroFormat: true
|
||||
euroFormat: true,
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '.stockStatus',
|
||||
text: ['liefertermin unbekannt']
|
||||
text: ['liefertermin unbekannt'],
|
||||
},
|
||||
{
|
||||
container: '.stockStatus',
|
||||
text: ['Artikel kann nicht gekauft werden']
|
||||
}
|
||||
]
|
||||
text: ['Artikel kann nicht gekauft werden'],
|
||||
},
|
||||
],
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.alternate.de/product/1662088'
|
||||
url: 'https://www.alternate.de/html/product/1662088',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1672868'
|
||||
url: 'https://www.alternate.de/html/product/1672868',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1672867'
|
||||
url: 'https://www.alternate.de/html/product/1672867',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1672251'
|
||||
url: 'https://www.alternate.de/html/product/1672251',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1672634'
|
||||
url: 'https://www.alternate.de/html/product/1672634',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1673517'
|
||||
url: 'https://www.alternate.de/html/product/1673517',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1673524'
|
||||
url: 'https://www.alternate.de/html/product/1673524',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1673512'
|
||||
url: 'https://www.alternate.de/html/product/1673512',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1673520'
|
||||
url: 'https://www.alternate.de/html/product/1673520',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1674164'
|
||||
url: 'https://www.alternate.de/html/product/1674164',
|
||||
},
|
||||
{
|
||||
brand: 'gainward',
|
||||
model: 'phantom gs',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1688597'
|
||||
url: 'https://www.alternate.de/html/product/1688597',
|
||||
},
|
||||
{
|
||||
brand: 'gainward',
|
||||
model: 'phoenix gs',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1673442'
|
||||
url: 'https://www.alternate.de/html/product/1673442',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus master',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1680168'
|
||||
url: 'https://www.alternate.de/html/product/1680168',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus xtreme',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1680168'
|
||||
url: 'https://www.alternate.de/html/product/1680168',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1672756'
|
||||
url: 'https://www.alternate.de/html/product/1672756',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1672753'
|
||||
url: 'https://www.alternate.de/html/product/1672753',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'vision oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1681134'
|
||||
url: 'https://www.alternate.de/html/product/1681134',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x3',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1673136'
|
||||
url: 'https://www.alternate.de/html/product/1673136',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x4',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1673134'
|
||||
url: 'https://www.alternate.de/html/product/1673134',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'twin x2 oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1673137'
|
||||
url: 'https://www.alternate.de/html/product/1673137',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1672343'
|
||||
url: 'https://www.alternate.de/html/product/1672343',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1672345'
|
||||
url: 'https://www.alternate.de/html/product/1672345',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'gamerock oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1688594'
|
||||
url: 'https://www.alternate.de/html/product/1688594',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'gaming pro oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1673431'
|
||||
url: 'https://www.alternate.de/html/product/1673431',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'amp extreme holo',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1677982'
|
||||
url: 'https://www.alternate.de/html/product/1677982',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'amp holo',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1677985'
|
||||
url: 'https://www.alternate.de/html/product/1677985',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity oc',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1677989'
|
||||
url: 'https://www.alternate.de/html/product/1677989',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.alternate.de/product/1672612'
|
||||
url: 'https://www.alternate.de/html/product/1672612',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1672870'
|
||||
url: 'https://www.alternate.de/html/product/1672870',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix oc',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1672872'
|
||||
url: 'https://www.alternate.de/html/product/1672872',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1672259'
|
||||
url: 'https://www.alternate.de/html/product/1672259',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1672629'
|
||||
url: 'https://www.alternate.de/html/product/1672629',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673530'
|
||||
url: 'https://www.alternate.de/html/product/1673530',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673531'
|
||||
url: 'https://www.alternate.de/html/product/1673531',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673521'
|
||||
url: 'https://www.alternate.de/html/product/1673521',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673525'
|
||||
url: 'https://www.alternate.de/html/product/1673525',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673529'
|
||||
url: 'https://www.alternate.de/html/product/1673529',
|
||||
},
|
||||
{
|
||||
brand: 'gainward',
|
||||
model: 'phoenix gs',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673440'
|
||||
url: 'https://www.alternate.de/html/product/1673440',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus xtreme',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1680670'
|
||||
url: 'https://www.alternate.de/html/product/1680670',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'aorus master',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1687793'
|
||||
url: 'https://www.alternate.de/html/product/1687793',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1672744'
|
||||
url: 'https://www.alternate.de/html/product/1672744',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1672749'
|
||||
url: 'https://www.alternate.de/html/product/1672749',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'turbo',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1687703'
|
||||
url: 'https://www.alternate.de/html/product/1687703',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'gaming x3',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673131'
|
||||
url: 'https://www.alternate.de/html/product/1673131',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x3',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673135'
|
||||
url: 'https://www.alternate.de/html/product/1673135',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
model: 'ichill x4',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673129'
|
||||
url: 'https://www.alternate.de/html/product/1673129',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1672341'
|
||||
url: 'https://www.alternate.de/html/product/1672341',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1672346'
|
||||
url: 'https://www.alternate.de/html/product/1672346',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
model: 'gaming pro oc',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1673434'
|
||||
url: 'https://www.alternate.de/html/product/1673434',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url: 'https://www.alternate.de/product/1672611'
|
||||
url: 'https://www.alternate.de/html/product/1672611',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.alternate.de/product/1685588'
|
||||
url: 'https://www.alternate.de/html/product/1685588',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.alternate.de/product/1685585'
|
||||
url: 'https://www.alternate.de/html/product/1685585',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.alternate.de/product/1685590'
|
||||
url: 'https://www.alternate.de/html/product/1685590',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.alternate.de/product/1685584'
|
||||
url: 'https://www.alternate.de/html/product/1685584',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.alternate.de/product/1651220'
|
||||
url: 'https://www.alternate.de/html/product/1651220',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.alternate.de/product/1651221'
|
||||
url: 'https://www.alternate.de/html/product/1651221',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
model: 'merc',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.alternate.de/product/1698792'
|
||||
url: 'https://www.alternate.de/html/product/1698792',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
model: 'nitro oc se',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.alternate.de/product/1696478'
|
||||
url: 'https://www.alternate.de/html/product/1696478',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
model: 'nitro oc',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.alternate.de/product/1696482'
|
||||
url: 'https://www.alternate.de/html/product/1696482',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'strix lc',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.alternate.de/product/1695392'
|
||||
url: 'https://www.alternate.de/html/product/1695392',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.alternate.de/product/1697044'
|
||||
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/product/1675115'
|
||||
url: 'https://www.alternate.de/html/product/1675115',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.alternate.de/product/1675117'
|
||||
url: 'https://www.alternate.de/html/product/1675117',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.alternate.de/product/1676874'
|
||||
}
|
||||
url: 'https://www.alternate.de/html/product/1651220',
|
||||
},
|
||||
],
|
||||
name: 'alternate'
|
||||
name: 'alternate',
|
||||
};
|
||||
|
||||
+108
-31
@@ -1,18 +1,23 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AmazonCa: Store = {
|
||||
currency: '$',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['enter the characters you see below']
|
||||
text: ['enter the characters you see below'],
|
||||
},
|
||||
inStock: {
|
||||
container: '#desktop_buybox',
|
||||
text: ['add to cart']
|
||||
text: ['add to cart'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice'
|
||||
}
|
||||
container: '.a-color-price',
|
||||
},
|
||||
outOfStock: {
|
||||
container: '.a-color-price',
|
||||
text: ['currently unavailable.'],
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
@@ -21,7 +26,47 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
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',
|
||||
@@ -29,7 +74,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08HR7SV3M',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -37,7 +82,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08HR5SXPS',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -45,7 +90,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08HR3DPGW',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -53,7 +98,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08HR3Y5GQ',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -61,7 +106,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08HR55YB5',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -69,7 +114,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08HR4RJ3Q',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -77,7 +122,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08HR6FMF3',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -85,7 +130,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08HJTH61J',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -93,7 +138,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08HJS2JLJ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -101,7 +146,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08HHDP9DW',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -109,7 +154,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08HH5WF97',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
@@ -117,7 +162,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08HJNKT3P',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
@@ -125,7 +170,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08HJQ182D',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -133,7 +178,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08HR9D2JS',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -141,7 +186,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08HJRF2CN',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -149,7 +194,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08HJPDJTY',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -157,7 +202,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08HJGNJ81',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -165,7 +210,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08HJLLF7G',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -173,7 +218,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08166SLDF',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -181,7 +226,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B0815XFSGK',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -189,7 +234,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08164VTWH',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -197,7 +242,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B0815Y8J9N',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
@@ -205,7 +250,7 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.ca/dp/B08GSC5D9G',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
@@ -213,8 +258,40 @@ export const AmazonCa: Store = {
|
||||
'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'
|
||||
}
|
||||
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'
|
||||
name: 'amazon-ca',
|
||||
};
|
||||
|
||||
@@ -2,62 +2,63 @@ 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'
|
||||
]
|
||||
'geben sie die zeichen unten ein',
|
||||
],
|
||||
},
|
||||
inStock: {
|
||||
container: '#a-autoid-0-announce',
|
||||
text: ['In den Einkaufswagen']
|
||||
text: ['In den Einkaufswagen'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: 'a-size-large a-color-price olpOfferPrice a-text-bold',
|
||||
euroFormat: true
|
||||
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'
|
||||
]
|
||||
}
|
||||
]
|
||||
'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'
|
||||
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'
|
||||
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'
|
||||
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'
|
||||
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'
|
||||
}
|
||||
url: 'https://www.amazon.de/gp/offer-listing/B08H93ZRLL',
|
||||
},
|
||||
],
|
||||
name: 'amazon-de-warehouse'
|
||||
name: 'amazon-de-warehouse',
|
||||
};
|
||||
|
||||
@@ -2,28 +2,29 @@ import {Store} from './store';
|
||||
|
||||
export const AmazonDe: Store = {
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '€',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: [
|
||||
'geben sie die unten angezeigten zeichen ein',
|
||||
'geben sie die zeichen unten ein'
|
||||
]
|
||||
'geben sie die zeichen unten ein',
|
||||
],
|
||||
},
|
||||
inStock: {
|
||||
container: '#add-to-cart-button',
|
||||
text: ['in den einkaufswagen']
|
||||
text: ['in den einkaufswagen'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice',
|
||||
euroFormat: true
|
||||
euroFormat: true,
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '#availability',
|
||||
text: ['Derzeit nicht verfügbar']
|
||||
}
|
||||
]
|
||||
text: ['Derzeit nicht verfügbar'],
|
||||
},
|
||||
],
|
||||
},
|
||||
links: [
|
||||
{
|
||||
@@ -32,7 +33,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B07PW9VBK5&Quantity.1=1',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amazon.de/dp/B07PW9VBK5'
|
||||
url: 'https://www.amazon.de/dp/B07PW9VBK5',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -40,7 +41,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HN7VVLJ&Quantity.1=1',
|
||||
model: 'strix',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08HN7VVLJ'
|
||||
url: 'https://www.amazon.de/dp/B08HN7VVLJ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -48,7 +49,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HN6KYS3&Quantity.1=1',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08HN6KYS3'
|
||||
url: 'https://www.amazon.de/dp/B08HN6KYS3',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -56,7 +57,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HN37VQK&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08HN37VQK'
|
||||
url: 'https://www.amazon.de/dp/B08HN37VQK',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -64,7 +65,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HN4DSTC&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08HN4DSTC'
|
||||
url: 'https://www.amazon.de/dp/B08HN4DSTC',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -72,7 +73,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HGBYWQ6&Quantity.1=1',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08HGBYWQ6'
|
||||
url: 'https://www.amazon.de/dp/B08HGBYWQ6',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -80,7 +81,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HGYXP4C&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08HGYXP4C'
|
||||
url: 'https://www.amazon.de/dp/B08HGYXP4C',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -88,7 +89,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HGLN78Q&Quantity.1=1',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08HGLN78Q'
|
||||
url: 'https://www.amazon.de/dp/B08HGLN78Q',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -96,7 +97,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HH1BMQQ&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08HH1BMQQ'
|
||||
url: 'https://www.amazon.de/dp/B08HH1BMQQ',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -104,7 +105,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HJ9XFNM&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08HJ9XFNM'
|
||||
url: 'https://www.amazon.de/dp/B08HJ9XFNM',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -112,7 +113,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08KHLDS72&Quantity.1=1',
|
||||
model: 'aorus master',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08KHLDS72'
|
||||
url: 'https://www.amazon.de/dp/B08KHLDS72',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -120,7 +121,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HHZVZ3N&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08HHZVZ3N'
|
||||
url: 'https://www.amazon.de/dp/B08HHZVZ3N',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -128,7 +129,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HLZXHZY&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08HLZXHZY'
|
||||
url: 'https://www.amazon.de/dp/B08HLZXHZY',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -136,7 +137,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08KH7RL89&Quantity.1=1',
|
||||
model: 'vision oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08KH7RL89'
|
||||
url: 'https://www.amazon.de/dp/B08KH7RL89',
|
||||
},
|
||||
{
|
||||
brand: 'inno3d',
|
||||
@@ -144,7 +145,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08JD6QPXD&Quantity.1=1',
|
||||
model: 'twin x2 oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08JD6QPXD'
|
||||
url: 'https://www.amazon.de/dp/B08JD6QPXD',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -152,7 +153,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HM4V2DH&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08HM4V2DH'
|
||||
url: 'https://www.amazon.de/dp/B08HM4V2DH',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -160,7 +161,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HM4M621&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08HM4M621'
|
||||
url: 'https://www.amazon.de/dp/B08HM4M621',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
@@ -168,7 +169,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08JCVWTQY&Quantity.1=1',
|
||||
model: 'gaming pro',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08JCVWTQY'
|
||||
url: 'https://www.amazon.de/dp/B08JCVWTQY',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
@@ -176,7 +177,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08JCKYYL8&Quantity.1=1',
|
||||
model: 'gaming pro oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08JCKYYL8'
|
||||
url: 'https://www.amazon.de/dp/B08JCKYYL8',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
@@ -184,7 +185,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HR1NPPQ&Quantity.1=1',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.de/dp/B08HR1NPPQ'
|
||||
url: 'https://www.amazon.de/dp/B08HR1NPPQ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -192,7 +193,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HN642LY&Quantity.1=1',
|
||||
model: 'strix',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08HN642LY'
|
||||
url: 'https://www.amazon.de/dp/B08HN642LY',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -200,7 +201,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HN51T8Q&Quantity.1=1',
|
||||
model: 'strix oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08HN51T8Q'
|
||||
url: 'https://www.amazon.de/dp/B08HN51T8Q',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -208,7 +209,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HN4FLFJ&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08HN4FLFJ'
|
||||
url: 'https://www.amazon.de/dp/B08HN4FLFJ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -216,7 +217,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HN5B8FJ&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08HN5B8FJ'
|
||||
url: 'https://www.amazon.de/dp/B08HN5B8FJ',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -224,7 +225,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HGFNPJQ&Quantity.1=1',
|
||||
model: 'ftw3',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08HGFNPJQ'
|
||||
url: 'https://www.amazon.de/dp/B08HGFNPJQ',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -232,7 +233,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08J5NMDP7&Quantity.1=1',
|
||||
model: 'ftw3',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08J5NMDP7'
|
||||
url: 'https://www.amazon.de/dp/B08J5NMDP7',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -240,7 +241,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HGS1SXH&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08HGS1SXH'
|
||||
url: 'https://www.amazon.de/dp/B08HGS1SXH',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -248,7 +249,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HGZ4XSZ&Quantity.1=1',
|
||||
model: 'xc3',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08HGZ4XSZ'
|
||||
url: 'https://www.amazon.de/dp/B08HGZ4XSZ',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -256,7 +257,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HGKQ527&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08HGKQ527'
|
||||
url: 'https://www.amazon.de/dp/B08HGKQ527',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -264,7 +265,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HGTNDL4&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08HGTNDL4'
|
||||
url: 'https://www.amazon.de/dp/B08HGTNDL4',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -272,7 +273,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08KH7R4FQ&Quantity.1=1',
|
||||
model: 'aorus master',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08KH7R4FQ'
|
||||
url: 'https://www.amazon.de/dp/B08KH7R4FQ',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -280,7 +281,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HJPDJTY&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08HJPDJTY'
|
||||
url: 'https://www.amazon.de/dp/B08HJPDJTY',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -288,7 +289,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08KHKDTSJ&Quantity.1=1',
|
||||
model: 'turbo',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08KHKDTSJ'
|
||||
url: 'https://www.amazon.de/dp/B08KHKDTSJ',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -296,7 +297,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HJRF2CN&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08HJRF2CN'
|
||||
url: 'https://www.amazon.de/dp/B08HJRF2CN',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -304,7 +305,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HRBW6VB&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08HRBW6VB'
|
||||
url: 'https://www.amazon.de/dp/B08HRBW6VB',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -312,7 +313,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HM661YM&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08HM661YM'
|
||||
url: 'https://www.amazon.de/dp/B08HM661YM',
|
||||
},
|
||||
{
|
||||
brand: 'palit',
|
||||
@@ -320,7 +321,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08JQQ1VD1&Quantity.1=1',
|
||||
model: 'gaming pro',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08JQQ1VD1'
|
||||
url: 'https://www.amazon.de/dp/B08JQQ1VD1',
|
||||
},
|
||||
{
|
||||
brand: 'nvidia',
|
||||
@@ -328,7 +329,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HR6ZBYJ&Quantity.1=1',
|
||||
model: 'founders edition',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08HR6ZBYJ'
|
||||
url: 'https://www.amazon.de/dp/B08HR6ZBYJ',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
@@ -336,7 +337,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HJQ182D&Quantity.1=1',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.de/dp/B08HJQ182D'
|
||||
url: 'https://www.amazon.de/dp/B08HJQ182D',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -344,7 +345,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HSJ1622&Quantity.1=1',
|
||||
model: 'dual',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.de/dp/B08HSJ1622'
|
||||
url: 'https://www.amazon.de/dp/B08HSJ1622',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -352,7 +353,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08KHFZN9P&Quantity.1=1',
|
||||
model: 'dual oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.de/dp/B08KHFZN9P'
|
||||
url: 'https://www.amazon.de/dp/B08KHFZN9P',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -360,7 +361,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HT7PR9Y&Quantity.1=1',
|
||||
model: 'strix',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.de/dp/B08HT7PR9Y'
|
||||
url: 'https://www.amazon.de/dp/B08HT7PR9Y',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -368,7 +369,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08L8JNTXQ&Quantity.1=1',
|
||||
model: 'strix oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.de/dp/B08L8JNTXQ'
|
||||
url: 'https://www.amazon.de/dp/B08L8JNTXQ',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -376,7 +377,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08KWPDXJZ&Quantity.1=1',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.de/dp/B08KWPDXJZ'
|
||||
url: 'https://www.amazon.de/dp/B08KWPDXJZ',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -384,7 +385,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08L6PCZTR&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.de/dp/B08L6PCZTR'
|
||||
url: 'https://www.amazon.de/dp/B08L6PCZTR',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -392,7 +393,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08KWN2LZG&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.de/dp/B08KWN2LZG'
|
||||
url: 'https://www.amazon.de/dp/B08KWN2LZG',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -400,7 +401,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08M13DXSZ&Quantity.1=1',
|
||||
model: 'vision oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.de/dp/B08M13DXSZ'
|
||||
url: 'https://www.amazon.de/dp/B08M13DXSZ',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -408,7 +409,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08KHL21CV&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.de/dp/B08KHL21CV'
|
||||
url: 'https://www.amazon.de/dp/B08KHL21CV',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -416,7 +417,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08KHL2J5X&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.de/dp/B08KHL2J5X'
|
||||
url: 'https://www.amazon.de/dp/B08KHL2J5X',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -424,7 +425,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08L3QCZKZ&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.de/dp/B08L3QCZKZ'
|
||||
url: 'https://www.amazon.de/dp/B08L3QCZKZ',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -432,7 +433,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08L3QZP7W&Quantity.1=1',
|
||||
model: 'xc3',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.de/dp/B08L3QZP7W'
|
||||
url: 'https://www.amazon.de/dp/B08L3QZP7W',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -440,7 +441,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08L3Q41SM&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.de/dp/B08L3Q41SM'
|
||||
url: 'https://www.amazon.de/dp/B08L3Q41SM',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
@@ -448,7 +449,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HRBR7K9&Quantity.1=1',
|
||||
model: 'twin edge',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.de/dp/B08HRBR7K9'
|
||||
url: 'https://www.amazon.de/dp/B08HRBR7K9',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
@@ -456,7 +457,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08LBVNKT1&Quantity.1=1',
|
||||
model: 'twin edge oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.de/dp/B08LBVNKT1'
|
||||
url: 'https://www.amazon.de/dp/B08LBVNKT1',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
@@ -464,7 +465,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HBF5L3K&Quantity.1=1',
|
||||
model: 'dual fan',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.de/dp/B08HBF5L3K'
|
||||
url: 'https://www.amazon.de/dp/B08HBF5L3K',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
@@ -472,7 +473,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08HBJB7YD&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.de/dp/B08HBJB7YD'
|
||||
url: 'https://www.amazon.de/dp/B08HBJB7YD',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -480,7 +481,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08166SLDF&Quantity.1=1',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amazon.de/dp/B08166SLDF'
|
||||
url: 'https://www.amazon.de/dp/B08166SLDF',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -488,7 +489,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B0815XFSGK&Quantity.1=1',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amazon.de/dp/B0815XFSGK'
|
||||
url: 'https://www.amazon.de/dp/B0815XFSGK',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -496,7 +497,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08164VTWH&Quantity.1=1',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amazon.de/dp/B08164VTWH'
|
||||
url: 'https://www.amazon.de/dp/B08164VTWH',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -504,7 +505,7 @@ export const AmazonDe: Store = {
|
||||
'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B0815Y8J9N&Quantity.1=1',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amazon.de/dp/B0815Y8J9N'
|
||||
url: 'https://www.amazon.de/dp/B0815Y8J9N',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
@@ -513,12 +514,12 @@ export const AmazonDe: Store = {
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '#productTitle',
|
||||
text: ['sony playstation 5']
|
||||
}
|
||||
text: ['sony playstation 5'],
|
||||
},
|
||||
},
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.amazon.de/dp/B08H93ZRK9'
|
||||
url: 'https://www.amazon.de/dp/B08H93ZRK9',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
@@ -527,12 +528,12 @@ export const AmazonDe: Store = {
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '#productTitle',
|
||||
text: ['sony playstation 5']
|
||||
}
|
||||
text: ['sony playstation 5'],
|
||||
},
|
||||
},
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.amazon.de/dp/B08H98GVK8'
|
||||
url: 'https://www.amazon.de/dp/B08H98GVK8',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
@@ -541,7 +542,7 @@ export const AmazonDe: Store = {
|
||||
// 'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B08H93ZRLL&Quantity.1=1',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.amazon.de/dp/B08H93ZRLL'
|
||||
url: 'https://www.amazon.de/dp/B08H93ZRLL',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
@@ -550,8 +551,8 @@ export const AmazonDe: Store = {
|
||||
// 'https://www.amazon.de/gp/aws/cart/add.html?ASIN.1=B087VM5XC6&Quantity.1=1',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.amazon.de/dp/B087VM5XC6'
|
||||
}
|
||||
url: 'https://www.amazon.de/dp/B087VM5XC6',
|
||||
},
|
||||
],
|
||||
name: 'amazon-de'
|
||||
name: 'amazon-de',
|
||||
};
|
||||
|
||||
@@ -2,24 +2,25 @@ 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']
|
||||
text: ['introduzca los caracteres que ve a continuación'],
|
||||
},
|
||||
inStock: {
|
||||
container: '#desktop_buybox',
|
||||
text: ['añadir a la cesta']
|
||||
text: ['añadir a la cesta'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice'
|
||||
container: '#priceblock_ourprice',
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '#availability',
|
||||
text: ['No disponible']
|
||||
}
|
||||
]
|
||||
text: ['No disponible'],
|
||||
},
|
||||
],
|
||||
},
|
||||
links: [
|
||||
{
|
||||
@@ -28,7 +29,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B07PW9VBK5',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -36,7 +37,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B08HM4V2DH',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -44,7 +45,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B08HGYXP4C',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -52,7 +53,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B08HJ9XFNM',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -60,7 +61,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B08HGBYWQ6',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -68,7 +69,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B08HGLN78Q',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -76,7 +77,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B08HH1BMQQ',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -84,7 +85,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B08HLZXHZY',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -92,7 +93,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B08HHZVZ3N',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -100,7 +101,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B08HN37VQK',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -108,7 +109,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B08HN4DSTC',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -116,7 +117,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B08HN6KYS3',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -124,7 +125,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B08HM4M621',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
@@ -132,7 +133,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B08HR1NPPQ',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -140,7 +141,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B08166SLDF',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -148,7 +149,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B0815XFSGK',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -156,7 +157,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B08164VTWH',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -164,7 +165,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B0815Y8J9N',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
@@ -172,7 +173,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B08KKJ37F7',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
@@ -180,7 +181,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B08KJF2D25',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
@@ -188,7 +189,7 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.es/dp/B08H93ZRLL',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
@@ -196,8 +197,8 @@ export const AmazonEs: Store = {
|
||||
'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'
|
||||
}
|
||||
url: 'https://www.amazon.es/dp/B087VM5XC6',
|
||||
},
|
||||
],
|
||||
name: 'amazon-es'
|
||||
name: 'amazon-es',
|
||||
};
|
||||
|
||||
@@ -2,189 +2,190 @@ 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']
|
||||
text: ['entrez les caractères que vous voyez ci-dessous'],
|
||||
},
|
||||
inStock: {
|
||||
container: '#desktop_buybox',
|
||||
text: ['ajouter au panier']
|
||||
text: ['ajouter au panier'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice',
|
||||
euroFormat: true
|
||||
euroFormat: true,
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '#availability',
|
||||
text: ['Actuellement indisponible']
|
||||
}
|
||||
]
|
||||
text: ['Actuellement indisponible'],
|
||||
},
|
||||
],
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amazon.fr/dp/B07PW9VBK5'
|
||||
url: 'https://www.amazon.fr/dp/B07PW9VBK5',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR7SV3M'
|
||||
url: 'https://www.amazon.fr/dp/B08HR7SV3M',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR5SXPS'
|
||||
url: 'https://www.amazon.fr/dp/B08HR5SXPS',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR3DPGW'
|
||||
url: 'https://www.amazon.fr/dp/B08HR3DPGW',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR3Y5GQ'
|
||||
url: 'https://www.amazon.fr/dp/B08HR3Y5GQ',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR55YB5'
|
||||
url: 'https://www.amazon.fr/dp/B08HR55YB5',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR4RJ3Q'
|
||||
url: 'https://www.amazon.fr/dp/B08HR4RJ3Q',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HR6FMF3'
|
||||
url: 'https://www.amazon.fr/dp/B08HR6FMF3',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HJTH61J'
|
||||
url: 'https://www.amazon.fr/dp/B08HJTH61J',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HJS2JLJ'
|
||||
url: 'https://www.amazon.fr/dp/B08HJS2JLJ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HHDP9DW'
|
||||
url: 'https://www.amazon.fr/dp/B08HHDP9DW',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HH5WF97'
|
||||
url: 'https://www.amazon.fr/dp/B08HH5WF97',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.fr/dp/B08HJNKT3P'
|
||||
url: 'https://www.amazon.fr/dp/B08HJNKT3P',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.fr/dp/B08HJQ182D'
|
||||
url: 'https://www.amazon.fr/dp/B08HJQ182D',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.fr/dp/B08HR9D2JS'
|
||||
url: 'https://www.amazon.fr/dp/B08HR9D2JS',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'gaming oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.fr/dp/B08HJRF2CN'
|
||||
url: 'https://www.amazon.fr/dp/B08HJRF2CN',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
model: 'eagle oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.fr/dp/B08HJPDJTY'
|
||||
url: 'https://www.amazon.fr/dp/B08HJPDJTY',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.fr/dp/B08HJGNJ81'
|
||||
url: 'https://www.amazon.fr/dp/B08HJGNJ81',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.fr/dp/B08HJLLF7G'
|
||||
url: 'https://www.amazon.fr/dp/B08HJLLF7G',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amazon.fr/dp/B08166SLDF'
|
||||
url: 'https://www.amazon.fr/dp/B08166SLDF',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amazon.fr/dp/B0815XFSGK'
|
||||
url: 'https://www.amazon.fr/dp/B0815XFSGK',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amazon.fr/dp/B08164VTWH'
|
||||
url: 'https://www.amazon.fr/dp/B08164VTWH',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amazon.fr/dp/B0815Y8J9N'
|
||||
url: 'https://www.amazon.fr/dp/B0815Y8J9N',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.amazon.fr/dp/B08H93ZRK9'
|
||||
url: 'https://www.amazon.fr/dp/B08H93ZRK9',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.amazon.fr/dp/B08H98GVK8'
|
||||
url: 'https://www.amazon.fr/dp/B08H98GVK8',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.amazon.fr/dp/B08H93ZRLL'
|
||||
url: 'https://www.amazon.fr/dp/B08H93ZRLL',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.amazon.fr/dp/B087VM5XC6'
|
||||
}
|
||||
url: 'https://www.amazon.fr/dp/B087VM5XC6',
|
||||
},
|
||||
],
|
||||
name: 'amazon-fr'
|
||||
name: 'amazon-fr',
|
||||
};
|
||||
|
||||
@@ -2,27 +2,29 @@ import {Store} from './store';
|
||||
|
||||
export const AmazonIt: Store = {
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
currency: '€',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['enter the characters you see below']
|
||||
text: ['Inserisci i caratteri visualizzati nello spazio sottostante'],
|
||||
},
|
||||
inStock: {
|
||||
container: '#desktop_buybox',
|
||||
text: ['Aggiungi al carrello']
|
||||
text: ['Aggiungi al carrello'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice'
|
||||
}
|
||||
container: '#priceblock_ourprice',
|
||||
euroFormat: true,
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.it/gp/aws/cart/add.html?ASIN.1=B07PW9VBK5&Quantity.1=1',
|
||||
'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/B07PW9VBK5'
|
||||
url: 'https://www.amazon.it/dp/B08KHFZN9P',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -30,7 +32,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08L8HPKR6',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -38,7 +40,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08L8JNTXQ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -46,7 +48,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08L8KC1J7',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -54,7 +56,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08KY266MG',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -62,7 +64,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08KWN2LZG',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
@@ -70,7 +72,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HBJB7YD',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
@@ -78,7 +80,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HBF5L3K',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -86,7 +88,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08KWPDXJZ',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -94,7 +96,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08KWLMZV4',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
@@ -102,7 +104,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08LF32LJ6',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -110,15 +112,15 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
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',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.it/dp/B08L8L9TCZ'
|
||||
url: 'https://www.amazon.it/dp/B08L8L9TCZ',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -126,7 +128,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08KY266MG',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -134,7 +136,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08M13DXSZ',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -142,7 +144,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08KXZV626',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
@@ -150,7 +152,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HBR7QBM',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
@@ -158,7 +160,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HBTJMLJ',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -166,7 +168,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HR3Y5GQ',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -174,7 +176,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HR55YB5',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -182,7 +184,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HR4RJ3Q',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -190,7 +192,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HR6FMF3',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -198,7 +200,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HJTH61J',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -206,7 +208,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HJS2JLJ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -214,7 +216,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HH5WF97',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -222,7 +224,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HHDP9DW',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -230,7 +232,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08J6GMWCQ',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -238,7 +240,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HR5SXPS',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
@@ -246,7 +248,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HJNKT3P',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
@@ -254,7 +256,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HJQ182D',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
@@ -262,7 +264,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HBQWBHH',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
@@ -270,7 +272,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HBVX53D',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -278,7 +280,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HRBW6VB',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -286,7 +288,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HR9D2JS',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -294,7 +296,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HJRF2CN',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -302,7 +304,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HJPDJTY',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -310,7 +312,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HJGNJ81',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -318,7 +320,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08HJLLF7G',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -326,7 +328,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08166SLDF',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -334,7 +336,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/product/B0815XFSGK',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -342,7 +344,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08164VTWH',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -350,7 +352,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B0815Y8J9N',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
@@ -358,7 +360,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08MVC76SR',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
@@ -366,7 +368,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08MVCLBWK',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
@@ -374,7 +376,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08KKJ37F7',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
@@ -382,7 +384,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08KJF2D25',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
@@ -390,7 +392,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08JDSW1ZW',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
@@ -398,7 +400,7 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.it/dp/B08JDTCXRG',
|
||||
},
|
||||
{
|
||||
brand: 'corsair',
|
||||
@@ -406,8 +408,8 @@ export const AmazonIt: Store = {
|
||||
'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'
|
||||
}
|
||||
url: 'https://www.amazon.it/dp/B07M63H81H',
|
||||
},
|
||||
],
|
||||
name: 'amazon-it'
|
||||
name: 'amazon-it',
|
||||
};
|
||||
|
||||
+149
-27
@@ -1,43 +1,45 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AmazonNl: Store = {
|
||||
currency: '€',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['voer de karakters in die u hieronder ziet']
|
||||
text: ['voer de karakters in die u hieronder ziet'],
|
||||
},
|
||||
inStock: {
|
||||
container: '#availability',
|
||||
text: [
|
||||
'op voorraad',
|
||||
'verkrijgbaar vanaf',
|
||||
'wordt gewoonlijk verzonden binnen',
|
||||
'nog slechts'
|
||||
]
|
||||
inStock: [
|
||||
{
|
||||
container: '#add-to-cart-button',
|
||||
text: ['in winkelwagen'],
|
||||
},
|
||||
{
|
||||
container: '#buy-now-button',
|
||||
text: ['nu kopen'],
|
||||
},
|
||||
],
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice',
|
||||
euroFormat: true
|
||||
euroFormat: true,
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '#availability',
|
||||
text: ['tijdelijk niet']
|
||||
text: ['tijdelijk niet'],
|
||||
},
|
||||
{
|
||||
container: '#outOfStock',
|
||||
text: ['we weten niet of en wanneer dit item weer op voorraad is']
|
||||
}
|
||||
]
|
||||
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=B083GGYNQ6&Quantity.1=1',
|
||||
'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/B083GGYNQ6'
|
||||
url: 'https://www.amazon.nl/dp/B085K45C3S',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -45,7 +47,7 @@ export const AmazonNl: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.nl/dp/B08HM4M621',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -53,7 +55,7 @@ export const AmazonNl: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.nl/dp/B08HM4V2DH',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -61,7 +63,7 @@ export const AmazonNl: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.nl/dp/B08HJ9XFNM',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -69,7 +71,7 @@ export const AmazonNl: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.nl/dp/B08HH1BMQQ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -77,7 +79,127 @@ export const AmazonNl: Store = {
|
||||
'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'
|
||||
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',
|
||||
@@ -85,7 +207,7 @@ export const AmazonNl: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.nl/dp/B08166SLDF',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -93,7 +215,7 @@ export const AmazonNl: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.nl/dp/B0815XFSGK',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -101,7 +223,7 @@ export const AmazonNl: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.nl/dp/B08164VTWH',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -109,8 +231,8 @@ export const AmazonNl: Store = {
|
||||
'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'
|
||||
}
|
||||
url: 'https://www.amazon.nl/dp/B0815Y8J9N',
|
||||
},
|
||||
],
|
||||
name: 'amazon-nl'
|
||||
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',
|
||||
};
|
||||
+440
-77
@@ -1,31 +1,30 @@
|
||||
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']
|
||||
text: ['enter the characters you see below'],
|
||||
},
|
||||
inStock: {
|
||||
container: '#availability',
|
||||
text: ['in stock']
|
||||
text: ['in stock'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice'
|
||||
container: '#priceblock_ourprice',
|
||||
},
|
||||
outOfStock: [
|
||||
{
|
||||
container: '#availability',
|
||||
text: ['out of stock', 'unavailable']
|
||||
text: ['out of stock', 'unavailable'],
|
||||
},
|
||||
{
|
||||
container: '#backInStock',
|
||||
text: ['unavailable']
|
||||
}
|
||||
]
|
||||
text: ['unavailable'],
|
||||
},
|
||||
],
|
||||
},
|
||||
links: [
|
||||
{
|
||||
@@ -34,7 +33,7 @@ export const AmazonUk: Store = {
|
||||
'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/'
|
||||
url: 'https://www.amazon.co.uk/dp/B0753R2TWC/',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
@@ -42,7 +41,7 @@ export const AmazonUk: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.co.uk/dp/B08H95Y452',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
@@ -50,7 +49,7 @@ export const AmazonUk: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.co.uk/dp/B08H97NYGP',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
@@ -58,7 +57,7 @@ export const AmazonUk: Store = {
|
||||
'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'
|
||||
url: 'https://www.amazon.co.uk/dp/B08H93GKNJ',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
@@ -66,72 +65,436 @@ export const AmazonUk: Store = {
|
||||
'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: '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'
|
||||
]
|
||||
url: 'https://www.amazon.co.uk/dp/B08GD9MNZB',
|
||||
},
|
||||
{
|
||||
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'
|
||||
]
|
||||
},
|
||||
{
|
||||
series: '3060ti',
|
||||
brand: 'amd',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
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'
|
||||
}
|
||||
]
|
||||
'https://www.amazon.co.uk/AMD-Ryzen-5600X-Processor-Cache/dp/B08166SLDF',
|
||||
},
|
||||
name: 'amazon-uk'
|
||||
{
|
||||
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',
|
||||
};
|
||||
|
||||
+235
-83
@@ -2,33 +2,147 @@ import {Store} from './store';
|
||||
|
||||
export const Amazon: Store = {
|
||||
backoffStatusCodes: [403, 429, 503],
|
||||
captchaDeterrent: {
|
||||
hardLinks: [
|
||||
'https://www.amazon.com/Amazon-Video/b/?ie=UTF8&node=2858778011&ref_=nav_cs_prime_video',
|
||||
'https://www.amazon.com/alm/storefront?almBrandId=VUZHIFdob2xlIEZvb2Rz&ref_=nav_cs_whole_foods_in_region',
|
||||
'https://www.amazon.com/gp/goldbox?ref_=nav_cs_gb',
|
||||
],
|
||||
searchTerms: ['goober', 'dungeons+and+dragons'],
|
||||
searchUrl: 'https://www.amazon.com/s?k=%%s&i=todays-deals&ref=nb_sb_noss_2',
|
||||
},
|
||||
currency: '$',
|
||||
labels: {
|
||||
captcha: {
|
||||
container: 'body',
|
||||
text: ['enter the characters you see below']
|
||||
text: ['enter the characters you see below'],
|
||||
},
|
||||
inStock: [
|
||||
{
|
||||
container: '#add-to-cart-button',
|
||||
text: ['add to cart']
|
||||
text: ['add to cart'],
|
||||
},
|
||||
{
|
||||
container: '#buy-now-button',
|
||||
text: ['buy now']
|
||||
}
|
||||
text: ['buy now'],
|
||||
},
|
||||
],
|
||||
maxPrice: {
|
||||
container: '#priceblock_ourprice'
|
||||
}
|
||||
container: '#priceblock_ourprice',
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B083248S3B&Quantity.1=1',
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B089KV4YYX&Quantity.1=1',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amazon.com/dp/B083248S3B'
|
||||
url: 'https://www.amazon.com/dp/B089KV4YYX',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08P2HBBLX&Quantity.1=1',
|
||||
model: 'dual',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.com/dp/B08P2HBBLX',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08NYP7KG6&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.com/dp/B08NYP7KG6',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08NYPLXPJ&Quantity.1=1',
|
||||
model: 'gaming oc pro',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.com/dp/B08NYPLXPJ',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08NYNJ6RC&Quantity.1=1',
|
||||
model: 'eagle',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.com/dp/B08NYNJ6RC',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B083Z5P6TX&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.com/dp/B083Z5P6TX',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08P2D3JSG&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.com/dp/B08P2D3JSG',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08P2DQ28S&Quantity.1=1',
|
||||
model: 'ventus 2x',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.com/dp/B08P2DQ28S',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08P3XJLJJ&Quantity.1=1',
|
||||
model: 'twin edge oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.com/dp/B08P3XJLJJ',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08P3V572B&Quantity.1=1',
|
||||
model: 'twin edge',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.com/dp/B08P3V572B',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08P2D1JZZ&Quantity.1=1',
|
||||
model: 'ko',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.com/dp/B08P2D1JZZ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B083Z7TR8Z&Quantity.1=1',
|
||||
model: 'strix',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.com/dp/B083Z7TR8Z',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08P2H5LW2&Quantity.1=1',
|
||||
model: 'ftw3',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.com/dp/B08P2H5LW2',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08NYPKW1Z&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3060ti',
|
||||
url: 'https://www.amazon.com/dp/B08NYPKW1Z',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -36,7 +150,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08L8LG4M3&Quantity.1=1',
|
||||
model: 'dual',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08L8LG4M3'
|
||||
url: 'https://www.amazon.com/dp/B08L8LG4M3',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -44,7 +158,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08L8HPKR6&Quantity.1=1',
|
||||
model: 'dual',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08L8HPKR6'
|
||||
url: 'https://www.amazon.com/dp/B08L8HPKR6',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -52,7 +166,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08LW46GH2&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08LW46GH2'
|
||||
url: 'https://www.amazon.com/dp/B08LW46GH2',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -60,7 +174,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08L8JNTXQ&Quantity.1=1',
|
||||
model: 'strix',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08L8JNTXQ'
|
||||
url: 'https://www.amazon.com/dp/B08L8JNTXQ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -68,7 +182,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08L8KC1J7&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08L8KC1J7'
|
||||
url: 'https://www.amazon.com/dp/B08L8KC1J7',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -76,7 +190,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08KY266MG&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08KY266MG'
|
||||
url: 'https://www.amazon.com/dp/B08KY266MG',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -84,7 +198,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08KWN2LZG&Quantity.1=1',
|
||||
model: 'gaming',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08KWN2LZG'
|
||||
url: 'https://www.amazon.com/dp/B08KWN2LZG',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
@@ -92,7 +206,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HBJB7YD&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08HBJB7YD'
|
||||
url: 'https://www.amazon.com/dp/B08HBJB7YD',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
@@ -100,7 +214,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HBF5L3K&Quantity.1=1',
|
||||
model: 'xlr8 uprising',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08HBF5L3K'
|
||||
url: 'https://www.amazon.com/dp/B08HBF5L3K',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -108,7 +222,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08KWPDXJZ&Quantity.1=1',
|
||||
model: 'ventus 2x oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08KWPDXJZ'
|
||||
url: 'https://www.amazon.com/dp/B08KWPDXJZ',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -116,7 +230,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08KWLMZV4&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08KWLMZV4'
|
||||
url: 'https://www.amazon.com/dp/B08KWLMZV4',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
@@ -124,7 +238,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08LF1CWT2&Quantity.1=1',
|
||||
model: 'twin edge oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08LF1CWT2'
|
||||
url: 'https://www.amazon.com/dp/B08LF1CWT2',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
@@ -132,7 +246,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08LF32LJ6&Quantity.1=1',
|
||||
model: 'gaming',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08LF32LJ6'
|
||||
url: 'https://www.amazon.com/dp/B08LF32LJ6',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -140,15 +254,15 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08L8L71SM&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08L8L71SM'
|
||||
url: 'https://www.amazon.com/dp/B08L8L71SM',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08L8L9TCZ&Quantity.1=1',
|
||||
model: 'ftw3',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08L8L9TCZ'
|
||||
url: 'https://www.amazon.com/dp/B08L8L9TCZ',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -156,7 +270,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08LW46GH2&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08LW46GH2'
|
||||
url: 'https://www.amazon.com/dp/B08LW46GH2',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -164,7 +278,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08KY266MG&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08KY266MG'
|
||||
url: 'https://www.amazon.com/dp/B08KY266MG',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -172,7 +286,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08M13DXSZ&Quantity.1=1',
|
||||
model: 'vision oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08M13DXSZ'
|
||||
url: 'https://www.amazon.com/dp/B08M13DXSZ',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -180,7 +294,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08M4YFNX2&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08M4YFNX2'
|
||||
url: 'https://www.amazon.com/dp/B08M4YFNX2',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -188,7 +302,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08KXZV626&Quantity.1=1',
|
||||
model: 'eagle',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08KXZV626'
|
||||
url: 'https://www.amazon.com/dp/B08KXZV626',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -196,7 +310,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08KY322TH&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3070',
|
||||
url: 'https://www.amazon.com/dp/B08KY322TH'
|
||||
url: 'https://www.amazon.com/dp/B08KY322TH',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
@@ -204,7 +318,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HBR7QBM&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.com/dp/B08HBR7QBM'
|
||||
url: 'https://www.amazon.com/dp/B08HBR7QBM',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
@@ -212,7 +326,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HBTJMLJ&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.com/dp/B08HBTJMLJ'
|
||||
url: 'https://www.amazon.com/dp/B08HBTJMLJ',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -220,7 +334,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HR7SV3M&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.com/dp/B08HR7SV3M'
|
||||
url: 'https://www.amazon.com/dp/B08HR7SV3M',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -228,7 +342,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HR3Y5GQ&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.com/dp/B08HR3Y5GQ'
|
||||
url: 'https://www.amazon.com/dp/B08HR3Y5GQ',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -236,7 +350,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HR55YB5&Quantity.1=1',
|
||||
model: 'xc3 ultra',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.com/dp/B08HR55YB5'
|
||||
url: 'https://www.amazon.com/dp/B08HR55YB5',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -244,7 +358,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HR3DPGW&Quantity.1=1',
|
||||
model: 'ftw3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.com/dp/B08HR3DPGW'
|
||||
url: 'https://www.amazon.com/dp/B08HR3DPGW',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -252,7 +366,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HR4RJ3Q&Quantity.1=1',
|
||||
model: 'xc3',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.com/dp/B08HR4RJ3Q'
|
||||
url: 'https://www.amazon.com/dp/B08HR4RJ3Q',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
@@ -260,7 +374,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HR6FMF3&Quantity.1=1',
|
||||
model: 'xc3 black',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.com/dp/B08HR6FMF3'
|
||||
url: 'https://www.amazon.com/dp/B08HR6FMF3',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -268,7 +382,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HJTH61J&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.com/dp/B08HJTH61J'
|
||||
url: 'https://www.amazon.com/dp/B08HJTH61J',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -276,7 +390,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HJS2JLJ&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.com/dp/B08HJS2JLJ'
|
||||
url: 'https://www.amazon.com/dp/B08HJS2JLJ',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -284,7 +398,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HH5WF97&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.com/dp/B08HH5WF97'
|
||||
url: 'https://www.amazon.com/dp/B08HH5WF97',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -292,7 +406,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HHDP9DW&Quantity.1=1',
|
||||
model: 'tuf',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.com/dp/B08HHDP9DW'
|
||||
url: 'https://www.amazon.com/dp/B08HHDP9DW',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -300,7 +414,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08J6F174Z&Quantity.1=1',
|
||||
model: 'strix oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.com/dp/B08J6F174Z'
|
||||
url: 'https://www.amazon.com/dp/B08J6F174Z',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -308,7 +422,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08J6GMWCQ&Quantity.1=1',
|
||||
model: 'strix oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.com/dp/B08J6GMWCQ'
|
||||
url: 'https://www.amazon.com/dp/B08J6GMWCQ',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -316,7 +430,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HR5SXPS&Quantity.1=1',
|
||||
model: 'ventus 3x oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.com/dp/B08HR5SXPS'
|
||||
url: 'https://www.amazon.com/dp/B08HR5SXPS',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
@@ -324,7 +438,15 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HJNKT3P&Quantity.1=1',
|
||||
model: 'trinity',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.com/dp/B08HJNKT3P'
|
||||
url: 'https://www.amazon.com/dp/B08HJNKT3P',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HVV2P4Z&Quantity.1=1',
|
||||
model: 'trinity oc',
|
||||
series: '3080',
|
||||
url: 'https://www.amazon.com/dp/B08HVV2P4Z',
|
||||
},
|
||||
{
|
||||
brand: 'zotac',
|
||||
@@ -332,7 +454,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HJQ182D&Quantity.1=1',
|
||||
model: 'trinity',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.com/dp/B08HJQ182D'
|
||||
url: 'https://www.amazon.com/dp/B08HJQ182D',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
@@ -340,7 +462,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HBQWBHH&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.com/dp/B08HBQWBHH'
|
||||
url: 'https://www.amazon.com/dp/B08HBQWBHH',
|
||||
},
|
||||
{
|
||||
brand: 'pny',
|
||||
@@ -348,7 +470,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HBVX53D&Quantity.1=1',
|
||||
model: 'xlr8 revel',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.com/dp/B08HBVX53D'
|
||||
url: 'https://www.amazon.com/dp/B08HBVX53D',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -356,7 +478,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HRBW6VB&Quantity.1=1',
|
||||
model: 'gaming x trio',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.com/dp/B08HRBW6VB'
|
||||
url: 'https://www.amazon.com/dp/B08HRBW6VB',
|
||||
},
|
||||
{
|
||||
brand: 'msi',
|
||||
@@ -364,7 +486,15 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HR9D2JS&Quantity.1=1',
|
||||
model: 'ventus 3x',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.com/dp/B08HR9D2JS'
|
||||
url: 'https://www.amazon.com/dp/B08HR9D2JS',
|
||||
},
|
||||
{
|
||||
brand: 'evga',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08J5F3G18&Quantity.1=1',
|
||||
model: 'ftw3 ultra',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.com/dp/B08J5F3G18',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -372,7 +502,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HJRF2CN&Quantity.1=1',
|
||||
model: 'gaming oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.com/dp/B08HJRF2CN'
|
||||
url: 'https://www.amazon.com/dp/B08HJRF2CN',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -380,7 +510,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HJPDJTY&Quantity.1=1',
|
||||
model: 'eagle oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.com/dp/B08HJPDJTY'
|
||||
url: 'https://www.amazon.com/dp/B08HJPDJTY',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -388,7 +518,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HJGNJ81&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.com/dp/B08HJGNJ81'
|
||||
url: 'https://www.amazon.com/dp/B08HJGNJ81',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -396,7 +526,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08HJLLF7G&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: '3090',
|
||||
url: 'https://www.amazon.com/dp/B08HJLLF7G'
|
||||
url: 'https://www.amazon.com/dp/B08HJLLF7G',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -404,7 +534,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08166SLDF&Quantity.1=1',
|
||||
model: '5600x',
|
||||
series: 'ryzen5600',
|
||||
url: 'https://www.amazon.com/dp/B08166SLDF'
|
||||
url: 'https://www.amazon.com/dp/B08166SLDF',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -412,7 +542,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B0815XFSGK&Quantity.1=1',
|
||||
model: '5800x',
|
||||
series: 'ryzen5800',
|
||||
url: 'https://www.amazon.com/dp/product/B0815XFSGK'
|
||||
url: 'https://www.amazon.com/dp/product/B0815XFSGK',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -420,7 +550,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08164VTWH&Quantity.1=1',
|
||||
model: '5900x',
|
||||
series: 'ryzen5900',
|
||||
url: 'https://www.amazon.com/dp/B08164VTWH'
|
||||
url: 'https://www.amazon.com/dp/B08164VTWH',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -428,7 +558,23 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B0815Y8J9N&Quantity.1=1',
|
||||
model: '5950x',
|
||||
series: 'ryzen5950',
|
||||
url: 'https://www.amazon.com/dp/B0815Y8J9N'
|
||||
url: 'https://www.amazon.com/dp/B0815Y8J9N',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08PHWJC8X&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://www.amazon.com/dp/B08PHWJC8X',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08PDQJVD9&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6900xt',
|
||||
url: 'https://www.amazon.com/dp/B08PDQJVD9',
|
||||
},
|
||||
{
|
||||
brand: 'gigabyte',
|
||||
@@ -436,7 +582,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08NS4W2ZY&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.com/dp/B08NS4W2ZY'
|
||||
url: 'https://www.amazon.com/dp/B08NS4W2ZY',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
@@ -444,7 +590,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08MVC76SR&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.com/dp/B08MVC76SR'
|
||||
url: 'https://www.amazon.com/dp/B08MVC76SR',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
@@ -452,7 +598,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08NXXT7WN&Quantity.1=1',
|
||||
model: 'nitro+',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.com/dp/B08NXXT7WN'
|
||||
url: 'https://www.amazon.com/dp/B08NXXT7WN',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
@@ -460,7 +606,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08NXYNLMR&Quantity.1=1',
|
||||
model: 'pulse',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.com/dp/B08NXYNLMR'
|
||||
url: 'https://www.amazon.com/dp/B08NXYNLMR',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
@@ -468,7 +614,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08NXVNMPQ&Quantity.1=1',
|
||||
model: 'nitro+',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.com/dp/B08NXVNMPQ'
|
||||
url: 'https://www.amazon.com/dp/B08NXVNMPQ',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
@@ -476,7 +622,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08N6ZLX9B&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.com/dp/B08N6ZLX9B'
|
||||
url: 'https://www.amazon.com/dp/B08N6ZLX9B',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
@@ -484,7 +630,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08NX14LV1&Quantity.1=1',
|
||||
model: 'merc',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.com/dp/B08NX14LV1'
|
||||
url: 'https://www.amazon.com/dp/B08NX14LV1',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
@@ -492,7 +638,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08NN76VJD&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amazon.com/dp/B08NN76VJD'
|
||||
url: 'https://www.amazon.com/dp/B08NN76VJD',
|
||||
},
|
||||
{
|
||||
brand: 'xfx',
|
||||
@@ -500,7 +646,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08P5YFZCY&Quantity.1=1',
|
||||
model: 'merc',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amazon.com/dp/B08P5YFZCY'
|
||||
url: 'https://www.amazon.com/dp/B08P5YFZCY',
|
||||
},
|
||||
{
|
||||
brand: 'powercolor',
|
||||
@@ -508,7 +654,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08MNZM5TK&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amazon.com/dp/B08MNZM5TK'
|
||||
url: 'https://www.amazon.com/dp/B08MNZM5TK',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
@@ -516,7 +662,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08MVCLBWK&Quantity.1=1',
|
||||
model: 'amd reference',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amazon.com/dp/B08MVCLBWK'
|
||||
url: 'https://www.amazon.com/dp/B08MVCLBWK',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
@@ -524,7 +670,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08NXZSPMY&Quantity.1=1',
|
||||
model: 'nitro+',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amazon.com/dp/B08NXZSPMY'
|
||||
url: 'https://www.amazon.com/dp/B08NXZSPMY',
|
||||
},
|
||||
{
|
||||
brand: 'sapphire',
|
||||
@@ -532,7 +678,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08NXYBVDB&Quantity.1=1',
|
||||
model: 'pulse',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amazon.com/dp/B08NXYBVDB'
|
||||
url: 'https://www.amazon.com/dp/B08NXYBVDB',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -540,7 +686,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08NWJ29NB&Quantity.1=1',
|
||||
model: 'strix oc',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amazon.com/dp/B08NWJ29NB'
|
||||
url: 'https://www.amazon.com/dp/B08NWJ29NB',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -548,7 +694,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08P3YT3MY&Quantity.1=1',
|
||||
model: 'tuf oc',
|
||||
series: 'rx6800',
|
||||
url: 'https://www.amazon.com/dp/B08P3YT3MY'
|
||||
url: 'https://www.amazon.com/dp/B08P3YT3MY',
|
||||
},
|
||||
{
|
||||
brand: 'asus',
|
||||
@@ -556,15 +702,21 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08NWHKGS9&Quantity.1=1',
|
||||
model: 'strix lc',
|
||||
series: 'rx6800xt',
|
||||
url: 'https://www.amazon.com/dp/B08NWHKGS9'
|
||||
url: 'https://www.amazon.com/dp/B08NWHKGS9',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
cartUrl:
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08FC5L3RG&Quantity.1=1',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '#productTitle',
|
||||
text: ['playstation 5 console'],
|
||||
},
|
||||
},
|
||||
model: 'ps5 console',
|
||||
series: 'sonyps5c',
|
||||
url: 'https://www.amazon.com/dp/B08FC5L3RG'
|
||||
url: 'https://www.amazon.com/dp/B08FC5L3RG',
|
||||
},
|
||||
{
|
||||
brand: 'sony',
|
||||
@@ -572,19 +724,19 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B08FC6MR62&Quantity.1=1',
|
||||
model: 'ps5 digital',
|
||||
series: 'sonyps5de',
|
||||
url: 'https://www.amazon.com/dp/B08FC6MR62'
|
||||
url: 'https://www.amazon.com/dp/B08FC6MR62',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series x',
|
||||
series: 'xboxsx',
|
||||
url: 'https://www.amazon.com/dp/B08H75RTZ8'
|
||||
url: 'https://www.amazon.com/dp/B08H75RTZ8',
|
||||
},
|
||||
{
|
||||
brand: 'microsoft',
|
||||
model: 'xbox series s',
|
||||
series: 'xboxss',
|
||||
url: 'https://www.amazon.com/dp/B08G9J44ZN'
|
||||
url: 'https://www.amazon.com/dp/B08G9J44ZN',
|
||||
},
|
||||
{
|
||||
brand: 'corsair',
|
||||
@@ -592,7 +744,7 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B07M63H81H&Quantity.1=1',
|
||||
model: '750 platinum',
|
||||
series: 'sf',
|
||||
url: 'https://www.amazon.com/dp/B07M63H81H'
|
||||
url: 'https://www.amazon.com/dp/B07M63H81H',
|
||||
},
|
||||
{
|
||||
brand: 'corsair',
|
||||
@@ -600,8 +752,8 @@ export const Amazon: Store = {
|
||||
'https://www.amazon.com/gp/aws/cart/add.html?ASIN.1=B07F84FJ1G&Quantity.1=1',
|
||||
model: '600 platinum',
|
||||
series: 'sf',
|
||||
url: 'https://www.amazon.com/dp/B07F84FJ1G'
|
||||
}
|
||||
url: 'https://www.amazon.com/dp/B07F84FJ1G',
|
||||
},
|
||||
],
|
||||
name: 'amazon'
|
||||
name: 'amazon',
|
||||
};
|
||||
|
||||
@@ -1,22 +1,23 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AmdCa: Store = {
|
||||
currency: '$',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.btn-shopping-cart',
|
||||
text: ['add to cart']
|
||||
text: ['add to cart'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.product-page-description h4',
|
||||
euroFormat: false
|
||||
}
|
||||
euroFormat: false,
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amd.com/en/direct-buy/5458373400/ca'
|
||||
url: 'https://www.amd.com/en/direct-buy/5458373400/ca',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -24,7 +25,7 @@ export const AmdCa: Store = {
|
||||
'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'
|
||||
url: 'https://www.amd.com/en/direct-buy/5458373400/ca',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -32,8 +33,16 @@ export const AmdCa: Store = {
|
||||
'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'
|
||||
}
|
||||
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'
|
||||
name: 'amd-ca',
|
||||
};
|
||||
|
||||
+32
-11
@@ -1,22 +1,27 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AmdDe: Store = {
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.btn-shopping-cart',
|
||||
text: ['add to cart']
|
||||
text: ['add to cart'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.product-page-description h4',
|
||||
euroFormat: true
|
||||
}
|
||||
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'
|
||||
url: 'https://www.amd.com/de/direct-buy/5450881400/de',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -24,7 +29,7 @@ export const AmdDe: Store = {
|
||||
'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'
|
||||
url: 'https://www.amd.com/de/direct-buy/5450881400/de',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -32,7 +37,7 @@ export const AmdDe: Store = {
|
||||
'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'
|
||||
url: 'https://www.amd.com/de/direct-buy/5450881500/de',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -40,7 +45,7 @@ export const AmdDe: Store = {
|
||||
'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'
|
||||
url: 'https://www.amd.com/de/direct-buy/5450881600/de',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -48,7 +53,15 @@ export const AmdDe: Store = {
|
||||
'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'
|
||||
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',
|
||||
@@ -56,8 +69,16 @@ export const AmdDe: Store = {
|
||||
'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'
|
||||
}
|
||||
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'
|
||||
name: 'amd-de',
|
||||
};
|
||||
|
||||
+12
-11
@@ -1,22 +1,23 @@
|
||||
import {Store} from './store';
|
||||
|
||||
export const AmdIt: Store = {
|
||||
currency: '€',
|
||||
labels: {
|
||||
inStock: {
|
||||
container: '.btn-shopping-cart',
|
||||
text: ['add to cart']
|
||||
text: ['add to cart'],
|
||||
},
|
||||
maxPrice: {
|
||||
container: '.product-page-description h4',
|
||||
euroFormat: true
|
||||
}
|
||||
euroFormat: true,
|
||||
},
|
||||
},
|
||||
links: [
|
||||
{
|
||||
brand: 'test:brand',
|
||||
model: 'test:model',
|
||||
series: 'test:series',
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881400/it'
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881400/it',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -24,7 +25,7 @@ export const AmdIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881400/it',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -32,7 +33,7 @@ export const AmdIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881500/it',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -40,7 +41,7 @@ export const AmdIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881600/it',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -48,7 +49,7 @@ export const AmdIt: Store = {
|
||||
'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'
|
||||
url: 'https://www.amd.com/en/direct-buy/5450881700/it',
|
||||
},
|
||||
{
|
||||
brand: 'amd',
|
||||
@@ -56,8 +57,8 @@ export const AmdIt: Store = {
|
||||
'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'
|
||||
}
|
||||
url: 'https://www.amd.com/en/direct-buy/5458374100/it',
|
||||
},
|
||||
],
|
||||
name: 'amd-it'
|
||||
name: 'amd-it',
|
||||
};
|
||||
|
||||
@@ -0,0 +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',
|
||||
};
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user