执行 AT 刷新的核心逻辑 Args: token_id: Token ID st: Session Token Returns: True if refresh successful AND AT is valid, False otherwise
(self, token_id: int, st: str, token: Optional[Token] = None)
| 610 | return await task |
| 611 | |
| 612 | async def _do_refresh_at(self, token_id: int, st: str, token: Optional[Token] = None) -> bool: |
| 613 | """执行 AT 刷新的核心逻辑 |
| 614 | |
| 615 | Args: |
| 616 | token_id: Token ID |
| 617 | st: Session Token |
| 618 | |
| 619 | Returns: |
| 620 | True if refresh successful AND AT is valid, False otherwise |
| 621 | """ |
| 622 | try: |
| 623 | debug_logger.log_info(f"[AT_REFRESH] Token {token_id}: 开始刷新AT...") |
| 624 | |
| 625 | # 使用ST转AT |
| 626 | token = token or await self.db.get_token(token_id) |
| 627 | result = await ( |
| 628 | self._st_to_at_for_token(token, st) |
| 629 | if token is not None |
| 630 | else self.flow_client.st_to_at(st) |
| 631 | ) |
| 632 | new_at = result["access_token"] |
| 633 | expires = result.get("expires") |
| 634 | |
| 635 | # 解析过期时间 |
| 636 | new_at_expires = None |
| 637 | if expires: |
| 638 | try: |
| 639 | new_at_expires = datetime.fromisoformat(expires.replace('Z', '+00:00')) |
| 640 | except: |
| 641 | pass |
| 642 | |
| 643 | # 更新数据库 |
| 644 | await self.db.update_token( |
| 645 | token_id, |
| 646 | at=new_at, |
| 647 | at_expires=new_at_expires |
| 648 | ) |
| 649 | |
| 650 | debug_logger.log_info(f"[AT_REFRESH] Token {token_id}: AT刷新成功") |
| 651 | debug_logger.log_info(f" - 新过期时间: {new_at_expires}") |
| 652 | |
| 653 | # 验证 AT 有效性:通过 get_credits 测试 |
| 654 | try: |
| 655 | credits_result = await ( |
| 656 | self._get_credits_for_token(token, new_at) |
| 657 | if token is not None |
| 658 | else self.flow_client.get_credits(new_at) |
| 659 | ) |
| 660 | await self.db.update_token( |
| 661 | token_id, |
| 662 | credits=credits_result.get("credits", 0), |
| 663 | user_paygate_tier=credits_result.get("userPaygateTier"), |
| 664 | ) |
| 665 | self._mark_at_valid(token_id) |
| 666 | debug_logger.log_info(f"[AT_REFRESH] Token {token_id}: AT 验证成功(余额: {credits_result.get('credits', 0)})") |
| 667 | record_token_refresh("at", "success") |
| 668 | return True |
| 669 | except Exception as verify_err: |
no test coverage detected