├── .DS_Store ├── .gitignore ├── Preview.gif ├── README.md ├── config_tmp.js ├── package-lock.json ├── package.json └── src ├── index.js ├── module └── user │ └── user.js ├── processor └── core.js └── utils ├── bot_url_list.js ├── helper.js └── logger.js /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Widiskel/telegram-query-getter-js/cb5d48103b6c531cd73ae0ff9fe59420c76719d0/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | config.js 3 | log/* 4 | sessions/* -------------------------------------------------------------------------------- /Preview.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Widiskel/telegram-query-getter-js/cb5d48103b6c531cd73ae0ff9fe59420c76719d0/Preview.gif -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TELEGRAM QUERY GETTER (NODE JS) 2 | 3 | Telegram web apps query getter, to get query data provided by telegram when authenticating to Telegram Web Apps. 4 | 5 | ## Prerequisite 6 | 7 | - Git 8 | - Node JS 9 | 10 | ## What you need to use this ? 11 | 12 | - TELEGRAM_APP_ID & TELEGRAM_APP_HASH Get it from [Here](https://my.telegram.org/auth?to=apps) 13 | - Telegram Bot Username & Telegram Web Apps Url (Or you can use provided list) 14 | 15 | ## Setup & Configure 16 | 17 | 1. clone project repo 18 | 2. run `npm install` 19 | 3. run `cp config_tmp.js config.js` 20 | To configure the app, open `src/config.ts` and add your telegram app id and hash there 21 | 4. Create sessions directory ```mkdir sessions``` 22 | 5. to start the app run `npm run start` 23 | 24 | ## Preview 25 | ![](Preview.gif) 26 | 27 | ## Note 28 | 29 | you can see `bot_url_list.js` for the example of bot username and url. 30 | -------------------------------------------------------------------------------- /config_tmp.js: -------------------------------------------------------------------------------- 1 | export class Config { 2 | static TELEGRAM_APP_ID = undefined; // YOUR APP ID 3 | static TELEGRAM_APP_HASH = undefined; // YOUR APP HASH 4 | } 5 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "telegram-query-getter-js", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "telegram-query-getter-js", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "input": "^1.0.1", 13 | "telegram": "^2.22.2", 14 | "winston": "^3.13.0" 15 | } 16 | }, 17 | "node_modules/@colors/colors": { 18 | "version": "1.6.0", 19 | "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", 20 | "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", 21 | "engines": { 22 | "node": ">=0.1.90" 23 | } 24 | }, 25 | "node_modules/@cryptography/aes": { 26 | "version": "0.1.1", 27 | "resolved": "https://registry.npmjs.org/@cryptography/aes/-/aes-0.1.1.tgz", 28 | "integrity": "sha512-PcYz4FDGblO6tM2kSC+VzhhK62vml6k6/YAkiWtyPvrgJVfnDRoHGDtKn5UiaRRUrvUTTocBpvc2rRgTCqxjsg==" 29 | }, 30 | "node_modules/@dabh/diagnostics": { 31 | "version": "2.0.3", 32 | "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", 33 | "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", 34 | "dependencies": { 35 | "colorspace": "1.1.x", 36 | "enabled": "2.0.x", 37 | "kuler": "^2.0.0" 38 | } 39 | }, 40 | "node_modules/@types/triple-beam": { 41 | "version": "1.3.5", 42 | "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", 43 | "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" 44 | }, 45 | "node_modules/ansi-escapes": { 46 | "version": "1.4.0", 47 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", 48 | "integrity": "sha512-wiXutNjDUlNEDWHcYH3jtZUhd3c4/VojassD8zHdHCY13xbZy2XbW+NKQwA0tWGBVzDA9qEzYwfoSsWmviidhw==", 49 | "engines": { 50 | "node": ">=0.10.0" 51 | } 52 | }, 53 | "node_modules/ansi-regex": { 54 | "version": "2.1.1", 55 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 56 | "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", 57 | "engines": { 58 | "node": ">=0.10.0" 59 | } 60 | }, 61 | "node_modules/ansi-styles": { 62 | "version": "2.2.1", 63 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 64 | "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", 65 | "engines": { 66 | "node": ">=0.10.0" 67 | } 68 | }, 69 | "node_modules/async": { 70 | "version": "3.2.5", 71 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", 72 | "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" 73 | }, 74 | "node_modules/async-mutex": { 75 | "version": "0.3.2", 76 | "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.3.2.tgz", 77 | "integrity": "sha512-HuTK7E7MT7jZEh1P9GtRW9+aTWiDWWi9InbZ5hjxrnRa39KS4BW04+xLBhYNS2aXhHUIKZSw3gj4Pn1pj+qGAA==", 78 | "dependencies": { 79 | "tslib": "^2.3.1" 80 | } 81 | }, 82 | "node_modules/babel-runtime": { 83 | "version": "6.26.0", 84 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 85 | "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", 86 | "dependencies": { 87 | "core-js": "^2.4.0", 88 | "regenerator-runtime": "^0.11.0" 89 | } 90 | }, 91 | "node_modules/base64-js": { 92 | "version": "1.5.1", 93 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 94 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 95 | "funding": [ 96 | { 97 | "type": "github", 98 | "url": "https://github.com/sponsors/feross" 99 | }, 100 | { 101 | "type": "patreon", 102 | "url": "https://www.patreon.com/feross" 103 | }, 104 | { 105 | "type": "consulting", 106 | "url": "https://feross.org/support" 107 | } 108 | ] 109 | }, 110 | "node_modules/big-integer": { 111 | "version": "1.6.52", 112 | "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", 113 | "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", 114 | "engines": { 115 | "node": ">=0.6" 116 | } 117 | }, 118 | "node_modules/buffer": { 119 | "version": "6.0.3", 120 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 121 | "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 122 | "funding": [ 123 | { 124 | "type": "github", 125 | "url": "https://github.com/sponsors/feross" 126 | }, 127 | { 128 | "type": "patreon", 129 | "url": "https://www.patreon.com/feross" 130 | }, 131 | { 132 | "type": "consulting", 133 | "url": "https://feross.org/support" 134 | } 135 | ], 136 | "dependencies": { 137 | "base64-js": "^1.3.1", 138 | "ieee754": "^1.2.1" 139 | } 140 | }, 141 | "node_modules/bufferutil": { 142 | "version": "4.0.8", 143 | "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", 144 | "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", 145 | "hasInstallScript": true, 146 | "dependencies": { 147 | "node-gyp-build": "^4.3.0" 148 | }, 149 | "engines": { 150 | "node": ">=6.14.2" 151 | } 152 | }, 153 | "node_modules/chalk": { 154 | "version": "1.1.3", 155 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 156 | "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", 157 | "dependencies": { 158 | "ansi-styles": "^2.2.1", 159 | "escape-string-regexp": "^1.0.2", 160 | "has-ansi": "^2.0.0", 161 | "strip-ansi": "^3.0.0", 162 | "supports-color": "^2.0.0" 163 | }, 164 | "engines": { 165 | "node": ">=0.10.0" 166 | } 167 | }, 168 | "node_modules/cli-cursor": { 169 | "version": "1.0.2", 170 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", 171 | "integrity": "sha512-25tABq090YNKkF6JH7lcwO0zFJTRke4Jcq9iX2nr/Sz0Cjjv4gckmwlW6Ty/aoyFd6z3ysR2hMGC2GFugmBo6A==", 172 | "dependencies": { 173 | "restore-cursor": "^1.0.1" 174 | }, 175 | "engines": { 176 | "node": ">=0.10.0" 177 | } 178 | }, 179 | "node_modules/cli-width": { 180 | "version": "2.2.1", 181 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", 182 | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" 183 | }, 184 | "node_modules/code-point-at": { 185 | "version": "1.1.0", 186 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 187 | "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", 188 | "engines": { 189 | "node": ">=0.10.0" 190 | } 191 | }, 192 | "node_modules/color": { 193 | "version": "3.2.1", 194 | "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", 195 | "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", 196 | "dependencies": { 197 | "color-convert": "^1.9.3", 198 | "color-string": "^1.6.0" 199 | } 200 | }, 201 | "node_modules/color-convert": { 202 | "version": "1.9.3", 203 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 204 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 205 | "dependencies": { 206 | "color-name": "1.1.3" 207 | } 208 | }, 209 | "node_modules/color-name": { 210 | "version": "1.1.3", 211 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 212 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 213 | }, 214 | "node_modules/color-string": { 215 | "version": "1.9.1", 216 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", 217 | "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", 218 | "dependencies": { 219 | "color-name": "^1.0.0", 220 | "simple-swizzle": "^0.2.2" 221 | } 222 | }, 223 | "node_modules/colorspace": { 224 | "version": "1.1.4", 225 | "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", 226 | "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", 227 | "dependencies": { 228 | "color": "^3.1.3", 229 | "text-hex": "1.0.x" 230 | } 231 | }, 232 | "node_modules/core-js": { 233 | "version": "2.6.12", 234 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", 235 | "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", 236 | "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", 237 | "hasInstallScript": true 238 | }, 239 | "node_modules/d": { 240 | "version": "1.0.2", 241 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", 242 | "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", 243 | "dependencies": { 244 | "es5-ext": "^0.10.64", 245 | "type": "^2.7.2" 246 | }, 247 | "engines": { 248 | "node": ">=0.12" 249 | } 250 | }, 251 | "node_modules/debug": { 252 | "version": "2.6.9", 253 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 254 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 255 | "dependencies": { 256 | "ms": "2.0.0" 257 | } 258 | }, 259 | "node_modules/dom-serializer": { 260 | "version": "1.4.1", 261 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", 262 | "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", 263 | "dependencies": { 264 | "domelementtype": "^2.0.1", 265 | "domhandler": "^4.2.0", 266 | "entities": "^2.0.0" 267 | }, 268 | "funding": { 269 | "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" 270 | } 271 | }, 272 | "node_modules/domelementtype": { 273 | "version": "2.3.0", 274 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 275 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 276 | "funding": [ 277 | { 278 | "type": "github", 279 | "url": "https://github.com/sponsors/fb55" 280 | } 281 | ] 282 | }, 283 | "node_modules/domhandler": { 284 | "version": "4.3.1", 285 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", 286 | "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", 287 | "dependencies": { 288 | "domelementtype": "^2.2.0" 289 | }, 290 | "engines": { 291 | "node": ">= 4" 292 | }, 293 | "funding": { 294 | "url": "https://github.com/fb55/domhandler?sponsor=1" 295 | } 296 | }, 297 | "node_modules/domutils": { 298 | "version": "2.8.0", 299 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", 300 | "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", 301 | "dependencies": { 302 | "dom-serializer": "^1.0.1", 303 | "domelementtype": "^2.2.0", 304 | "domhandler": "^4.2.0" 305 | }, 306 | "funding": { 307 | "url": "https://github.com/fb55/domutils?sponsor=1" 308 | } 309 | }, 310 | "node_modules/enabled": { 311 | "version": "2.0.0", 312 | "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", 313 | "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" 314 | }, 315 | "node_modules/entities": { 316 | "version": "2.2.0", 317 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", 318 | "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", 319 | "funding": { 320 | "url": "https://github.com/fb55/entities?sponsor=1" 321 | } 322 | }, 323 | "node_modules/es5-ext": { 324 | "version": "0.10.64", 325 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", 326 | "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", 327 | "hasInstallScript": true, 328 | "dependencies": { 329 | "es6-iterator": "^2.0.3", 330 | "es6-symbol": "^3.1.3", 331 | "esniff": "^2.0.1", 332 | "next-tick": "^1.1.0" 333 | }, 334 | "engines": { 335 | "node": ">=0.10" 336 | } 337 | }, 338 | "node_modules/es6-iterator": { 339 | "version": "2.0.3", 340 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", 341 | "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", 342 | "dependencies": { 343 | "d": "1", 344 | "es5-ext": "^0.10.35", 345 | "es6-symbol": "^3.1.1" 346 | } 347 | }, 348 | "node_modules/es6-symbol": { 349 | "version": "3.1.4", 350 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", 351 | "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", 352 | "dependencies": { 353 | "d": "^1.0.2", 354 | "ext": "^1.7.0" 355 | }, 356 | "engines": { 357 | "node": ">=0.12" 358 | } 359 | }, 360 | "node_modules/escape-string-regexp": { 361 | "version": "1.0.5", 362 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 363 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 364 | "engines": { 365 | "node": ">=0.8.0" 366 | } 367 | }, 368 | "node_modules/esniff": { 369 | "version": "2.0.1", 370 | "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", 371 | "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", 372 | "dependencies": { 373 | "d": "^1.0.1", 374 | "es5-ext": "^0.10.62", 375 | "event-emitter": "^0.3.5", 376 | "type": "^2.7.2" 377 | }, 378 | "engines": { 379 | "node": ">=0.10" 380 | } 381 | }, 382 | "node_modules/event-emitter": { 383 | "version": "0.3.5", 384 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", 385 | "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", 386 | "dependencies": { 387 | "d": "1", 388 | "es5-ext": "~0.10.14" 389 | } 390 | }, 391 | "node_modules/exit-hook": { 392 | "version": "1.1.1", 393 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", 394 | "integrity": "sha512-MsG3prOVw1WtLXAZbM3KiYtooKR1LvxHh3VHsVtIy0uiUu8usxgB/94DP2HxtD/661lLdB6yzQ09lGJSQr6nkg==", 395 | "engines": { 396 | "node": ">=0.10.0" 397 | } 398 | }, 399 | "node_modules/ext": { 400 | "version": "1.7.0", 401 | "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", 402 | "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", 403 | "dependencies": { 404 | "type": "^2.7.2" 405 | } 406 | }, 407 | "node_modules/fecha": { 408 | "version": "4.2.3", 409 | "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", 410 | "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" 411 | }, 412 | "node_modules/figures": { 413 | "version": "1.7.0", 414 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 415 | "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", 416 | "dependencies": { 417 | "escape-string-regexp": "^1.0.5", 418 | "object-assign": "^4.1.0" 419 | }, 420 | "engines": { 421 | "node": ">=0.10.0" 422 | } 423 | }, 424 | "node_modules/fn.name": { 425 | "version": "1.1.0", 426 | "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", 427 | "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" 428 | }, 429 | "node_modules/graceful-fs": { 430 | "version": "4.2.11", 431 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 432 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 433 | }, 434 | "node_modules/has-ansi": { 435 | "version": "2.0.0", 436 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 437 | "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", 438 | "dependencies": { 439 | "ansi-regex": "^2.0.0" 440 | }, 441 | "engines": { 442 | "node": ">=0.10.0" 443 | } 444 | }, 445 | "node_modules/htmlparser2": { 446 | "version": "6.1.0", 447 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", 448 | "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", 449 | "funding": [ 450 | "https://github.com/fb55/htmlparser2?sponsor=1", 451 | { 452 | "type": "github", 453 | "url": "https://github.com/sponsors/fb55" 454 | } 455 | ], 456 | "dependencies": { 457 | "domelementtype": "^2.0.1", 458 | "domhandler": "^4.0.0", 459 | "domutils": "^2.5.2", 460 | "entities": "^2.0.0" 461 | } 462 | }, 463 | "node_modules/ieee754": { 464 | "version": "1.2.1", 465 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 466 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 467 | "funding": [ 468 | { 469 | "type": "github", 470 | "url": "https://github.com/sponsors/feross" 471 | }, 472 | { 473 | "type": "patreon", 474 | "url": "https://www.patreon.com/feross" 475 | }, 476 | { 477 | "type": "consulting", 478 | "url": "https://feross.org/support" 479 | } 480 | ] 481 | }, 482 | "node_modules/imurmurhash": { 483 | "version": "0.1.4", 484 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 485 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 486 | "engines": { 487 | "node": ">=0.8.19" 488 | } 489 | }, 490 | "node_modules/inherits": { 491 | "version": "2.0.4", 492 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 493 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 494 | }, 495 | "node_modules/input": { 496 | "version": "1.0.1", 497 | "resolved": "https://registry.npmjs.org/input/-/input-1.0.1.tgz", 498 | "integrity": "sha512-5DKQKQ7Nm/CaPGYKF74uUvk5ftC3S04fLYWcDrNG2rOVhhRgB4E2J8JNb7AAh+RlQ/954ukas4bEbrRQ3/kPGA==", 499 | "dependencies": { 500 | "babel-runtime": "^6.6.1", 501 | "chalk": "^1.1.1", 502 | "inquirer": "^0.12.0", 503 | "lodash": "^4.6.1" 504 | }, 505 | "engines": { 506 | "node": ">=0.12" 507 | } 508 | }, 509 | "node_modules/inquirer": { 510 | "version": "0.12.0", 511 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", 512 | "integrity": "sha512-bOetEz5+/WpgaW4D1NYOk1aD+JCqRjqu/FwRFgnIfiP7FC/zinsrfyO1vlS3nyH/R7S0IH3BIHBu4DBIDSqiGQ==", 513 | "dependencies": { 514 | "ansi-escapes": "^1.1.0", 515 | "ansi-regex": "^2.0.0", 516 | "chalk": "^1.0.0", 517 | "cli-cursor": "^1.0.1", 518 | "cli-width": "^2.0.0", 519 | "figures": "^1.3.5", 520 | "lodash": "^4.3.0", 521 | "readline2": "^1.0.1", 522 | "run-async": "^0.1.0", 523 | "rx-lite": "^3.1.2", 524 | "string-width": "^1.0.1", 525 | "strip-ansi": "^3.0.0", 526 | "through": "^2.3.6" 527 | } 528 | }, 529 | "node_modules/ip-address": { 530 | "version": "9.0.5", 531 | "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", 532 | "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", 533 | "dependencies": { 534 | "jsbn": "1.1.0", 535 | "sprintf-js": "^1.1.3" 536 | }, 537 | "engines": { 538 | "node": ">= 12" 539 | } 540 | }, 541 | "node_modules/is-arrayish": { 542 | "version": "0.3.2", 543 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 544 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" 545 | }, 546 | "node_modules/is-fullwidth-code-point": { 547 | "version": "1.0.0", 548 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 549 | "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", 550 | "dependencies": { 551 | "number-is-nan": "^1.0.0" 552 | }, 553 | "engines": { 554 | "node": ">=0.10.0" 555 | } 556 | }, 557 | "node_modules/is-stream": { 558 | "version": "2.0.1", 559 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 560 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 561 | "engines": { 562 | "node": ">=8" 563 | }, 564 | "funding": { 565 | "url": "https://github.com/sponsors/sindresorhus" 566 | } 567 | }, 568 | "node_modules/is-typedarray": { 569 | "version": "1.0.0", 570 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 571 | "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" 572 | }, 573 | "node_modules/jsbn": { 574 | "version": "1.1.0", 575 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", 576 | "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" 577 | }, 578 | "node_modules/kuler": { 579 | "version": "2.0.0", 580 | "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", 581 | "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" 582 | }, 583 | "node_modules/lodash": { 584 | "version": "4.17.21", 585 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 586 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 587 | }, 588 | "node_modules/logform": { 589 | "version": "2.6.0", 590 | "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", 591 | "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", 592 | "dependencies": { 593 | "@colors/colors": "1.6.0", 594 | "@types/triple-beam": "^1.3.2", 595 | "fecha": "^4.2.0", 596 | "ms": "^2.1.1", 597 | "safe-stable-stringify": "^2.3.1", 598 | "triple-beam": "^1.3.0" 599 | }, 600 | "engines": { 601 | "node": ">= 12.0.0" 602 | } 603 | }, 604 | "node_modules/logform/node_modules/ms": { 605 | "version": "2.1.3", 606 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 607 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 608 | }, 609 | "node_modules/mime": { 610 | "version": "3.0.0", 611 | "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 612 | "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 613 | "bin": { 614 | "mime": "cli.js" 615 | }, 616 | "engines": { 617 | "node": ">=10.0.0" 618 | } 619 | }, 620 | "node_modules/ms": { 621 | "version": "2.0.0", 622 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 623 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 624 | }, 625 | "node_modules/mute-stream": { 626 | "version": "0.0.5", 627 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", 628 | "integrity": "sha512-EbrziT4s8cWPmzr47eYVW3wimS4HsvlnV5ri1xw1aR6JQo/OrJX5rkl32K/QQHdxeabJETtfeaROGhd8W7uBgg==" 629 | }, 630 | "node_modules/next-tick": { 631 | "version": "1.1.0", 632 | "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", 633 | "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" 634 | }, 635 | "node_modules/node-gyp-build": { 636 | "version": "4.8.1", 637 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", 638 | "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", 639 | "bin": { 640 | "node-gyp-build": "bin.js", 641 | "node-gyp-build-optional": "optional.js", 642 | "node-gyp-build-test": "build-test.js" 643 | } 644 | }, 645 | "node_modules/node-localstorage": { 646 | "version": "2.2.1", 647 | "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-2.2.1.tgz", 648 | "integrity": "sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw==", 649 | "dependencies": { 650 | "write-file-atomic": "^1.1.4" 651 | }, 652 | "engines": { 653 | "node": ">=0.12" 654 | } 655 | }, 656 | "node_modules/number-is-nan": { 657 | "version": "1.0.1", 658 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 659 | "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", 660 | "engines": { 661 | "node": ">=0.10.0" 662 | } 663 | }, 664 | "node_modules/object-assign": { 665 | "version": "4.1.1", 666 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 667 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 668 | "engines": { 669 | "node": ">=0.10.0" 670 | } 671 | }, 672 | "node_modules/once": { 673 | "version": "1.4.0", 674 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 675 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 676 | "dependencies": { 677 | "wrappy": "1" 678 | } 679 | }, 680 | "node_modules/one-time": { 681 | "version": "1.0.0", 682 | "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", 683 | "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", 684 | "dependencies": { 685 | "fn.name": "1.x.x" 686 | } 687 | }, 688 | "node_modules/onetime": { 689 | "version": "1.1.0", 690 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", 691 | "integrity": "sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==", 692 | "engines": { 693 | "node": ">=0.10.0" 694 | } 695 | }, 696 | "node_modules/pako": { 697 | "version": "2.1.0", 698 | "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", 699 | "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" 700 | }, 701 | "node_modules/path-browserify": { 702 | "version": "1.0.1", 703 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", 704 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 705 | }, 706 | "node_modules/readable-stream": { 707 | "version": "3.6.2", 708 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 709 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 710 | "dependencies": { 711 | "inherits": "^2.0.3", 712 | "string_decoder": "^1.1.1", 713 | "util-deprecate": "^1.0.1" 714 | }, 715 | "engines": { 716 | "node": ">= 6" 717 | } 718 | }, 719 | "node_modules/readline2": { 720 | "version": "1.0.1", 721 | "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", 722 | "integrity": "sha512-8/td4MmwUB6PkZUbV25uKz7dfrmjYWxsW8DVfibWdlHRk/l/DfHKn4pU+dfcoGLFgWOdyGCzINRQD7jn+Bv+/g==", 723 | "dependencies": { 724 | "code-point-at": "^1.0.0", 725 | "is-fullwidth-code-point": "^1.0.0", 726 | "mute-stream": "0.0.5" 727 | } 728 | }, 729 | "node_modules/real-cancellable-promise": { 730 | "version": "1.2.0", 731 | "resolved": "https://registry.npmjs.org/real-cancellable-promise/-/real-cancellable-promise-1.2.0.tgz", 732 | "integrity": "sha512-FYhmx1FVSgoPRjneoTjh+EKZcNb8ijl/dyatTzase5eujYhVrLNDOiIY6AgQq7GU1kOoLgEd9jLVbhFg8k8dOQ==" 733 | }, 734 | "node_modules/regenerator-runtime": { 735 | "version": "0.11.1", 736 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 737 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" 738 | }, 739 | "node_modules/restore-cursor": { 740 | "version": "1.0.1", 741 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", 742 | "integrity": "sha512-reSjH4HuiFlxlaBaFCiS6O76ZGG2ygKoSlCsipKdaZuKSPx/+bt9mULkn4l0asVzbEfQQmXRg6Wp6gv6m0wElw==", 743 | "dependencies": { 744 | "exit-hook": "^1.0.0", 745 | "onetime": "^1.0.0" 746 | }, 747 | "engines": { 748 | "node": ">=0.10.0" 749 | } 750 | }, 751 | "node_modules/run-async": { 752 | "version": "0.1.0", 753 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", 754 | "integrity": "sha512-qOX+w+IxFgpUpJfkv2oGN0+ExPs68F4sZHfaRRx4dDexAQkG83atugKVEylyT5ARees3HBbfmuvnjbrd8j9Wjw==", 755 | "dependencies": { 756 | "once": "^1.3.0" 757 | } 758 | }, 759 | "node_modules/rx-lite": { 760 | "version": "3.1.2", 761 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", 762 | "integrity": "sha512-1I1+G2gteLB8Tkt8YI1sJvSIfa0lWuRtC8GjvtyPBcLSF5jBCCJJqKrpER5JU5r6Bhe+i9/pK3VMuUcXu0kdwQ==" 763 | }, 764 | "node_modules/safe-buffer": { 765 | "version": "5.2.1", 766 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 767 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 768 | "funding": [ 769 | { 770 | "type": "github", 771 | "url": "https://github.com/sponsors/feross" 772 | }, 773 | { 774 | "type": "patreon", 775 | "url": "https://www.patreon.com/feross" 776 | }, 777 | { 778 | "type": "consulting", 779 | "url": "https://feross.org/support" 780 | } 781 | ] 782 | }, 783 | "node_modules/safe-stable-stringify": { 784 | "version": "2.4.3", 785 | "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", 786 | "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", 787 | "engines": { 788 | "node": ">=10" 789 | } 790 | }, 791 | "node_modules/simple-swizzle": { 792 | "version": "0.2.2", 793 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 794 | "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", 795 | "dependencies": { 796 | "is-arrayish": "^0.3.1" 797 | } 798 | }, 799 | "node_modules/slide": { 800 | "version": "1.1.6", 801 | "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", 802 | "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", 803 | "engines": { 804 | "node": "*" 805 | } 806 | }, 807 | "node_modules/smart-buffer": { 808 | "version": "4.2.0", 809 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 810 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 811 | "engines": { 812 | "node": ">= 6.0.0", 813 | "npm": ">= 3.0.0" 814 | } 815 | }, 816 | "node_modules/socks": { 817 | "version": "2.8.3", 818 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", 819 | "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", 820 | "dependencies": { 821 | "ip-address": "^9.0.5", 822 | "smart-buffer": "^4.2.0" 823 | }, 824 | "engines": { 825 | "node": ">= 10.0.0", 826 | "npm": ">= 3.0.0" 827 | } 828 | }, 829 | "node_modules/sprintf-js": { 830 | "version": "1.1.3", 831 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", 832 | "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" 833 | }, 834 | "node_modules/stack-trace": { 835 | "version": "0.0.10", 836 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 837 | "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", 838 | "engines": { 839 | "node": "*" 840 | } 841 | }, 842 | "node_modules/store2": { 843 | "version": "2.14.3", 844 | "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.3.tgz", 845 | "integrity": "sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==" 846 | }, 847 | "node_modules/string_decoder": { 848 | "version": "1.3.0", 849 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 850 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 851 | "dependencies": { 852 | "safe-buffer": "~5.2.0" 853 | } 854 | }, 855 | "node_modules/string-width": { 856 | "version": "1.0.2", 857 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 858 | "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", 859 | "dependencies": { 860 | "code-point-at": "^1.0.0", 861 | "is-fullwidth-code-point": "^1.0.0", 862 | "strip-ansi": "^3.0.0" 863 | }, 864 | "engines": { 865 | "node": ">=0.10.0" 866 | } 867 | }, 868 | "node_modules/strip-ansi": { 869 | "version": "3.0.1", 870 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 871 | "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", 872 | "dependencies": { 873 | "ansi-regex": "^2.0.0" 874 | }, 875 | "engines": { 876 | "node": ">=0.10.0" 877 | } 878 | }, 879 | "node_modules/supports-color": { 880 | "version": "2.0.0", 881 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 882 | "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", 883 | "engines": { 884 | "node": ">=0.8.0" 885 | } 886 | }, 887 | "node_modules/telegram": { 888 | "version": "2.22.2", 889 | "resolved": "https://registry.npmjs.org/telegram/-/telegram-2.22.2.tgz", 890 | "integrity": "sha512-9payizc801Aqqu4eTGPc0huxKnIwFe0hn18mrpbgAKKiMLurX/UIQW/fjPhI5ONzockDFsaXDFqTreXBoG1u3A==", 891 | "dependencies": { 892 | "@cryptography/aes": "^0.1.1", 893 | "async-mutex": "^0.3.0", 894 | "big-integer": "^1.6.48", 895 | "buffer": "^6.0.3", 896 | "htmlparser2": "^6.1.0", 897 | "mime": "^3.0.0", 898 | "node-localstorage": "^2.2.1", 899 | "pako": "^2.0.3", 900 | "path-browserify": "^1.0.1", 901 | "real-cancellable-promise": "^1.1.1", 902 | "socks": "^2.6.2", 903 | "store2": "^2.13.0", 904 | "ts-custom-error": "^3.2.0", 905 | "websocket": "^1.0.34" 906 | }, 907 | "optionalDependencies": { 908 | "bufferutil": "^4.0.3", 909 | "utf-8-validate": "^5.0.5" 910 | } 911 | }, 912 | "node_modules/text-hex": { 913 | "version": "1.0.0", 914 | "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", 915 | "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" 916 | }, 917 | "node_modules/through": { 918 | "version": "2.3.8", 919 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 920 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" 921 | }, 922 | "node_modules/triple-beam": { 923 | "version": "1.4.1", 924 | "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", 925 | "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", 926 | "engines": { 927 | "node": ">= 14.0.0" 928 | } 929 | }, 930 | "node_modules/ts-custom-error": { 931 | "version": "3.3.1", 932 | "resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-3.3.1.tgz", 933 | "integrity": "sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==", 934 | "engines": { 935 | "node": ">=14.0.0" 936 | } 937 | }, 938 | "node_modules/tslib": { 939 | "version": "2.6.3", 940 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", 941 | "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" 942 | }, 943 | "node_modules/type": { 944 | "version": "2.7.3", 945 | "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", 946 | "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==" 947 | }, 948 | "node_modules/typedarray-to-buffer": { 949 | "version": "3.1.5", 950 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", 951 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", 952 | "dependencies": { 953 | "is-typedarray": "^1.0.0" 954 | } 955 | }, 956 | "node_modules/utf-8-validate": { 957 | "version": "5.0.10", 958 | "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", 959 | "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", 960 | "hasInstallScript": true, 961 | "dependencies": { 962 | "node-gyp-build": "^4.3.0" 963 | }, 964 | "engines": { 965 | "node": ">=6.14.2" 966 | } 967 | }, 968 | "node_modules/util-deprecate": { 969 | "version": "1.0.2", 970 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 971 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 972 | }, 973 | "node_modules/websocket": { 974 | "version": "1.0.35", 975 | "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.35.tgz", 976 | "integrity": "sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==", 977 | "dependencies": { 978 | "bufferutil": "^4.0.1", 979 | "debug": "^2.2.0", 980 | "es5-ext": "^0.10.63", 981 | "typedarray-to-buffer": "^3.1.5", 982 | "utf-8-validate": "^5.0.2", 983 | "yaeti": "^0.0.6" 984 | }, 985 | "engines": { 986 | "node": ">=4.0.0" 987 | } 988 | }, 989 | "node_modules/winston": { 990 | "version": "3.13.0", 991 | "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", 992 | "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", 993 | "dependencies": { 994 | "@colors/colors": "^1.6.0", 995 | "@dabh/diagnostics": "^2.0.2", 996 | "async": "^3.2.3", 997 | "is-stream": "^2.0.0", 998 | "logform": "^2.4.0", 999 | "one-time": "^1.0.0", 1000 | "readable-stream": "^3.4.0", 1001 | "safe-stable-stringify": "^2.3.1", 1002 | "stack-trace": "0.0.x", 1003 | "triple-beam": "^1.3.0", 1004 | "winston-transport": "^4.7.0" 1005 | }, 1006 | "engines": { 1007 | "node": ">= 12.0.0" 1008 | } 1009 | }, 1010 | "node_modules/winston-transport": { 1011 | "version": "4.7.0", 1012 | "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", 1013 | "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", 1014 | "dependencies": { 1015 | "logform": "^2.3.2", 1016 | "readable-stream": "^3.6.0", 1017 | "triple-beam": "^1.3.0" 1018 | }, 1019 | "engines": { 1020 | "node": ">= 12.0.0" 1021 | } 1022 | }, 1023 | "node_modules/wrappy": { 1024 | "version": "1.0.2", 1025 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1026 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 1027 | }, 1028 | "node_modules/write-file-atomic": { 1029 | "version": "1.3.4", 1030 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", 1031 | "integrity": "sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw==", 1032 | "dependencies": { 1033 | "graceful-fs": "^4.1.11", 1034 | "imurmurhash": "^0.1.4", 1035 | "slide": "^1.1.5" 1036 | } 1037 | }, 1038 | "node_modules/yaeti": { 1039 | "version": "0.0.6", 1040 | "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", 1041 | "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", 1042 | "engines": { 1043 | "node": ">=0.10.32" 1044 | } 1045 | } 1046 | } 1047 | } 1048 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "telegram-query-getter-js", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "type": "module", 6 | "scripts": { 7 | "start": "node src/index.js" 8 | }, 9 | "keywords": [ 10 | "telegram-query-getter-js" 11 | ], 12 | "author": "", 13 | "license": "ISC", 14 | "description": "Telegram web apps query getter, to get query data provided by telegram when authenticating to Telegram Web Apps.", 15 | "dependencies": { 16 | "input": "^1.0.1", 17 | "telegram": "^2.22.2", 18 | "winston": "^3.13.0" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import input from "input"; // npm i input 2 | import { Config } from "../config.js"; // Adjusted the path to the config.js file 3 | import { Core } from "./processor/core.js"; 4 | import { Helper } from "./utils/helper.js"; 5 | import logger from "./utils/logger.js"; 6 | import { TelegramClient } from "telegram"; 7 | import { StoreSession } from "telegram/sessions/StoreSession.js"; 8 | import { botUrlList } from "./utils/bot_url_list.js"; // Import botUrlList 9 | 10 | let sessionName; 11 | 12 | async function sessionCreation() { 13 | const sessionList = Helper.getSession("sessions"); 14 | let ctx = "Your session List:\n\n"; 15 | 16 | for (const sess of sessionList) { 17 | ctx += `${sessionList.indexOf(sess) + 1}. ${sess}\n`; 18 | } 19 | ctx += sessionList.length === 0 20 | ? "\n\nPlease enter Session Name:" 21 | : "\n\nYou already have sessions, cancel(CTRL+C) or create new Session:"; 22 | 23 | const newSession = await input.text(ctx); 24 | sessionName = Helper.createDir(newSession); 25 | 26 | // Create a new Telegram Client for session 27 | const client = new TelegramClient( 28 | new StoreSession(sessionName), 29 | Number(Config.TELEGRAM_APP_ID), 30 | Config.TELEGRAM_APP_HASH, 31 | { 32 | connectionRetries: 10, 33 | connectionTimeout: 30, 34 | } 35 | ); 36 | 37 | // Start the login process 38 | try { 39 | await client.start({ 40 | phoneNumber: async () => await input.text("Enter your Telegram Phone Number: "), 41 | password: async () => await input.text("Enter your Telegram Password: "), 42 | phoneCode: async () => await input.text("Enter the Telegram Verification Code you received: "), 43 | onError: (err) => console.log(err), 44 | }); 45 | 46 | console.log("Session created and logged in successfully."); 47 | logger.info(`Session ${newSession} - Created and connected`); 48 | 49 | } catch (error) { 50 | console.error(`Error creating session ${newSession}:`, error); 51 | logger.error(`Session ${newSession} Error - ${error.message}`); 52 | } finally { 53 | try { 54 | await client.disconnect(); 55 | console.log("Client disconnected."); 56 | logger.info(`Session ${newSession} - Client disconnected`); 57 | } catch (disconnectError) { 58 | console.error("Error disconnecting client:", disconnectError); 59 | logger.error(`Session ${newSession} - Error disconnecting client: ${disconnectError}`); 60 | } 61 | } 62 | 63 | // Return to the welcome menu after session creation 64 | await onBoarding(); 65 | } 66 | 67 | async function sessionSelection() { 68 | const sessionList = Helper.getSession("sessions"); 69 | if (sessionList.length === 0) { 70 | console.info("No sessions available. Please create a new session."); 71 | await sessionCreation(); 72 | return; 73 | } 74 | 75 | let ctx = "Your session List:\n\n"; 76 | for (const sess of sessionList) { 77 | ctx += `${sessionList.indexOf(sess) + 1}. ${sess}\n`; 78 | } 79 | 80 | ctx += "\n\nPlease select Session:"; 81 | 82 | const newSession = await input.text(ctx); 83 | const selectedSession = sessionList[parseInt(newSession) - 1]; 84 | 85 | if (selectedSession) { 86 | sessionName = `sessions/${selectedSession}`; 87 | console.info(`Using session ${selectedSession}`); 88 | } else { 89 | console.error("Invalid choice. Please try again."); 90 | await sessionSelection(); 91 | } 92 | } 93 | 94 | async function onBoarding() { 95 | const choice = await input.text( 96 | "Welcome to Telegram Query Getter \nBy : Widiskel \n\nLet's get started.\n1. Create Session.\n2. Reset Sessions\n3. Get Query\n4. Process All Sessions\n\nInput your choice:" 97 | ); 98 | switch (parseInt(choice)) { 99 | case 1: 100 | await sessionCreation(); 101 | await onBoarding(); // Return to the welcome menu after creating a session 102 | break; 103 | case 2: 104 | Helper.resetSession("sessions"); 105 | await onBoarding(); // Return to the welcome menu after resetting sessions 106 | break; 107 | case 3: 108 | if (Helper.getSession("sessions").length === 0) { 109 | console.info("You don't have any sessions, please create one first"); 110 | await onBoarding(); // Return to the welcome menu if no sessions exist 111 | } else { 112 | await sessionSelection(); 113 | await processSingleSession(sessionName); // Process a single session 114 | await onBoarding(); // Return to the welcome menu after processing a single session 115 | } 116 | break; 117 | case 4: 118 | await processAllSessions(); // Process all sessions 119 | await postProcessingMenu(); // Prompt user after processing all sessions 120 | break; 121 | default: 122 | console.error("Invalid input, Please try again"); 123 | await onBoarding(); // Return to the welcome menu for invalid input 124 | break; 125 | } 126 | } 127 | 128 | async function processSingleSession(session) { 129 | const sessionList = Helper.getSession("sessions"); 130 | if (sessionList.length === 0) { 131 | console.info("No sessions available to process."); 132 | return; 133 | } 134 | 135 | const chosenBot = await selectBot(); 136 | const url = chosenBot.url; 137 | const useDefaultQueryType = await selectQueryResultType(); 138 | 139 | const client = new TelegramClient( 140 | new StoreSession(session), 141 | Number(Config.TELEGRAM_APP_ID), 142 | Config.TELEGRAM_APP_HASH, 143 | { 144 | connectionRetries: 10, // Number of retry attempts 145 | connectionTimeout: 60 * 1000, // Set timeout to 60 seconds (60000 ms) 146 | } 147 | ); 148 | 149 | try { 150 | await client.start({ 151 | phoneNumber: async () => await input.text("Enter your Telegram Phone Number: "), 152 | password: async () => await input.text("Enter your Telegram Password: "), 153 | phoneCode: async () => await input.text("Enter the Telegram Verification Code you received: "), 154 | onError: (err) => console.log(err), 155 | }); 156 | 157 | console.log("Connected."); 158 | logger.info(`Session ${session} - Connected`); 159 | const core = new Core(client, session, chosenBot.bot, url, useDefaultQueryType); 160 | const queryData = await core.process(); 161 | console.log(`Query Data for session ${session}: ${queryData}`); 162 | } catch (error) { 163 | console.error(`Error processing session ${session}:`, error); 164 | logger.error(`Session ${session} Error - ${error.message}`); 165 | } finally { 166 | try { 167 | await client.disconnect(); 168 | console.log("Client disconnected."); 169 | logger.info(`Session ${session} - Client disconnected`); 170 | } catch (disconnectError) { 171 | console.error("Error disconnecting client:", disconnectError); 172 | logger.error(`Session ${session} - Error disconnecting client: ${disconnectError}`); 173 | } 174 | } 175 | } 176 | 177 | async function processAllSessions() { 178 | const sessionList = Helper.getSession("sessions"); 179 | if (sessionList.length === 0) { 180 | console.info("No sessions available to process."); 181 | return; 182 | } 183 | 184 | const chosenBot = await selectBot(); 185 | const url = chosenBot.url; 186 | const useDefaultQueryType = await selectQueryResultType(); 187 | 188 | const queryResults = []; 189 | 190 | for (const sess of sessionList) { 191 | const sessionName = `sessions/${sess}`; 192 | const client = new TelegramClient( 193 | new StoreSession(sessionName), 194 | Number(Config.TELEGRAM_APP_ID), 195 | Config.TELEGRAM_APP_HASH, 196 | { 197 | connectionRetries: 10, // Number of retry attempts 198 | connectionTimeout: 60 * 1000, // Set timeout to 60 seconds (60000 ms) 199 | } 200 | ); 201 | 202 | try { 203 | await client.start({ 204 | phoneNumber: async () => await input.text("Enter your Telegram Phone Number: "), 205 | password: async () => await input.text("Enter your Telegram Password: "), 206 | phoneCode: async () => await input.text("Enter the Telegram Verification Code you received: "), 207 | onError: (err) => console.log(err), 208 | }); 209 | 210 | console.log("Connected."); 211 | logger.info(`Session ${sessionName} - Connected`); 212 | const core = new Core(client, sessionName, chosenBot.bot, url, useDefaultQueryType); 213 | const queryData = await core.process(); 214 | queryResults.push(queryData); 215 | } catch (error) { 216 | console.error(`Error processing session ${sess}:`, error); 217 | logger.error(`Session ${sessionName} Error - ${error.message}`); 218 | } finally { 219 | try { 220 | await client.disconnect(); 221 | console.log("Client disconnected."); 222 | logger.info(`Session ${sessionName} - Client disconnected`); 223 | } catch (disconnectError) { 224 | console.error("Error disconnecting client:", disconnectError); 225 | logger.error(`Session ${sessionName} - Error disconnecting client: ${disconnectError}`); 226 | } 227 | } 228 | } 229 | 230 | // Display all collected queries after processing all sessions 231 | console.log("\nAggregated Queries from All Sessions:\n"); 232 | queryResults.forEach((result, index) => { 233 | console.log(`${index + 1}. ${result}`); 234 | }); 235 | } 236 | 237 | async function selectBot() { 238 | // Show bot list 239 | let botOptions = "Bot List:\n"; 240 | botUrlList.forEach((item, index) => { 241 | botOptions += `${index + 1}. ${item.bot}\n`; 242 | }); 243 | 244 | const botChoiceIndex = parseInt(await input.text(`${botOptions}\nEnter bot number to connect:`)) - 1; 245 | const chosenBot = botUrlList[botChoiceIndex]; 246 | if (!chosenBot) { 247 | console.error("Invalid bot choice."); 248 | throw new Error("Invalid bot choice."); 249 | } 250 | return chosenBot; 251 | } 252 | 253 | async function selectQueryResultType() { 254 | return await input.text( 255 | "Select Query Result Type ?\n \n1. URI Component \n2. JSON String\n3. Init Params (DEFAULT)\n \nPlease select result type :" 256 | ); 257 | } 258 | 259 | async function postProcessingMenu() { 260 | const choice = await input.text( 261 | "All sessions have been processed.\n\n1. Return to Welcome Menu\n2. Exit Program\n\nInput your choice:" 262 | ); 263 | switch (parseInt(choice)) { 264 | case 1: 265 | await onBoarding(); // Return to the welcome menu 266 | break; 267 | case 2: 268 | console.log("Exiting program..."); 269 | logger.info("Program exited by user."); 270 | process.exit(0); // Exit the program 271 | break; 272 | default: 273 | console.error("Invalid input, Please try again."); 274 | await postProcessingMenu(); // Prompt again if invalid input 275 | break; 276 | } 277 | } 278 | 279 | (async () => { 280 | sessionName = "sessions"; 281 | try { 282 | logger.info(`BOT STARTED`); 283 | await onBoarding(); 284 | } catch (error) { 285 | console.error("Unhandled Error: ", error); 286 | logger.error(`Unhandled Error: ${error.message}`); 287 | } 288 | })(); 289 | -------------------------------------------------------------------------------- /src/module/user/user.js: -------------------------------------------------------------------------------- 1 | class User { 2 | /** @type {any} */ 3 | user; 4 | constructor(user) { 5 | this.user = user; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/processor/core.js: -------------------------------------------------------------------------------- 1 | import logger from "../utils/logger.js"; 2 | import { Helper } from "../utils/helper.js"; 3 | import { Api } from "telegram"; 4 | import { FloodWaitError } from "telegram/errors/RPCErrorList.js"; 5 | 6 | export class Core { 7 | /** @type {TelegramClient} */ 8 | client; 9 | /** @type {string} */ 10 | session; 11 | /** @type {EntityLike | Entity} */ 12 | peer; 13 | /** @type {any} */ 14 | bot; 15 | /** @type {any} */ 16 | url; 17 | /** @type {boolean} */ 18 | useDefaultQueryType; 19 | 20 | constructor(client, session, bot, url, useDefaultQueryType) { 21 | this.client = client; 22 | this.session = session; 23 | this.bot = bot; 24 | this.url = url; 25 | this.useDefaultQueryType = useDefaultQueryType; 26 | } 27 | 28 | async resolvePeer() { 29 | logger.info(`Session ${this.session} - Resolving Peer`); 30 | let attempts = 0; 31 | const maxAttempts = 5; 32 | 33 | while (this.peer == undefined && attempts < maxAttempts) { 34 | try { 35 | this.peer = await this.client.getEntity(this.bot); 36 | break; 37 | } catch (error) { 38 | if (error instanceof FloodWaitError) { 39 | const fls = error.seconds; 40 | logger.warn(`${this.client.session.serverAddress} | FloodWait ${error}`); 41 | logger.info(`${this.client.session.serverAddress} | Sleep ${fls}s`); 42 | await Helper.sleep((fls + 3) * 1000); 43 | } else if (error.message.includes('TIMEOUT')) { 44 | attempts++; 45 | logger.warn(`Timeout Error - Attempt ${attempts} of ${maxAttempts}`); 46 | if (attempts >= maxAttempts) { 47 | throw new Error('Maximum attempts reached for resolving peer'); 48 | } 49 | await Helper.sleep(5000); // Wait before retrying 50 | } else { 51 | console.error(`Error resolving peer: ${error.message}`); 52 | throw error; 53 | } 54 | } 55 | } 56 | } 57 | 58 | async process() { 59 | try { 60 | logger.info(`Session ${this.session} - Processing`); 61 | this.user = await this.client.getMe(); 62 | 63 | if (!this.bot || !this.url) { 64 | throw new Error("You need to set Bot Username and Bot Web Apps URL"); 65 | } 66 | 67 | await this.resolvePeer(); 68 | logger.info(`Session ${this.session} - Connecting to Webview`); 69 | 70 | const webView = await this.client.invoke( 71 | new Api.messages.RequestWebView({ 72 | peer: this.peer, 73 | bot: this.peer, 74 | fromBotMenu: true, 75 | url: this.url, // Ensure the URL is fully qualified 76 | platform: "android", 77 | }) 78 | ); 79 | logger.info(`Session ${this.session} - Webview Connected`); 80 | 81 | const authUrl = webView.url; 82 | const tgData = Helper.getTelegramQuery(authUrl, this.useDefaultQueryType); 83 | 84 | return tgData; // Return query data for aggregation 85 | } catch (error) { 86 | console.error("Error during process execution:", error); 87 | logger.error(`Session ${this.session} Error - ${error.message}`); 88 | throw error; 89 | } finally { 90 | try { 91 | await this.client.disconnect(); 92 | logger.info(`Session ${this.session} - Client disconnected`); 93 | } catch (disconnectError) { 94 | console.error("Error disconnecting client:", disconnectError); 95 | logger.error(`Session ${this.session} - Error disconnecting client: ${disconnectError}`); 96 | } 97 | } 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /src/utils/bot_url_list.js: -------------------------------------------------------------------------------- 1 | export const botUrlList = [ 2 | //BLUM 3 | { 4 | bot: "BlumCryptoBot", 5 | url: "https://user-domain.blum.codes/api/v1/auth/provider/PROVIDER_TELEGRAM_MINI_APP", 6 | }, 7 | //CatsGang 8 | { 9 | bot: "catsgang_bot", 10 | url: "https://cats-backend-cxblew-prod.up.railway.app", 11 | }, 12 | //Agent301 13 | { 14 | bot: "Agent301Bot", 15 | url: "https://api.agent301.org/completeTask", 16 | }, 17 | //Fintopio 18 | { 19 | bot: "fintopiobot", 20 | url: "https://fintopio-tg.fintopio.com/api", 21 | }, 22 | //HamsterKombat 23 | { 24 | bot: "hamster_kombat_bot", 25 | url: "https://api.hamsterkombat.io/", 26 | }, 27 | //LostDogs 28 | { 29 | bot: "lost_dogs_bot", 30 | url: "https://api.getgems.io/graphql?operationName=getHomePage&variables=%7B%7D&extensions=%7B%22persistedQuery%22%3A%7B%22version%22%3A1%2C%22sha256Hash%22%3A%22d89d3ccd8d9fd69d37d181e2e8303ee78b80e6a26e4500c42e6d9f695257f9be%22%7D%7D", 31 | }, 32 | //GOATS 33 | { 34 | bot : "realgoats_bot", 35 | url : "https://dev-api.goatsbot.xyz", 36 | }, 37 | //TOMARKET 38 | { 39 | bot : "Tomarket_ai_bot", 40 | url : "https://api-web.tomarket.ai", 41 | }, 42 | //#ISI DENGAN DATA BOT YANG INGING DITAMBAHKAN 43 | // { 44 | // bot: "", 45 | // url: "", 46 | // }, 47 | ]; 48 | -------------------------------------------------------------------------------- /src/utils/helper.js: -------------------------------------------------------------------------------- 1 | import fs from "fs"; 2 | import path from "path"; 3 | import { parse } from "querystring"; 4 | 5 | export class Helper { 6 | static sleep = (ms) => { 7 | return new Promise((resolve) => setTimeout(resolve, ms)); 8 | }; 9 | 10 | static getTelegramQuery(url, type) { 11 | try { 12 | const hashIndex = url.indexOf("#"); 13 | if (hashIndex === -1) { 14 | throw new Error("No query string found in the URL."); 15 | } 16 | 17 | const queryString = url.substring(hashIndex + 1); 18 | const decodedQueryString = queryString.split("&"); 19 | const param = decodedQueryString[0].split("=")[1]; // Ensure correct extraction 20 | 21 | if (!param) { 22 | throw new Error("Param not found in the query string."); 23 | } 24 | 25 | if (type == "1") { 26 | return param; 27 | } else if (type == "2") { 28 | return this.decodeQueryString(param); 29 | } else { 30 | const newParam = this.decodeQueryString(param); 31 | return this.jsonToInitParam(newParam); 32 | } 33 | } catch (error) { 34 | console.error("Error in getTelegramQuery:", error.message); 35 | throw error; 36 | } 37 | } 38 | 39 | static jsonToInitParam(dataString) { 40 | try { 41 | const newData = parse(dataString); 42 | 43 | if (newData.user) { 44 | const userObject = JSON.parse(newData.user); 45 | newData.user = encodeURIComponent(JSON.stringify(userObject)); 46 | } 47 | 48 | const resultArray = []; 49 | for (const [key, value] of Object.entries(newData)) { 50 | resultArray.push(`${key}=${value}`); 51 | } 52 | const result = resultArray.join("&"); 53 | 54 | return result; 55 | } catch (error) { 56 | console.error("Error in jsonToInitParam:", error.message); 57 | throw error; 58 | } 59 | } 60 | 61 | static decodeQueryString(encodedString) { 62 | try { 63 | const decodedString = decodeURIComponent(encodedString); 64 | const paramsArray = decodedString.split("&"); 65 | const paramsObject = {}; 66 | 67 | paramsArray.forEach((param) => { 68 | const [key, value] = param.split("="); 69 | if (key === "user") { 70 | paramsObject[key] = JSON.parse(decodeURIComponent(value)); 71 | } else { 72 | paramsObject[key] = value; 73 | } 74 | }); 75 | 76 | const resultArray = []; 77 | for (const [key, value] of Object.entries(paramsObject)) { 78 | if (key === "user") { 79 | resultArray.push(`${key}=${JSON.stringify(value)}`); 80 | } else { 81 | resultArray.push(`${key}=${value}`); 82 | } 83 | } 84 | 85 | return resultArray.join("&"); 86 | } catch (error) { 87 | console.error("Error in decodeQueryString:", error.message); 88 | throw error; 89 | } 90 | } 91 | 92 | static getSession(sessionName) { 93 | try { 94 | const files = fs.readdirSync(path.resolve(sessionName)); 95 | const session = []; 96 | files.forEach((file) => { 97 | session.push(file); 98 | }); 99 | return session; 100 | } catch (error) { 101 | console.error(`Error reading sessions directory: ${error.message}`); 102 | throw error; 103 | } 104 | } 105 | 106 | static resetSession(sessionName) { 107 | try { 108 | const files = fs.readdirSync(path.resolve(sessionName)); 109 | console.log("Deleting Sessions..."); 110 | files.forEach((file) => { 111 | fs.rm( 112 | `${path.join(path.resolve(sessionName), file)}`, 113 | { recursive: true }, 114 | (err) => { 115 | if (err) throw err; 116 | } 117 | ); 118 | }); 119 | console.info("Sessions reset successfully"); 120 | } catch (error) { 121 | console.error(`Error deleting session files: ${error.message}`); 122 | throw error; 123 | } 124 | } 125 | 126 | static createDir(dirName) { 127 | try { 128 | const dirPath = `sessions/${dirName}`; 129 | console.log(dirPath); 130 | fs.mkdir(dirPath, { recursive: true }, (err) => { 131 | if (err) throw err; 132 | }); 133 | return dirPath; 134 | } catch (error) { 135 | console.error(`Error creating directory: ${error.message}`); 136 | throw error; 137 | } 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /src/utils/logger.js: -------------------------------------------------------------------------------- 1 | import { createLogger, format, transports } from "winston"; 2 | 3 | const { combine, timestamp, printf, colorize } = format; 4 | 5 | const customFormat = printf(({ level, message, timestamp }) => { 6 | return `${timestamp} [${level}]: ${message}`; 7 | }); 8 | 9 | class Logger { 10 | constructor() { 11 | this.logger = createLogger({ 12 | level: "debug", 13 | format: combine( 14 | timestamp({ 15 | format: "YYYY-MM-DD HH:mm:ss", 16 | }), 17 | colorize(), 18 | customFormat 19 | ), 20 | transports: [new transports.File({ filename: "log/app.log" })], 21 | exceptionHandlers: [new transports.File({ filename: "log/app.log" })], 22 | rejectionHandlers: [new transports.File({ filename: "log/app.log" })], 23 | }); 24 | } 25 | 26 | info(message) { 27 | this.logger.info(message); 28 | } 29 | 30 | warn(message) { 31 | this.logger.warn(message); 32 | } 33 | 34 | error(message) { 35 | this.logger.error(message); 36 | } 37 | 38 | debug(message) { 39 | this.logger.debug(message); 40 | } 41 | 42 | setLevel(level) { 43 | this.logger.level = level; 44 | } 45 | } 46 | 47 | export default new Logger(); 48 | --------------------------------------------------------------------------------