Jump to content

MediaWiki API/Pywikibot

From Wikiversity

The following code samples demonstrate functions that may be used in Python scripts with Pywikibot to access the MediaWiki API.

API Documentation

[edit | edit source]

PAWS Test Platform

[edit | edit source]

Wikimedia hosts a Pywikibot web shell for easy bot testing. See mw:Manual:Pywikibot/PAWS for more information.

Hello Pywikibot

[edit | edit source]

Simple example to begin testing Pywikibot.

import pywikibot

site = pywikibot.Site('en', 'wikiversity')
page = pywikibot.Page(site, "Wikiversity:Sandbox")

title = page.title()
text = page.text

text += "\n\nHello from Pywikibot!"

try:
    if page.text != text:
        print(title)
        page.text = text
        page.save(summary='Testing Pywikibot', minor=True, botflag=True)
except Exception as exception:
    print(exception)

More Sample Code

[edit | edit source]
import pywikibot
import re

site = pywikibot.Site("en", "wikiversity")


def addsection(title, summary, text):
    page = pywikibot.Page(site, title)
    result = pywikibot.site.APISite.editpage(
        site,
        page=page,
        summary=summary,
        minor=False,
        text=text,
        section="new"
    )
    return result


def allimages(start="!", prefix="", reverse=False, step=None, total=None, content=False):
    pages = pywikibot.site.APISite.allimages(
        site,
        start=start,
        prefix=prefix,
        reverse=reverse,
        step=step,
        total=total,
        content=content
    )
    return pages


def allpages(prefix="", namespace=0, filterredir=None, content=False):
    pages = pywikibot.site.APISite.allpages(
        site,
        prefix=prefix,
        namespace=namespace,
        filterredir=filterredir,
        content=content
    )
    return pages


def allredirects(prefix="", namespace=0):
    return allpages(
        prefix=prefix,
        namespace=namespace,
        filterredir=True
    )


def categorymembers(category):
    category = pywikibot.Category(site, category)
    pages = pywikibot.site.APISite.categorymembers(
        site,
        category=category
    )
    return pages


def editpage(title, summary, text, minor=True):
    page = pywikibot.Page(site, title)
    page.text = text
    result = pywikibot.site.APISite.editpage(
        site,
        page=page,
        summary=summary,
        minor=minor
    )
    return result


def embeddedin(title, filterRedirects=None, namespaces=None, step=None, total=None, content=False):
    page = pywikibot.Page(site, title)
    pages = pywikibot.site.APISite.page_embeddedin(
        site,
        page=page,
        filterRedirects = filterRedirects,
        namespaces = namespaces,
        step = step,
        total = total,
        content = content
    )
    return pages


def extlinks(title):
    page = pywikibot.Page(site, title)
    links = pywikibot.site.APISite.page_extlinks(
        site,
        page=page
    )
    return links


def logevents(title):
    page = pywikibot.Page(site, title)
    links = pywikibot.site.APISite.page_extlinks(
        site,
        page=page
    )
    return links


def movepage(title, newtitle, summary, noredirect=False):
    page = pywikibot.Page(site, title)
    page = pywikibot.site.APISite.movepage(
        site,
        page=page,
        newtitle=newtitle,
        summary=summary,
        noredirect=noredirect
    )
    return page


def newfiles(user=None, start=None, end=None, reverse=False, step=None, total=None):
    files = pywikibot.site.APISite.newfiles(
        site,
        start=start,
        end=end,
        reverse=reverse,
        step=step,
        total=total
    )
    return files


def pagebacklinks(title):
    page = pywikibot.Page(site, title)
    pages = pywikibot.site.APISite.pagebacklinks(
        site,
        page=page
    )
    return pages


def pagelinks(title):
    page = pywikibot.Page(site, title)
    pages = pywikibot.site.APISite.pagelinks(
        site,
        page=page
    )
    return pages


def get_allpages():
    start = "!"
    while (True):
        try:
            pages = allimages(start=start, total=10, content=True)
            for page in pages:
                print(page.title())
                print(page.text)
            start = page.title()
            start = start[5:] + "!"
            break
        except:
            break

def dump(obj):
  for attr in dir(obj):
    print("obj.%s = %s" % (attr, getattr(obj, attr)))


def files_missing_license(start, end):
    tags = [
        "{{information",
        "{{pd",
        "{{cc-by",
        "{{gfdl",
        "{{self",
        "{{bsd",
        "{{gpl",
        "{{lgpl",
        "{{free",
        "{{copyright",
        "{{fairuse",
        "{{non-free",
        "{{software",
        "{{no license",
        "{{no fairuse"
    ]

    files = newfiles(
        start=start,
        end=end,
        reverse=True)

    result = list()

    for file in files:
        text = file[0].text.lower()
        if not (any(word in text for word in tags)):
            result.append(file)

    return result

def filekey(file):
    return file[2] + file[0].title()

def add_missing_license_information(start, end):
    usermsg = (
        "Thank you for uploading files to Wikiversity. See [[Wikiversity:Media]] for copyright and license requirements "
        "for Wikiversity files. All files must have copyright and/or license information added to the file.\n\n"
        "Instructions for adding copyright and/or license information are available at [[Wikiversity:License tags]]. "
        "Files must be updated within seven days or they may be removed without further notice.\n\n"
        "The following files are missing copyright and/or license information:\n"
    )
    summary = "Missing License Information"

    files = files_missing_license(start, end)
    files = sorted(files, key=filekey)
    user = ""
    print("== Files Missing License Information ==")
    for file in files:
        if user != file[2]:
            if user != "":
                title = "User_talk:" + user
                text += "\n~~~~\n"
                addsection(title, summary, text)
            user = file[2]
            text = usermsg
            print(";[[User_talk:" + user + "]]")
        title = file[0].title()
        text += "* [[:" + title + "]]\n"
        print(":[[:" + title + "]]")
        addsection(title, summary, "{{subst:nld}}")
    if user != "":
        title = "User_talk:" + user
        text += "\n~~~~\n"
        addsection(title, summary, text)


def show_sister_backlinks(wiki, language = "en"):
    global site

    site = pywikibot.Site(language, wiki.lower())
    pages = embeddedin(title = "Template:Wikiversity", namespaces = 0, content = True)
    pages = sorted(pages)
    for page in pages:
        title = page.title()
        regex = re.compile("{{wikiversity[^}]*}}", re.IGNORECASE)
        match = regex.search(page.text)
        if(match == None):
            continue

        text = match.group()
        if(text.lower() == "{{wikiversity}}"):
            print("* [[" + wiki + ":" + title + "]] -> [[" + title + "]]")
            continue

        match = re.search("\|[^|}]*[|}]", text)
        if(match != None):
            text = match.group()
            text.replace("at=", "")
            print("* [[" + wiki + ":" + title + "]] -> [[" + text[1:-1] + "]]")
            continue

        print(title + " -> " + text)