mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-06 07:56:52 +08:00
fix: migrate wechat clawbot login cache on rename
This commit is contained in:
@@ -214,3 +214,25 @@ def test_wechatclawbot(
|
|||||||
return schemas.Response(success=False, message=errmsg)
|
return schemas.Response(success=False, message=errmsg)
|
||||||
state, message = client.test_connection()
|
state, message = client.test_connection()
|
||||||
return schemas.Response(success=state, message=message)
|
return schemas.Response(success=state, message=message)
|
||||||
|
|
||||||
|
|
||||||
|
@router.post(
|
||||||
|
"/wechatclawbot/migrate",
|
||||||
|
summary="迁移微信 ClawBot 登录缓存",
|
||||||
|
response_model=schemas.Response,
|
||||||
|
)
|
||||||
|
def migrate_wechatclawbot_cache(
|
||||||
|
old_source: str,
|
||||||
|
new_source: str,
|
||||||
|
cleanup_old: bool = False,
|
||||||
|
overwrite: bool = False,
|
||||||
|
_: User = Depends(get_current_active_superuser),
|
||||||
|
):
|
||||||
|
"""在通知名称变更时迁移对应的微信 ClawBot 登录缓存。"""
|
||||||
|
success, message = WechatClawBot.migrate_cached_state(
|
||||||
|
old_name=old_source,
|
||||||
|
new_name=new_source,
|
||||||
|
cleanup_old=cleanup_old,
|
||||||
|
overwrite=overwrite,
|
||||||
|
)
|
||||||
|
return schemas.Response(success=success, message=message)
|
||||||
|
|||||||
@@ -1340,6 +1340,11 @@ class WechatClawBot:
|
|||||||
_qrcode_ttl_seconds = 240
|
_qrcode_ttl_seconds = 240
|
||||||
_active_target_ttl_seconds = 24 * 60 * 60
|
_active_target_ttl_seconds = 24 * 60 * 60
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _build_cache_key(cls, config_name: str) -> str:
|
||||||
|
safe_name = hashlib.md5(str(config_name or "wechatclawbot").encode("utf-8")).hexdigest()[:12]
|
||||||
|
return f"__wechatclawbot_state_{safe_name}__"
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
WECHATCLAWBOT_BASE_URL: Optional[str] = None,
|
WECHATCLAWBOT_BASE_URL: Optional[str] = None,
|
||||||
@@ -1363,8 +1368,7 @@ class WechatClawBot:
|
|||||||
self._poll_timeout = max(10, int(WECHATCLAWBOT_POLL_TIMEOUT or 25))
|
self._poll_timeout = max(10, int(WECHATCLAWBOT_POLL_TIMEOUT or 25))
|
||||||
except Exception:
|
except Exception:
|
||||||
self._poll_timeout = 25
|
self._poll_timeout = 25
|
||||||
safe_name = hashlib.md5(self._config_name.encode("utf-8")).hexdigest()[:12]
|
self._cache_key = self._build_cache_key(self._config_name)
|
||||||
self._cache_key = f"__wechatclawbot_state_{safe_name}__"
|
|
||||||
self._filecache = FileCache()
|
self._filecache = FileCache()
|
||||||
self._lock = threading.Lock()
|
self._lock = threading.Lock()
|
||||||
self._stop_event = threading.Event()
|
self._stop_event = threading.Event()
|
||||||
@@ -1733,6 +1737,36 @@ class WechatClawBot:
|
|||||||
return False, "未登录,请先扫码完成绑定"
|
return False, "未登录,请先扫码完成绑定"
|
||||||
return self._build_client().test_connection()
|
return self._build_client().test_connection()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def migrate_cached_state(
|
||||||
|
cls,
|
||||||
|
old_name: Optional[str],
|
||||||
|
new_name: Optional[str],
|
||||||
|
cleanup_old: bool = False,
|
||||||
|
overwrite: bool = False,
|
||||||
|
) -> Tuple[bool, str]:
|
||||||
|
"""迁移配置重命名后的登录缓存,默认复制而不是删除旧缓存。"""
|
||||||
|
source_name = str(old_name or "").strip()
|
||||||
|
target_name = str(new_name or "").strip()
|
||||||
|
if not source_name or not target_name:
|
||||||
|
return False, "旧名称或新名称不能为空"
|
||||||
|
if source_name == target_name:
|
||||||
|
return True, "通知名称未变化,无需迁移登录缓存"
|
||||||
|
|
||||||
|
cache = FileCache()
|
||||||
|
source_key = cls._build_cache_key(source_name)
|
||||||
|
target_key = cls._build_cache_key(target_name)
|
||||||
|
source_state = cache.get(source_key)
|
||||||
|
if not source_state:
|
||||||
|
return True, "未找到可迁移的微信 ClawBot 登录缓存"
|
||||||
|
if cache.exists(target_key) and not overwrite:
|
||||||
|
return True, "新名称下已存在登录缓存,跳过迁移"
|
||||||
|
|
||||||
|
cache.set(target_key, source_state)
|
||||||
|
if cleanup_old:
|
||||||
|
cache.delete(source_key)
|
||||||
|
return True, f"已将微信 ClawBot 登录缓存从 {source_name} 迁移到 {target_name}"
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _decode_ref_payload(ref: str, kind: str) -> Optional[Dict[str, Any]]:
|
def _decode_ref_payload(ref: str, kind: str) -> Optional[Dict[str, Any]]:
|
||||||
prefix = f"wxclaw://{kind}/"
|
prefix = f"wxclaw://{kind}/"
|
||||||
|
|||||||
Reference in New Issue
Block a user