from pathlib import Path import shutil root=Path('C:/wechat_rpa') path=root/'wxwork_db.py' text=path.read_text(encoding='utf-8') def replace(old,new,count=1): global text assert text.count(old)==count,(str(path),old[:90],text.count(old),count) text=text.replace(old,new) replace('def decrypt_with_keys(db_base: str, out_dir: str, keys_map: dict, use_cache: bool = True) -> list:', 'def decrypt_with_keys(db_base: str, out_dir: str, keys_map: dict, use_cache: bool = True, *, account="", database_names=None) -> list:') replace(' decrypted_dbs = []\n os.makedirs(out_dir, exist_ok=True)', ''' account = str(account or "") if account and not account.isdecimal(): raise ValueError("企业微信账号 ID 无效") names = _RELEVANT_DBS if database_names is None else tuple(database_names) if not names or any(name not in _RELEVANT_DBS for name in names): raise ValueError("企业微信数据库范围无效") decrypted_dbs = [] os.makedirs(out_dir, exist_ok=True)''') replace(' for user_dir in sorted(os.listdir(db_base)):', ' for user_dir in ([account] if account else sorted(os.listdir(db_base))):') replace(' for db_name in _RELEVANT_DBS:', ' for db_name in names:') replace(' cache_dir: str | None = None, poll_interval: float = 2.0):', ' cache_dir: str | None = None, poll_interval: float = 2.0, *, account="", load_metadata=True):') replace(' self.db_base = db_base\n self.keys_map', ''' self.db_base = db_base self.account = str(account or "") if self.account and not self.account.isdecimal(): raise ValueError("企业微信账号 ID 无效") self._load_metadata_enabled = bool(load_metadata) self._database_names = _RELEVANT_DBS if self._load_metadata_enabled else ("message.db",) self.keys_map''') replace(' decrypted = decrypt_with_keys(self.db_base, self.cache_dir, self.keys_map, use_cache=not refresh)', ''' decrypted = decrypt_with_keys(self.db_base, self.cache_dir, self.keys_map, use_cache=not refresh, account=self.account, database_names=self._database_names)''') replace(' self._load_metadata()\n for out_path, db_name, user_dir in decrypted:', ' if self._load_metadata_enabled:\n self._load_metadata()\n for out_path, db_name, user_dir in decrypted:') replace(' for account in sorted(os.listdir(self.db_base)):\n for name in _RELEVANT_DBS:', ' for account in ([self.account] if self.account else sorted(os.listdir(self.db_base))):\n for name in self._database_names:') compile(text,str(path),'exec') backup=root/'backups/loading-performance-20260917'/path.name assert not backup.exists() shutil.copy2(path,backup) path.write_text(text,encoding='utf-8') path=root/'reply_database.py' text=path.read_text(encoding='utf-8') replace(' def _open_database(*, account="", initialize=True, source_directory=None):', ' def _open_database(*, account="", initialize=True, source_directory=None, load_metadata=True):') replace(' database = WXWorkDB(source, keys, cache_dir=cache)', ' database = WXWorkDB(source, keys, cache_dir=cache, account=account, load_metadata=load_metadata)') replace(' database = WXWorkDB(source, load_keys(), cache_dir=cache)', ' database = WXWorkDB(source, load_keys(), cache_dir=cache, account=account, load_metadata=load_metadata)') compile(text,str(path),'exec') path.write_text(text,encoding='utf-8') path=root/'wecom_environment.py' text=path.read_text(encoding='utf-8') replace(' database = LiveReplyDatabase._open_database(account=account, initialize=initialize, source_directory=source)', ' database = LiveReplyDatabase._open_database(account=account, initialize=initialize, source_directory=source, load_metadata=False)') compile(text,str(path),'exec') path.write_text(text,encoding='utf-8') print('Protocol checks prepare only the current account message.db; actual reply startup loads its metadata.')