(self, token: Token, now: datetime)
| 797 | return None |
| 798 | |
| 799 | async def _refresh_protocol_token(self, token: Token, now: datetime) -> None: |
| 800 | token_id = int(token.id) |
| 801 | refresh_lock = await self._get_token_lock( |
| 802 | self._refresh_locks, |
| 803 | self._refresh_lock_guard, |
| 804 | token_id, |
| 805 | ) |
| 806 | async with refresh_lock: |
| 807 | latest = await self.db.get_token(token_id) |
| 808 | if not latest or not latest.is_active: |
| 809 | return |
| 810 | if not latest.auto_refresh_enabled: |
| 811 | return |
| 812 | if self._normalize_protocol_mode(latest.protocol_mode) != "protocol": |
| 813 | return |
| 814 | if not (latest.google_cookies or "").strip(): |
| 815 | return |
| 816 | |
| 817 | new_st = await self._try_protocol_refresh_st(token_id, latest) |
| 818 | if not new_st: |
| 819 | return |
| 820 | |
| 821 | try: |
| 822 | session = await self._st_to_at_for_token(latest, new_st) |
| 823 | new_at = str(session.get("access_token") or "").strip() |
| 824 | if not new_at: |
| 825 | raise RuntimeError("ST 转 AT 响应缺少 access_token") |
| 826 | |
| 827 | updates: Dict[str, Any] = { |
| 828 | "st": new_st, |
| 829 | "at": new_at, |
| 830 | "at_expires": self._parse_at_expires(session.get("expires")), |
| 831 | "last_st_refresh_at": now, |
| 832 | "last_st_refresh_result": "success", |
| 833 | } |
| 834 | user_info = session.get("user") if isinstance(session.get("user"), dict) else {} |
| 835 | if user_info.get("email"): |
| 836 | updates["email"] = user_info.get("email") |
| 837 | if user_info.get("name"): |
| 838 | updates["name"] = user_info.get("name") |
| 839 | |
| 840 | try: |
| 841 | credits_result = await self._get_credits_for_token(latest, new_at) |
| 842 | updates["credits"] = credits_result.get("credits", 0) |
| 843 | updates["user_paygate_tier"] = credits_result.get("userPaygateTier") |
| 844 | except Exception as e: |
| 845 | debug_logger.log_warning(f"[PROTOCOL_REFRESH] Token {token_id}: 刷新余额失败 - {e}") |
| 846 | |
| 847 | await self.db.update_token(token_id, **updates) |
| 848 | record_token_refresh("at", "success") |
| 849 | debug_logger.log_info(f"[PROTOCOL_REFRESH] Token {token_id}: 协议刷新 ST/AT 成功") |
| 850 | except Exception as e: |
| 851 | await self.db.update_token( |
| 852 | token_id, |
| 853 | st=new_st, |
| 854 | last_st_refresh_at=now, |
| 855 | last_st_refresh_result=str(e), |
| 856 | ) |
no test coverage detected