应用补丁到指定文件
(self, file_path: str, patch_mode: PatchMode)
| 149 | return re.search(pattern, content) |
| 150 | |
| 151 | def apply_patch(self, file_path: str, patch_mode: PatchMode) -> PatchResult: |
| 152 | """应用补丁到指定文件""" |
| 153 | try: |
| 154 | # 检查文件是否存在 |
| 155 | if not os.path.exists(file_path): |
| 156 | return PatchResult(False, f"文件不存在: {file_path}") |
| 157 | |
| 158 | print_info(f"开始补丁文件: {file_path}") |
| 159 | print_info(f"补丁模式: {patch_mode.value} - {self.get_patch_description(patch_mode)}") |
| 160 | |
| 161 | # 读取文件内容 |
| 162 | try: |
| 163 | with open(file_path, 'r', encoding='utf-8') as f: |
| 164 | content = f.read() |
| 165 | except Exception as e: |
| 166 | return PatchResult(False, f"读取文件失败: {e}") |
| 167 | |
| 168 | # 检查是否已被补丁 |
| 169 | if self._is_already_patched(content): |
| 170 | return PatchResult(False, "文件已被补丁,跳过操作") |
| 171 | |
| 172 | # 查找callApi函数 |
| 173 | match = self._find_callapi_function(content) |
| 174 | if not match: |
| 175 | return PatchResult(False, "未找到async callApi函数") |
| 176 | |
| 177 | # 创建备份 |
| 178 | backup_success, backup_path = self._create_backup(file_path) |
| 179 | if not backup_success: |
| 180 | return PatchResult(False, "创建备份失败") |
| 181 | |
| 182 | # 生成完整补丁代码 |
| 183 | patch_code = self.patches[patch_mode] + self._generate_session_randomizer() |
| 184 | |
| 185 | # 应用补丁 |
| 186 | func_start = match.end() |
| 187 | patched_content = content[:func_start] + patch_code + content[func_start:] |
| 188 | |
| 189 | # 写入补丁后的内容 |
| 190 | try: |
| 191 | with open(file_path, 'w', encoding='utf-8') as f: |
| 192 | f.write(patched_content) |
| 193 | |
| 194 | print_success(f"补丁应用成功: {file_path}") |
| 195 | print_info(f"效果: {self.get_patch_description(patch_mode)}") |
| 196 | print_info("隐私保护已启用!") |
| 197 | |
| 198 | return PatchResult(True, "补丁应用成功", file_path, backup_path) |
| 199 | |
| 200 | except Exception as e: |
| 201 | # 尝试从备份恢复 |
| 202 | try: |
| 203 | shutil.copy2(backup_path, file_path) |
| 204 | print_warning("已从备份恢复原始文件") |
| 205 | except: |
| 206 | print_error("恢复原始文件失败!") |
| 207 | |
| 208 | # 生成详细的错误信息 |
no test coverage detected