Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(captcha): add support for configurable capture type #2468

Merged
merged 3 commits into from
May 17, 2021

Conversation

klords
Copy link
Contributor

@klords klords commented Apr 29, 2021

Description

Update: The logic is now configurable and defaults to the current implementation link but is settable per-store or with a global override in dotenv. This sidesteps the overall impact of the below discussion points (but not its relevance to the available options).

Changes the logic of the captcha handler to take a screenshot of the target element rather extracting an image url. This approach has some advantages and drawbacks worth consideration:

Pros Cons
Prevents flagging from excessive or unusual downloads/accesses of captcha images Counts against messaging service file upload quotas
"Future-proof" for when we want to take on harder captchas We would have to use a strategy pattern approach anyways based on store config or other detection method
Resistant to using non-image-based captchas Is this captcha tech in use? Would it be easier to solve anyway?

I also added the captcha handler config for all Amazon sites after testing them in bulk. It appears they all have the same structure (as one might expect). Guess that'll fix issues like #2452.

Testing

npm run test:captcha with various service configurations. Captcha test is updated to actually open a live page and grab image.

@klords klords requested a review from jef as a code owner April 29, 2021 12:48
@AlexP11223
Copy link
Contributor

AlexP11223 commented Apr 30, 2021

I would make an option for the captcha capture method. Like this:

async function saveCaptchaAsync(method: string, page: Page, store: Store): CaptchaPayload {
  switch (method) {
     case 'screenshot':
       return saveCaptchaScreenshotAsync(page, store);
    case 'url' ... 
  }
}

Probably should be configurable per store, and maybe allow to override via env.

And maybe should rename DMPayload to CaptchaPayload, for adding captcha recognition services and libs (and I would extract all handlers from messaging to e.g. captcha/handler). For some captchas (such as recaptcha iirc) you may need to just extract some ID from HTML.

For saving files maybe easier to use tmp dir. https://github.com/benjamingr/tmp-promise

@klords
Copy link
Contributor Author

klords commented Apr 30, 2021 via email

@AlexP11223
Copy link
Contributor

There are no captcha handlers in the messaging code.

I mean just extracting this

export async function getDiscordCaptchaInputAsync(

it seems like it can be outside of this module since it's only using the more generic exported stuff. And then all possible captcha handlers will be nicely in one place making it more clear.

I have no intention of adding it.

I can do it :)

Also I saw this lib for Amazon captchas used in fairgame, but not sure if there are JS alternatives.

Though handling Amazon captchas actually seems not very important, because there is no chance to buy a GPU manually, there are too many buying bots, and even without bots thousands of people monitor Amazon.

@jef
Copy link
Owner

jef commented May 4, 2021

Sorry @klords, I haven't gotten around to reviewing this.

Is this PR in it's final state?

@klords klords force-pushed the klords/captcha-send-image branch from 02a0081 to 41a80d9 Compare May 10, 2021 10:06
@klords
Copy link
Contributor Author

klords commented May 10, 2021

@jef no worries, similar boat here! I was able to allocate some time to this and incorporated some ideas from the feedback above. It's at a good point now, and other ideas can be vetted and/or included in a more applicable PR later on.

@klords klords changed the title refactor(captcha): use screenshot instead of passing image url refactor(captcha): add support for configurable capture type May 11, 2021
@jef
Copy link
Owner

jef commented May 17, 2021

Looking at this today @klords. Thanks for your patience and keeping this updated.

Copy link
Owner

@jef jef left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall, looks great. I really appreciate the hard work you've put into this topic. This has been a great addition.

});

config.browser.userAgent = await browser.userAgent();
browser = await launchBrowser();
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

@@ -104,3 +105,11 @@ export async function getRandomUserAgent(): Promise<string> {
logger.debug('user agent', {userAgent});
return userAgent;
}

export function deleteFile(path: string) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion(non-blocking): As previously mentioned, it could be easily to put into a temp directory. But this is fine for now as I don't want to block this.

@jef jef changed the title refactor(captcha): add support for configurable capture type feat(captcha): add support for configurable capture type May 17, 2021
@jef jef merged commit 6e614a2 into jef:main May 17, 2021
@jef
Copy link
Owner

jef commented May 17, 2021

Changed to feat to get captured by release-please.

@klords klords deleted the klords/captcha-send-image branch May 17, 2021 11:17
jef pushed a commit that referenced this pull request Oct 21, 2022
🤖 I have created a release *beep* *boop*
---


##
[3.6.0](v3.5.0...v3.6.0)
(2022-10-21)


### Features

