From 6bceb0a6bfd1f0953d600c6d51615cce66a63dbd Mon Sep 17 00:00:00 2001 From: Vlad Pronsky Date: Sun, 9 Jul 2023 16:43:23 +0300 Subject: [PATCH] feat: ability to remove account; show stats for login_all method in cli --- twscrape/accounts_pool.py | 17 ++++++++++++++++- twscrape/cli.py | 10 ++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/twscrape/accounts_pool.py b/twscrape/accounts_pool.py index 39ea6e4..0066b8f 100644 --- a/twscrape/accounts_pool.py +++ b/twscrape/accounts_pool.py @@ -87,6 +87,16 @@ class AccountsPool: ) await self.save(account) + async def delete_accounts(self, usernames: str | list[str]): + usernames = usernames if isinstance(usernames, list) else [usernames] + usernames = list(set(usernames)) + if not usernames: + logger.warning("No usernames provided") + return + + qs = f"""DELETE FROM accounts WHERE username IN ({','.join([f'"{x}"' for x in usernames])})""" + await execute(self._db_file, qs) + async def get(self, username: str): qs = "SELECT * FROM accounts WHERE username = :username" rs = await fetchone(self._db_file, qs, {"username": username}) @@ -113,8 +123,10 @@ class AccountsPool: try: await login(account) logger.info(f"Logged in to {account.username} successfully") + return True except Exception as e: logger.error(f"Error logging in to {account.username}: {e}") + return False finally: await self.save(account) @@ -125,9 +137,12 @@ class AccountsPool: accounts = [Account.from_rs(rs) for rs in rs] # await asyncio.gather(*[login(x) for x in self.accounts]) + counter = {"total": len(accounts), "success": 0, "failed": 0} for i, x in enumerate(accounts, start=1): logger.info(f"[{i}/{len(accounts)}] Logging in {x.username} - {x.email}") - await self.login(x) + status = await self.login(x) + counter["success" if status else "failed"] += 1 + return counter async def relogin(self, usernames: str | list[str]): usernames = usernames if isinstance(usernames, list) else [usernames] diff --git a/twscrape/cli.py b/twscrape/cli.py index fd03e3b..6b58292 100644 --- a/twscrape/cli.py +++ b/twscrape/cli.py @@ -77,7 +77,7 @@ async def main(args): return if args.command == "login_accounts": - await pool.login_all() + print(await pool.login_all()) return if args.command == "relogin_failed": @@ -143,14 +143,20 @@ def run(): return p subparsers.add_parser("version", help="Show version") - subparsers.add_parser("accounts", help="List all accounts") + add_accounts = subparsers.add_parser("add_accounts", help="Add accounts") add_accounts.add_argument("file_path", help="File with accounts") add_accounts.add_argument("line_format", help="args of Pool.add_account splited by same delim") + + del_accounts = subparsers.add_parser("del_accounts", help="Delete accounts") + del_accounts.add_argument("usernames", nargs="+", default=[], help="Usernames to delete") + subparsers.add_parser("login_accounts", help="Login accounts") + relogin = subparsers.add_parser("relogin", help="Re-login selected accounts") relogin.add_argument("usernames", nargs="+", default=[], help="Usernames to re-login") + subparsers.add_parser("relogin_failed", help="Retry login for failed accounts") subparsers.add_parser("stats", help="Get current usage stats")