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[^"\']*["\'][^>]*>.*?\1>', 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()