{"id":15017693,"url":"https://github.com/kanasimi/wikiapi","last_synced_at":"2025-10-24T11:10:44.103Z","repository":{"id":45253658,"uuid":"199611636","full_name":"kanasimi/wikiapi","owner":"kanasimi","description":"JavaScript MediaWiki API for node.js","archived":false,"fork":false,"pushed_at":"2025-03-16T22:50:33.000Z","size":2026,"stargazers_count":50,"open_issues_count":5,"forks_count":6,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-07T07:37:37.162Z","etag":null,"topics":["cejs","mediawiki","midiawiki-api","wiki","wikiapi","wikiapijs","wikidata","wikipedia","wikipedia-api","wikipedia-bot","wikitext","wikitext-parser"],"latest_commit_sha":null,"homepage":"https://kanasimi.github.io/wikiapi/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kanasimi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-07-30T08:42:18.000Z","updated_at":"2025-03-16T22:50:37.000Z","dependencies_parsed_at":"2024-02-11T14:28:17.593Z","dependency_job_id":"94588fdd-2b9d-4ced-ad7b-6c58149d3933","html_url":"https://github.com/kanasimi/wikiapi","commit_stats":{"total_commits":288,"total_committers":4,"mean_commits":72.0,"dds":0.02777777777777779,"last_synced_commit":"bc73728f54bdd4d06fca751361ed60238a23b7c8"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kanasimi%2Fwikiapi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kanasimi%2Fwikiapi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kanasimi%2Fwikiapi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kanasimi%2Fwikiapi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kanasimi","download_url":"https://codeload.github.com/kanasimi/wikiapi/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248566571,"owners_count":21125690,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cejs","mediawiki","midiawiki-api","wiki","wikiapi","wikiapijs","wikidata","wikipedia","wikipedia-api","wikipedia-bot","wikitext","wikitext-parser"],"created_at":"2024-09-24T19:50:52.032Z","updated_at":"2025-10-24T11:10:39.061Z","avatar_url":"https://github.com/kanasimi.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"﻿[![npm version](https://badge.fury.io/js/wikiapi.svg)](https://www.npmjs.com/package/wikiapi)\n[![npm downloads](https://img.shields.io/npm/dm/wikiapi.svg)](https://www.npmjs.com/package/wikiapi)\n[![GitHub Actions workflow build status](https://github.com/kanasimi/wikiapi/actions/workflows/npm-test.yml/badge.svg)](https://github.com/kanasimi/wikiapi/actions)\n[![codecov](https://codecov.io/gh/kanasimi/wikiapi/branch/master/graph/badge.svg)](https://codecov.io/gh/kanasimi/wikiapi)\n\n[![Known Vulnerabilities](https://snyk.io/test/github/kanasimi/wikiapi/badge.svg?targetFile=package.json)](https://snyk.io/test/github/kanasimi/wikiapi?targetFile=package.json)\n[![codebeat badge](https://codebeat.co/badges/47d3b442-fd49-4142-a69b-05171bf8fe36)](https://codebeat.co/projects/github-com-kanasimi-wikiapi-master)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/bfb4fe9fe6e04346986f5cc83099369e)](https://www.codacy.com/gh/kanasimi/wikiapi/dashboard?utm_source=github.com\u0026amp;utm_medium=referral\u0026amp;utm_content=kanasimi/wikiapi\u0026amp;utm_campaign=Badge_Grade)\n[![DeepScan grade](https://deepscan.io/api/teams/4788/projects/6757/branches/58325/badge/grade.svg)](https://deepscan.io/dashboard#view=project\u0026tid=4788\u0026pid=6757\u0026bid=58325)\n\n# JavaScript MediaWiki API\n\u003cp align=\"center\"\u003e\n\t\u003cimg alt=\"Wikiapi logo\" width=\"244\" src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/8/8c/WikiapiJS_MW_gear_icon.svg/244px-WikiapiJS_MW_gear_icon.svg.png\" /\u003e\n\u003c/p\u003e\n\nA simple way to access MediaWiki API via JavaScript with [wikitext parser](https://kanasimi.github.io/CeJS/_test%20suite/wikitext_parser.html).\nThis is basically a modern syntax version of [CeJS MediaWiki module](https://github.com/kanasimi/CeJS/blob/master/application/net/wiki). For example, using [async functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function).\n\n## Features\n*   Read / edit pages.\n*   Get list of categorymembers, pages transclude specified template, and more...\n*   Auto-limited editing rate.\n*   Parse wikitext / pages. You may modify parts of the wikitext, then regenerate the page just using .toString(). See [wikitext parser examples](https://kanasimi.github.io/CeJS/_test%20suite/wikitext_parser.html).\n\n## Installation\nThis is a nodejs module. Please install [node.js](https://nodejs.org/) first.\n\n```bash\nnpm install wikiapi\n```\n\n## Usage\nHere lists some examples of this module.\n* [Login to wiki site](https://kanasimi.github.io/wikiapi/Wikiapi.html#login)\n\t* [Login to wiki site #1](https://kanasimi.github.io/wikiapi/Wikiapi.html#example__Login%20to%20wiki%20site%201)\n\t* [Login to wiki site #2](https://kanasimi.github.io/wikiapi/Wikiapi.html#example__Login%20to%20wiki%20site%202)\n* [Get page data and parse the wikitext](https://kanasimi.github.io/wikiapi/Wikiapi.html#page)\n* [Listen to page modification](https://kanasimi.github.io/wikiapi/Wikiapi.html#listen)\n* [Edit page](https://kanasimi.github.io/wikiapi/Wikiapi.html#edit)\n* [Edit multiple pages](https://kanasimi.github.io/wikiapi/Wikiapi.html#for_each_page)\n* [Get category tree](https://kanasimi.github.io/wikiapi/Wikiapi.html#category_tree)\n* [Get wikidata](https://kanasimi.github.io/wikiapi/Wikiapi.html#data)\n* [Upload file / media](https://kanasimi.github.io/wikiapi/Wikiapi.html#upload)\n\t* [Upload file / media](https://kanasimi.github.io/wikiapi/Wikiapi.html#example__Upload%20file%20/%20media)\n* [Download file / media](https://kanasimi.github.io/wikiapi/Wikiapi.html#download)\n* [Move page](https://kanasimi.github.io/wikiapi/Wikiapi.html#move_page)\n\n### As node.js module\n```javascript\n// Load Wikiapi module\nconst Wikiapi = require('wikiapi');\n\n// OPEN ASYNC DOMAIN:\n(async () =\u003e {\n\n\t// LOGIN IN: In any wiki, any language\n\tconst wiki = new Wikiapi('zh');\t\t// or new Wikiapi('https://zh.wikipedia.org/w/api.php')\n\tawait wiki.login('user', 'password');\t\t// get your own account and password on your target wiki.\n\n\n\t/* ***************************************************** */\n\t/* READ ONLY ******************************************* */\n\t// load page\n\tlet page_data = await wiki.page('Universe', {});\n\tconsole.log('page_data: ', page_data);\n\tconsole.log('page_data.text: ', page_data.wikitext);\n\n\t// Get multi revisions (ex: 2)\n\tlet page_data = await wiki.page('Universe', { revisions: 2 });\n\tconsole.log('page_data: ', page_data);\n\tconsole.log('page_data.text: ', page_data.wikitext);\n\n\t/* ***************************************************** */\n\t/* EDITING ********************************************* */\n\t/* Note: .page() then .edit() ************************** */\n\t// Edit page: append content, as bot.\n\tlet page_data = await wiki.page('Universe'),\n\t\tnewContent = page_data.wikitext + '\\nTest edit using wikiapi.';\n\tawait enwiki.edit(\n\t\tfunction (page_data) { return newContent; },\t\t// new content\n\t\t{ bot: 1, summary: 'Test edit.' }\t\t\t// options\n\t);\n\n\t// Edit page: replace content, with more options.\n\tlet page_data = await wiki.page('Universe'),\n\t\tnewContent = page_data.wikitext.replace(/Test edit using wikiapi/g, 'Test: replace content was successful!');\n\tawait enwiki.edit(\n\t\tfunction (page_data) { return newContent; },  // new content\n\t\t{ bot: 1, minor: 1, nocreate: 1, summary: 'Test: replace content.' } // more options\n\t);\n\n\t// Edit page: wipe clean, replace by string\n\tlet page_data = await wiki.page('Universe');\n\tawait wiki.edit(\n\t\t'{{Speedy|reason=Vandalism}}',\n\t\t{ bot: 1, minor: 0, nocreate: 1, summary: 'Test: wipe clean, please delete.' }\n\t);\n\n\t/* edit_page(): a more direct method ******************* */\n\t// Edit page: \n\tawait wiki.edit_page('Wikipedia:Sandbox', function (page_data) {\n\t\treturn page_data.wikitext + '\\nTest edit using {{GitHub|kanasimi/wikiapi}}.';\n\t}, { bot: 1, nocreate: 1, minor: 1, summary: 'Test: edit page via .edit_page().' });\n\n\n\t/* ***************************************************** */\n\t/* PROVIDE MANY **************************************** */\n\t// List of hand-picked target pages\n\tlet list = ['Wikipedia:Sandbox', 'Wikipedia:Sandbox2', 'Wikipedia:Sandbox/wikiapi'];\n\t// List pages in [[Category:Chemical_elements]]\n\tlet listMembers = await wiki.categorymembers('Chemical elements');  // array of titles\n\t// List intra-wiki links in [[ABC]]\n\tlet listLinks = await wiki.redirects_here('ABC');  // array of titles\n\t// List of transcluded pages {{w:en:Periodic table}}\n\tlet listTranscluded = await wiki.embeddedin('Template:Periodic table');\n\t// List of searched pages with expression in its title name\n\tlet listSearch = await wiki.search(' dragon');  // array of titles\n\n\t/* ***************************************************** */\n\t/* MULTI-read/edit ************************************* */\n\t// Multi edit, members of category\n\tawait wiki.for_each_page(\n\t\tlistMembers,\n\t\tpage_data =\u003e { return `{{stub}}\\n` + page_data.wikitext; },\n\t\t{ summary: 'Test: multi-edits', minor: 1 }\n\t);\n\n\t// Multi read, following intra-wiki links\n\tawait wiki.for_each_page(\n\t\tlistLinks,\t\t\t// array of targets\n\t\tpage_data =\u003e {\n\t\t\tconsole.log(page_data.title);\t\t// print page title\n\t\t\treturn Wikiapi.skip_edit;\t\t// skip edit, just read, return nothing to edit with.\n\t\t}, // no edit therefore no options\n\t);\n\n\n\t/* ***************************************************** */\n\t/* MOVE PAGE (RENAME) ********************************** */\n\t// Move page once.\n\tresult = await wiki.move_page('Wikipedia:Sanbox/Wikiapi', 'Wikipedia:Sanbox/NewWikiapi',\n\t\t{ reason: 'Test: move page (1).', noredirect: true, movetalk: true }\n\t);\n\t// Reverse move\n\tresult = await wiki.move_page('Wikipedia:Sanbox/NewWikiapi', 'Wikipedia:Sanbox/Wikiapi',\n\t\t{ reason: 'Test: move page (2).', noredirect: true, movetalk: true }\n\t);\n\n\n\t/* ***************************************************** */\n\t/* PARSE *********************************************** */\n\t// Read Infobox templates, convert to JSON.\n\tconst page_data = await wiki.page('JavaScript');\n\t// `page_data.parse(options)` will startup the parser process, create page_data.parsed. After .parse(), we can use parsed.each().\n\tconst parsed = page_data.parse();\n\tlet infobox;\n\tparsed.each('template', template_token =\u003e {\n\t\tif (template_token.name.startsWith('Infobox')) {\n\t\t\tinfobox = template_token.parameters;\n\t\t\treturn parsed.each.exit;\n\t\t}\n\t});\n\tfor (const [key, value] of Object.entries(infobox))\n\t\tinfobox[key] = value.toString();\n\t// print json of the infobox\n\tconsole.log(infobox);\n\n\t// Edit page and parse\n\tconst parsed = await wiki.page('Wikipedia:Sandbox').parse();\n\tparsed.each('template', template_token =\u003e {/* modify token */ });\n\tawait wiki.edit(parsed.toString(), { bot: 1, minor: 1, nocreate: 1 });\n\n\tlet page_data = await wiki.page('Universe');\n\t// See all type in wiki_toString @ https://github.com/kanasimi/CeJS/tree/master/application/net/wiki/parser.js\n\t// List all template name.\n\tpage_data.parse().each('template',\n\t\ttoken =\u003e console.log(token.name));\n\n\t/* ***************************************************** */\n\t/* MONITORING ****************************************** */\n\t// Listen to new edits, check every 2 minutes\n\twiki.listen(function for_each_row() {\n\t\t// ...\n\t}, {\n\t\t// 檢查的延遲時間。\n\t\tdelay: '2m',\n\t\tfilter: function filter_row(row) {\n\t\t\t// row is the same format as page_data\n\t\t},\n\t\t// also get diff\n\t\twith_diff: { LCS: true, line: true },\n\t\t// only for articles (0:main namespace) and talk pages\n\t\tnamespace: '0|talk',\n\t});\n\n\t/* ***************************************************** */\n\t/* FILES *********************************************** */\n\t// Set upload parameters, maily for licensing reasons.\n\t// Note: parameter `text`, filled with the right wikicode `{{description|}}`, can replace most parameters.\n\tlet options = {\n\t\tdescription: 'Photo of Osaka',\n\t\tdate: new Date() || '2021-01-01',\n\t\tsource_url: 'https://github.com/kanasimi/wikiapi',\n\t\tauthor: '[[User:user]]',\n\t\tpermission: '{{cc-by-sa-2.5}}',\n\t\tother_versions: '',\n\t\tother_fields: '',\n\t\tlicense: ['{{cc-by-sa-2.5}}'],\n\t\tcategories: ['[[Category:test images]]'],\n\t\tbot: 1,\n\t\ttags: \"tag1|tag2\",\n\t};\n\n\t// Upload file from local path\n\tlet result = await wiki.upload({\n\t\tfile_path: '/local/file/path',\n\t\tfilename: 'New_Osaka_Photograph.jpg',  // default : keep filename\n\t\tcomment: '',\n\t\tignorewarnings: 1,  // overwrite\n\t\t...options\n\t});\n\n\t// Upload file from URL\n\tresult = await wiki.upload({\n\t\tmedia_url: 'https://media.url/Thunder-Dragon.ogg',\n\t\ttext: \"Her eis wikicode to replave the page's content instead of various other parameters.\",\n\t\tcomment: 'Thunder Dragon audio from vacation in Philipines. Page uses custom template.',\n\t\tignorewarnings: 1,  // overwrite\n\t\t...options\n\t});\n\n\n\t/* ***************************************************** */\n\t/* WIKIDATA, WIKIBASES ********************************* */\n\t// Read Qid Q1 (Universe), print Chinese label\n\tconst wiki = new Wikiapi('https://wikidata.org/w/api.php')\n\tlet page_data = await wiki.data('Q1');\n\tconsole.log(page_data.labels.zh)\t\t// '宇宙'\n\n\t// Read, access by title (English), access property P1419\n\t// Get P1419 of wikidata entity: 'Universe'\n\tlet data = await wiki.data('Universe', 'P1419');\n\t// assert: {Array}data = [ 'shape of the universe', '...', ... ]\n\tconsole.assert(data.includes('shape of the universe'));\n\n\t// update wikidata\n\t// Get https://test.wikidata.org/wiki/Q7\n\tlet entity = await wiki.data('Q7');\n\t// search [ language, label ]\n\t//entity = await wiki.data(['en', 'Earth']);\n\n\t// Update claim\n\tawait entity.modify({ claims: [{ P17: 'Q213280' }] });\n\t// Update claim: set country (P17) to 'Test Country 1' (Q213280) ([language, label] as entity)\n\tawait entity.modify({ claims: [{ language: 'en', country: [, 'Test Country 1'] }] });\n\t// Remove country (P17) : 'Test Country 1' (Q213280)\n\tawait entity.modify({ claims: [{ language: 'en', country: [, 'Test Country 1'], remove: true }] });\n\n\t// Update label\n\tawait entity.modify({ labels: [{ language: 'zh-tw', value: '地球' }] });\n\n\t// CLOSE ASYNC DOMAIN:\n})();\n```\n\nMore examples: Please see [test.js](https://github.com/kanasimi/wikiapi/blob/master/_test%20suite/test.js).\n\n### User agent\nBy default, the library will use the user agent `get_URL_node.default_user_agent` set in [Ajax.js](https://github.com/kanasimi/CeJS/blob/master/application/net/Ajax.js). If you want to [set another user agent](https://meta.wikimedia.org/wiki/User-Agent_policy), you can change `CeL.wiki.query.get_URL_options` listed in [query.js](https://github.com/kanasimi/CeJS/blob/master/application/net/wiki/query.js):\n```javascript\nCeL.wiki.query.get_URL_options.headers['User-Agent'] = 'testbot/1.0';\n```\n\n## OS support\n| Platform    | support |\n| ----------- | ------- |\n| Windows     | ✔️       |\n| macOS       | ✔️       |\n| UNIX, Linux | ✔️       |\n\n## See also\nFor old style JavaScript, or general environment usage, please see [wikibot](https://github.com/kanasimi/wikibot).\n\n## Contact\nContact us at [GitHub](https://github.com/kanasimi/wikiapi/issues).\n\n[![logo](https://raw.githubusercontent.com/kanasimi/CeJS/master/_test%20suite/misc/logo.jpg)](http://lyrics.meicho.com.tw/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkanasimi%2Fwikiapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkanasimi%2Fwikiapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkanasimi%2Fwikiapi/lists"}