Χρήστης: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 θα πρέπει να τροποποιηθεί κατάλληλα από άλλον χρήστη