A Python robot that edits Wikipedia and interacts with people over IRC https://en.wikipedia.org/wiki/User:EarwigBot
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

toolset.rst 11 KiB

12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. The Wiki Toolset
  2. ================
  3. EarwigBot's answer to the `Pywikipedia framework`_ is the Wiki Toolset
  4. (:py:mod:`earwigbot.wiki`), which you will mainly access through
  5. :py:attr:`bot.wiki <earwigbot.bot.Bot.wiki>`.
  6. :py:attr:`bot.wiki <earwigbot.bot.Bot.wiki>` provides three methods for the
  7. management of Sites - :py:meth:`~earwigbot.wiki.sitesdb.SitesDB.get_site`,
  8. :py:meth:`~earwigbot.wiki.sitesdb.SitesDB.add_site`, and
  9. :py:meth:`~earwigbot.wiki.sitesdb.SitesDB.remove_site`. Sites are objects that
  10. simply represent a MediaWiki site. A single instance of EarwigBot (i.e. a
  11. single *working directory*) is expected to relate to a single site or group of
  12. sites using the same login info (like all WMF wikis with `CentralAuth`_).
  13. Load your default site (the one that you picked during setup) with
  14. ``site = bot.wiki.get_site()``.
  15. Dealing with other sites
  16. ~~~~~~~~~~~~~~~~~~~~~~~~
  17. *Skip this section if you're only working with one site.*
  18. If a site is *already known to the bot* (meaning that it is stored in the
  19. :file:`sites.db` file, which includes just your default wiki at first), you can
  20. load a site with ``site = bot.wiki.get_site(name)``, where ``name`` might be
  21. ``"enwiki"`` or ``"frwiktionary"`` (you can also do
  22. ``site = bot.wiki.get_site(project="wikipedia", lang="en")``). Recall that not
  23. giving any arguments to ``get_site()`` will return the default site.
  24. :py:meth:`~earwigbot.wiki.sitesdb.SitesDB.add_site` is used to add new sites to
  25. the sites database. It may be called with similar arguments as
  26. :py:meth:`~earwigbot.wiki.sitesdb.SitesDB.get_site`, but the difference is
  27. important. :py:meth:`~earwigbot.wiki.sitesdb.SitesDB.get_site` only needs
  28. enough information to identify the site in its database, which is usually just
  29. its name; the database stores all other necessary connection info. With
  30. :py:meth:`~earwigbot.wiki.sitesdb.SitesDB.add_site`, you need to provide enough
  31. connection info so the toolset can successfully access the site's API/SQL
  32. databases and store that information for later. That might not be much; for WMF
  33. wikis, you can usually use code like this::
  34. project, lang = "wikipedia", "es"
  35. try:
  36. site = bot.wiki.get_site(project=project, lang=lang)
  37. except earwigbot.SiteNotFoundError:
  38. # Load site info from http://es.wikipedia.org/w/api.php:
  39. site = bot.wiki.add_site(project=project, lang=lang)
  40. This works because EarwigBot assumes that the URL for the site is
  41. ``"//{lang}.{project}.org"`` and the API is at ``/w/api.php``; this might
  42. change if you're dealing with non-WMF wikis, where the code might look
  43. something more like::
  44. project, lang = "mywiki", "it"
  45. try:
  46. site = bot.wiki.get_site(project=project, lang=lang)
  47. except earwigbot.SiteNotFoundError:
  48. # Load site info from http://mysite.net/mywiki/it/s/api.php:
  49. base_url = "http://mysite.net/" + project + "/" + lang
  50. db_name = lang + project + "_p"
  51. sql = {host: "sql.mysite.net", db: db_name}
  52. site = bot.wiki.add_site(base_url=base_url, script_path="/s", sql=sql)
  53. :py:meth:`~earwigbot.wiki.sitesdb.SitesDB.remove_site` does the opposite of
  54. :py:meth:`~earwigbot.wiki.sitesdb.SitesDB.add_site`: give it a site's name or a
  55. project/lang pair like :py:meth:`~earwigbot.wiki.sitesdb.SitesDB.get_site`
  56. takes, and it'll remove that site from the sites database.
  57. Sites
  58. ~~~~~
  59. :py:class:`earwigbot.wiki.Site <earwigbot.wiki.site.Site>` objects provide the
  60. following attributes:
  61. - :py:attr:`~earwigbot.wiki.site.Site.name`: the site's name (or "wikiid"),
  62. like ``"enwiki"``
  63. - :py:attr:`~earwigbot.wiki.site.Site.project`: the site's project name, like
  64. ``"wikipedia"``
  65. - :py:attr:`~earwigbot.wiki.site.Site.lang`: the site's language code, like
  66. ``"en"``
  67. - :py:attr:`~earwigbot.wiki.site.Site.domain`: the site's web domain, like
  68. ``"en.wikipedia.org"``
  69. - :py:attr:`~earwigbot.wiki.site.Site.url`: the site's full base URL, like
  70. ``"https://en.wikipedia.org"``
  71. and the following methods:
  72. - :py:meth:`api_query(**kwargs) <earwigbot.wiki.site.Site.api_query>`: does an
  73. API query with the given keyword arguments as params
  74. - :py:meth:`sql_query(query, params=(), ...)
  75. <earwigbot.wiki.site.Site.sql_query>`: does an SQL query and yields its
  76. results (as a generator)
  77. - :py:meth:`~earwigbot.wiki.site.Site.get_replag`: returns the estimated
  78. database replication lag (if we have the site's SQL connection info)
  79. - :py:meth:`namespace_id_to_name(id, all=False)
  80. <earwigbot.wiki.site.Site.namespace_id_to_name>`: given a namespace ID,
  81. returns the primary associated namespace name (or a list of all names when
  82. ``all`` is ``True``)
  83. - :py:meth:`namespace_name_to_id(name)
  84. <earwigbot.wiki.site.Site.namespace_name_to_id>`: given a namespace name,
  85. returns the associated namespace ID
  86. - :py:meth:`get_page(title, follow_redirects=False, ...)
  87. <earwigbot.wiki.site.Site.get_page>`: returns a ``Page`` object for the given
  88. title (or a :py:class:`~earwigbot.wiki.category.Category` object if the
  89. page's namespace is "``Category:``")
  90. - :py:meth:`get_category(catname, follow_redirects=False, ...)
  91. <earwigbot.wiki.site.Site.get_category>`: returns a ``Category`` object for
  92. the given title (sans namespace)
  93. - :py:meth:`get_user(username) <earwigbot.wiki.site.Site.get_user>`: returns a
  94. :py:class:`~earwigbot.wiki.user.User` object for the given username
  95. Pages and categories
  96. ~~~~~~~~~~~~~~~~~~~~
  97. Create :py:class:`earwigbot.wiki.Page <earwigbot.wiki.page.Page>` objects with
  98. :py:meth:`site.get_page(title) <earwigbot.wiki.site.Site.get_page>`,
  99. :py:meth:`page.toggle_talk() <earwigbot.wiki.page.Page.toggle_talk>`,
  100. :py:meth:`user.get_userpage() <earwigbot.wiki.user.User.get_userpage>`, or
  101. :py:meth:`user.get_talkpage() <earwigbot.wiki.user.User.get_talkpage>`. They
  102. provide the following attributes:
  103. - :py:attr:`~earwigbot.wiki.page.Page.site`: the page's corresponding
  104. :py:class:`~earwigbot.wiki.site.Site` object
  105. - :py:attr:`~earwigbot.wiki.page.Page.title`: the page's title, or pagename
  106. - :py:attr:`~earwigbot.wiki.page.Page.exists`: whether or not the page exists
  107. - :py:attr:`~earwigbot.wiki.page.Page.pageid`: an integer ID representing the
  108. page
  109. - :py:attr:`~earwigbot.wiki.page.Page.url`: the page's URL
  110. - :py:attr:`~earwigbot.wiki.page.Page.namespace`: the page's namespace as an
  111. integer
  112. - :py:attr:`~earwigbot.wiki.page.Page.protection`: the page's current
  113. protection status
  114. - :py:attr:`~earwigbot.wiki.page.Page.is_talkpage`: ``True`` if the page is a
  115. talkpage, else ``False``
  116. - :py:attr:`~earwigbot.wiki.page.Page.is_redirect`: ``True`` if the page is a
  117. redirect, else ``False``
  118. and the following methods:
  119. - :py:meth:`~earwigbot.wiki.page.Page.reload`: forcibly reloads the page's
  120. attributes (emphasis on *reload* - this is only necessary if there is reason
  121. to believe they have changed)
  122. - :py:meth:`toggle_talk(...) <earwigbot.wiki.page.Page.toggle_talk>`: returns a
  123. content page's talk page, or vice versa
  124. - :py:meth:`~earwigbot.wiki.page.Page.get`: returns page content
  125. - :py:meth:`~earwigbot.wiki.page.Page.get_redirect_target`: if the page is a
  126. redirect, returns its destination
  127. - :py:meth:`~earwigbot.wiki.page.Page.get_creator`: returns a
  128. :py:class:`~earwigbot.wiki.user.User` object representing the first user to
  129. edit the page
  130. - :py:meth:`edit(text, summary, minor=False, bot=True, force=False)
  131. <earwigbot.wiki.page.Page.edit>`: replaces the page's content with ``text``
  132. or creates a new page
  133. - :py:meth:`add_section(text, title, minor=False, bot=True, force=False)
  134. <earwigbot.wiki.page.Page.add_section>`: adds a new section named ``title``
  135. at the bottom of the page
  136. - :py:meth:`copyvio_check(...)
  137. <earwigbot.wiki.copyvios.CopyvioMixin.copyvio_check>`: checks the page for
  138. copyright violations
  139. - :py:meth:`copyvio_compare(url, ...)
  140. <earwigbot.wiki.copyvios.CopyvioMixin.copyvio_compare>`: checks the page like
  141. :py:meth:`~earwigbot.wiki.copyvios.CopyvioMixin.copyvio_check`, but
  142. against a specific URL
  143. Additionally, :py:class:`~earwigbot.wiki.category.Category` objects (created
  144. with :py:meth:`site.get_category(name) <earwigbot.wiki.site.Site.get_category>`
  145. or :py:meth:`site.get_page(title) <earwigbot.wiki.site.Site.get_page>` where
  146. ``title`` is in the ``Category:`` namespace) provide the following additional
  147. method:
  148. - :py:meth:`get_members(use_sql=False, limit=None, ...)
  149. <earwigbot.wiki.category.Category.get_members>`: iterates over
  150. :py:class:`~earwigbot.wiki.page.Page`\ s in the category, until either the
  151. category is exhausted or (if given) ``limit`` is reached
  152. Users
  153. ~~~~~
  154. Create :py:class:`earwigbot.wiki.User <earwigbot.wiki.user.User>` objects with
  155. :py:meth:`site.get_user(name) <earwigbot.wiki.site.Site.get_user>` or
  156. :py:meth:`page.get_creator() <earwigbot.wiki.page.Page.get_creator>`. They
  157. provide the following attributes:
  158. - :py:attr:`~earwigbot.wiki.user.User.site`: the user's corresponding
  159. :py:class:`~earwigbot.wiki.site.Site` object
  160. - :py:attr:`~earwigbot.wiki.user.User.name`: the user's username
  161. - :py:attr:`~earwigbot.wiki.user.User.exists`: ``True`` if the user exists, or
  162. ``False`` if they do not
  163. - :py:attr:`~earwigbot.wiki.user.User.userid`: an integer ID representing the
  164. user
  165. - :py:attr:`~earwigbot.wiki.user.User.blockinfo`: information about any current
  166. blocks on the user (``False`` if no block, or a dict of
  167. ``{"by": blocking_user, "reason": block_reason,
  168. "expiry": block_expire_time}``)
  169. - :py:attr:`~earwigbot.wiki.user.User.groups`: a list of the user's groups
  170. - :py:attr:`~earwigbot.wiki.user.User.rights`: a list of the user's rights
  171. - :py:attr:`~earwigbot.wiki.user.User.editcount`: the number of edits made by
  172. the user
  173. - :py:attr:`~earwigbot.wiki.user.User.registration`: the time the user
  174. registered as a :py:obj:`time.struct_time`
  175. - :py:attr:`~earwigbot.wiki.user.User.emailable`: ``True`` if you can email the
  176. user, ``False`` if you cannot
  177. - :py:attr:`~earwigbot.wiki.user.User.gender`: the user's gender (``"male"``,
  178. ``"female"``, or ``"unknown"``)
  179. and the following methods:
  180. - :py:meth:`~earwigbot.wiki.user.User.reload`: forcibly reloads the user's
  181. attributes (emphasis on *reload* - this is only necessary if there is reason
  182. to believe they have changed)
  183. - :py:meth:`~earwigbot.wiki.user.User.get_userpage`: returns a
  184. :py:class:`~earwigbot.wiki.page.Page` object representing the user's userpage
  185. - :py:meth:`~earwigbot.wiki.user.User.get_talkpage`: returns a
  186. :py:class:`~earwigbot.wiki.page.Page` object representing the user's talkpage
  187. Additional features
  188. ~~~~~~~~~~~~~~~~~~~
  189. Not all aspects of the toolset are covered here. Explore `its code and
  190. docstrings`_ to learn how to use it in a more hands-on fashion. For reference,
  191. :py:attr:`bot.wiki <earwigbot.bot.Bot.wiki>` is an instance of
  192. :py:class:`earwigbot.wiki.SitesDB <earwigbot.wiki.sitesdb.SitesDB>` tied to the
  193. :file:`sites.db` file in the bot's working directory.
  194. .. _Pywikipedia framework: http://pywikipediabot.sourceforge.net/
  195. .. _CentralAuth: http://www.mediawiki.org/wiki/Extension:CentralAuth
  196. .. _its code and docstrings: https://github.com/earwig/earwigbot/tree/develop/earwigbot/wiki