Χρήστης:Flubot/interwikibot2

Από Βικιλεξικό
Μετάβαση στην πλοήγηση Πήδηση στην αναζήτηση

Οδηγίες[επεξεργασία]

Χρειαζόμαστε ένα αρχείο με τίτλο ypodeikseis του τύπου:

téléphone||removal:mg||addition:eu
έλεγχος||removal:cs
șarpe||addition:ru fr en ro io

Για το πώς δημιουργείται αυτό το αρχείο βλέπε Χρήστης:AtouBot/generate-iw-actionlist.sh.

Μπορούμε επίσης να ψάξουμε συγκεκριμένες λέξεις με το script findiws.sh

interwikibot2.py[επεξεργασία]

O κώδικας προσαρμόστηκε (με λίγα χρόνια καθυστέρηση :P ) στα νέα δεδομένα του pywikibot. Στη μετάβαση έχασα το throttle (γραμμές 27-28) και κυρίως το logfile (γραμμή 115). Flyax (συζήτηση) 07:37, 30 Ιουνίου 2016 (UTC)

#!/usr/bin/python
# -*- coding: utf-8  -*-

import re
import codecs
import time

import pywikibot
from pywikibot import config, i18n, textlib
from pywikibot.compat import query

class job_iws:
  def __init__(self, site, title, mods):
    self.site = site
    self.title = title
    self.mods = mods

  def checkIfPageExists(self, wl, get_redirect=True, throttle=True, sysop=False,
                     oldid=None, change_edit_time=True, expandtemplates=False):
    # έλεγχος για το εάν υπάρχει η σελίδα σε ξένο Βικιλεξικό μέσω API query
    # γράφτηκε αρχικά από τον Ariel Glenn (που έκλεψε κώδικα από το pywikipedia)
    
    params = {
        'action': 'query',
        'titles': self.title,
        }
    #if throttle:
    #    pywikibot.get_throttle()
        # retrying loop is done by query.GetData
    data = query.GetData(params, wl)
    if 'error' in data:
        raise RuntimeError("API query error: %s" % data)
    if not 'pages' in data['query']:
        raise RuntimeError("API query error, no pages found: %s" % data)
    pageInfo = data['query']['pages'].values()[0]
    if data['query']['pages'].keys()[0] == "-1":
        if 'missing' in pageInfo:
            return False
        elif 'invalid' in pageInfo:
            raise pywikibot.BadTitle('BadTitle: %s' % page)
#            return False
        else:
            return False
    else:
        # page exists
        return True

  def treat_iws(self, keimeno,):
    summary = ""
    #marker = '@@'
    #while marker in keimeno:
    #   marker += '@'

    site = self.site
    try:	
         interwiki = textlib.getLanguageLinks(keimeno, site)
	 iwcopy = textlib.getLanguageLinks(keimeno, site)

         # αφαιρούμε τα interwikis
         textnoiws = textlib.removeLanguageLinks(keimeno, site)

	 # βρίσκουμε τα σκάρτα interwikis
	 for key in interwiki.keys():
		if interwiki[key].title() != self.title:
			print "invalid iw", key, interwiki[key]
			del interwiki[key]

	 # εδώ αρχίζει ο νέος κώδικας
	 # mods: βλέπουμε αν έχει +, διαφορετικά πάμε στα -
	 if self.mods.has_key("add"):
		found = 0
		for key in self.mods["add"]:
		   if key != "":
			# μετατρέπουμε το πρώτο "+" σε site object
			key = key.replace('_','-')
			key1 = pywikibot.Site(key)			
			# ελέγχουμε αν λείπει από το interwiki, διαφορετικά πάμε στο επόμενο
			if not interwiki.has_key(key1):
				# ελέγχουμε αν αντιστοιχεί σε υπαρκτή σελίδα
				if self.checkIfPageExists(key1): 
					# το προσθέτουμε
					found = found + 1
					if (found == 1):
						summary = u", προσθήκη %s"%key
					else:
						summary = summary + ", %s"%key
					interwiki[key1] = pywikibot.Page(key1, self.title)

	 # mods: βλέπουμε αν έχει -, διαφορετικά πάμε να επιστρέψουμε αποτέλεσμα. Τα υπόλοιπα σχεδόν όπως και παραπάνω
	 if self.mods.has_key("rem"):
		found = 0
		for key in self.mods["rem"]:
		   if key != "":
			key = key.replace('_','-')
			key1 = pywikibot.Site(key)			
			if interwiki.has_key(key1):
				if not self.checkIfPageExists(key1):
					found = found + 1
					if (found == 1):
						summary = summary + u", αφαίρεση " + key
					else:
						summary = summary + ", " + key
					del interwiki[key1]
	 
	 if (iwcopy == interwiki):
		return keimeno, ""
	 newiws = textlib.replaceLanguageLinks(textnoiws, interwiki, site)
         return newiws, summary
    except pywikibot.NoSuchSite:
	 #raise
	 print u"link to non-existant wiktionary in %s" % (self.title)
         return keimeno, ""

