56 lines
4.0 KiB
Python
56 lines
4.0 KiB
Python
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.')
|