Advertisement
cobija

pywiki

Dec 24th, 2024 (edited)
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.24 KB | Source Code | 0 0
  1. import re
  2. import mwclient
  3. import time
  4. from concurrent.futures import ThreadPoolExecutor
  5. import os
  6. from dotenv import load_dotenv
  7. from config import PATTERNS, replacements, excluded_pages, search_terms, excluded_phrases
  8.  
  9. # .env dosyasını yükle
  10. load_dotenv()
  11.  
  12. # Ortam değişkenlerini al
  13. USERNAME = os.getenv('WIKI_USERNAME')
  14. PASSWORD = os.getenv('WIKI_PASSWORD')
  15.  
  16. if not USERNAME or not PASSWORD:
  17.     print("Kullanıcı adı veya şifre belirtilmemiş! Lütfen .env dosyasını kontrol edin.")
  18.     exit(1)
  19.  
  20. def is_excluded_line(line):
  21.     """Bir satırın şablon parametresi, kategori veya kaynak şablonu içerip içermediğini kontrol eder."""
  22.     return (
  23.         re.match(r'^\|.*=.*$', line.strip()) or
  24.         re.match(r'^\[\[Kategori:.*\]\]$', line.strip()) or
  25.         re.search(r'<ref(=[^>]*)?>.*?</ref>', line) or
  26.         re.search(r'\{\{[^}]*kaynağı[^}]*\}\}', line, re.IGNORECASE)
  27.     )
  28.  
  29. def is_excluded_phrase(line, pattern_key):
  30.     """Bir satırda hariç tutulan kelime öbeklerinin olup olmadığını kontrol eder."""
  31.     if pattern_key in excluded_phrases:
  32.         return any(phrase in line for phrase in excluded_phrases[pattern_key])
  33.     return False
  34.  
  35. def replace_text_in_line(line):
  36.     """Bir satırdaki uygun ifadeleri değiştiren işlev."""
  37.     modified_line = line
  38.     for pattern_key, pattern in PATTERNS.items():
  39.         # Eğer satırda hariç tutulan bir kelime öbeği varsa, bu pattern için değişiklik yapma
  40.         if is_excluded_phrase(line, pattern_key):
  41.             continue
  42.        
  43.         modified_line = re.sub(pattern,
  44.                              lambda m: replacements[pattern_key].get(m.group(0), m.group(0)),
  45.                              modified_line)
  46.     return modified_line
  47.  
  48. def replace_text_everywhere(text):
  49.     """Metindeki tüm alanlarda belirtilen ifadeleri kurallara göre değiştirir."""
  50.     lines = text.splitlines()
  51.     return "\n".join(replace_text_in_line(line) if not is_excluded_line(line) else line for line in lines)
  52.  
  53. def process_pages_parallel(pages, results):
  54.     """Sayfaları paralel olarak işleyen yardımcı işlev."""
  55.     total_pages = len(pages)
  56.     processed_count = 0
  57.  
  58.     def process_page(page_name):
  59.         nonlocal processed_count
  60.         try:
  61.             page = site.pages[page_name]
  62.             if page.name.lower() in {excluded.lower() for excluded in excluded_pages}:
  63.                 results['skipped'] += 1
  64.                 processed_count += 1
  65.                 print(f"Taranan sayfa: {processed_count}/{total_pages}", end="\r")
  66.                 return
  67.  
  68.             original_text = page.text()
  69.             updated_text = replace_text_everywhere(original_text)
  70.  
  71.             if original_text != updated_text:
  72.                 page.save(updated_text, summary="Ana madde adına ya da yaygın kullanıma uygun ifade düzenlemeleri yapıldı.")
  73.                 results['updated'] += 1
  74.                 print(f"Değişiklik yapıldı: {page.name}")
  75.             else:
  76.                 results['unchanged'] += 1
  77.         except mwclient.errors.APIError as api_error:
  78.             print(f"API Hatası: {page.name} - {api_error.code}: {api_error.info}")
  79.             results['errors'] += 1
  80.         except Exception as e:
  81.             print(f"Hata: {page.name} - {type(e).__name__}: {e}")
  82.             results['errors'] += 1
  83.         finally:
  84.             processed_count += 1
  85.             print(f"Taranan sayfa: {processed_count}/{total_pages}", end="\r")
  86.  
  87.     with ThreadPoolExecutor() as executor:
  88.         executor.map(process_page, pages)
  89.  
  90. def process_term(term, results):
  91.     """Belirli bir terim için arama ve bağlantı verilen sayfaları işleyerek değişiklik yapar."""
  92.     term_cleaned = term.strip('"')
  93.     print(f"'{term_cleaned}' ifadesi aranıyor ve işleniyor...")
  94.  
  95.     try:
  96.         search_results = list(site.search(term_cleaned, namespace=0))
  97.         linked_pages = list(site.pages[term_cleaned].backlinks(namespace=0))
  98.  
  99.         all_pages = {result['title'] for result in search_results}
  100.         all_pages.update(page.name for page in linked_pages)
  101.  
  102.         filtered_pages = {page for page in all_pages if page.lower() not in {excluded.lower() for excluded in excluded_pages}}
  103.         process_pages_parallel(filtered_pages, results)
  104.  
  105.     except Exception as e:
  106.         print(f"'{term_cleaned}' işlemi sırasında hata: {e}")
  107.  
  108. # Vikipedi'ye bağlan ve giriş yap
  109. site = mwclient.Site('tr.wikipedia.org')
  110.  
  111. try:
  112.     site.login(USERNAME, PASSWORD)
  113.     print("Vikipedi'ye başarıyla girildi.")
  114. except Exception as e:
  115.     print(f"Vikipedi'ye giriş başarısız: {e}")
  116.     exit(1)
  117.  
  118. # Sonuçlar için kılavuz
  119. results = {
  120.     'updated': 0,
  121.     'unchanged': 0,
  122.     'skipped': 0,
  123.     'errors': 0,
  124.     'excluded_phrases_count': 0
  125. }
  126.  
  127. # Her arama terimi için işlem yap
  128. for term in search_terms:
  129.     process_term(term, results)
  130.     time.sleep(1)  # API sınırlaması için bekle
  131.  
  132. # Sonuçları özetle
  133. print("\nİşlem tamamlandı!")
  134. print(f"Taranan toplam sayfa: {results['updated'] + results['unchanged'] + results['skipped']}")
  135. print(f"Değişiklik yapılan sayfa: {results['updated']}")
  136. print(f"Değişiklik yapılmayan sayfa: {results['unchanged']}")
  137. print(f"Atlanan sayfa: {results['skipped']}")
  138. print(f"Hata alınan sayfa: {results['errors']}")
Tags: vikipedi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement