import os import re TARGET_EXTS = ('.html', '.htm', '.php', '.phtml') BACKUP_SUFFIX = '.bak' # کامپایل الگوها برای سرعت بیشتر RE_VIEWPORT = re.compile(r'', re.IGNORECASE) RE_WPADMINBAR = re.compile(r']*>.*?', re.DOTALL | re.IGNORECASE) RE_ADMIN_ID = re.compile(r'<(\w+)[^>]*\s+id\s*=\s*["\'][^"\']*wp-admin[^"\']*["\'][^>]*>.*?', re.DOTALL | re.IGNORECASE) def needs_cleaning(content): """بررسی سریع وجود هر یک از الگوها - بدون پردازش سنگین""" return (RE_VIEWPORT.search(content) or RE_WPADMINBAR.search(content) or RE_ADMIN_ID.search(content)) def clean_file(file_path): with open(file_path, 'r', encoding='utf-8', errors='ignore') as f: content = f.read() # اگر هیچ الگوی قابل پاکسازی نباشد، فایل را دست نزن if not needs_cleaning(content): return False original = content # 1) جایگزینی سربرگ از متا ویوپورت تا انتهای فایل match = RE_VIEWPORT.search(content) if match: content = '\n\t' + content[match.end():] else: # اگر متا تگ نبود، فقط بلاک ابتدایی مخرب را حذف کنیم (اختیاری) if content.startswith(''): content = '\n\t' + content[21:] # 2) حذف نوار ادمین content = RE_WPADMINBAR.sub('', content) # 3) حذف تمام المان‌هایی که id آن‌ها حاوی wp-admin است content = RE_ADMIN_ID.sub('', content) # اگر تغییری نکرد، ذخیره نکن if content == original: return False with open(file_path, 'w', encoding='utf-8') as f: f.write(content) return True def process_directory(root_dir='.'): cleaned = 0 for dirpath, _, filenames in os.walk(root_dir): for fname in filenames: if fname.lower().endswith(TARGET_EXTS): full = os.path.join(dirpath, fname) backup = full + BACKUP_SUFFIX # ساخت پشتیبان فقط در صورتی که نباشد if not os.path.exists(backup): try: with open(full, 'rb') as src, open(backup, 'wb') as dst: dst.write(src.read()) print(f"📁 پشتیبان: {backup}") except Exception as e: print(f"❌ خطا در پشتیبان {full}: {e}") continue try: if clean_file(full): print(f"✅ پاکسازی: {full}") cleaned += 1 else: print(f"⏩ بدون تغییر: {full}") except Exception as e: print(f"❌ خطا در {full}: {e}") print(f"🏁 تعداد فایل‌های تغییر یافته: {cleaned}") if __name__ == '__main__': process_directory()