Wikipedia:Pywikibot
Tällä sivulla opastetaan Pywikibotin käyttöön suomenkielisessä Wikipediassa. Oman botin ajamiseen sinun pitää tutustua bottikäytäntöön, sekä rekisteröidä sille oma käyttäjätunnus. (ks wikipedia:botit)
Pywikibot
[muokkaa wikitekstiä]Asennus
[muokkaa wikitekstiä]- Tee Python virtualenv ja asenna pywikibot
mkdir pywikibot cd pywikibot python3 -m venv ./venv source venv/bin/activate pip install pywikibot
- Tee konfiguraatiotiedosto
echo "usernames['wikipedia']['fi'] = 'ZacheBot'" > user-config.py
Esimerkki-scriptit
[muokkaa wikitekstiä]Github
[muokkaa wikitekstiä]Generator-esimerkki
[muokkaa wikitekstiä]- Tee tiedosto "mybot.py" seuraavalla sisällöllä
import pywikibot
from pywikibot import pagegenerators
from pywikibot.bot import ExistingPageBot
class MyBot(ExistingPageBot):
update_options = {
'text': 'This is a test text',
'summary': 'Bot: a bot test edit with Pywikibot.',
}
def treat_page(self):
"""Load the given page, do some changes, and save it."""
text = self.current_page.text
text += '\n' + self.opt.text
self.put_current(text, summary=self.opt.summary)
def main():
"""Parse command line arguments and invoke bot."""
options = {}
gen_factory = pagegenerators.GeneratorFactory()
# Option parsing
local_args = pywikibot.handle_args() # global options
local_args = gen_factory.handle_args(local_args) # generators options
for arg in local_args:
opt, sep, value = arg.partition(':')
if opt in ('-summary', '-text'):
options[opt[1:]] = value
MyBot(generator=gen_factory.getCombinedGenerator(), **options).run()
if __name__ == '__main__':
main()
- Aja ohjelma
python mybot.py -site:wikipedia:fi -page:Ohje:Hiekkalaatikko -text:"A text added to the sandbox"
Scripti-esimerkki
[muokkaa wikitekstiä]- Tee tiedosto "myscript.py" seuraavalla sisällöllä
import pywikibot
site = pywikibot.Site("fi", "wikipedia")
site.login()
page = pywikibot.Page(site, 'Ohje:Hiekkalaatikko')
oldtext=page.text
newtext= page.text + "Foobar"
# Confirm
print("")
pywikibot.showDiff(oldtext, newtext)
pywikibot.info('Edit summary: {}'.format('summary'))
question='Do you want to accept these changes?'
choice = pywikibot.input_choice(
question,
[('Yes', 'y'), ('No', 'N')],
default='N',
automatic_quit=False
)
# Save
if choice == 'y':
if site.userinfo['messages']:
print("Warning: You have received a talk page message. Exiting.")
exit()
page.text = newtext
page.save('Testing')
- Aja ohjelma
python myscript.py
Petscan-esimerkki
[muokkaa wikitekstiä]Scripti hakee Petscanilla kolme Suomalaista museota joissa on {{auktoriteettitunnisteet}}-malline, mutta joissa ei ole {{perustiedot Wikidatassa}} -mallinetta. Tämän jälkeen scripti lisää perustiedot Wikidatassa -mallineen auktoriteettitunnisteet-mallineen yläpuolelle ja varmistuksen jälkeen tallentaa muutokset.
- Tee tiedosto "mypetscan.py" seuraavalla sisällöllä
import pywikibot
import json
from urllib.request import urlopen
site = pywikibot.Site("fi", "wikipedia")
site.login()
url = "https://petscan.wmflabs.org/?psid=24092213"
url += "&format=json"
url += "&output_limit=3"
response = urlopen(url)
data_json = json.loads(response.read())
for row in data_json['*'][0]['a']['*']:
page=pywikibot.Page(site, row['title'])
oldtext=page.text
replacementtext="\n{{Perustiedot Wikidatassa}}\n{{Auktoriteettitunnisteet"
if 'erustiedot Wikidatassa' in oldtext:
print("Skipping " + row['title'] + " - perustiedot Wikidatassa already added.")
continue
if 'Auktoriteettitunnisteet' in oldtext:
newtext=oldtext.replace("\n{{Auktoriteettitunnisteet", replacementtext)
elif 'auktoriteettitunnisteet' in oldtext:
newtext=oldtext.replace("\n{{auktoriteettitunnisteet", replacementtext)
else:
print("Skipping " + row['title'] + " - Auktoriteettitunnisteet template not found.")
continue
if oldtext == newtext:
print("Exiting. " + row['title'] + " - adding perustiedot Wikidatassa template failed.")
exit()
pywikibot.info('----')
pywikibot.showDiff(oldtext, newtext,2)
summary='Lisätään perustiedot Wikidatassa -malline'
pywikibot.info('Edit summary: {}'.format(summary))
question='Do you want to accept these changes?'
choice = pywikibot.input_choice(
question,
[('Yes', 'y'),('No', 'N')],
default='N',
automatic_quit=False
)
pywikibot.info(choice)
if choice == 'y':
if site.userinfo['messages']:
print("Warning: You have received a talk page message. Exiting.")
exit()
page.text=newtext
page.save(summary)
- Aja ohjelma
python mypetscan.py
Toolforgen-tietokantayhteydet
[muokkaa wikitekstiä]Toolforgen ohjeet
Toolforge-tunnusten teko
[muokkaa wikitekstiä]Toolforge-tunnuksen voi tehdä seuraavasti:
- Tee wmflabs-tunnus. Tämä on erillinen Wikipedian tunnuksesta.
- https://wikitech.wikimedia.org/wiki/Portal:Toolforge/Quickstart
- kirjauduttasi sisälle julkisen ssh-avaimen voi asettaa Wikitechin wikin asetuksissa OpenStack-välilehdellä.
- Kirjaudu toolforgeen
ssh zache-tool@login.toolforge.org
taimosh -a zache-tool@login.toolforge.org
Tietokantayhteys WMF:n tietokantareplikaan Toolforgesta
[muokkaa wikitekstiä]Tietokantadokumentaatio
- - https://www.mediawiki.org/wiki/Manual:Database_layout
- - https://www.mediawiki.org/wiki/Wikibase/Schema
Hyödyllisiä komentoja
- Kirjaudu SQL-konsoliin ja avaa yhteys fiwiki_p -tietokantaan:
sql fiwiki_p
Valmistelut
- Kirjaudu toolforgeen
ssh zache-tool@login.toolforge.org
taimosh -a zache-tool@login.toolforge.org
- Tee virtualenv ja asenna toolforge ja pymsql
python3 -m venv ./venv source venv/bin/activate pip install toolforge pymysql
4.) Tee tiedosto mydatabase_toolforge.py
#/usr/bin/python3
import toolforge
import pymysql.cursors
commons_con = toolforge.connect('commonswiki_p', cursorclass=pymysql.cursors.DictCursor )
try:
with commons_con.cursor() as cur:
cur.execute('SELECT el_from, el_to FROM externallinks WHERE el_index LIKE "http://fi.finna%" OR el_index LIKE "https://fi.finna%" LIMIT 10')
rows = cur.fetchall()
for row in rows:
print(row)
except:
print("ERROR")
- Aja ohjelma
python mydatabase_toolforge.py
Ohjelman ajaminen crontabissa Toolforgessa
[muokkaa wikitekstiä]HUOM: jsub on vanhentunut
- Tee mydatabase_toolforge.sh -scripti
#!/bin/sh source venv/bin/activate python mydatabase_toolforge.py
- Lisää se crontabiin komennolla
crontab -e
- Jsubin parametrit
- once = aja vain kerran
- -N hiekkalaatikko = ohjelman nimi
- -o logs/hiekkalaatikko.log = mihin logitiedosto kirjoitetaan
- -m 768m = käytettävissä oleva muistimäärä
- Jsubin parametrit
0 * * * jsub -once -j y -cwd -N mydatabase_toolforge -mem 768m -o mydatabase_toolforge.log sh -c mydatabase_toolforge.sh
Oman tietokannan luominen Toolforgessa
[muokkaa wikitekstiä]1.) Kirjaudu Toolforgeen
2.) Kirjaudu tietokantapalvelimeen Mariadb-konsoliin
# sql tools
tai
# mariadb --defaults-file=$HOME/replica.my.cnf -h tools.db.svc.wikimedia.cloud
tai
# mysql -u s51154 -p
3.) Mariadb-konsolissa luo oma tietokantataulu. Tietokantojen alkuosa on oma käyttäjätunnus ja kaksi alaviivaa. Korvaa 51154 omalla käyttäjätunnuksella joka löytyy replica.my.cnf -tiedostosta.
CREATE DATABASE s51154__example;
USE s51154__example;
CREATE TABLE example_table (
id INT AUTO_INCREMENT PRIMARY KEY,
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
value VARCHAR(255)
);
INSERT INTO example_table (value) VALUES ('Hello World');
4.) Tee virtualenv, aktivoi se ja asenna pymsql
python3 -m venv ./venv source venv/bin/activate pip install pymysql
5.) Tee tiedosto tooldatabase_example.py
#/usr/bin/python3
import configparser
import os
import pymysql
from time import time
def print_values(tool_con):
with tool_con.cursor() as cur:
sql='SELECT * FROM example_table'
cur.execute(sql, {})
rows = cur.fetchall()
for row in rows:
print(row)
def insert_value(tool_con, value):
sql='INSERT INTO example_table (value) VALUES (%(value)s)'
with tool_con.cursor() as cur:
cur.execute(sql, {
'value':str(value),
})
tool_con.commit()
HOME=os.environ.get('HOME') #get environment variable $HOME
replica_path=HOME + '/replica.my.cnf'
if os.path.exists(replica_path): #check that the file is found
config = configparser.ConfigParser()
config.read(replica_path)
else:
print('replica.my.cnf file not found')
exit(1)
tool_con = pymysql.connect(host='tools.db.svc.eqiad.wmflabs',
port=3306,
user=config['client']['user'].replace("'", ""),
password=config['client']['password'].replace("'", ""),
db='s51154__example',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
try:
insert_value(tool_con, 'foobarbiz ' + str(time()))
print_values(tool_con)
finally:
tool_con.close()
print("OK")
5.) Aja ohjelma
python tooldatabase_example.py
Tietokantayhteys WMF:n tietokantareplikaan omalta koneelta
[muokkaa wikitekstiä]Tietokantadokumentaatio
- - https://www.mediawiki.org/wiki/Manual:Database_layout
- - https://www.mediawiki.org/wiki/Wikibase/Schema
Valmistelut
- Tee wmflabs-tunnus
- wikimedia.cloud domain näkyy vain Wikimedian verkossa. Saadaksesi yhteyden omalta koneelta luo porttiforwadointi: 3306:fiwiki.web.db.svc.wikimedia.cloud:3306
ssh -L 3306:fiwiki.web.db.svc.wikimedia.cloud:3306 zache-tool@login.toolforge.org
- Kopioi wmflabsin salasana paikalliseksi tiedostoksi
scp zache-tool@login.toolforge.org:~/replica.my.cnf ./wikitech_replica.my.cnf
- Tee virtualenv, aktivoi se ja asenna pymsql
python3 -m venv ./venv source venv/bin/activate pip install pymysql
- 5.) Tee tiedosto mydatabase_local.py
#/usr/bin/python3
import os
import configparser
import pymysql
replica_path='wikitech_replica.my.cnf'
if os.path.exists(replica_path): #check that the file is found
config = configparser.ConfigParser()
config.read(replica_path)
else:
print(replica_path + ' file not found')
exit(1)
fiwiki_con = pymysql.connect(
host='localhost',
port=3306,
user=config['client']['user'].replace("'", ""),
password=config['client']['password'].replace("'", ""),
db='fiwiki_p',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
try:
with fiwiki_con.cursor() as cur:
cur.execute('SELECT rc_title, rc_user_text FROM recentchanges_compat WHERE rc_namespace=0 LIMIT 10')
rows = cur.fetchall()
for row in rows:
print(row)
finally:
fiwiki_con.close()
- Aja ohjelma
python mydatabase_local.py
PAWS-asennus
[muokkaa wikitekstiä]Lyhyt selostus miten saadaan pywikibot:n PAWS-instanssi (selainpohjainen asennus) pywikibotista käyttöön. PAWS on Wikimedia-palvelimella oleva Jupyter notebook -ympäristö.
- Klikkaa sivulla https://paws.wmflabs.org
sign in with mediawiki
- Aloita uusi projekti valitsemalla:
new -> python 3
- Kopioi Finna regexp -esimerkkikoodi muokkausikkunaan
- Aja koodi klikkaamalla
run
- Odotettu tulos
Scripti muokkaa Ohje:Hiekkalaatikko -sivua ja lisää sen alkuun tekstin "Hiekkalaatikko ei ole vasarakirves; skandinaavinen vasarakirves; + aikaleima". Tunnus käyttää Oauth-sisäänkirjautumista ja muokkaukset tehdään sillä käyttäjätunnuksella jolla käyttäjä on sisäänkirjautuneena Wikipediaan. Salasanaa ei tarvitse kirjoittaa.
Esimerkkejä
[muokkaa wikitekstiä]Katso myös
[muokkaa wikitekstiä]- Pywikibot (Mediawikin opas)