Ver código fonte

pause to wait for browser login

Mike L 3 anos atrás
pai
commit
a055a5d49e
4 arquivos alterados com 18 adições e 4 exclusões
  1. 7 1
      dist/twitter.js
  2. 3 1
      dist/utils.js
  3. 6 2
      src/twitter.ts
  4. 2 0
      src/utils.ts

+ 7 - 1
dist/twitter.js

@@ -361,7 +361,7 @@ class default_1 {
                     }
                     fs.writeFileSync(path.resolve(this.lockfile), JSON.stringify(lock));
                 });
-                return Promise.race([promise, util_1.promisify(setTimeout)(promiseDelay * 3)]);
+                return Promise.race([promise, isWaitingForLogin ? utils_1.neverResolves() : util_1.promisify(setTimeout)(promiseDelay * 3)]);
             }))))
                 .then(() => {
                 let timeout = this.workInterval * 500;
@@ -412,6 +412,12 @@ class default_1 {
             logger.warn('cookies will be saved to this file when needed');
         }
         browserLogin = page => page.fill('input[name="username"]', opt.credentials[0], { timeout: 0 })
+            .then(() => {
+            if (isWaitingForLogin !== true)
+                return;
+            logger.warn('still waiting for login, pausing execution...');
+            return utils_1.neverResolves();
+        })
             .then(() => { isWaitingForLogin = true; logger.warn('blocked by login dialog, trying to log in manually...'); })
             .then(() => page.fill('input[name="password"]', opt.credentials[1], { timeout: 0 }))
             .then(() => page.click('button[type="submit"]', { timeout: 0 }))

+ 3 - 1
dist/utils.js

@@ -1,8 +1,10 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.Arr = exports.BigNumOps = exports.chainPromises = void 0;
+exports.Arr = exports.BigNumOps = exports.neverResolves = exports.chainPromises = void 0;
 const chainPromises = (lazyPromises, reducer = (lp1, lp2) => (p) => lp1(p).then(lp2), initialValue) => lazyPromises.reduce(reducer, p => Promise.resolve(p))(initialValue);
 exports.chainPromises = chainPromises;
+const neverResolves = () => new Promise(() => undefined);
+exports.neverResolves = neverResolves;
 const chunkArray = (arr, size) => {
     const noOfChunks = Math.ceil(size && arr.length / size);
     const res = Array(noOfChunks);

+ 6 - 2
src/twitter.ts

@@ -18,7 +18,7 @@ import { SocksProxyAgent } from 'socks-proxy-agent';
 
 import { getLogger } from './loggers';
 import QQBot from './koishi';
-import { Arr, BigNumOps, chainPromises } from './utils';
+import { Arr, BigNumOps, chainPromises, neverResolves } from './utils';
 import Webshot, { Cookies, Page } from './webshot';
 
 const parseLink = (link: string): { userName?: string, postUrlSegment?: string } => {
@@ -289,6 +289,10 @@ export default class {
 
     browserLogin = page =>
       page.fill('input[name="username"]', opt.credentials[0], {timeout: 0})
+        .then(() => {
+          if (isWaitingForLogin !== true) return;
+          logger.warn('still waiting for login, pausing execution...'); return neverResolves();
+        })
         .then(() => { isWaitingForLogin = true; logger.warn('blocked by login dialog, trying to log in manually...'); })
         .then(() => page.fill('input[name="password"]', opt.credentials[1], {timeout: 0}))
         .then(() => page.click('button[type="submit"]', {timeout: 0}))
@@ -537,7 +541,7 @@ export default class {
           fs.writeFileSync(path.resolve(this.lockfile), JSON.stringify(lock));
         });
 
-        return Promise.race([promise, promisify(setTimeout)(promiseDelay * 3)]);
+        return Promise.race([promise, isWaitingForLogin ? neverResolves() : promisify(setTimeout)(promiseDelay * 3)]);
       }))
     ))
       .then(() => {

+ 2 - 0
src/utils.ts

@@ -4,6 +4,8 @@ export const chainPromises = <T>(
   initialValue?: T
 ) => lazyPromises.reduce(reducer, p => Promise.resolve(p))(initialValue);
 
+export const neverResolves = () => new Promise<never>(() => undefined);
+
 const chunkArray = <T>(arr: T[], size: number) => {
   const noOfChunks = Math.ceil(size && arr.length / size);
   const res = Array<T[]>(noOfChunks);