def main():
   #wikipedia.setLogfileStatus(True, 'iw-log.txt')
   acceptall = False
   page_tag = re.compile('(.*)')
   rmv = re.compile('removal')
   eof=0
   fin = codecs.open('ypodeikseis1', 'r', 'utf-8')
   count = 0

   line1 = fin.readline()
   while line1 != "":
	line = page_tag.search(line1).group(1)
	line1 = fin.readline()
	grammi = line.split("||")
	title = grammi[0]
	mod = {}
	for i in range(len(grammi)-1):
		
		mods = grammi[i+1].split(':')
		sites = mods[1].split(' ')
		# if "as" or "mo" in sites, remove it
		if rmv.search(mods[0]):
			mod["rem"]=sites
		else:
			mod["add"]=sites
	print u"Προτάσεις:", line
	# τωρα πρέπει να φορτώσουμε τη σελίδα title

	try:
		mysite= pywikibot.getSite()
		page = pywikibot.Page(mysite, title)
		# ελέγχουμε τις προτεινόμενες αλλαγές
		class_job_iws = job_iws(mysite, page.title(), mod)
		arxiko = page.get()
		teliko, summary = class_job_iws.treat_iws(arxiko)	

	   # αποθηκεύουμε τη σελίδα στη νέα της μορφή
	        if (teliko == arxiko):
	          pywikibot.output('No changes were necessary in %s' % page.title())
	        else:
		  summary = u"ενημέρωση των interwikis" + summary
		  print summary
	          pywikibot.output(u'>>> %s <<<' % page.title())
	          pywikibot.showDiff(arxiko, teliko)
	          # DEBUG
	
		  if not acceptall:
			choice=pywikibot.input_choice(u'Θέλετε να δεχτείτε αυτές τις αλλαγές;', [['Yes', 'y'],['No', 'N'], ['All','a']], None, True, False)
			if choice in ['a', 'A']:
	                  acceptall = True
		  if acceptall or choice in ['y', 'Y']:
			print "saving"
			page.put(teliko, summary, minorEdit=True)

	except pywikibot.NoPage:
		print u"Η σελίδα %s δεν υπάρχει;;!!"%page.aslink()
	except pywikibot.IsRedirectPage:
		pass
	except pywikibot.LockedPage:
		pass 

   fin.close()


if __name__ == "__main__":
    try:
        main()
    finally:
        pywikibot.stopme()

findiws.sh[επεξεργασία]

#!/bin/bash

usage() {
  echo "Usage: $0 word"
  echo "Αυτό βρίσκει μια λέξη στο αρχείο iws_tmp/all-lemmas-sorted.txt και μαζεύει από εκεί όλα τα interwikis"
  echo "και μας δίνει μια γραμμή για το ypodeikseis"
  echo
  echo "For example:"
  echo "$0 geologist"
  exit 1
}

if [ -z "$1"  ]; then
  usage
fi
entry=`echo "$1"`
entry1=`echo $entry | sed -e "s/ /_/g"`

declare -a interwiki
declare -a langlinks

langlinks=`curl --retry 10 -f "http://el.wiktionary.org/w/api.php?action=query&prop=langlinks&lllimit=500&format=xml&titles=$entry1" | sed -e 's/>/>\n/g' | grep lang | awk -F 'lang="' '{ print $2 }' | awk -F '"' '{ print $1 }'`

interwiki=`grep "^$entry|" iws_tmp/all-lemmas-sorted.txt | grep -v "|el" | awk -F '|' '{ print $3 }'`

removals=""
for i in $langlinks; do
   found=0
   for j in $interwiki; do
      if [ $i = $j ]; then
         found=1
      fi
   done
   if [ $found = 0 ]; then
      removals="$removals$i "     
   fi
done

additions=""
for i in $interwiki; do
    found=0
    for j in $langlinks; do
       if [ $i = $j ]; then
          found=1
       fi
    done
        if [ $found = 0 ]; then
       additions="$additions$i "
    fi
done

if [ "$removals" != "" ]; then
   removals="||removals:$removals"
fi
if [ "$additions" != "" ]; then
   additions="||additions:$additions"
fi

result="$entry$additions$removals"
if [ "$removals" = "" -a "$additions" = "" ];then
	result=""
fi
if [ "$result" != "" ]; then
   echo "$result" >> /home/flyax/wiki/pywikipedia/ypodeikseis
fi
# προστέθηκε το αποτέλεσμα στο αρχείο ypodeikseis που χρησιμοποιεί το interwikibot2.py
# η διαδρομή του αρχείου ypodeikseis θα πρέπει να τροποποιηθεί κατάλληλα από άλλον χρήστη