30 releases

0.6.1 Jan 7, 2024
0.6.0 Dec 15, 2023
0.6.0-rc.1 Nov 2, 2023
0.5.3 Jul 11, 2023
0.3.2 Nov 22, 2021

#397 in Web programming


10K SLoC


crates.io docs.rs docs (main) pipeline status coverage report

A MediaWiki bot and tool framework

mwbot aims to provide a batteries-included framework for building bots and tools for MediaWiki wikis. It builds on top of the mwapi and parsoid crates, which offer lower-level APIs.



Create a ~/.config/mwbot.toml file with the following structure:

api_url = "https://en.wikipedia.org/w/api.php"
rest_url = "https://en.wikipedia.org/api/rest_v1"

If want to authenticate, add an auth section:

username = "Example"
oauth2_token = "[...]"

See the OAuth documentation for how to get an OAuth 2 token. Using an owner-only consumer is the easiest way to do so.

Reading a page

let bot = mwbot::Bot::from_default_config().await.unwrap();
let page = bot.page("Rust (programming language)")?;
let html = page.html().await?.into_mutable();
// The lead section is the second p tag in the first section
let lead = html.select("section > p")[1].text_contents();
assert!(lead.starts_with("Rust is a multi-paradigm, general-purpose programming language"));

Using Bot::from_default_config() will look in the current directory for mwbot.toml before looking in the user's config directory. A custom path can be specified by using Bot::from_config(...).

Editing a page

let bot = mwbot::Bot::from_default_config().await.unwrap();
let page = bot.page("Project:Sandbox")?;
let wikitext = "This is a test edit!";
page.save(wikitext, &SaveOptions::summary("test edit!")).await?;

Page.save() accepts both HTML and wikitext and supports the {{nobots}} exclusion mechanism, among other features.

Next steps

Try using one of the offered page generators to fetch and operate on multiple pages.


mwbot is the flagship crate of the mwbot-rs project. We're always looking for new contributors, please reach out if you're interested!


This crate is released under GPL-3.0-or-later. See COPYING for details.


~466K SLoC