API:Створення облікового запису
Ця сторінка є частиною документації по MediaWiki Action API. |
Версія MediaWiki: | ≥ 1.27 |
Документація API
Створення облікового запису
Процес складається з трьох загальних етапів:
- Отримати поля від API:Authmanagerinfo і токен від API:Токени .
- Надішліть запит POST із отриманим токеном, інформацією про користувача та іншими полями та поверніть URL-адресу до API.
- Розробіть відповідь, яка може включати додаткові запити POST для надання додаткової інформації.
Приклад 1: Обробка у вікі без спеціальних розширень автентифікації
Вікі без спеціальних розширень автентифікації може бути досить простою. Якщо ваш код знає, які поля будуть потрібні, він може пропустити виклик до API:Authmanagerinfo і просто припустити, які поля будуть потрібні (наприклад, ім’я користувача, пароль і повторно введений пароль, електронна адреса, можливо справжнє ім’я).
reason
до запиту POST. Ви також можете використовувати mailpassword
замість параметрів password
і retype
, щоб MediaWiki надсилала новому користувачеві тимчасовий пароль електронною поштою.
Запит POST
Відповідь
{
"createaccount": {
"status": "PASS",
"username": "Zane"
}
}
Зразок коду
Python
#!/usr/bin/python3
"""
create_account.py
MediaWiki API Demos
Demo of `createaccount` module: Create an account on a wiki without the
special authentication extensions
MIT license
"""
import requests
S = requests.Session()
WIKI_URL = "http://dev.wiki.local.wmftest.net:8080"
API_ENDPOINT = WIKI_URL + "/w/api.php"
# First step
# Retrieve account creation token from `tokens` module
PARAMS_0 = {
'action':"query",
'meta':"tokens",
'type':"createaccount",
'format':"json"
}
R = S.get(url=API_ENDPOINT, params=PARAMS_0)
DATA = R.json()
TOKEN = DATA['query']['tokens']['createaccounttoken']
# Second step
# Send a post request with the fetched token and other data (user information,
# return URL, etc.) to the API to create an account
PARAMS_1 = {
'action': "createaccount",
'createtoken': TOKEN,
'username': 'your_username',
'password': 'your_password',
'retype': 'retype_your_password',
'createreturnurl': WIKI_URL,
'format': "json"
}
R = S.post(API_ENDPOINT, data=PARAMS_1)
DATA = R.json()
print(DATA)
PHP
<?php
/*
create_account.php
MediaWiki API Demos
Demo of `createaccount` module: Create an account on a wiki without the
special authentication extensions
MIT license
*/
$wikiUrl = "http://dev.wiki.local.wmftest.net:8080";
$endPoint = $wikiUrl . "/w/api.php";
$createAccount_Token = getCreateAccountToken(); // Step 1
createAccount( $createAccount_Token ); // Step 2
// Step 1: GET request to fetch createaccount token
function getCreateAccountToken() {
global $endPoint;
$params1 = [
"action" => "query",
"meta" => "tokens",
"type" => "createaccount",
"format" => "json"
];
$url = $endPoint . "?" . http_build_query( $params1 );
$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
$output = curl_exec( $ch );
curl_close( $ch );
$result = json_decode( $output, true );
return $result["query"]["tokens"]["createaccounttoken"];
}
// Step 2: POST request with the fetched token and other data (user information,
// return URL, etc.) to the API to create an account
function createAccount( $createAccount_Token ) {
global $endPoint, $wikiUrl;
$params2 = [
"action" => "createaccount",
"createtoken" => $createAccount_Token,
"username" => "your_username",
"password" => "your_password",
"retype" => "retype_your_password",
"createreturnurl" => $wikiUrl,
"format" => "json"
];
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $endPoint );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $params2 ) );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
$output = curl_exec( $ch );
curl_close( $ch );
echo( $output );
}
JavaScript
/*
create_account.js
MediaWiki API Demos
Demo of `createaccount` module: Create an account on a wiki without the
special authentication extensions
MIT license
*/
var request = require('request').defaults({jar: true}),
wikiUrl = "http://dev.wiki.local.wmftest.net:8080",
endPoint = wikiUrl + "/w/api.php";
// Step 1: GET request to fetch createaccount token
function getCreateAccountToken() {
var params_0 = {
action: "query",
meta: "tokens",
type: "createaccount",
format: "json"
};
request.get({ url: endPoint, qs: params_0 }, function (error, res, body) {
if (error) {
return;
}
var data = JSON.parse(body);
createaccount(data.query.tokens.createaccounttoken);
});
}
// Step 2: POST request with the fetched token and other data (user information,
// return URL, etc.) to the API to create an account
function createaccount(createaccount_token) {
var params_1 = {
action: "createaccount",
username: "your_username",
password: "your_password",
retype: "retype_your_password",
createreturnurl: wikiUrl,
createtoken: createaccount_token,
format: "json"
};
request.post({ url: endPoint, form: params_1 }, function (error, res, body) {
if (error) {
return;
}
console.log(body);
});
}
// Start From Step 1
getCreateAccountToken();
MediaWiki JS
/*
create_account.js
MediaWiki API Demos
Demo of `createaccount` module: Create an account on a wiki without the
special authentication extensions
MIT License
*/
var params = {
action: 'query',
meta: 'tokens',
type: 'createaccount',
format: 'json'
},
api = new mw.Api();
api.get( params ).done( function ( data ) {
var token = data.query.tokens.createaccounttoken,
params1 = {
action: 'createaccount',
username: 'your_username',
password: 'your_password',
retype: 'retype_your_password',
createreturnurl: 'http:' + mw.config.get( 'wgServer' ),
createtoken: token,
format: 'json'
};
api.post( params1 ).done( function ( data ) {
console.log( data );
} );
} );
Приклад 2: Обробка на вікі з розширенням CAPTCHA
Зауважте, що перший крок нижче, якщо ви бажаєте, може бути виконаний у два кроки: один для отримання полів, доступних з API:Authmanagerinfo , а інший для отримання токена з API:Токени .
<span id="First_step:_Fetch_fields_available_from_API:Authmanagerinfo _and_token_from_API:Токени ">
Перший крок: отримати поля, доступні від API:Authmanagerinfo і токен від API:Токени
Результат |
---|
{
"batchcomplete": "",
"query": {
"authmanagerinfo": {
"canauthenticatenow": "",
"cancreateaccounts": "",
"preservedusername": "",
"requests": [
{
"id": "CaptchaAuthenticationRequest",
"metadata": {
"type": "image",
"mime": "image/png"
},
"required": "required",
"provider": "CaptchaAuthenticationRequest",
"account": "CaptchaAuthenticationRequest",
"fields": {
"captchaId": {
"type": "hidden",
"value": "16649214",
"label": "CAPTCHA ID",
"help": "This value should be sent back unchanged."
},
"captchaInfo": {
"type": "null",
"value": "/w/index.php?title=Special:Captcha/image&wpCaptchaId=16649214",
"label": "To help protect against automated account creation, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):",
"help": "Description of the CAPTCHA."
},
"captchaWord": {
"type": "string",
"label": "CAPTCHA",
"help": "Solution of the CAPTCHA."
}
}
}
...
]
},
"tokens": {
"createaccounttoken": "1de8d3f8023305742e69db9e16b4d5365bd82f9c+\\"
}
}
}
|
Другий крок: надішліть запит на публікацію разом із токеном створення облікового запису, інформацією про користувача та зворотною URL-адресою
Результат |
---|
{
"createaccount": {
"status": "PASS",
"username": "Zane"
}
}
|
Зразок коду
Зауважте, що цей зразок коду розділяє запити API:Authmanagerinfo і API:Токени і, як правило, передбачає, що буде CAPTCHA та жодниих інших ускладнень.
create_account_with_captcha.py |
---|
#!/usr/bin/python3
"""
create_account_with_captcha.py
MediaWiki Action API Code Samples
Demo of `createaccount` module: Create an account on a wiki with a special
authentication extension installed. This example considers a case of a wiki
where captcha is enabled through extensions like ConfirmEdit
(https://www.mediawiki.org/wiki/Extension:ConfirmEdit)
MIT license
"""
import requests
from flask import Flask, render_template, flash, request
S = requests.Session()
WIKI_URL = "https://test.wikipedia.org"
API_ENDPOINT = WIKI_URL + "/w/api.php"
# App config.
DEBUG = True
APP = Flask(__name__)
APP.config.from_object(__name__)
APP.config['SECRET_KEY'] = 'enter_your_secret_key'
@APP.route("/", methods=['GET', 'POST'])
def show_form():
""" Render form template and handle form submission request """
fields = get_form_fields()
captcha = fields['CaptchaAuthenticationRequest']
captcha_url = WIKI_URL + captcha['captchaInfo']['value']
captcha_id = captcha['captchaId']['value']
display_fields = []
user_fields = []
captcha_fields = []
for field in fields:
for name in fields[field]:
details = {
'name': name,
'type': fields[field][name]['type'],
'label': fields[field][name]['label']
}
if field != "CaptchaAuthenticationRequest":
user_fields.append(details)
else:
if name == 'captchaWord':
captcha_fields.append(details)
display_fields = user_fields + captcha_fields
if request.method == 'POST':
create_account(request.form, captcha_id)
return render_template('create_account_form.html', \
captcha=captcha_url, fields=display_fields)
def get_form_fields():
""" Fetch the form fields from `authmanagerinfo` module """
result = {}
response = S.get(url=API_ENDPOINT, params={
'action': 'query',
'meta': 'authmanagerinfo',
'amirequestsfor': 'create',
'format': 'json'
})
data = response.json()
query = data and data['query']
authmanagerinfo = query and query['authmanagerinfo']
fields = authmanagerinfo and authmanagerinfo['requests']
for field in fields:
if field['id'] in ('MediaWiki\\Auth\\UserDataAuthenticationRequest', \
'CaptchaAuthenticationRequest', 'MediaWiki\\Auth\\PasswordAuthenticationRequest'):
result[field['id']] = field['fields']
return result
def create_account(form, captcha_id):
""" Send a post request along with create account token, user information
and return URL to the API to create an account on a wiki """
createtoken = fetch_create_token()
response = S.post(url=API_ENDPOINT, data={
'action': 'createaccount',
'createtoken': createtoken,
'username': form['username'],
'password': form['password'],
'retype': form['retype'],
'email': form['email'],
'createreturnurl': 'http://127.0.0.1:5000/',
'captchaId': captcha_id,
'captchaWord': form['captchaWord'],
'format': 'json'
})
data = response.json()
createaccount = data['createaccount']
if createaccount['status'] == "PASS":
flash('Success! An account with username ' + \
form['username'] + ' has been created!')
else:
flash('Oops! Something went wrong -- ' + \
createaccount['messagecode'] + "." + createaccount['message'])
def fetch_create_token():
""" Fetch create account token via `tokens` module """
response = S.get(url=API_ENDPOINT, params={
'action': 'query',
'meta': 'tokens',
'type': 'createaccount',
'format': 'json'
})
data = response.json()
return data['query']['tokens']['createaccounttoken']
if __name__ == "__main__":
APP.run()
|
create_account_form.html |
---|
<!DOCTYPE html>
<title>MediaWiki Create Account</title>
<!-- CSS files are in here: https://github.com/srish/MediaWiki-Action-API-Code-Samples/tree/master/static -->
<link rel="stylesheet" href="static/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="static/css/account_form.css">
<div class="container">
<h2>Create MediaWiki Account</h2>
<form method="POST">
<div class="form-group">
<div class="form-field">
<div class="label-field">Enter your username</div>
<input name="username">
</div>
<div class="form-field">
<div class="label-field">Password</div>
<input type="password" name="password">
</div>
<div class="form-field">
<div class="label-field">Confirm password</div>
<input type="password" name="confirm-password">
</div>
<div class="form-field">
<div class="label-field">Enter address (optional)</div>
<input name="email">
</div>
<div class="form-field">
<div class="label-field">Enter the text you see on the image below</div>
<input name="captcha-word">
</div>
<img src="{{ captcha }}">
</div>
<button type="submit" class="btn btn-success">Create your account</button>
</form>
<br>
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
{% for message in messages %}
<div class="alert alert-info">
{{ message[1] }}
</div>
{% endfor %}
{% endif %}
{% endwith %}
</div>
<br>
</div>
</div>
|
Приклад 3: створення облікового запису на вікі з увімкненою CAPTCHA, розширенням OpenID та двофакторною автентифікацією
<span id="First_step:_Fetch_fields_available_from_API:Authmanagerinfo _and_token_from_API:Токени ">
Перший крок: отримати поля, доступні від API:Authmanagerinfo і токен від API:Токени
Вибір API:Authmanagerinfo і API:Токени в основному такий самий, як і в попередньому прикладі, тому тут не повторюється. Список запитів, які повертає API:Authmanagerinfo , міститиме визначення як для розширення CAPTCHA, так і для розширення OpenID.
Другий крок: дайте відповідь на CAPTCHA та виберіть автентифікацію OpenID.
Результат |
---|
{
"createaccount": {
"status": "REDIRECT",
"redirecttarget": "https://openid.example.net/openid-auth.php?scope=openid&response_type=code&client_id=ABC&redirect_uri=https://wiki.example.org/wiki/Special:OpenIDConnectReturn&state=XYZ123",
"requests": [
{
"id": "OpenIdConnectResponseAuthenticationRequest",
"metadata": {},
"required": "required",
"provider": "OpenID Connect at example.net",
"account": "",
"fields": {
"code": {
"type": "string",
"label": "OpenID Code",
"help": "OpenID Connect code response"
},
"state": {
"type": "string",
"label": "OpenID State",
"help": "OpenID Connect state response"
},
}
}
]
}
}
|
Очікується, що клієнт перенаправить браузер користувача на наданий redirecttarget.
Постачальник OpenID здійснить автентифікацію та перенаправляє до Special:OpenIDConnectReturn у вікі, яка підтвердить відповідь OpenID, а потім перенаправляє на createreturnurl, наданий у першому POST до API з кодом< Додано параметри і state.
На цьому етапі клієнт отримує контроль над процесом і робить наступний запит API.
Крок третій: повернення з OpenID.
Клієнт надсилає code і state назад до API. Відповідь API містить розширення двофакторної автентифікації, яке пропонує користувачеві налаштувати другий фактор.
Результат |
---|
{
"createaccount": {
"status": "UI",
"message": "Set up two-factor authentication",
"requests": [
{
"id": "TwoFactorAuthenticationRequest",
"metadata": {
"account": "Alice",
"secret": "6CO3 2AKV EP2X MIV5"
},
"required": "optional",
"provider": "",
"account": "",
"fields": {
"2FAInfo": {
"type": "null",
"label": "A bunch of text describing how to set up two-factor auth.",
"help": "Two-factor authentication setup instructions"
},
"code": {
"type": "string",
"label": "Code",
"help": "Two-factor authentication code"
}
}
},
{
"id": "MediaWiki\\Auth\\ButtonAuthenticationRequest:skip2FASetup",
"metadata": {},
"required": "optional",
"provider": "MediaWiki\\Auth\\ButtonAuthenticationRequest",
"account": "MediaWiki\\Auth\\ButtonAuthenticationRequest:skip2FASetup",
"fields": {
"skip2FASetup": {
"type": "button",
"label": "Skip",
"help": "Skip two-factor authentication setup"
}
}
}
]
}
}
|
Тепер клієнт запропонує користувачеві створити новий обліковий запис у своїй програмі двофакторної автентифікації та ввести поточний код або дозволить користувачеві пропустити налаштування 2FA. Припустимо, що користувач налаштував 2FA.
Четвертий крок: налаштуйте двофакторну автентифікацію.
Результат |
---|
{
"createaccount": {
"status": "PASS",
"username": "Alice"
}
}
|
Нарешті створення облікового запису вдалося.
Якщо в будь-який момент створення облікового запису не вдасться, буде повернуто відповідь зі статусом FAIL, а також message, яке відобразиться користувачеві.
Можливі помилки
Код | Інформація |
---|---|
badtoken | Недійсний токен створення облікового запису |
notoken | Параметр token має бути заповнений. |
mustpostparams | Вказаний параметр було знайдено в рядку запиту, але має бути у тілі POST: createtoken. |
missingparam | Щонайменше один параметрів "createcontinue" та "createreturnurl" є обов'язковим. |
authmanager-create-no-primary | Надані облікові дані не можуть бути використані для створення облікового запису. |
noemailcreate | Вам потрібно вказати правильну адресу електронної пошти |
invalidemailaddress | Вказана адреса не може бути прийнята через невідповідний формат.
Будь ласка, введіть коректну адресу або залиште поле порожнім. |
badretype | Введені паролі не збігаються. |
userexists | Введене ім'я користувача вже існує.
Будь ласка оберіть інше ім'я. |
captcha-createaccount-fail | Неправильна або відсутня капча. |
acct_creation_throttle_hit | Відвідувачі цієї вікі, що використовували Вашу IP-адресу, створили num облікових записів за останню добу, що є максимальною кількістю для цього періоду часу.
В результаті відвідувачі, що використовують цю IP-адресу, наразі більше не можуть створювати облікові записи. Якщо Ви перебуваєте на заході, тематикою якого є внесок до проектів Вікімедіа, будь ласка, перегляньте сторінку запитів на тимчасове підвищення ліміту для IP, щоб отримати допомогу із вирішенням цього питання. |
Додаткові примітки
- Створення облікового запису записується в Special:log/newusers.
Якщо ви ввійшли, ваше ім’я користувача також буде записано під час створення облікового запису.
- Виконуючи фрагменти коду, надані на цій сторінці, пам’ятайте:
- Після створення облікового запису на вікі його не можна буде видалити.
- Завжди використовуйте
https://test.wikipedia.org/w/api.php
як кінцеву точку, щоб випадково не створювати облікові записи на робочих вікі.
- MediaWiki адміністратори та розробники розширень можуть вимкнути цю функцію API, вставивши наступний рядок у файл конфігурації:
$wgAPIModules['createaccount'] = 'ApiDisabled';