├── .gitignore ├── index.js ├── package-lock.json ├── package.json └── readme.md /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.png 3 | .DS_STORE -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const puppeteer = require('puppeteer-extra') 2 | const StealthPlugin = require('puppeteer-extra-plugin-stealth') 3 | puppeteer.use(StealthPlugin()) 4 | 5 | const Jimp = require('jimp'); 6 | const pixelmatch = require('pixelmatch'); 7 | const { cv } = require('opencv-wasm'); 8 | 9 | (async () => { 10 | const browser = await puppeteer.launch({ 11 | headless: false, 12 | defaultViewport: null, 13 | }); 14 | const page = await browser.newPage(); 15 | await page.goto('https://scraperbox.com/captcha/geetest'); 16 | 17 | await clickVerifyButton(page); 18 | 19 | const images = await getCaptchaImages(page); 20 | const diffImage = await getDiffImage(images); 21 | const center = await getPuzzlePieceSlotCenterPosition(diffImage); 22 | 23 | await slidePuzzlePiece(page, center); 24 | })(); 25 | 26 | async function clickVerifyButton(page) { 27 | await page.waitForSelector('[aria-label="Click to verify"]'); 28 | await page.click('[aria-label="Click to verify"]'); 29 | await page.waitForSelector('.geetest_canvas_img canvas', { 30 | visible: true, 31 | }) 32 | await page.waitForTimeout(1000) 33 | } 34 | 35 | async function getCaptchaImages(page) { 36 | const images = await page.$$eval( 37 | '.geetest_canvas_img canvas', 38 | (canvases) => { 39 | return canvases.map((canvas) => { 40 | // This will get the base64 image data from the 41 | // html canvas. The replace function simply strip 42 | // the "data:image" prefix. 43 | return canvas 44 | .toDataURL() 45 | .replace(/^data:image\/png;base64,/, '') 46 | }) 47 | } 48 | ); 49 | 50 | // For each base64 string create a Javascript buffer. 51 | const buffers = images.map((img) => new Buffer(img, 'base64')); 52 | 53 | // And read each buffer into a Jimp image. 54 | return { 55 | captcha: await Jimp.read(buffers[0]), 56 | puzzle: await Jimp.read(buffers[1]), 57 | original: await Jimp.read(buffers[2]), 58 | }; 59 | } 60 | 61 | async function getDiffImage(images) { 62 | const { width, height } = images.original.bitmap 63 | 64 | // Use the pixelmatch package to create an image diff 65 | const diffImage = new Jimp(width, height) 66 | pixelmatch( 67 | images.original.bitmap.data, 68 | images.captcha.bitmap.data, 69 | diffImage.bitmap.data, 70 | width, 71 | height, 72 | { includeAA: true, threshold: 0.2 } 73 | ) 74 | 75 | // Use opencv to make the diff result more clear 76 | const src = cv.matFromImageData(diffImage.bitmap) 77 | const dst = new cv.Mat() 78 | const kernel = cv.Mat.ones(5, 5, cv.CV_8UC1) 79 | const anchor = new cv.Point(-1, -1) 80 | cv.threshold(src, dst, 127, 255, cv.THRESH_BINARY) 81 | cv.erode(dst, dst, kernel, anchor, 1) 82 | cv.dilate(dst, dst, kernel, anchor, 1) 83 | 84 | return new Jimp({ 85 | width: dst.cols, 86 | height: dst.rows, 87 | data: Buffer.from(dst.data), 88 | }) 89 | } 90 | 91 | async function getPuzzlePieceSlotCenterPosition(diffImage) { 92 | const src = cv.matFromImageData(diffImage.bitmap) 93 | const dst = new cv.Mat() 94 | 95 | cv.cvtColor(src, src, cv.COLOR_BGR2GRAY) 96 | cv.threshold(src, dst, 150, 255, cv.THRESH_BINARY_INV) 97 | 98 | // This will find the contours of the image. 99 | const contours = new cv.MatVector() 100 | const hierarchy = new cv.Mat() 101 | cv.findContours( 102 | dst, 103 | contours, 104 | hierarchy, 105 | cv.RETR_EXTERNAL, 106 | cv.CHAIN_APPROX_SIMPLE 107 | ) 108 | 109 | // Next, extract the center position from these contours. 110 | const contour = contours.get(0) 111 | const moment = cv.moments(contour) 112 | const cx = Math.floor(moment.m10 / moment.m00) 113 | const cy = Math.floor(moment.m01 / moment.m00) 114 | 115 | // Just for fun, let's draw the contours and center on a new image. 116 | cv.cvtColor(dst, dst, cv.COLOR_GRAY2BGR); 117 | const red = new cv.Scalar(255,0,0); 118 | cv.drawContours(dst, contours, 0, red); 119 | cv.circle(dst, new cv.Point(cx, cy), 3, red); 120 | new Jimp({ 121 | width: dst.cols, 122 | height: dst.rows, 123 | data: Buffer.from(dst.data) 124 | }).write('./contours.png'); 125 | 126 | return { 127 | x: cx, 128 | y: cy, 129 | } 130 | } 131 | 132 | async function slidePuzzlePiece(page, center) { 133 | const sliderHandle = await page.$('.geetest_slider_button') 134 | const handle = await sliderHandle.boundingBox() 135 | 136 | let handleX = handle.x + handle.width / 2; 137 | let handleY = handle.y + handle.height / 2; 138 | 139 | await page.mouse.move(handleX, handleY, { steps: 25} ); 140 | await page.mouse.down(); 141 | 142 | let destX = handleX + center.x; 143 | let destY = handle.y + handle.height / 3; 144 | await page.mouse.move(destX, handleY, { steps: 25 }); 145 | await page.waitForTimeout(100) 146 | 147 | // find the location of my puzzle piece. 148 | const puzzlePos = await findMyPuzzlePiecePosition(page) 149 | destX = destX + center.x - puzzlePos.x; 150 | destY = handle.y + handle.height / 2; 151 | await page.mouse.move(destX, destY, { steps: 25 }) 152 | await page.mouse.up() 153 | } 154 | 155 | async function findMyPuzzlePiecePosition(page) { 156 | // Must call the getCaptchaImages again, because we have changed the 157 | // slider position (and therefore the image) 158 | const images = await getCaptchaImages(page) 159 | const srcPuzzleImage = images.puzzle 160 | const srcPuzzle = cv.matFromImageData(srcPuzzleImage.bitmap) 161 | const dstPuzzle = new cv.Mat() 162 | 163 | cv.cvtColor(srcPuzzle, srcPuzzle, cv.COLOR_BGR2GRAY) 164 | cv.threshold(srcPuzzle, dstPuzzle, 127, 255, cv.THRESH_BINARY) 165 | 166 | const kernel = cv.Mat.ones(5, 5, cv.CV_8UC1) 167 | const anchor = new cv.Point(-1, -1) 168 | cv.dilate(dstPuzzle, dstPuzzle, kernel, anchor, 1) 169 | cv.erode(dstPuzzle, dstPuzzle, kernel, anchor, 1) 170 | 171 | const contours = new cv.MatVector() 172 | const hierarchy = new cv.Mat() 173 | cv.findContours( 174 | dstPuzzle, 175 | contours, 176 | hierarchy, 177 | cv.RETR_EXTERNAL, 178 | cv.CHAIN_APPROX_SIMPLE 179 | ) 180 | 181 | const contour = contours.get(0) 182 | const moment = cv.moments(contour) 183 | 184 | return { 185 | x: Math.floor(moment.m10 / moment.m00), 186 | y: Math.floor(moment.m01 / moment.m00), 187 | } 188 | } 189 | 190 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "geetest-captcha-solver", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/runtime": { 8 | "version": "7.12.5", 9 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", 10 | "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", 11 | "requires": { 12 | "regenerator-runtime": "^0.13.4" 13 | } 14 | }, 15 | "@jimp/bmp": { 16 | "version": "0.16.1", 17 | "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.16.1.tgz", 18 | "integrity": "sha512-iwyNYQeBawrdg/f24x3pQ5rEx+/GwjZcCXd3Kgc+ZUd+Ivia7sIqBsOnDaMZdKCBPlfW364ekexnlOqyVa0NWg==", 19 | "requires": { 20 | "@babel/runtime": "^7.7.2", 21 | "@jimp/utils": "^0.16.1", 22 | "bmp-js": "^0.1.0" 23 | } 24 | }, 25 | "@jimp/core": { 26 | "version": "0.16.1", 27 | "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.16.1.tgz", 28 | "integrity": "sha512-la7kQia31V6kQ4q1kI/uLimu8FXx7imWVajDGtwUG8fzePLWDFJyZl0fdIXVCL1JW2nBcRHidUot6jvlRDi2+g==", 29 | "requires": { 30 | "@babel/runtime": "^7.7.2", 31 | "@jimp/utils": "^0.16.1", 32 | "any-base": "^1.1.0", 33 | "buffer": "^5.2.0", 34 | "exif-parser": "^0.1.12", 35 | "file-type": "^9.0.0", 36 | "load-bmfont": "^1.3.1", 37 | "mkdirp": "^0.5.1", 38 | "phin": "^2.9.1", 39 | "pixelmatch": "^4.0.2", 40 | "tinycolor2": "^1.4.1" 41 | }, 42 | "dependencies": { 43 | "pixelmatch": { 44 | "version": "4.0.2", 45 | "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", 46 | "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", 47 | "requires": { 48 | "pngjs": "^3.0.0" 49 | } 50 | } 51 | } 52 | }, 53 | "@jimp/custom": { 54 | "version": "0.16.1", 55 | "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.16.1.tgz", 56 | "integrity": "sha512-DNUAHNSiUI/j9hmbatD6WN/EBIyeq4AO0frl5ETtt51VN1SvE4t4v83ZA/V6ikxEf3hxLju4tQ5Pc3zmZkN/3A==", 57 | "requires": { 58 | "@babel/runtime": "^7.7.2", 59 | "@jimp/core": "^0.16.1" 60 | } 61 | }, 62 | "@jimp/gif": { 63 | "version": "0.16.1", 64 | "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.16.1.tgz", 65 | "integrity": "sha512-r/1+GzIW1D5zrP4tNrfW+3y4vqD935WBXSc8X/wm23QTY9aJO9Lw6PEdzpYCEY+SOklIFKaJYUAq/Nvgm/9ryw==", 66 | "requires": { 67 | "@babel/runtime": "^7.7.2", 68 | "@jimp/utils": "^0.16.1", 69 | "gifwrap": "^0.9.2", 70 | "omggif": "^1.0.9" 71 | } 72 | }, 73 | "@jimp/jpeg": { 74 | "version": "0.16.1", 75 | "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.16.1.tgz", 76 | "integrity": "sha512-8352zrdlCCLFdZ/J+JjBslDvml+fS3Z8gttdml0We759PnnZGqrnPRhkOEOJbNUlE+dD4ckLeIe6NPxlS/7U+w==", 77 | "requires": { 78 | "@babel/runtime": "^7.7.2", 79 | "@jimp/utils": "^0.16.1", 80 | "jpeg-js": "0.4.2" 81 | } 82 | }, 83 | "@jimp/plugin-blit": { 84 | "version": "0.16.1", 85 | "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.16.1.tgz", 86 | "integrity": "sha512-fKFNARm32RoLSokJ8WZXHHH2CGzz6ire2n1Jh6u+XQLhk9TweT1DcLHIXwQMh8oR12KgjbgsMGvrMVlVknmOAg==", 87 | "requires": { 88 | "@babel/runtime": "^7.7.2", 89 | "@jimp/utils": "^0.16.1" 90 | } 91 | }, 92 | "@jimp/plugin-blur": { 93 | "version": "0.16.1", 94 | "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.16.1.tgz", 95 | "integrity": "sha512-1WhuLGGj9MypFKRcPvmW45ht7nXkOKu+lg3n2VBzIB7r4kKNVchuI59bXaCYQumOLEqVK7JdB4glaDAbCQCLyw==", 96 | "requires": { 97 | "@babel/runtime": "^7.7.2", 98 | "@jimp/utils": "^0.16.1" 99 | } 100 | }, 101 | "@jimp/plugin-circle": { 102 | "version": "0.16.1", 103 | "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.16.1.tgz", 104 | "integrity": "sha512-JK7yi1CIU7/XL8hdahjcbGA3V7c+F+Iw+mhMQhLEi7Q0tCnZ69YJBTamMiNg3fWPVfMuvWJJKOBRVpwNTuaZRg==", 105 | "requires": { 106 | "@babel/runtime": "^7.7.2", 107 | "@jimp/utils": "^0.16.1" 108 | } 109 | }, 110 | "@jimp/plugin-color": { 111 | "version": "0.16.1", 112 | "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.16.1.tgz", 113 | "integrity": "sha512-9yQttBAO5SEFj7S6nJK54f+1BnuBG4c28q+iyzm1JjtnehjqMg6Ljw4gCSDCvoCQ3jBSYHN66pmwTV74SU1B7A==", 114 | "requires": { 115 | "@babel/runtime": "^7.7.2", 116 | "@jimp/utils": "^0.16.1", 117 | "tinycolor2": "^1.4.1" 118 | } 119 | }, 120 | "@jimp/plugin-contain": { 121 | "version": "0.16.1", 122 | "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.16.1.tgz", 123 | "integrity": "sha512-44F3dUIjBDHN+Ym/vEfg+jtjMjAqd2uw9nssN67/n4FdpuZUVs7E7wadKY1RRNuJO+WgcD5aDQcsvurXMETQTg==", 124 | "requires": { 125 | "@babel/runtime": "^7.7.2", 126 | "@jimp/utils": "^0.16.1" 127 | } 128 | }, 129 | "@jimp/plugin-cover": { 130 | "version": "0.16.1", 131 | "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.16.1.tgz", 132 | "integrity": "sha512-YztWCIldBAVo0zxcQXR+a/uk3/TtYnpKU2CanOPJ7baIuDlWPsG+YE4xTsswZZc12H9Kl7CiziEbDtvF9kwA/Q==", 133 | "requires": { 134 | "@babel/runtime": "^7.7.2", 135 | "@jimp/utils": "^0.16.1" 136 | } 137 | }, 138 | "@jimp/plugin-crop": { 139 | "version": "0.16.1", 140 | "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.16.1.tgz", 141 | "integrity": "sha512-UQdva9oQzCVadkyo3T5Tv2CUZbf0klm2cD4cWMlASuTOYgaGaFHhT9st+kmfvXjKL8q3STkBu/zUPV6PbuV3ew==", 142 | "requires": { 143 | "@babel/runtime": "^7.7.2", 144 | "@jimp/utils": "^0.16.1" 145 | } 146 | }, 147 | "@jimp/plugin-displace": { 148 | "version": "0.16.1", 149 | "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.16.1.tgz", 150 | "integrity": "sha512-iVAWuz2+G6Heu8gVZksUz+4hQYpR4R0R/RtBzpWEl8ItBe7O6QjORAkhxzg+WdYLL2A/Yd4ekTpvK0/qW8hTVw==", 151 | "requires": { 152 | "@babel/runtime": "^7.7.2", 153 | "@jimp/utils": "^0.16.1" 154 | } 155 | }, 156 | "@jimp/plugin-dither": { 157 | "version": "0.16.1", 158 | "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.16.1.tgz", 159 | "integrity": "sha512-tADKVd+HDC9EhJRUDwMvzBXPz4GLoU6s5P7xkVq46tskExYSptgj5713J5Thj3NMgH9Rsqu22jNg1H/7tr3V9Q==", 160 | "requires": { 161 | "@babel/runtime": "^7.7.2", 162 | "@jimp/utils": "^0.16.1" 163 | } 164 | }, 165 | "@jimp/plugin-fisheye": { 166 | "version": "0.16.1", 167 | "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.16.1.tgz", 168 | "integrity": "sha512-BWHnc5hVobviTyIRHhIy9VxI1ACf4CeSuCfURB6JZm87YuyvgQh5aX5UDKtOz/3haMHXBLP61ZBxlNpMD8CG4A==", 169 | "requires": { 170 | "@babel/runtime": "^7.7.2", 171 | "@jimp/utils": "^0.16.1" 172 | } 173 | }, 174 | "@jimp/plugin-flip": { 175 | "version": "0.16.1", 176 | "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.16.1.tgz", 177 | "integrity": "sha512-KdxTf0zErfZ8DyHkImDTnQBuHby+a5YFdoKI/G3GpBl3qxLBvC+PWkS2F/iN3H7wszP7/TKxTEvWL927pypT0w==", 178 | "requires": { 179 | "@babel/runtime": "^7.7.2", 180 | "@jimp/utils": "^0.16.1" 181 | } 182 | }, 183 | "@jimp/plugin-gaussian": { 184 | "version": "0.16.1", 185 | "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.16.1.tgz", 186 | "integrity": "sha512-u9n4wjskh3N1mSqketbL6tVcLU2S5TEaFPR40K6TDv4phPLZALi1Of7reUmYpVm8mBDHt1I6kGhuCJiWvzfGyg==", 187 | "requires": { 188 | "@babel/runtime": "^7.7.2", 189 | "@jimp/utils": "^0.16.1" 190 | } 191 | }, 192 | "@jimp/plugin-invert": { 193 | "version": "0.16.1", 194 | "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.16.1.tgz", 195 | "integrity": "sha512-2DKuyVXANH8WDpW9NG+PYFbehzJfweZszFYyxcaewaPLN0GxvxVLOGOPP1NuUTcHkOdMFbE0nHDuB7f+sYF/2w==", 196 | "requires": { 197 | "@babel/runtime": "^7.7.2", 198 | "@jimp/utils": "^0.16.1" 199 | } 200 | }, 201 | "@jimp/plugin-mask": { 202 | "version": "0.16.1", 203 | "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.16.1.tgz", 204 | "integrity": "sha512-snfiqHlVuj4bSFS0v96vo2PpqCDMe4JB+O++sMo5jF5mvGcGL6AIeLo8cYqPNpdO6BZpBJ8MY5El0Veckhr39Q==", 205 | "requires": { 206 | "@babel/runtime": "^7.7.2", 207 | "@jimp/utils": "^0.16.1" 208 | } 209 | }, 210 | "@jimp/plugin-normalize": { 211 | "version": "0.16.1", 212 | "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.16.1.tgz", 213 | "integrity": "sha512-dOQfIOvGLKDKXPU8xXWzaUeB0nvkosHw6Xg1WhS1Z5Q0PazByhaxOQkSKgUryNN/H+X7UdbDvlyh/yHf3ITRaw==", 214 | "requires": { 215 | "@babel/runtime": "^7.7.2", 216 | "@jimp/utils": "^0.16.1" 217 | } 218 | }, 219 | "@jimp/plugin-print": { 220 | "version": "0.16.1", 221 | "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.16.1.tgz", 222 | "integrity": "sha512-ceWgYN40jbN4cWRxixym+csyVymvrryuKBQ+zoIvN5iE6OyS+2d7Mn4zlNgumSczb9GGyZZESIgVcBDA1ezq0Q==", 223 | "requires": { 224 | "@babel/runtime": "^7.7.2", 225 | "@jimp/utils": "^0.16.1", 226 | "load-bmfont": "^1.4.0" 227 | } 228 | }, 229 | "@jimp/plugin-resize": { 230 | "version": "0.16.1", 231 | "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.16.1.tgz", 232 | "integrity": "sha512-u4JBLdRI7dargC04p2Ha24kofQBk3vhaf0q8FwSYgnCRwxfvh2RxvhJZk9H7Q91JZp6wgjz/SjvEAYjGCEgAwQ==", 233 | "requires": { 234 | "@babel/runtime": "^7.7.2", 235 | "@jimp/utils": "^0.16.1" 236 | } 237 | }, 238 | "@jimp/plugin-rotate": { 239 | "version": "0.16.1", 240 | "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.16.1.tgz", 241 | "integrity": "sha512-ZUU415gDQ0VjYutmVgAYYxC9Og9ixu2jAGMCU54mSMfuIlmohYfwARQmI7h4QB84M76c9hVLdONWjuo+rip/zg==", 242 | "requires": { 243 | "@babel/runtime": "^7.7.2", 244 | "@jimp/utils": "^0.16.1" 245 | } 246 | }, 247 | "@jimp/plugin-scale": { 248 | "version": "0.16.1", 249 | "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.16.1.tgz", 250 | "integrity": "sha512-jM2QlgThIDIc4rcyughD5O7sOYezxdafg/2Xtd1csfK3z6fba3asxDwthqPZAgitrLgiKBDp6XfzC07Y/CefUw==", 251 | "requires": { 252 | "@babel/runtime": "^7.7.2", 253 | "@jimp/utils": "^0.16.1" 254 | } 255 | }, 256 | "@jimp/plugin-shadow": { 257 | "version": "0.16.1", 258 | "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.16.1.tgz", 259 | "integrity": "sha512-MeD2Is17oKzXLnsphAa1sDstTu6nxscugxAEk3ji0GV1FohCvpHBcec0nAq6/czg4WzqfDts+fcPfC79qWmqrA==", 260 | "requires": { 261 | "@babel/runtime": "^7.7.2", 262 | "@jimp/utils": "^0.16.1" 263 | } 264 | }, 265 | "@jimp/plugin-threshold": { 266 | "version": "0.16.1", 267 | "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.16.1.tgz", 268 | "integrity": "sha512-iGW8U/wiCSR0+6syrPioVGoSzQFt4Z91SsCRbgNKTAk7D+XQv6OI78jvvYg4o0c2FOlwGhqz147HZV5utoSLxA==", 269 | "requires": { 270 | "@babel/runtime": "^7.7.2", 271 | "@jimp/utils": "^0.16.1" 272 | } 273 | }, 274 | "@jimp/plugins": { 275 | "version": "0.16.1", 276 | "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.16.1.tgz", 277 | "integrity": "sha512-c+lCqa25b+4q6mJZSetlxhMoYuiltyS+ValLzdwK/47+aYsq+kcJNl+TuxIEKf59yr9+5rkbpsPkZHLF/V7FFA==", 278 | "requires": { 279 | "@babel/runtime": "^7.7.2", 280 | "@jimp/plugin-blit": "^0.16.1", 281 | "@jimp/plugin-blur": "^0.16.1", 282 | "@jimp/plugin-circle": "^0.16.1", 283 | "@jimp/plugin-color": "^0.16.1", 284 | "@jimp/plugin-contain": "^0.16.1", 285 | "@jimp/plugin-cover": "^0.16.1", 286 | "@jimp/plugin-crop": "^0.16.1", 287 | "@jimp/plugin-displace": "^0.16.1", 288 | "@jimp/plugin-dither": "^0.16.1", 289 | "@jimp/plugin-fisheye": "^0.16.1", 290 | "@jimp/plugin-flip": "^0.16.1", 291 | "@jimp/plugin-gaussian": "^0.16.1", 292 | "@jimp/plugin-invert": "^0.16.1", 293 | "@jimp/plugin-mask": "^0.16.1", 294 | "@jimp/plugin-normalize": "^0.16.1", 295 | "@jimp/plugin-print": "^0.16.1", 296 | "@jimp/plugin-resize": "^0.16.1", 297 | "@jimp/plugin-rotate": "^0.16.1", 298 | "@jimp/plugin-scale": "^0.16.1", 299 | "@jimp/plugin-shadow": "^0.16.1", 300 | "@jimp/plugin-threshold": "^0.16.1", 301 | "timm": "^1.6.1" 302 | } 303 | }, 304 | "@jimp/png": { 305 | "version": "0.16.1", 306 | "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.16.1.tgz", 307 | "integrity": "sha512-iyWoCxEBTW0OUWWn6SveD4LePW89kO7ZOy5sCfYeDM/oTPLpR8iMIGvZpZUz1b8kvzFr27vPst4E5rJhGjwsdw==", 308 | "requires": { 309 | "@babel/runtime": "^7.7.2", 310 | "@jimp/utils": "^0.16.1", 311 | "pngjs": "^3.3.3" 312 | } 313 | }, 314 | "@jimp/tiff": { 315 | "version": "0.16.1", 316 | "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.16.1.tgz", 317 | "integrity": "sha512-3K3+xpJS79RmSkAvFMgqY5dhSB+/sxhwTFA9f4AVHUK0oKW+u6r52Z1L0tMXHnpbAdR9EJ+xaAl2D4x19XShkQ==", 318 | "requires": { 319 | "@babel/runtime": "^7.7.2", 320 | "utif": "^2.0.1" 321 | } 322 | }, 323 | "@jimp/types": { 324 | "version": "0.16.1", 325 | "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.16.1.tgz", 326 | "integrity": "sha512-g1w/+NfWqiVW4CaXSJyD28JQqZtm2eyKMWPhBBDCJN9nLCN12/Az0WFF3JUAktzdsEC2KRN2AqB1a2oMZBNgSQ==", 327 | "requires": { 328 | "@babel/runtime": "^7.7.2", 329 | "@jimp/bmp": "^0.16.1", 330 | "@jimp/gif": "^0.16.1", 331 | "@jimp/jpeg": "^0.16.1", 332 | "@jimp/png": "^0.16.1", 333 | "@jimp/tiff": "^0.16.1", 334 | "timm": "^1.6.1" 335 | } 336 | }, 337 | "@jimp/utils": { 338 | "version": "0.16.1", 339 | "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.16.1.tgz", 340 | "integrity": "sha512-8fULQjB0x4LzUSiSYG6ZtQl355sZjxbv8r9PPAuYHzS9sGiSHJQavNqK/nKnpDsVkU88/vRGcE7t3nMU0dEnVw==", 341 | "requires": { 342 | "@babel/runtime": "^7.7.2", 343 | "regenerator-runtime": "^0.13.3" 344 | } 345 | }, 346 | "@types/debug": { 347 | "version": "4.1.5", 348 | "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", 349 | "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==" 350 | }, 351 | "@types/node": { 352 | "version": "14.14.10", 353 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.10.tgz", 354 | "integrity": "sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ==" 355 | }, 356 | "@types/puppeteer": { 357 | "version": "5.4.0", 358 | "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.0.tgz", 359 | "integrity": "sha512-zTYDLjnHjgzokrwKt7N0rgn7oZPYo1J0m8Ghu+gXqzLCEn8RWbELa2uprE2UFJ0jU/Sk0x9jXXdOH/5QQLFHhQ==", 360 | "requires": { 361 | "@types/node": "*" 362 | } 363 | }, 364 | "@types/yauzl": { 365 | "version": "2.9.1", 366 | "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", 367 | "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", 368 | "optional": true, 369 | "requires": { 370 | "@types/node": "*" 371 | } 372 | }, 373 | "agent-base": { 374 | "version": "5.1.1", 375 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", 376 | "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" 377 | }, 378 | "any-base": { 379 | "version": "1.1.0", 380 | "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", 381 | "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" 382 | }, 383 | "arr-union": { 384 | "version": "3.1.0", 385 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", 386 | "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" 387 | }, 388 | "balanced-match": { 389 | "version": "1.0.0", 390 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 391 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 392 | }, 393 | "base64-js": { 394 | "version": "1.5.1", 395 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 396 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 397 | }, 398 | "bl": { 399 | "version": "4.0.3", 400 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", 401 | "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", 402 | "requires": { 403 | "buffer": "^5.5.0", 404 | "inherits": "^2.0.4", 405 | "readable-stream": "^3.4.0" 406 | } 407 | }, 408 | "bmp-js": { 409 | "version": "0.1.0", 410 | "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", 411 | "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=" 412 | }, 413 | "brace-expansion": { 414 | "version": "1.1.11", 415 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 416 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 417 | "requires": { 418 | "balanced-match": "^1.0.0", 419 | "concat-map": "0.0.1" 420 | } 421 | }, 422 | "buffer": { 423 | "version": "5.7.1", 424 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 425 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 426 | "requires": { 427 | "base64-js": "^1.3.1", 428 | "ieee754": "^1.1.13" 429 | } 430 | }, 431 | "buffer-crc32": { 432 | "version": "0.2.13", 433 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 434 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" 435 | }, 436 | "buffer-equal": { 437 | "version": "0.0.1", 438 | "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", 439 | "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" 440 | }, 441 | "chownr": { 442 | "version": "1.1.4", 443 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 444 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 445 | }, 446 | "clone-deep": { 447 | "version": "0.2.4", 448 | "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", 449 | "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", 450 | "requires": { 451 | "for-own": "^0.1.3", 452 | "is-plain-object": "^2.0.1", 453 | "kind-of": "^3.0.2", 454 | "lazy-cache": "^1.0.3", 455 | "shallow-clone": "^0.1.2" 456 | } 457 | }, 458 | "concat-map": { 459 | "version": "0.0.1", 460 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 461 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 462 | }, 463 | "debug": { 464 | "version": "4.3.1", 465 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 466 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 467 | "requires": { 468 | "ms": "2.1.2" 469 | } 470 | }, 471 | "deepmerge": { 472 | "version": "4.2.2", 473 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", 474 | "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" 475 | }, 476 | "devtools-protocol": { 477 | "version": "0.0.818844", 478 | "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.818844.tgz", 479 | "integrity": "sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==" 480 | }, 481 | "dom-walk": { 482 | "version": "0.1.2", 483 | "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", 484 | "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" 485 | }, 486 | "end-of-stream": { 487 | "version": "1.4.4", 488 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 489 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 490 | "requires": { 491 | "once": "^1.4.0" 492 | } 493 | }, 494 | "exif-parser": { 495 | "version": "0.1.12", 496 | "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", 497 | "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=" 498 | }, 499 | "extract-zip": { 500 | "version": "2.0.1", 501 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", 502 | "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", 503 | "requires": { 504 | "@types/yauzl": "^2.9.1", 505 | "debug": "^4.1.1", 506 | "get-stream": "^5.1.0", 507 | "yauzl": "^2.10.0" 508 | } 509 | }, 510 | "fd-slicer": { 511 | "version": "1.1.0", 512 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 513 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 514 | "requires": { 515 | "pend": "~1.2.0" 516 | } 517 | }, 518 | "file-type": { 519 | "version": "9.0.0", 520 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", 521 | "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==" 522 | }, 523 | "find-up": { 524 | "version": "4.1.0", 525 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 526 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 527 | "requires": { 528 | "locate-path": "^5.0.0", 529 | "path-exists": "^4.0.0" 530 | } 531 | }, 532 | "for-in": { 533 | "version": "1.0.2", 534 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 535 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" 536 | }, 537 | "for-own": { 538 | "version": "0.1.5", 539 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 540 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", 541 | "requires": { 542 | "for-in": "^1.0.1" 543 | } 544 | }, 545 | "fs-constants": { 546 | "version": "1.0.0", 547 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 548 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 549 | }, 550 | "fs.realpath": { 551 | "version": "1.0.0", 552 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 553 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 554 | }, 555 | "get-stream": { 556 | "version": "5.2.0", 557 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 558 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 559 | "requires": { 560 | "pump": "^3.0.0" 561 | } 562 | }, 563 | "gifwrap": { 564 | "version": "0.9.2", 565 | "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.2.tgz", 566 | "integrity": "sha512-fcIswrPaiCDAyO8xnWvHSZdWChjKXUanKKpAiWWJ/UTkEi/aYKn5+90e7DE820zbEaVR9CE2y4z9bzhQijZ0BA==", 567 | "requires": { 568 | "image-q": "^1.1.1", 569 | "omggif": "^1.0.10" 570 | } 571 | }, 572 | "glob": { 573 | "version": "7.1.6", 574 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 575 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 576 | "requires": { 577 | "fs.realpath": "^1.0.0", 578 | "inflight": "^1.0.4", 579 | "inherits": "2", 580 | "minimatch": "^3.0.4", 581 | "once": "^1.3.0", 582 | "path-is-absolute": "^1.0.0" 583 | } 584 | }, 585 | "global": { 586 | "version": "4.4.0", 587 | "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", 588 | "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", 589 | "requires": { 590 | "min-document": "^2.19.0", 591 | "process": "^0.11.10" 592 | } 593 | }, 594 | "https-proxy-agent": { 595 | "version": "4.0.0", 596 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", 597 | "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", 598 | "requires": { 599 | "agent-base": "5", 600 | "debug": "4" 601 | } 602 | }, 603 | "ieee754": { 604 | "version": "1.2.1", 605 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 606 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 607 | }, 608 | "image-q": { 609 | "version": "1.1.1", 610 | "resolved": "https://registry.npmjs.org/image-q/-/image-q-1.1.1.tgz", 611 | "integrity": "sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY=" 612 | }, 613 | "inflight": { 614 | "version": "1.0.6", 615 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 616 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 617 | "requires": { 618 | "once": "^1.3.0", 619 | "wrappy": "1" 620 | } 621 | }, 622 | "inherits": { 623 | "version": "2.0.4", 624 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 625 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 626 | }, 627 | "is-buffer": { 628 | "version": "1.1.6", 629 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 630 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 631 | }, 632 | "is-extendable": { 633 | "version": "0.1.1", 634 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 635 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" 636 | }, 637 | "is-function": { 638 | "version": "1.0.2", 639 | "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", 640 | "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" 641 | }, 642 | "is-plain-object": { 643 | "version": "2.0.4", 644 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 645 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 646 | "requires": { 647 | "isobject": "^3.0.1" 648 | } 649 | }, 650 | "isobject": { 651 | "version": "3.0.1", 652 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 653 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 654 | }, 655 | "jimp": { 656 | "version": "0.16.1", 657 | "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.16.1.tgz", 658 | "integrity": "sha512-+EKVxbR36Td7Hfd23wKGIeEyHbxShZDX6L8uJkgVW3ESA9GiTEPK08tG1XI2r/0w5Ch0HyJF5kPqF9K7EmGjaw==", 659 | "requires": { 660 | "@babel/runtime": "^7.7.2", 661 | "@jimp/custom": "^0.16.1", 662 | "@jimp/plugins": "^0.16.1", 663 | "@jimp/types": "^0.16.1", 664 | "regenerator-runtime": "^0.13.3" 665 | } 666 | }, 667 | "jpeg-js": { 668 | "version": "0.4.2", 669 | "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.2.tgz", 670 | "integrity": "sha512-+az2gi/hvex7eLTMTlbRLOhH6P6WFdk2ITI8HJsaH2VqYO0I594zXSYEP+tf4FW+8Cy68ScDXoAsQdyQanv3sw==" 671 | }, 672 | "kind-of": { 673 | "version": "3.2.2", 674 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 675 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 676 | "requires": { 677 | "is-buffer": "^1.1.5" 678 | } 679 | }, 680 | "lazy-cache": { 681 | "version": "1.0.4", 682 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 683 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" 684 | }, 685 | "load-bmfont": { 686 | "version": "1.4.1", 687 | "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", 688 | "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==", 689 | "requires": { 690 | "buffer-equal": "0.0.1", 691 | "mime": "^1.3.4", 692 | "parse-bmfont-ascii": "^1.0.3", 693 | "parse-bmfont-binary": "^1.0.5", 694 | "parse-bmfont-xml": "^1.1.4", 695 | "phin": "^2.9.1", 696 | "xhr": "^2.0.1", 697 | "xtend": "^4.0.0" 698 | } 699 | }, 700 | "locate-path": { 701 | "version": "5.0.0", 702 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 703 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 704 | "requires": { 705 | "p-locate": "^4.1.0" 706 | } 707 | }, 708 | "merge-deep": { 709 | "version": "3.0.2", 710 | "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", 711 | "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", 712 | "requires": { 713 | "arr-union": "^3.1.0", 714 | "clone-deep": "^0.2.4", 715 | "kind-of": "^3.0.2" 716 | } 717 | }, 718 | "mime": { 719 | "version": "1.6.0", 720 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 721 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 722 | }, 723 | "min-document": { 724 | "version": "2.19.0", 725 | "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", 726 | "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", 727 | "requires": { 728 | "dom-walk": "^0.1.0" 729 | } 730 | }, 731 | "minimatch": { 732 | "version": "3.0.4", 733 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 734 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 735 | "requires": { 736 | "brace-expansion": "^1.1.7" 737 | } 738 | }, 739 | "minimist": { 740 | "version": "1.2.5", 741 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 742 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 743 | }, 744 | "mixin-object": { 745 | "version": "2.0.1", 746 | "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", 747 | "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", 748 | "requires": { 749 | "for-in": "^0.1.3", 750 | "is-extendable": "^0.1.1" 751 | }, 752 | "dependencies": { 753 | "for-in": { 754 | "version": "0.1.8", 755 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", 756 | "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" 757 | } 758 | } 759 | }, 760 | "mkdirp": { 761 | "version": "0.5.5", 762 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 763 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 764 | "requires": { 765 | "minimist": "^1.2.5" 766 | } 767 | }, 768 | "mkdirp-classic": { 769 | "version": "0.5.3", 770 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 771 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" 772 | }, 773 | "ms": { 774 | "version": "2.1.2", 775 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 776 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 777 | }, 778 | "node-fetch": { 779 | "version": "2.6.1", 780 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 781 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 782 | }, 783 | "omggif": { 784 | "version": "1.0.10", 785 | "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", 786 | "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" 787 | }, 788 | "once": { 789 | "version": "1.4.0", 790 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 791 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 792 | "requires": { 793 | "wrappy": "1" 794 | } 795 | }, 796 | "opencv-wasm": { 797 | "version": "4.3.0-5", 798 | "resolved": "https://registry.npmjs.org/opencv-wasm/-/opencv-wasm-4.3.0-5.tgz", 799 | "integrity": "sha512-52C3MjRrt8xazmBaAVBfsXQm13UIAHjU3tY6ZINXwF914TmD1KmEPuTkzLXSAV/IzMYC5hm4yLBzSZ/ZYNzjPw==" 800 | }, 801 | "p-limit": { 802 | "version": "2.3.0", 803 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 804 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 805 | "requires": { 806 | "p-try": "^2.0.0" 807 | } 808 | }, 809 | "p-locate": { 810 | "version": "4.1.0", 811 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 812 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 813 | "requires": { 814 | "p-limit": "^2.2.0" 815 | } 816 | }, 817 | "p-try": { 818 | "version": "2.2.0", 819 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 820 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 821 | }, 822 | "pako": { 823 | "version": "1.0.11", 824 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 825 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 826 | }, 827 | "parse-bmfont-ascii": { 828 | "version": "1.0.6", 829 | "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", 830 | "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=" 831 | }, 832 | "parse-bmfont-binary": { 833 | "version": "1.0.6", 834 | "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", 835 | "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=" 836 | }, 837 | "parse-bmfont-xml": { 838 | "version": "1.1.4", 839 | "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", 840 | "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", 841 | "requires": { 842 | "xml-parse-from-string": "^1.0.0", 843 | "xml2js": "^0.4.5" 844 | } 845 | }, 846 | "parse-headers": { 847 | "version": "2.0.3", 848 | "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", 849 | "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" 850 | }, 851 | "path-exists": { 852 | "version": "4.0.0", 853 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 854 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" 855 | }, 856 | "path-is-absolute": { 857 | "version": "1.0.1", 858 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 859 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 860 | }, 861 | "pend": { 862 | "version": "1.2.0", 863 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 864 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" 865 | }, 866 | "phin": { 867 | "version": "2.9.3", 868 | "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", 869 | "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" 870 | }, 871 | "pixelmatch": { 872 | "version": "5.2.1", 873 | "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.2.1.tgz", 874 | "integrity": "sha512-WjcAdYSnKrrdDdqTcVEY7aB7UhhwjYQKYhHiBXdJef0MOaQeYpUdQ+iVyBLa5YBKS8MPVPPMX7rpOByISLpeEQ==", 875 | "requires": { 876 | "pngjs": "^4.0.1" 877 | }, 878 | "dependencies": { 879 | "pngjs": { 880 | "version": "4.0.1", 881 | "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-4.0.1.tgz", 882 | "integrity": "sha512-rf5+2/ioHeQxR6IxuYNYGFytUyG3lma/WW1nsmjeHlWwtb2aByla6dkVc8pmJ9nplzkTA0q2xx7mMWrOTqT4Gg==" 883 | } 884 | } 885 | }, 886 | "pkg-dir": { 887 | "version": "4.2.0", 888 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 889 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 890 | "requires": { 891 | "find-up": "^4.0.0" 892 | } 893 | }, 894 | "pngjs": { 895 | "version": "3.4.0", 896 | "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", 897 | "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==" 898 | }, 899 | "process": { 900 | "version": "0.11.10", 901 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 902 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" 903 | }, 904 | "progress": { 905 | "version": "2.0.3", 906 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 907 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" 908 | }, 909 | "proxy-from-env": { 910 | "version": "1.1.0", 911 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 912 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 913 | }, 914 | "pump": { 915 | "version": "3.0.0", 916 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 917 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 918 | "requires": { 919 | "end-of-stream": "^1.1.0", 920 | "once": "^1.3.1" 921 | } 922 | }, 923 | "puppeteer": { 924 | "version": "5.5.0", 925 | "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-5.5.0.tgz", 926 | "integrity": "sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg==", 927 | "requires": { 928 | "debug": "^4.1.0", 929 | "devtools-protocol": "0.0.818844", 930 | "extract-zip": "^2.0.0", 931 | "https-proxy-agent": "^4.0.0", 932 | "node-fetch": "^2.6.1", 933 | "pkg-dir": "^4.2.0", 934 | "progress": "^2.0.1", 935 | "proxy-from-env": "^1.0.0", 936 | "rimraf": "^3.0.2", 937 | "tar-fs": "^2.0.0", 938 | "unbzip2-stream": "^1.3.3", 939 | "ws": "^7.2.3" 940 | } 941 | }, 942 | "puppeteer-extra": { 943 | "version": "3.1.15", 944 | "resolved": "https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.15.tgz", 945 | "integrity": "sha512-TFKcluoNSYCT3xmZjDcqOkBuxZePbwvaL5mrW5Gvp5c9QsJEei5TYixoenMQaB3QZuRW0Aura4yyjVrJDNlWFA==", 946 | "requires": { 947 | "@types/debug": "^4.1.0", 948 | "@types/puppeteer": "*", 949 | "debug": "^4.1.1", 950 | "deepmerge": "^4.2.2" 951 | } 952 | }, 953 | "puppeteer-extra-plugin": { 954 | "version": "3.1.7", 955 | "resolved": "https://registry.npmjs.org/puppeteer-extra-plugin/-/puppeteer-extra-plugin-3.1.7.tgz", 956 | "integrity": "sha512-In3o89X06Q4w1wt0RsAvvdRIp7BzWttVHh24srzlfcBvsGq+zCqhPuwbOYbxnwemtNLaiD/hcYGLvNMEqeUo/Q==", 957 | "requires": { 958 | "@types/debug": "^4.1.0", 959 | "debug": "^4.1.1", 960 | "merge-deep": "^3.0.1" 961 | } 962 | }, 963 | "puppeteer-extra-plugin-stealth": { 964 | "version": "2.6.5", 965 | "resolved": "https://registry.npmjs.org/puppeteer-extra-plugin-stealth/-/puppeteer-extra-plugin-stealth-2.6.5.tgz", 966 | "integrity": "sha512-AMR5lflH51kZART1hSuag/pFCgSoy8U/t23rH6deXN6CirS6S4HzVF72KltGxYnlH9oHRo7ZzoG/aRTsUN8H8A==", 967 | "requires": { 968 | "debug": "^4.1.1", 969 | "puppeteer-extra-plugin": "^3.1.7" 970 | } 971 | }, 972 | "readable-stream": { 973 | "version": "3.6.0", 974 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 975 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 976 | "requires": { 977 | "inherits": "^2.0.3", 978 | "string_decoder": "^1.1.1", 979 | "util-deprecate": "^1.0.1" 980 | } 981 | }, 982 | "regenerator-runtime": { 983 | "version": "0.13.7", 984 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", 985 | "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" 986 | }, 987 | "rimraf": { 988 | "version": "3.0.2", 989 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 990 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 991 | "requires": { 992 | "glob": "^7.1.3" 993 | } 994 | }, 995 | "safe-buffer": { 996 | "version": "5.2.1", 997 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 998 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 999 | }, 1000 | "sax": { 1001 | "version": "1.2.4", 1002 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 1003 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 1004 | }, 1005 | "shallow-clone": { 1006 | "version": "0.1.2", 1007 | "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", 1008 | "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", 1009 | "requires": { 1010 | "is-extendable": "^0.1.1", 1011 | "kind-of": "^2.0.1", 1012 | "lazy-cache": "^0.2.3", 1013 | "mixin-object": "^2.0.1" 1014 | }, 1015 | "dependencies": { 1016 | "kind-of": { 1017 | "version": "2.0.1", 1018 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", 1019 | "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", 1020 | "requires": { 1021 | "is-buffer": "^1.0.2" 1022 | } 1023 | }, 1024 | "lazy-cache": { 1025 | "version": "0.2.7", 1026 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", 1027 | "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" 1028 | } 1029 | } 1030 | }, 1031 | "string_decoder": { 1032 | "version": "1.3.0", 1033 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1034 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1035 | "requires": { 1036 | "safe-buffer": "~5.2.0" 1037 | } 1038 | }, 1039 | "tar-fs": { 1040 | "version": "2.1.1", 1041 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", 1042 | "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", 1043 | "requires": { 1044 | "chownr": "^1.1.1", 1045 | "mkdirp-classic": "^0.5.2", 1046 | "pump": "^3.0.0", 1047 | "tar-stream": "^2.1.4" 1048 | } 1049 | }, 1050 | "tar-stream": { 1051 | "version": "2.1.4", 1052 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.4.tgz", 1053 | "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", 1054 | "requires": { 1055 | "bl": "^4.0.3", 1056 | "end-of-stream": "^1.4.1", 1057 | "fs-constants": "^1.0.0", 1058 | "inherits": "^2.0.3", 1059 | "readable-stream": "^3.1.1" 1060 | } 1061 | }, 1062 | "through": { 1063 | "version": "2.3.8", 1064 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1065 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 1066 | }, 1067 | "timm": { 1068 | "version": "1.7.1", 1069 | "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", 1070 | "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==" 1071 | }, 1072 | "tinycolor2": { 1073 | "version": "1.4.2", 1074 | "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", 1075 | "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" 1076 | }, 1077 | "unbzip2-stream": { 1078 | "version": "1.4.3", 1079 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", 1080 | "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", 1081 | "requires": { 1082 | "buffer": "^5.2.1", 1083 | "through": "^2.3.8" 1084 | } 1085 | }, 1086 | "utif": { 1087 | "version": "2.0.1", 1088 | "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", 1089 | "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", 1090 | "requires": { 1091 | "pako": "^1.0.5" 1092 | } 1093 | }, 1094 | "util-deprecate": { 1095 | "version": "1.0.2", 1096 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1097 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1098 | }, 1099 | "wrappy": { 1100 | "version": "1.0.2", 1101 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1102 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1103 | }, 1104 | "ws": { 1105 | "version": "7.4.0", 1106 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.0.tgz", 1107 | "integrity": "sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ==" 1108 | }, 1109 | "xhr": { 1110 | "version": "2.6.0", 1111 | "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", 1112 | "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", 1113 | "requires": { 1114 | "global": "~4.4.0", 1115 | "is-function": "^1.0.1", 1116 | "parse-headers": "^2.0.0", 1117 | "xtend": "^4.0.0" 1118 | } 1119 | }, 1120 | "xml-parse-from-string": { 1121 | "version": "1.0.1", 1122 | "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", 1123 | "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=" 1124 | }, 1125 | "xml2js": { 1126 | "version": "0.4.23", 1127 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", 1128 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", 1129 | "requires": { 1130 | "sax": ">=0.6.0", 1131 | "xmlbuilder": "~11.0.0" 1132 | } 1133 | }, 1134 | "xmlbuilder": { 1135 | "version": "11.0.1", 1136 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 1137 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" 1138 | }, 1139 | "xtend": { 1140 | "version": "4.0.2", 1141 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1142 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1143 | }, 1144 | "yauzl": { 1145 | "version": "2.10.0", 1146 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1147 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 1148 | "requires": { 1149 | "buffer-crc32": "~0.2.3", 1150 | "fd-slicer": "~1.1.0" 1151 | } 1152 | } 1153 | } 1154 | } 1155 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "geetest-captcha-solver", 3 | "version": "1.0.0", 4 | "description": "Solve geetest slider captchas with puppeteer", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js" 8 | }, 9 | "author": "Dirk Hoekstra", 10 | "license": "ISC", 11 | "dependencies": { 12 | "jimp": "^0.16.1", 13 | "opencv-wasm": "^4.3.0-5", 14 | "pixelmatch": "^5.2.1", 15 | "puppeteer": "^5.5.0", 16 | "puppeteer-extra": "^3.1.15", 17 | "puppeteer-extra-plugin-stealth": "^2.6.5" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Solve the Geetest slider captcha with Puppeteer 2 | 3 | This repo contains a Javascript script that will solve a geetest slider captcha. 4 | 5 | [View my blog post on this project here 🚀](https://scraperbox.com/blog/solving-a-geetest-slider-captcha-with-puppeteer) 6 | 7 | ## Getting started 8 | 9 | To install all dependencies: 10 | ``` 11 | npm i 12 | ``` 13 | 14 | To run the program: 15 | ``` 16 | node index.js 17 | ``` --------------------------------------------------------------------------------