• Stars
    star
    235
  • Rank 165,490 (Top 4 %)
  • Language
    JavaScript
  • License
    BSD 2-Clause "Sim...
  • Created almost 12 years ago
  • Updated 15 days ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

MediaWiki API and WikiData client written in Node.js

nodemw

Node.js CI Coverage Status code style: prettier

MediaWiki API client written in node.js

Requirements

Installation

Using npm

npm install nodemw

Or Download the latest stable version via GitHub.

Development version

git clone https://github.com/macbre/nodemw.git

Features

  • HTTP requests are stored in the queue and performed in parallel with limited number of "threads" (i.e. there's no risk of flooding the server)
  • articles creation / edit / move / delete
  • file uploads (using given content or via provided URL)
  • Special:Log processing
  • listing articles in categories
  • and much more
  • getting claims from WikiData

Where it's used

First script

An example script can be found in /examples directory.

cd examples
node pagesInCategory.js

You can enter debug mode by setting DEBUG enviromental variable:

DEBUG=1 node examples/pagesInCategory.js

You can enter dry-run mode (all "write" operations like edits and uploads will be disabled) by setting DRY_RUN environmental variable (or dryRun entry in the config):

DRY_RUN=1 node examples/pagesInCategory.js

Running unit tests

npm test

How to use it?

Creating a bot instance

var bot = require("nodemw");

// pass configuration object
var client = new bot({
  protocol: "https", // Wikipedia now enforces HTTPS
  server: "en.wikipedia.org", // host name of MediaWiki-powered site
  path: "/w", // path to api.php script
  debug: false, // is more verbose when set to true
});

client.getArticle("foo", function (err, data) {
  // error handling
  if (err) {
    console.error(err);
    return;
  }

  // ...
});

Config file

nodemw can use config files as well as objects directly provided to bot object constructor.

// read config from external file
var client = new bot("config.js");

Config file is a JSON-encoded object with the following fields (see /examples/config-DIST.js file):

{
      "protocol": "https",  // default to 'http'
      "server": "en.wikipedia.org",  // host name of MediaWiki-powered site
      "path": "/w",                  // path to api.php script
      "debug": false,                // is more verbose when set to true
      "username": "foo",             // account to be used when logIn is called (optional)
      "password": "bar",             // password to be used when logIn is called (optional)
      "domain" : "auth.bar.net",     // domain to be used when logIn is called (optional)
      "userAgent": "Custom UA",      // define custom bot's user agent
      "concurrency": 5               // how many API requests can be run in parallel (defaults to 3)
}

Making direct API calls

nodemw allows you make direct calls to MediaWiki API (example querying Semantic MediaWiki API):

var bot = require("nodemw"),
  client = new bot({
    server: "semantic-mediawiki.org",
    path: "/w",
  }),
  params = {
    action: "ask",
    query:
      "[[Modification date::+]]|?Modification date|sort=Modification date|order=desc",
  };

client.api.call(
  params /* api.php parameters */,
  function (
    err /* Error instance or null */,
    info /* processed query result */,
    next /* more results? */,
    data /* raw data */,
  ) {
    console.log(data && data.query && data.query.results);
  },
);

Bot methods

The last parameter of each function in nodemw API is a callback which will be fired when the requested action is done.

Callbacks use node.js style - err is always passed as the first argument.

bot.logIn(username, password, callback)

Log-in using given credentials - read more

bot.getCategories(prefix, callback)

Gets the list of all categories on a wiki

bot.getAllPages(callback)

Gets the list of all pages from the main namespace (excludes redirects) - read more

bot.getPagesInCategory(category, callback)

Gets the list of pages in a given category - read more

bot.getPagesInNamespace(namespace, callback)

Gets the list of pages in a given namespace - read more

bot.getPagesByPrefix(prefix, callback)

Gets the list of pages by a given prefix - read more

bot.getPagesTranscluding(page, callback)

Gets the list of pages that transclude the given pages - read more

bot.getArticle(title, [redirect,] callback)

Gets article content and redirect info - read more

bot.getArticleRevisions(title, callback)

Gets all revisions of a given article - read more

bot.getArticleCategories(title, callback)

Gets all categories a given article is in - read more

bot.getArticleInfo(title, callback)

Gets all info of a given article - read more

bot.edit(title, content, summary, minor, callback)

Creates / edits an article (and mark the edit as minor if minor is set to true) - read more

bot.append(title, content, summary, callback)

Adds given content to the end of the page - read more

bot.prepend(title, content, summary, callback)

Adds given content to the beginning of the page - read more

bot.addFlowTopic(title, topic, content, callback)

Add a Flow topic - read more

bot.delete(title, reason, callback)

Deletes an article - read more

bot.purge(titles, callback)

Purge a given list of articles (titles or page IDs can be provided) - read more

By providing Category:Foo as titles argument you can purge all pages in a given category (available since MW 1.21)

bot.protect(title, protections, options, callback)

Protect a page (A title or page ID can be provided) - read more

The protections value is an Array of protection information in the format:

{
    action: string,
    level?: string = 'all',
    expiry?: string | number = 'never'
}

Calls to the Protect endpoint are not additive. Each call must include a list of all intended protections, including any already in place. Each call will replace all existing protections.

bot.sendEmail(username, subject, text, callback)

Send an email to an user - read more

bot.getToken(title, action, callback)

Returns token required for a number of MediaWiki API operations - read more / for MW 1.24+

bot.whoami(callback)

Gets information about current bot's user (including rights and rate limits) - read more

bot.whois(username, callback)

Gets information about a specific user (including rights, current block, groups) - read more

bot.whoare(usernames, callback)

Gets information about specific users (including rights, current block, groups) - read more

bot.createAccount(username, password, callback)

Create account using given credentials - read more

bot.move(from, to, summary, callback)

Moves (aka renames) given article - read more

bot.getImages(callback)

Gets list of all images on a wiki

bot.getImageUsage(filename, callback)

Gets list of all articles using given image

bot.getImagesFromArticle(title, callback)

Get list of all images that are used on a given page - read more

bot.getImageInfo(filename, callback)

Gets metadata (including uploader, size, dimensions and EXIF data) of given image

bot.getLog(type, start, callback)

Get entries form Special:Log - read more

bot.expandTemplates(content, title, callback)

Returns XML with preprocessed wikitext - read more

bot.parse(content, title, callback)

Returns parsed wikitext - read more

bot.fetchUrl(url, callback)

Makes a GET request to provided resource and returns its content.

bot.getRecentChanges(start, callback)

Returns entries from recent changes (starting from a given point)

bot.getSiteInfo(props, callback)

Returns site information entries - read more

bot.getSiteStats(props, callback)

Returns site statistics (number of articles, edits etc) - read more

bot.getMediaWikiVersion(callback)

Returns the version of MediaWiki given site uses - read more

client.getQueryPage(queryPage, callback)

Returns entries from QueryPage-based special pages

bot.upload(filename, content, summary /* or extraParams */, callback)

Uploads a given raw content as a File:[filename] - read more

bot.uploadByUrl(filename, url, summary /* or extraParams */, callback)

Uploads a given external resource as a File:[filename]

bot.uploadVideo(fileName, url, callback)

Uploads a given video as a File:[filename] (Wikia-specific API)

bot.getTemplateParamFromXml(tmplXml, paramName)

Gets a value of a given template parameter from article's preparsed content (see expandTemplates)

bot.getExternalLinks(title, callback)

Gets all external links used in article

bot.getBacklinks(title, callback)

Gets all articles that links to given article

bot.search(query, callback)

Performs a search

Helpers

bot.getConfig(key, def)

Gets config entry value (returns def value if not found)

bot.setConfig(key, val)

Sets config entry value

bot.diff(old, current)

Returns a diff colored using ANSI colors (powered by diff)

Wikia-specific bot methods

They're grouped in bot.wikia "namespace".

bot.wikia.getWikiVariables(callback)

Get wiki-specific settings (like ThemeDesigner colors and hubs).

bot.wikia.getUser(userId, callback)

Get information (avatar, number of edits) about a given user

bot.wikia.getUsers(userIds, callback)

Get information (avatar, number of edits) about a given set of users (by their IDs)

WikiData

This API is Promise-based, use await keyword.

Examples:

const wikidata = require("nodemw/lib/wikidata");
const client = new wikidata();

// Where is Saksun, Faroe Islands located?
const geo = await client.getEntityClaim(
  "Q928875" /* Saksun */,
  "P625" /* place location */,
);

// will give you the geolocation of the place
expect(geo[0].mainsnak.datavalue.value).toMatchObject({
  latitude: 62.248888888889,
  longitude: -7.1758333333333,
});

// When was Albert Einstein born?
const res = await client.getArticleClaims("Albert Einstein");

const dateOfBirth = res.P569[0].mainsnak.datavalue.value;
expect(dateOfBirth.time).toMatch(/1879-03-14/);

const dateOfDeath = res.P570[0].mainsnak.datavalue.value;
expect(dateOfDeath.time).toMatch(/1955-04-18/);

// interwiki links for a given artlice
const links = await client.getArticleSitelinks("Albert Einstein");
console.log(links.enwiki); // {site: "enwiki", title: "Albert Einstein", badges: ["Q17437798"]}

Stargazers over time

Stargazers over time

More Repositories

1

phantomas

Headless Chromium-based web performance metrics collector and monitoring tool
JavaScript
2,252
star
2

sql-metadata

Uses tokenized query returned by python-sqlparse and generates query metadata
Python
739
star
3

analyze-css

CSS selectors complexity and performance analyzer
JavaScript
695
star
4

index-digest

Analyses your database queries and schema and suggests indices and schema improvements
Python
66
star
5

docker-sphinxsearch

Docker image for Sphinx search engine
Dockerfile
52
star
6

push-to-ghcr

This action simplifies pushes of Docker images to ghcr.io repository and the Docker Hub
Dockerfile
23
star
7

wayback-machine

Internet Wayback Machine nodejs Client
JavaScript
23
star
8

data-flow-graph

Uses your app logs to visualize how the data moves between the code, database, HTTP services, message queue, external storages etc.
Python
22
star
9

mediawiki-dump

Python package for working with MediaWiki XML content dumps
Python
19
star
10

telemetry

Telemetry system based on 8-bit AVR microcontroller with full TCP/IP stack (DHCP, NTP, HTTP)
C
11
star
11

wiki-evolution

Visualize evolution of your MediaWiki based site
JavaScript
7
star
12

phantomas-python

Python module for easy integration with phantomas
Python
7
star
13

query-digest

A dynamic code analysis tool that processes SQL queries logs and data flow information
Python
7
star
14

farerskie-kadry-feed

Turn Instagram and Facebook feeds into RSS
HTML
6
star
15

mobify

Download a webpage as an e-book
Python
5
star
16

plc

Power Line Communication
C
4
star
17

travis-fold

Tiny module for emitting folding syntax for Travis CI output
JavaScript
3
star
18

3pc

3rd party web content database
Python
3
star
19

monolog-python

Python's logging formatter compatible with
Python
3
star
20

actions-index-digest

GitHub Actions for index-digest - database performance regression testing
3
star
21

phantomas-reporter-elasticsearch

elasticsearch reporter for phantomas
JavaScript
3
star
22

airrohr-prometheus-exporter

Make prometheus collect temperature, pressure and PM metrics from your airrohr station
Python
2
star
23

nordic-feed

RSS feeds agregator aka planet for Nordic blogs in Polish
Python
2
star
24

faroese-planet

RSS feeds agregator aka planet for Faroese blogs from around the world
Python
2
star
25

curl-http3

A custom curl build with BoringSSL and http3 support via quiche
Dockerfile
2
star
26

electronics

Various electronics related notes, projects and schematics
C
2
star
27

optimist-config-file

Extends optimist with support for JSON/YAML config file and Docker's inspired environment variables handling
JavaScript
1
star
28

elasticsearch-query

A fork of https://github.com/Wikia/python-commons/tree/master/wikia/common/kibana for public PyPI repository
Python
1
star
29

test-wordpress-bitnami

The Docker Compose setup for the Bitnami-powered WordPress instance with SSH access and wp-cli installed. Can be easily put behind Traefik.
Shell
1
star
30

rs2eth

Ethernet / RS232 / RS485 converter with Telnet, VCOM and MCHP Discovery protocols support
1
star
31

map-porn

Templates used to generate maps based on geo data for Faroe Islands and Ireland
JavaScript
1
star
32

faroese-resources

Faroese resources
HTML
1
star
33

docker-traefik

Dockerized traefik v3 with auto-discovery of other containers on the same Docker network
Shell
1
star
34

pelican-planet

A fork of
Python
1
star
35

github-tools

GitHub toolbox
JavaScript
1
star
36

pyrabot

Skrypty bota używanego na Poznańskiej Wiki
Lua
1
star
37

fussball

IR-based goal system for football tables
C
1
star
38

slides

macbre's slides for Wikia
JavaScript
1
star