* add 3080ti
([#2598](#2598))
([4cfbd37](4cfbd37))
* add 3080ti
([#2600](#2600))
([51c9b3a](51c9b3a))
* add a few stores for spain
([#2646](#2646))
([0b060e8](0b060e8))
* add alternate-fr, 3070ti, change alternate to alternate.de
([#2653](#2653))
([8c7b8aa](8c7b8aa))
* add INCOGNITO to dotenv-example and volta support
([#2484](#2484))
([b579052](b579052))
* add interactive captcha handler with Slack and Discord
([#2385](#2385))
([409769e](409769e))
* add ldlc-italy and fixes ollo/hardware-planet
([#2903](#2903))
([d4f4076](d4f4076)),
closes [#2867](#2867)
* add SCREENSHOT_DIR config option
([#2801](#2801))
([fe99aa4](fe99aa4))
* add ubiquiti store and dream machine model.
([#3034](#3034))
([87301fe](87301fe))
* add waitUntil and waitForSelctor to linksBuilder
([#2437](#2437))
([cac7c20](cac7c20))
* **captcha:** add support for configurable capture type
([#2468](#2468))
([6e614a2](6e614a2))
* change max price behavior
([9b02c36](9b02c36))
* color empty stores
([#2312](#2312))
([bbfa808](bbfa808))
* **coolmod:** add linksBuilder and update selectors
([#2803](#2803))
([f297e1d](f297e1d))
* **equippr:** add links builder
([#2795](#2795))
([e631d80](e631d80))
* **gotify:** add priority option
([#2546](#2546))
([32fe440](32fe440))
* **notification:** add gotify
([8f2de5d](8f2de5d)),
closes [#2541](#2541)
[#2536](https://github.com/jef/streetmerchant/issues/2536)
* **notification:** add support for Free mobile
([#2285](#2285))
([6be2e0d](6be2e0d))
* **notifications:** add apple push notifications
([#2077](#2077))
([6b78b2e](6b78b2e))
* **pushover:** ability to specify device
([#2101](#2101))
([d03aea0](d03aea0))
* **pushover:** add support for sound
([#2203](#2203))
([83ce922](83ce922))
* **redis:** introduce pub/sub
([#2855](#2855))
([d6d8ef2](d6d8ef2))
* **series:** support for rx6700xt
([#2290](#2290))
([113c9ce](113c9ce))
* **store:** add 3050 in topachat and materiel
([#2945](#2945))
([fc0c3da](fc0c3da))
* **store:** add amd-at
([#2462](#2462))
([441617f](441617f))
* **store:** add amd-be store
([#2338](#2338))
([6e9b1a9](6e9b1a9))
* **store:** add amd-nl store
([#2072](#2072))
([49c9e8c](49c9e8c))
* **store:** Add AO and BT (UK)
([#2089](#2089))
([1714e89](1714e89))
* **store:** add cyberport-at
([#2463](#2463))
([5a744b1](5a744b1))
* **store:** add materiel.net (french), 35 3060ti references
([#2287](#2287))
([0ebe745](0ebe745))
* **store:** add mediamarkt austria
([#1836](#1836))
([ae8e72a](ae8e72a))
* **store:** add Microsoft (CA) for Xbox X/S
([#2764](#2764))
([ca784c8](ca784c8))
* **store:** add Microsoft for Xbox S/X
([#2738](#2738))
([d06d050](d06d050))
* **store:** add MightyApe, NoelLeeming and TheWarehouse (NZ)
([#2133](#2133))
([e2d8040](e2d8040))
* **store:** add multicom.no and more products to NO stores
([#2483](#2483))
([41305f1](41305f1))
* **stores-nz:** update labels
([#2486](#2486))
([c0f46d7](c0f46d7))
* use new nightly release build
([51118ba](51118ba))
* **web:** add select all/none for columns & black theme
([#2878](#2878))
([2ff7f58](2ff7f58))


### Bug Fixes

* add missing tests in Dockerfile
([#2323](#2323))
([cd6e1f6](cd6e1f6))
* **alternate:** use button selector instead of text
([#2419](#2419))
([35f9eb4](35f9eb4))
* amazon prices
([#2914](#2914))
([f7236b3](f7236b3)),
closes [#2926](#2926)
* **amazon-es:** use euroFormat
([#2371](#2371))
([4eb702b](4eb702b))
* **amazon-eu:** checking price selector
([#2856](#2856))
([19afe41](19afe41))
* **amazon:** false positives for xbox
([#2497](#2497))
([790fe9b](790fe9b))
* **apns:** use when specified
([99a274d](99a274d))
* **bestbuy-ca:** avoid false positive
([#2694](#2694))
([0c589a7](0c589a7))
* **captcha:** use Slack captcha handler token when provided
([#2460](#2460))
([164902a](164902a)),
closes [#2428](#2428)
* clear cookies when rotating proxies
([#2575](#2575))
([8854ce9](8854ce9))
* **discord:** add Discord.ClientOptions
([#2714](#2714))
([3787c54](3787c54))
* **discord:** properly wait for webhooks
([#2352](#2352))
([bc59da1](bc59da1))
* **docker:** disable opening browser
([d13f7f1](d13f7f1))
* **lookup:** prevent terminal from being hidden
([#2461](#2461))
([39fac90](39fac90))
* **microcenter:** add outOfStock label
([#2432](#2432))
([092919a](092919a)),
closes [#2407](#2407)
* **nodemon:** use npx with ts-node
([#2423](#2423))
([b6ac6c5](b6ac6c5))
* parsing prices with thousands separator and European format
([#2153](#2153))
([61f8e3a](61f8e3a))
* partial url regexp
([#2382](#2382))
([61af2a4](61af2a4))
* **playstation:** fix inStock selector
([#2187](#2187))
([b0efc83](b0efc83))
* **puppeteer:** cannot read property
([#2987](#2987))
([04fbdc1](04fbdc1))
* remove spaces from price
([#2482](#2482))
([eb76f0d](eb76f0d))
* **terraform:** update IAM configuration for ECS deployment
([#2675](#2675))
([9c346e7](9c346e7))
* **web:** add favicon to prevent missing icon console error
([#2375](#2375))
([2be33ac](2be33ac))
* **xbox:** false positive
([#2726](#2726))
([e5e8481](e5e8481))


### Refactoring

* **captcha:** use seconds instead of ms
([#2424](#2424))
([d652b49](d652b49))
* **freemobile:** remove local throw
([bf8f242](bf8f242))
* **materiel:** update docs, change name
([7ec8a16](7ec8a16))
* simplify maxPrice logic
([a25b7f1](a25b7f1))
* **store:** replace euroFormat with regex
([#2131](#2131))
([795c723](795c723))


### Documentation

* add better heroku documentation
([#2942](#2942))
([f344615](f344615))
* fix sort-able tables
([08789a7](08789a7))
* make templates required
([00b468a](00b468a))
* remove twitter
([d19d05c](d19d05c))
* remove twitter
([1aa0224](1aa0224))
* toggle light/dark mode
([1e76d5a](1e76d5a))
* update badges
([c2c8531](c2c8531))
* update edit_uri location
([af603c2](af603c2))
* update incorrect store description for alternate-de
([#2765](#2765))
([28ce7e9](28ce7e9))
* update issue templates
([74d71e4](74d71e4))
* update issue templates
([9aa3f16](9aa3f16))
* update issue templates
([7171113](7171113))
* update node references
([f65aab8](f65aab8))
* update Xbox Series S and X price limit desc
([#2098](#2098))
([ba35706](ba35706))
* use node lts
([2a482e3](2a482e3)),
closes [#2776](#2776)


### Miscellaneous

* add APNS to dotenv-example
([#2174](#2174))
([4bd048f](4bd048f))
* add links to RX 6700 XT in German stores
([#2736](#2736))
([430ec73](430ec73))
* **alternate-de:** add gpus
([#2797](#2797))
([a6d7447](a6d7447))
* **alternate:** add new oos label
([#2409](#2409))
([5937d01](5937d01))
* **alternate:** add PS5 bundle
([#2562](#2562))
([1122075](1122075))
* **alternate:** update links and selectors
([#2282](#2282))
([ea095a3](ea095a3))
* **amazon-fr:** update evga 3080 ftw3 link
([#2286](#2286))
([5b2fe88](5b2fe88))
* **amazon-uk:** add 3060 cards
([#2229](#2229))
([983cc52](983cc52))
* **amd:** add rx6800xt midnight black
([#2321](#2321))
([c7e24e7](c7e24e7))
* **amd:** update rx6900xt urls
([#2094](#2094))
([7fcce58](7fcce58))
* **amd:** update rx6900xt urls
([#2876](#2876))
([88ec46e](88ec46e))
* **asus:** update urls
([#2155](#2155))
([245d110](245d110))
* **bestbuy:** add 3080ti models
([#2670](#2670))
([cc0aaec](cc0aaec))
* bump dependencies
([10f7e0c](10f7e0c))
* bump dependencies
([#2413](#2413))
([3c00eca](3c00eca))
* bump node 16.5.0
([4e3eade](4e3eade))
* bump node version
([9ba964a](9ba964a))
* bump node, implement proper ci cache
([9b0b4d1](9b0b4d1))
* bump stale workflow to 60 days
([3c1419f](3c1419f))
* change url
([2af1531](2af1531))
* change verbiage to be more generic
([e006c48](e006c48))
* **computeruniverse:** add backoff code
([#2542](#2542))
([42a24a6](42a24a6))
* **coolblue:** add ps5 consoles
([#2597](#2597))
([4bb58ac](4bb58ac))
* **currys:** add rx6800, rx6800xt and rx6900xt
([#2236](#2236))
([211e3e2](211e3e2))
* **deps-dev:** bump @types/cheerio from 0.22.28 to 0.22.29
([#2580](#2580))
([e4ebdc4](e4ebdc4))
* **deps-dev:** bump @types/node from 14.14.35 to 14.14.36
([#2233](#2233))
([a7a5e69](a7a5e69))
* **deps-dev:** bump @types/node from 15.3.0 to 15.6.1
([#2571](#2571))
([3e74a4c](3e74a4c))
* **deps-dev:** bump @types/nodemailer from 6.4.1 to 6.4.2
([#2582](#2582))
([1cb1787](1cb1787))
* **deps-dev:** bump @types/sinon from 9.0.10 to 9.0.11
([#2166](#2166))
([4cdda98](4cdda98))
* **deps-dev:** bump mocha from 8.3.0 to 8.3.2
([#2167](#2167))
([a575143](a575143))
* **deps-dev:** bump typescript from 4.2.2 to 4.2.3
([#2092](#2092))
([b516e26](b516e26))
* **deps-dev:** bump webpack from 5.24.2 to 5.26.3
([#2164](#2164))
([2775124](2775124))
* **deps-dev:** bump webpack from 5.35.0 to 5.36.2
([#2480](#2480))
([e397306](e397306))
* **deps-dev:** bump webpack from 5.37.0 to 5.37.1
([#2558](#2558))
([9e13cd7](9e13cd7))
* **deps-dev:** bump webpack from 5.37.0 to 5.38.0
([#2579](#2579))
([9fc5ec0](9fc5ec0))
* **deps:** bump actions/checkout from 2 to 3
([#2967](#2967))
([92a3c94](92a3c94))
* **deps:** bump actions/setup-node from 2 to 3
([#2963](#2963))
([31c2887](31c2887))
* **deps:** bump actions/setup-python from 2 to 3
([#2965](#2965))
([fe53ba3](fe53ba3))
* **deps:** bump actions/stale from 3 to 4
([#2671](#2671))
([e030310](e030310))
* **deps:** bump dependencies
([1ab0af2](1ab0af2))
* **deps:** bump dependencies
([aed9cfe](aed9cfe))
* **deps:** bump dependencies
([2a1734a](2a1734a))
* **deps:** bump dependencies, node 15.14.0
([91a0ff5](91a0ff5))
* **deps:** bump google-github-actions/release-please-action from 2 to
3.1.3 ([#2968](#2968))
([0906f64](0906f64))
* **deps:** bump node 16.1.0
([1e62878](1e62878))
* **deps:** bump node from 15.11.0-alpine3.13 to 15.12.0-alpine3.13
([#2185](#2185))
([2ebbf55](2ebbf55))
* **deps:** bump node-notifier from 9.0.1 to 10.0.0
([#2583](#2583))
([a751cb1](a751cb1))
* **deps:** bump nodemailer from 6.6.0 to 6.6.1
([#2568](#2568))
([2e5b07c](2e5b07c))
* **deps:** bump open from 7.4.2 to 8.0.2
([#2078](#2078))
([00e4ddc](00e4ddc))
* **deps:** bump open from 8.0.2 to 8.0.3
([#2186](#2186))
([54883f0](54883f0))
* **deps:** bump open from 8.0.2 to 8.2.0
([#2572](#2572))
([36e188f](36e188f))
* **deps:** bump top-user-agents from 1.0.25 to 1.0.26
([#2556](#2556))
([729afd0](729afd0))
* **deps:** bump twilio from 3.62.0 to 3.63.0
([#2561](#2561))
([7d35c2b](7d35c2b))
* **deps:** bump twilio from 3.66.1 to 3.71.1
([#2837](#2837))
([72140be](72140be))
* **deps:** bump twitch-chat-client from 4.4.13 to 4.5.1
([#2127](#2127))
([eeab4b1](eeab4b1))
* **deps:** bump url-parse from 1.5.3 to 1.5.10
([#2964](#2964))
([6f57777](6f57777))
* **elkjop:** update selectors
([#2505](#2505))
([c9049a3](c9049a3))
* **gamestop:** update inventory
([#2239](#2239))
([c1c92bd](c1c92bd))
* improve linksBuilder logging
([#2785](#2785))
([73eaa88](73eaa88))
* **ldlc:** add 3050
([#2948](#2948))
([a146ea3](a146ea3))
* **materiel:** add 3070 and 3080 cards
([#2393](#2393))
([8c39d0d](8c39d0d))
* **mediamarkt, saturn:** add new outOfStock message
([#2850](#2850))
([5d4f4c5](5d4f4c5))
* **mediamarkt:** update captcha selector
([#2496](#2496))
([64120e7](64120e7))
* **microcenter:** add 3090 cards
([d46c636](d46c636))
* move lookup loop logging to lower level
([#2784](#2784))
([a20faaa](a20faaa))
* **multicom:** update selectors
([#2499](#2499))
([7c4c6ed](7c4c6ed))
* **netonnet-no:** update selectors
([#2547](#2547))
([0378a7c](0378a7c))
* **nodejs:** bump version
([#2088](#2088))
([afe7a70](afe7a70))
* **notification:** add better logging, remove debug
([d12639e](d12639e))
* **nvidia:** add 3070ti & 3080ti
([#2798](#2798))
([ada90bf](ada90bf))
* **otto:** add labels for xbox series x & s
([#2515](#2515))
([d0a6c7e](d0a6c7e))
* prune invalid links
([#2592](#2592))
([b33f678](b33f678))
* remove hooks
([b6af582](b6af582))
* remove unused dependencies
([53e7a8d](53e7a8d))
* revert puppeteer, run linter
([5e9b3db](5e9b3db))
* **store:** add additional PS5 bundles and alternative links for
MediaMarkt (DE) & Saturn (DE)
([#2820](#2820))
([668ed54](668ed54))
* **store:** add additional PS5 bundles to MediaMarkt (DE) & Saturn (DE)
([#2787](#2787))
([0d936a9](0d936a9))
* **store:** add more links to norwegian stores
([#2485](#2485))
([a286b73](a286b73))
* **store:** add Nvidia RTX Cards
([#2204](#2204))
([0a9ce0d](0a9ce0d))
* **store:** add some PS5 bundles
([#2021](#2021))
([d4dc397](d4dc397))
* **store:** EBGames renamed to Gamestop (in Canada)
([#2734](#2734))
([4e77c67](4e77c67))
* **store:** updated and added Nvidia links
([#2806](#2806))
([c31a861](c31a861))
* update dependencies
([f14a1ca](f14a1ca))
* update dependencies
([1d08d4c](1d08d4c))
* update dependencies and nightly workflow
([3b43732](3b43732))
* update package-lock, remove ci perms
([#3059](#3059))
([9b8b8ff](9b8b8ff))
* update pr template
([f0e5c5d](f0e5c5d))
* update stale workflow
([e4a267f](e4a267f))
* **walmart:** update 5900x url
([#2184](#2184))
([b2ce715](b2ce715))
* **xbox:** update oos selector
([4d89306](4d89306)),
closes [#2118](#2118)
[#2479](#2479)
[#2475](https://github.com/jef/streetmerchant/issues/2475)
[#2200](#2200)

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This was referenced Oct 21, 2022
jef pushed a commit that referenced this pull request Oct 21, 2022
🤖 I have created a release *beep* *boop*
---


##
[3.6.0](v3.5.0...v3.6.0)
(2022-10-21)


### Features

* add 3080ti
([#2598](#2598))
([4cfbd37](4cfbd37))
* add 3080ti
([#2600](#2600))
([51c9b3a](51c9b3a))
* add a few stores for spain
([#2646](#2646))
([0b060e8](0b060e8))
* add alternate-fr, 3070ti, change alternate to alternate.de
([#2653](#2653))
([8c7b8aa](8c7b8aa))
* add INCOGNITO to dotenv-example and volta support
([#2484](#2484))
([b579052](b579052))
* add interactive captcha handler with Slack and Discord
([#2385](#2385))
([409769e](409769e))
* add ldlc-italy and fixes ollo/hardware-planet
([#2903](#2903))
([d4f4076](d4f4076)),
closes [#2867](#2867)
* add SCREENSHOT_DIR config option
([#2801](#2801))
([fe99aa4](fe99aa4))
* add ubiquiti store and dream machine model.
([#3034](#3034))
([87301fe](87301fe))
* add waitUntil and waitForSelctor to linksBuilder
([#2437](#2437))
([cac7c20](cac7c20))
* **captcha:** add support for configurable capture type
([#2468](#2468))
([6e614a2](6e614a2))
* change max price behavior
([9b02c36](9b02c36))
* color empty stores
([#2312](#2312))
([bbfa808](bbfa808))
* **coolmod:** add linksBuilder and update selectors
([#2803](#2803))
([f297e1d](f297e1d))
* **equippr:** add links builder
([#2795](#2795))
([e631d80](e631d80))
* **gotify:** add priority option
([#2546](#2546))
([32fe440](32fe440))
* **notification:** add gotify
([8f2de5d](8f2de5d)),
closes [#2541](#2541)
[#2536](https://github.com/jef/streetmerchant/issues/2536)
* **notification:** add support for Free mobile
([#2285](#2285))
([6be2e0d](6be2e0d))
* **notifications:** add apple push notifications
([#2077](#2077))
([6b78b2e](6b78b2e))
* **pushover:** ability to specify device
([#2101](#2101))
([d03aea0](d03aea0))
* **pushover:** add support for sound
([#2203](#2203))
([83ce922](83ce922))
* **redis:** introduce pub/sub
([#2855](#2855))
([d6d8ef2](d6d8ef2))
* **series:** support for rx6700xt
([#2290](#2290))
([113c9ce](113c9ce))
* **store:** add 3050 in topachat and materiel
([#2945](#2945))
([fc0c3da](fc0c3da))
* **store:** add amd-at
([#2462](#2462))
([441617f](441617f))
* **store:** add amd-be store
([#2338](#2338))
([6e9b1a9](6e9b1a9))
* **store:** add amd-nl store
([#2072](#2072))
([49c9e8c](49c9e8c))
* **store:** Add AO and BT (UK)
([#2089](#2089))
([1714e89](1714e89))
* **store:** add cyberport-at
([#2463](#2463))
([5a744b1](5a744b1))
* **store:** add materiel.net (french), 35 3060ti references
([#2287](#2287))
([0ebe745](0ebe745))
* **store:** add mediamarkt austria
([#1836](#1836))
([ae8e72a](ae8e72a))
* **store:** add Microsoft (CA) for Xbox X/S
([#2764](#2764))
([ca784c8](ca784c8))
* **store:** add Microsoft for Xbox S/X
([#2738](#2738))
([d06d050](d06d050))
* **store:** add MightyApe, NoelLeeming and TheWarehouse (NZ)
([#2133](#2133))
([e2d8040](e2d8040))
* **store:** add multicom.no and more products to NO stores
([#2483](#2483))
([41305f1](41305f1))
* **stores-nz:** update labels
([#2486](#2486))
([c0f46d7](c0f46d7))
* use new nightly release build
([51118ba](51118ba))
* **web:** add select all/none for columns & black theme
([#2878](#2878))
([2ff7f58](2ff7f58))


### Bug Fixes

* add missing tests in Dockerfile
([#2323](#2323))
([cd6e1f6](cd6e1f6))
* **alternate:** use button selector instead of text
([#2419](#2419))
([35f9eb4](35f9eb4))
* amazon prices
([#2914](#2914))
([f7236b3](f7236b3)),
closes [#2926](#2926)
* **amazon-es:** use euroFormat
([#2371](#2371))
([4eb702b](4eb702b))
* **amazon-eu:** checking price selector
([#2856](#2856))
([19afe41](19afe41))
* **amazon:** false positives for xbox
([#2497](#2497))
([790fe9b](790fe9b))
* **apns:** use when specified
([99a274d](99a274d))
* **bestbuy-ca:** avoid false positive
([#2694](#2694))
([0c589a7](0c589a7))
* **captcha:** use Slack captcha handler token when provided
([#2460](#2460))
([164902a](164902a)),
closes [#2428](#2428)
* clear cookies when rotating proxies
([#2575](#2575))
([8854ce9](8854ce9))
* **discord:** add Discord.ClientOptions
([#2714](#2714))
([3787c54](3787c54))
* **discord:** properly wait for webhooks
([#2352](#2352))
([bc59da1](bc59da1))
* **docker:** disable opening browser
([d13f7f1](d13f7f1))
* **lookup:** prevent terminal from being hidden
([#2461](#2461))
([39fac90](39fac90))
* **microcenter:** add outOfStock label
([#2432](#2432))
([092919a](092919a)),
closes [#2407](#2407)
* **nodemon:** use npx with ts-node
([#2423](#2423))
([b6ac6c5](b6ac6c5))
* parsing prices with thousands separator and European format
([#2153](#2153))
([61f8e3a](61f8e3a))
* partial url regexp
([#2382](#2382))
([61af2a4](61af2a4))
* **playstation:** fix inStock selector
([#2187](#2187))
([b0efc83](b0efc83))
* **puppeteer:** cannot read property
([#2987](#2987))
([04fbdc1](04fbdc1))
* remove spaces from price
([#2482](#2482))
([eb76f0d](eb76f0d))
* **terraform:** update IAM configuration for ECS deployment
([#2675](#2675))
([9c346e7](9c346e7))
* **web:** add favicon to prevent missing icon console error
([#2375](#2375))
([2be33ac](2be33ac))
* **xbox:** false positive
([#2726](#2726))
([e5e8481](e5e8481))


### Refactoring

* **captcha:** use seconds instead of ms
([#2424](#2424))
([d652b49](d652b49))
* **freemobile:** remove local throw
([bf8f242](bf8f242))
* **materiel:** update docs, change name
([7ec8a16](7ec8a16))
* simplify maxPrice logic
([a25b7f1](a25b7f1))
* **store:** replace euroFormat with regex
([#2131](#2131))
([795c723](795c723))


### Documentation

* add better heroku documentation
([#2942](#2942))
([f344615](f344615))
* fix sort-able tables
([08789a7](08789a7))
* make templates required
([00b468a](00b468a))
* remove twitter
([d19d05c](d19d05c))
* remove twitter
([1aa0224](1aa0224))
* toggle light/dark mode
([1e76d5a](1e76d5a))
* update badges
([c2c8531](c2c8531))
* update edit_uri location
([af603c2](af603c2))
* update incorrect store description for alternate-de
([#2765](#2765))
([28ce7e9](28ce7e9))
* update issue templates
([74d71e4](74d71e4))
* update issue templates
([9aa3f16](9aa3f16))
* update issue templates
([7171113](7171113))
* update node references
([f65aab8](f65aab8))
* update Xbox Series S and X price limit desc
([#2098](#2098))
([ba35706](ba35706))
* use node lts
([2a482e3](2a482e3)),
closes [#2776](#2776)


### Miscellaneous

* add APNS to dotenv-example
([#2174](#2174))
([4bd048f](4bd048f))
* add links to RX 6700 XT in German stores
([#2736](#2736))
([430ec73](430ec73))
* **alternate-de:** add gpus
([#2797](#2797))
([a6d7447](a6d7447))
* **alternate:** add new oos label
([#2409](#2409))
([5937d01](5937d01))
* **alternate:** add PS5 bundle
([#2562](#2562))
([1122075](1122075))
* **alternate:** update links and selectors
([#2282](#2282))
([ea095a3](ea095a3))
* **amazon-fr:** update evga 3080 ftw3 link
([#2286](#2286))
([5b2fe88](5b2fe88))
* **amazon-uk:** add 3060 cards
([#2229](#2229))
([983cc52](983cc52))
* **amd:** add rx6800xt midnight black
([#2321](#2321))
([c7e24e7](c7e24e7))
* **amd:** update rx6900xt urls
([#2094](#2094))
([7fcce58](7fcce58))
* **amd:** update rx6900xt urls
([#2876](#2876))
([88ec46e](88ec46e))
* **asus:** update urls
([#2155](#2155))
([245d110](245d110))
* **bestbuy:** add 3080ti models
([#2670](#2670))
([cc0aaec](cc0aaec))
* bump dependencies
([10f7e0c](10f7e0c))
* bump dependencies
([#2413](#2413))
([3c00eca](3c00eca))
* bump node 16.5.0
([4e3eade](4e3eade))
* bump node version
([9ba964a](9ba964a))
* bump node, implement proper ci cache
([9b0b4d1](9b0b4d1))
* bump stale workflow to 60 days
([3c1419f](3c1419f))
* change url
([2af1531](2af1531))
* change verbiage to be more generic
([e006c48](e006c48))
* **computeruniverse:** add backoff code
([#2542](#2542))
([42a24a6](42a24a6))
* **coolblue:** add ps5 consoles
([#2597](#2597))
([4bb58ac](4bb58ac))
* **currys:** add rx6800, rx6800xt and rx6900xt
([#2236](#2236))
([211e3e2](211e3e2))
* **deps-dev:** bump @types/cheerio from 0.22.28 to 0.22.29
([#2580](#2580))
([e4ebdc4](e4ebdc4))
* **deps-dev:** bump @types/node from 14.14.35 to 14.14.36
([#2233](#2233))
([a7a5e69](a7a5e69))
* **deps-dev:** bump @types/node from 15.3.0 to 15.6.1
([#2571](#2571))
([3e74a4c](3e74a4c))
* **deps-dev:** bump @types/nodemailer from 6.4.1 to 6.4.2
([#2582](#2582))
([1cb1787](1cb1787))
* **deps-dev:** bump @types/sinon from 9.0.10 to 9.0.11
([#2166](#2166))
([4cdda98](4cdda98))
* **deps-dev:** bump mocha from 8.3.0 to 8.3.2
([#2167](#2167))
([a575143](a575143))
* **deps-dev:** bump typescript from 4.2.2 to 4.2.3
([#2092](#2092))
([b516e26](b516e26))
* **deps-dev:** bump webpack from 5.24.2 to 5.26.3
([#2164](#2164))
([2775124](2775124))
* **deps-dev:** bump webpack from 5.35.0 to 5.36.2
([#2480](#2480))
([e397306](e397306))
* **deps-dev:** bump webpack from 5.37.0 to 5.37.1
([#2558](#2558))
([9e13cd7](9e13cd7))
* **deps-dev:** bump webpack from 5.37.0 to 5.38.0
([#2579](#2579))
([9fc5ec0](9fc5ec0))
* **deps:** bump actions/checkout from 2 to 3
([#2967](#2967))
([92a3c94](92a3c94))
* **deps:** bump actions/setup-node from 2 to 3
([#2963](#2963))
([31c2887](31c2887))
* **deps:** bump actions/setup-python from 2 to 3
([#2965](#2965))
([fe53ba3](fe53ba3))
* **deps:** bump actions/stale from 3 to 4
([#2671](#2671))
([e030310](e030310))
* **deps:** bump dependencies
([1ab0af2](1ab0af2))
* **deps:** bump dependencies
([aed9cfe](aed9cfe))
* **deps:** bump dependencies
([2a1734a](2a1734a))
* **deps:** bump dependencies, node 15.14.0
([91a0ff5](91a0ff5))
* **deps:** bump google-github-actions/release-please-action from 2 to
3.1.3 ([#2968](#2968))
([0906f64](0906f64))
* **deps:** bump node 16.1.0
([1e62878](1e62878))
* **deps:** bump node from 15.11.0-alpine3.13 to 15.12.0-alpine3.13
([#2185](#2185))
([2ebbf55](2ebbf55))
* **deps:** bump node-notifier from 9.0.1 to 10.0.0
([#2583](#2583))
([a751cb1](a751cb1))
* **deps:** bump nodemailer from 6.6.0 to 6.6.1
([#2568](#2568))
([2e5b07c](2e5b07c))
* **deps:** bump open from 7.4.2 to 8.0.2
([#2078](#2078))
([00e4ddc](00e4ddc))
* **deps:** bump open from 8.0.2 to 8.0.3
([#2186](#2186))
([54883f0](54883f0))
* **deps:** bump open from 8.0.2 to 8.2.0
([#2572](#2572))
([36e188f](36e188f))
* **deps:** bump top-user-agents from 1.0.25 to 1.0.26
([#2556](#2556))
([729afd0](729afd0))
* **deps:** bump twilio from 3.62.0 to 3.63.0
([#2561](#2561))
([7d35c2b](7d35c2b))
* **deps:** bump twilio from 3.66.1 to 3.71.1
([#2837](#2837))
([72140be](72140be))
* **deps:** bump twitch-chat-client from 4.4.13 to 4.5.1
([#2127](#2127))
([eeab4b1](eeab4b1))
* **deps:** bump url-parse from 1.5.3 to 1.5.10
([#2964](#2964))
([6f57777](6f57777))
* **elkjop:** update selectors
([#2505](#2505))
([c9049a3](c9049a3))
* **gamestop:** update inventory
([#2239](#2239))
([c1c92bd](c1c92bd))
* improve linksBuilder logging
([#2785](#2785))
([73eaa88](73eaa88))
* **ldlc:** add 3050
([#2948](#2948))
([a146ea3](a146ea3))
* **materiel:** add 3070 and 3080 cards
([#2393](#2393))
([8c39d0d](8c39d0d))
* **mediamarkt, saturn:** add new outOfStock message
([#2850](#2850))
([5d4f4c5](5d4f4c5))
* **mediamarkt:** update captcha selector
([#2496](#2496))
([64120e7](64120e7))
* **microcenter:** add 3090 cards
([d46c636](d46c636))
* move lookup loop logging to lower level
([#2784](#2784))
([a20faaa](a20faaa))
* **multicom:** update selectors
([#2499](#2499))
([7c4c6ed](7c4c6ed))
* **netonnet-no:** update selectors
([#2547](#2547))
([0378a7c](0378a7c))
* **nodejs:** bump version
([#2088](#2088))
([afe7a70](afe7a70))
* **notification:** add better logging, remove debug
([d12639e](d12639e))
* **nvidia:** add 3070ti & 3080ti
([#2798](#2798))
([ada90bf](ada90bf))
* **otto:** add labels for xbox series x & s
([#2515](#2515))
([d0a6c7e](d0a6c7e))
* prune invalid links
([#2592](#2592))
([b33f678](b33f678))
* remove hooks
([b6af582](b6af582))
* remove unused dependencies
([53e7a8d](53e7a8d))
* revert puppeteer, run linter
([5e9b3db](5e9b3db))
* **store:** add additional PS5 bundles and alternative links for
MediaMarkt (DE) & Saturn (DE)
([#2820](#2820))
([668ed54](668ed54))
* **store:** add additional PS5 bundles to MediaMarkt (DE) & Saturn (DE)
([#2787](#2787))
([0d936a9](0d936a9))
* **store:** add more links to norwegian stores
([#2485](#2485))
([a286b73](a286b73))
* **store:** add Nvidia RTX Cards
([#2204](#2204))
([0a9ce0d](0a9ce0d))
* **store:** add some PS5 bundles
([#2021](#2021))
([d4dc397](d4dc397))
* **store:** EBGames renamed to Gamestop (in Canada)
([#2734](#2734))
([4e77c67](4e77c67))
* **store:** updated and added Nvidia links
([#2806](#2806))
([c31a861](c31a861))
* update dependencies
([f14a1ca](f14a1ca))
* update dependencies
([1d08d4c](1d08d4c))
* update dependencies and nightly workflow
([3b43732](3b43732))
* update package-lock, remove ci perms
([#3059](#3059))
([ba98f26](ba98f26))
* update pr template
([f0e5c5d](f0e5c5d))
* update stale workflow
([e4a267f](e4a267f))
* **walmart:** update 5900x url
([#2184](#2184))
([b2ce715](b2ce715))
* **xbox:** update oos selector
([4d89306](4d89306)),
closes [#2118](#2118)
[#2479](#2479)
[#2475](https://github.com/jef/streetmerchant/issues/2475)
[#2200](#2200)

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants