This page explains how to create python bots on Wikidata using the basic pywikibot library.

If you just want to run some scripts without writing a line of Python, see the included Wikidata scripts.

Caution! Caution: The methods and results may be changed in the future, as Wikibase evolves.
pywikibot currently does not support lexical data objects like Lexemes. Use WikibaseIntegrator or LexData to edit those instead.


To start contributing/testing using your bot's account you must add the following to your

Production site
usernames['wikidata']['wikidata'] = 'YourBot'
Testing site
usernames['wikidata']['test'] = 'YourBot'


see Wikidata:Creating a bot for an extended documentation. pywikibot core supports most Wikibase features already, e.g., qualifiers, sources, properties with item, coordinate, time, and string type.

import pwb  # only needed if you haven't installed the framework as side-package
import pywikibot
site = pywikibot.Site('en', 'wikipedia')  # any site will work, this is just an example
page = pywikibot.Page(site, 'Douglas Adams')
item = pywikibot.ItemPage.fromPage(page)  # this can be used for any page object
# you can also define an item like this
repo = site.data_repository()  # this is a DataSite object
item = pywikibot.ItemPage(repo, 'Q42')  # This will be functionally the same as the other item we defined
item.get()  # you need to call it to access any data.
sitelinks = item.sitelinks
aliases = item.aliases
if 'en' in item.labels:
    print('The label in English is: ' + item.labels['en'])
    if 'P31' in # instance of
        print(['P31'][0].sources[0])  # let's just assume it has sources.

# Edit an existing item
item.editLabels(labels={'en': 'Douglas Adams'}, summary='Edit label')
item.editDescriptions(descriptions={'en': 'English writer'}, summary='Edit description')
item.editAliases(aliases={'en':['Douglas Noel Adams', 'another alias']})
item.setSitelink(sitelink={'site': 'enwiki', 'title': 'Douglas Adams'}, summary='Set sitelink')
item.removeSitelink(site='enwiki', summary='Remove sitelink')

# You can also made this all in one time:
data = {'labels': {'en': 'Douglas Adams'},
  'descriptions': {'en': 'English writer'},
       'aliases': {'en': ['Douglas Noel Adams', 'another alias'], 'de': ['Douglas Noel Adams']},
     'sitelinks': [{'site': 'enwiki', 'title': 'Douglas Adams'}]}
item.editEntity(data, summary='Edit item')

See alsoEdit

Some bot examplesEdit

If you need more help on setting up your Pywikibot visit the #pywikibot IRC channel connect or pywikibot@ mailing list.