Wikipedia:Pywikibot

Wikipediasta
Siirry navigaatioon Siirry hakuun

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)

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ä]

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:

  1. Tee wmflabs-tunnus. Tämä on erillinen Wikipedian tunnuksesta.
  2. Kirjaudu toolforgeen
    • ssh zache-tool@login.toolforge.org
      tai
      mosh -a zache-tool@login.toolforge.org

Tietokantayhteys WMF:n tietokantareplikaan Toolforgesta

[muokkaa wikitekstiä]

Tietokantadokumentaatio

Hyödyllisiä komentoja

  • Kirjaudu SQL-konsoliin ja avaa yhteys fiwiki_p -tietokantaan: sql fiwiki_p

Valmistelut

  1. Kirjaudu toolforgeen
    • ssh zache-tool@login.toolforge.org
      tai
      mosh -a zache-tool@login.toolforge.org
  2. 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ä
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

Valmistelut

  1. Tee wmflabs-tunnus
  2. 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
  3. Kopioi wmflabsin salasana paikalliseksi tiedostoksi
    • scp zache-tool@login.toolforge.org:~/replica.my.cnf ./wikitech_replica.my.cnf
  4. 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ö.

  1. Klikkaa sivulla https://paws.wmflabs.org sign in with mediawiki
  2. Aloita uusi projekti valitsemalla: new -> python 3
  3. Kopioi Finna regexp -esimerkkikoodi muokkausikkunaan
  4. 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ä]