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: add interactive captcha handler with Slack and Discord #2385

Merged
merged 2 commits into from
Apr 22, 2021

Conversation

klords
Copy link
Contributor

@klords klords commented Apr 18, 2021

Description

Added a simple captcha handler to allow better captcha experience. Currently in headless mode there is no way to deal with captcha which makes running in Docker useless. Even when running with browser open, it's still difficult to deal with captcha as other tabs can open, taking focus away from captcha page.

NOTE: This is currently only tested/used on NA Amazon. For other captcha implementations (e.g. reCAPTCHA), this can be refactored to employ a strategy per store.

Basic functionality description

Uses existing captcha detection logic. When captcha is detected, grabs captcha image URL, sends to configured service, and waits up to configured timeout for response, polling at configured intervals.

How to use

The dotenv file now has 5 new captcha-related variables.

CAPTCHA_HANDLER_POLL_INTERVAL: specify poll interval for response in milliseconds (default is 5000 = 5 seconds)
CAPTCHA_HANDLER_RESPONSE_TIMEOUT: specify response timeout in milliseconds (default is 300000 = 5 minutes)
CAPTCHA_HANDLER_SERVICE: specify messaging service to DM user (supports `discord` and `slack` currently)
CAPTCHA_HANDLER_TOKEN: token used to access messaging service's API
CAPTCHA_HANDLER_USER_ID: DM recipient's ID in messaging service

Once these have been configured, the bot will message the user specified using the defined service.

IMPORTANT: To respond, the user should either "Reply in thread" (Slack) or "Reply" (Discord) to the captcha DM, so that the bot will be able to associate the response to a streetmerchant instance. Simply DMing the bot with a response will not be detected.

Testing

Added a new functional test to the functional test folder. Simply fill out the dotenv variables (shown above) and run npm run test:captcha (or npm run test:captcha:production) to run the test and ensure the DM/response is received.

Sample images

Discord
Slack

@klords klords requested a review from jef as a code owner April 18, 2021 18:17
@AlexP11223
Copy link
Contributor

AlexP11223 commented Apr 18, 2021

reCAPTCHA

It would be difficult. Definitely not via discord input. Maybe via some paid anti-captcha service.

@klords klords force-pushed the klords/interactive-captcha-handler branch 2 times, most recently from 5178e66 to d911c21 Compare April 18, 2021 20:43
@klords klords marked this pull request as draft April 18, 2021 23:20
@klords
Copy link
Contributor Author

klords commented Apr 18, 2021

bug in the Discord implementation, should be quick fix, will address later tonight (Edit: fixed)

@klords klords force-pushed the klords/interactive-captcha-handler branch from d911c21 to fa6f73a Compare April 19, 2021 03:20
@klords klords marked this pull request as ready for review April 19, 2021 03:28
@AlexP11223 AlexP11223 mentioned this pull request Apr 19, 2021
@klords klords force-pushed the klords/interactive-captcha-handler branch from fa6f73a to 1a182eb Compare April 20, 2021 00:51
@klords
Copy link
Contributor Author

klords commented Apr 20, 2021

Added some documentation as I see it's in the repo. Hope they're set up right. 🤞

@jef
Copy link
Owner

jef commented Apr 20, 2021

This is great! I will be testing in the coming days. Thanks so much for putting this together -- this will be a great addition!

@klords klords force-pushed the klords/interactive-captcha-handler branch from f7680b2 to c21a959 Compare April 20, 2021 03:41
@jef
Copy link
Owner

jef commented Apr 22, 2021

What an awesome addition. I'm sure a lot of folks will be loving this. Testing it was fun :)

Thanks for the contribution!

@jef jef changed the title feat: added interactive captcha handler with Slack and Discord support feat: add interactive captcha handler with Slack and Discord Apr 22, 2021
@jef jef merged commit 409769e into jef:main Apr 22, 2021
@klords klords deleted the klords/interactive-captcha-handler branch April 23, 2021 00:42
@bramevo
Copy link
Contributor

bramevo commented Apr 23, 2021

Adding an auto solver would be nice too. But this one is already a great start!


const response = await getCaptchaInputAsync(
imgElementSrc ||
`captcha detected on [${page.url()}] but unable to get captcha image url`
Copy link
Contributor

Choose a reason for hiding this comment

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

It may be a good idea to figure out how to do this without sending another captcha download request, it may fail/get detected on some websites.

I think it was possible via Canvas like this

const cnv = document.createElement('CANVAS');
const ctx = cnv.getContext('2d');
ctx.drawImage(img, 0, 0);
const base64ImgData = cnv.toDataURL();

Copy link
Contributor

Choose a reason for hiding this comment

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

Looks like here are some solutions for puppeter: https://intoli.com/blog/saving-images/

@klords
Copy link
Contributor Author

klords commented Apr 23, 2021 via email

@AlexP11223
Copy link
Contributor

Yeah, I guess one way that doesn't break CORS etc. is to get captcha coordinates, take page screenshot and crop it.

@klords
Copy link
Contributor Author

klords commented Apr 23, 2021 via email

@northmatt
Copy link

Neat, just recently I was thinking about doing smth a bit similar but have captcha img open to browser and do input in console. Sounds like this'll be a better way of doing things.

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.

5 participants