Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import re
- import mwclient
- import time
- from concurrent.futures import ThreadPoolExecutor
- import os
- from dotenv import load_dotenv
- from config import PATTERNS, replacements, excluded_pages, search_terms, excluded_phrases
- # .env dosyasını yükle
- load_dotenv()
- # Ortam değişkenlerini al
- USERNAME = os.getenv('WIKI_USERNAME')
- PASSWORD = os.getenv('WIKI_PASSWORD')
- if not USERNAME or not PASSWORD:
- print("Kullanıcı adı veya şifre belirtilmemiş! Lütfen .env dosyasını kontrol edin.")
- exit(1)
- def is_excluded_line(line):
- """Bir satırın şablon parametresi, kategori veya kaynak şablonu içerip içermediğini kontrol eder."""
- return (
- re.match(r'^\|.*=.*$', line.strip()) or
- re.match(r'^\[\[Kategori:.*\]\]$', line.strip()) or
- re.search(r'<ref(=[^>]*)?>.*?</ref>', line) or
- re.search(r'\{\{[^}]*kaynağı[^}]*\}\}', line, re.IGNORECASE)
- )
- def is_excluded_phrase(line, pattern_key):
- """Bir satırda hariç tutulan kelime öbeklerinin olup olmadığını kontrol eder."""
- if pattern_key in excluded_phrases:
- return any(phrase in line for phrase in excluded_phrases[pattern_key])
- return False
- def replace_text_in_line(line):
- """Bir satırdaki uygun ifadeleri değiştiren işlev."""
- modified_line = line
- for pattern_key, pattern in PATTERNS.items():
- # Eğer satırda hariç tutulan bir kelime öbeği varsa, bu pattern için değişiklik yapma
- if is_excluded_phrase(line, pattern_key):
- continue
- modified_line = re.sub(pattern,
- lambda m: replacements[pattern_key].get(m.group(0), m.group(0)),
- modified_line)
- return modified_line
- def replace_text_everywhere(text):
- """Metindeki tüm alanlarda belirtilen ifadeleri kurallara göre değiştirir."""
- lines = text.splitlines()
- return "\n".join(replace_text_in_line(line) if not is_excluded_line(line) else line for line in lines)
- def process_pages_parallel(pages, results):
- """Sayfaları paralel olarak işleyen yardımcı işlev."""
- total_pages = len(pages)
- processed_count = 0
- def process_page(page_name):
- nonlocal processed_count
- try:
- page = site.pages[page_name]
- if page.name.lower() in {excluded.lower() for excluded in excluded_pages}:
- results['skipped'] += 1
- processed_count += 1
- print(f"Taranan sayfa: {processed_count}/{total_pages}", end="\r")
- return
- original_text = page.text()
- updated_text = replace_text_everywhere(original_text)
- if original_text != updated_text:
- page.save(updated_text, summary="Ana madde adına ya da yaygın kullanıma uygun ifade düzenlemeleri yapıldı.")
- results['updated'] += 1
- print(f"Değişiklik yapıldı: {page.name}")
- else:
- results['unchanged'] += 1
- except mwclient.errors.APIError as api_error:
- print(f"API Hatası: {page.name} - {api_error.code}: {api_error.info}")
- results['errors'] += 1
- except Exception as e:
- print(f"Hata: {page.name} - {type(e).__name__}: {e}")
- results['errors'] += 1
- finally:
- processed_count += 1
- print(f"Taranan sayfa: {processed_count}/{total_pages}", end="\r")
- with ThreadPoolExecutor() as executor:
- executor.map(process_page, pages)
- def process_term(term, results):
- """Belirli bir terim için arama ve bağlantı verilen sayfaları işleyerek değişiklik yapar."""
- term_cleaned = term.strip('"')
- print(f"'{term_cleaned}' ifadesi aranıyor ve işleniyor...")
- try:
- search_results = list(site.search(term_cleaned, namespace=0))
- linked_pages = list(site.pages[term_cleaned].backlinks(namespace=0))
- all_pages = {result['title'] for result in search_results}
- all_pages.update(page.name for page in linked_pages)
- filtered_pages = {page for page in all_pages if page.lower() not in {excluded.lower() for excluded in excluded_pages}}
- process_pages_parallel(filtered_pages, results)
- except Exception as e:
- print(f"'{term_cleaned}' işlemi sırasında hata: {e}")
- # Vikipedi'ye bağlan ve giriş yap
- site = mwclient.Site('tr.wikipedia.org')
- try:
- site.login(USERNAME, PASSWORD)
- print("Vikipedi'ye başarıyla girildi.")
- except Exception as e:
- print(f"Vikipedi'ye giriş başarısız: {e}")
- exit(1)
- # Sonuçlar için kılavuz
- results = {
- 'updated': 0,
- 'unchanged': 0,
- 'skipped': 0,
- 'errors': 0,
- 'excluded_phrases_count': 0
- }
- # Her arama terimi için işlem yap
- for term in search_terms:
- process_term(term, results)
- time.sleep(1) # API sınırlaması için bekle
- # Sonuçları özetle
- print("\nİşlem tamamlandı!")
- print(f"Taranan toplam sayfa: {results['updated'] + results['unchanged'] + results['skipped']}")
- print(f"Değişiklik yapılan sayfa: {results['updated']}")
- print(f"Değişiklik yapılmayan sayfa: {results['unchanged']}")
- print(f"Atlanan sayfa: {results['skipped']}")
- print(f"Hata alınan sayfa: {results['errors']}")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement