Примеры использования API Яндекс Вики

В этом разделе приведены примеры скриптов на языке Python, которые используют API Яндекс Вики для управления формами и ответами.

Во всех примерах для аутентификации используется OAuth или IAM-токен. Получение токена описано в разделе Доступ к API.

1. Создать страницу и добавить контент

Ниже продемонстрируем пример скрипта, который выполняет действия:

  • Создание новой страницы
  • Изменение контента страницы
  • Получение атрибутов страницы по ее супертегу (пути)

В примере предполагаем, что для авторизации используется OAuth-токен (см. Получить доступ к API по протоколу OAuth).

Текст скрипта api_example_1.py
import os
import requests
import sys

WIKI_PUBLIC_API = 'https://api.wiki.yandex.net/v1'
WIKI_TOKEN = os.environ.get('WIKI_TOKEN')


def create_wiki_page(
    *, supertag: str,
    org_id: str,
    title: str,
    content: str,
) -> int:
    """
    Создать новую страницу

    Параметры:
    - supertag: супертег (слаг) создаваемой страницы
    - org_id: код организации
    - title: заголовок страницы
    - content: текст страницы
    """
    url = f'{WIKI_PUBLIC_API}/pages'
    headers = {
        'Authorization': f'OAuth {WIKI_TOKEN}',
        'X-Org-Id': org_id,
    }
    body = {
        'page_type': 'wysiwyg',
        'slug': supertag,
        'title': title,
        'content': content,
    }
    response = requests.post(url, json=body, headers=headers)
    if response.status_code != 200:
        return None

    res = response.json()
    return res.get('id')


def change_wiki_page(
    *, page_id: int,
    org_id: str,
    title: str = None,
    content: str = None,
) -> bool:
    """
    Изменить существующую страницу

    Параметры:
    - page_id: код страницы
    - org_id: код организации
    - title: заголовок страницы
    - content: текст страницы
    """
    url = f'{WIKI_PUBLIC_API}/pages/{page_id}'
    headers = {
        'Authorization': f'OAuth {WIKI_TOKEN}',
        'X-Org-Id': org_id,
    }
    body = {}
    if title:
        body['title'] = title
    if content:
        body['content'] = content
    response = requests.post(url, json=body, headers=headers)
    return response.status_code == 200


def append_wiki_page_content(
    *, page_id: int,
    org_id: str,
    content: str,
    location: str = None,
) -> bool:
    """
    Добавить контент на существующую страницу

    Параметры:
    - page_id: код страницы
    - org_id: код организации
    - content: текст для вставки
    - location: позиция для вставки текста,
      возможна вставка в начало страницы `top`, в конец страницы `bottom`
      или под якорь, например `#fragment`
    """
    url = f'{WIKI_PUBLIC_API}/pages/{page_id}/append-content'
    headers = {
        'Authorization': f'OAuth {WIKI_TOKEN}',
        'X-Org-Id': org_id,
    }
    body = {
        'content': content,
    }
    if location in ('top', 'bottom'):
        body['body'] = {'location': location}
    elif isinstance(location, str) and location.startswith('#'):
        body['anchor'] = {'name': location}
    else:
        body['body'] = {'location': 'bottom'}
    response = requests.post(url, json=body, headers=headers)
    return response.status_code == 200


def get_wiki_page_attributes(
    *, supertag: str,
    org_id: str,
) -> int:
    """
    Получить атрибуты существующей страницы по ее супертегу

    Параметры:
    - supertag: супертег (слаг) существующей страницы
    - org_id: код организации
    """
    url = f'{WIKI_PUBLIC_API}/pages'
    params = {
        'slug': supertag,
    }
    headers = {
        'Authorization': f'OAuth {WIKI_TOKEN}',
        'X-Org-Id': org_id,
    }
    response = requests.get(url, params=params, headers=headers)
    if response.status_code == 200:
        return response.json()


def main():
    if len(sys.argv) < 2:
        sys.exit(1)
    org_id = sys.argv[1]

    supertag = 'users/test/pageone'

    # создадим новую страницу
    new_page_id = create_wiki_page(
        supertag=supertag,
        title='Страница 1',
        content=(
            'Lorem ipsum dolor sit amet, consectetur adipiscing elit, '
            'sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n'
        ),
        org_id=org_id,
    )
    if new_page_id:
        print(f'создана страница с кодом {new_page_id}')

    # перепишем контент страницы (важно, метод меняет всю страницу)
    is_changed = change_wiki_page(
        page_id=new_page_id,
        org_id=org_id,
        title='Страница номер один',
        content=(
            'Lorem ipsum dolor sit amet, consectetur adipiscing elit, '
            'sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n'
            'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris '
            'nisi ut aliquip ex ea commodo consequat.\n'
            'Duis aute irure dolor in reprehenderit in voluptate velit esse cillum '
            'dolore eu fugiat nulla pariatur.\n'
            'Excepteur sint occaecat cupidatat non proident, '
            'sunt in culpa qui officia deserunt mollit anim id est laborum.\n'
        ),
    )
    if is_changed:
        print('контент страницы переписан')


    # получим атрибуты страницы по ее супертегу
    page_attributes = get_wiki_page_attributes(
        supertag=supertag,
        org_id=org_id,
    )
    if not page_attributes:
        print('вики страница не найдена')
        sys.exit(1)
    page_id = page_attributes.get('id')
    print(f'найдена страница с кодом {page_id}')


if __name__ == '__main__':
    main()

Пример запуска скрипта (в качестве аргумента передается код организации):

$ WIKI_TOKEN=$(cat .wiki-token) python api_example_1.py 'd3509bd2-b226-421a-94f1-1bf5b0e5fbf3'
создана страница с кодом 464211
контент страницы переписан
найдена страница с кодом 464211

2. Создать динамическую таблицу, добавить столбцы и строки

Ниже продемонстрируем пример скрипта, который выполняет действия:

  • Добавление новой динамической таблицы на существующую страницу
  • Добавление в таблицу колонок и строк
  • Изменение ячеек строки
  • Публикация таблицы на странице

В примере предполагаем, что для авторизации используется IAM-токен (см. Получить доступ к API по IAM-токену).

Текст скрипта api_example_2.py
import os
import requests
import sys

WIKI_PUBLIC_API = 'https://api.wiki.yandex.net/v1'
WIKI_TOKEN = os.environ.get('WIKI_TOKEN')

def get_wiki_page_attributes(
    *, supertag: str,
    org_id: str,
) -> int:
    """
    Получить атрибуты существующей страницы по ее супертегу

    Параметры:
    - supertag: супертег (слаг) существующей страницы
    - org_id: код организации
    """
    url = f'{WIKI_PUBLIC_API}/pages'
    params = {
        'slug': supertag,
    }
    headers = {
        'Authorization': f'Bearer {WIKI_TOKEN}',
        'X-Org-Id': org_id,
    }
    response = requests.get(url, params=params, headers=headers)
    if response.status_code == 200:
        return response.json()


def create_wiki_grid(
    *, page_id: int,
    title: str,
    org_id: str,
) -> int:
    """
    Создать новую таблицу

    Параметры:
    - page_id: код страницы
    - org_id: код организации
    - title: заголовок таблицы

    Важно, после создания таблица доступна только через интерфейс просмотра ресурсов,
    ее еще нужно добавить на страницу.
    """
    url = f'{WIKI_PUBLIC_API}/grids'
    body = {
        'page': {'id': page_id},
        'title': title,
    }
    headers = {
        'Authorization': f'Bearer {WIKI_TOKEN}',
        'X-Org-Id': org_id,
    }
    response = requests.post(url, json=body, headers=headers)
    if response.status_code == 200:
        res = response.json()
        return res.get('id')


def insert_grid_columns(
    *, grid_id: str,
    org_id: str,
    columns: list[dict],
) -> bool:
    """
    Добавить колонки в таблицу

    Параметры:
    - grid_id: код таблицы
    - org_id: код организации
    - columns: список колонок для добавления
    """
    url = f'{WIKI_PUBLIC_API}/grids/{grid_id}/columns'
    body = {
        'columns': columns,
    }
    headers = {
        'Authorization': f'Bearer {WIKI_TOKEN}',
        'X-Org-Id': org_id,
    }
    response = requests.post(url, json=body, headers=headers)
    return response.status_code == 200


def insert_grid_rows(
    *, grid_id: str,
    org_id: str,
    rows: list[dict],
) -> bool:
    """
    Добавить строки в таблицу

    Параметры:
    - grid_id: код таблицы
    - org_id: код организации
    - rows: список строк для добавления
    """
    url = f'{WIKI_PUBLIC_API}/grids/{grid_id}/rows'
    body = {
        'rows': rows,
    }
    headers = {
        'Authorization': f'Bearer {WIKI_TOKEN}',
        'X-Org-Id': org_id,
    }
    response = requests.post(url, json=body, headers=headers)
    return response.status_code == 200


def change_grid_cells(
    *, grid_id: str,
    org_id: str,
    cells: list[dict],
) -> bool:
    """
    Изменить ячейки в таблице

    Параметры:
    - grid_id: код таблицы
    - org_id: код организации
    - cells: список ячеек для изменения
    """
    url = f'{WIKI_PUBLIC_API}/grids/{grid_id}/cells'
    body = {
        'cells': cells,
    }
    headers = {
        'Authorization': f'Bearer {WIKI_TOKEN}',
        'X-Org-Id': org_id,
    }
    response = requests.post(url, json=body, headers=headers)
    return response.status_code == 200


def main():
    if len(sys.argv) < 2:
        sys.exit(1)
    org_id = sys.argv[1]

    supertag = 'users/test/pageone'

    # получим атрибуты страницы по ее супертегу
    page_attributes = get_wiki_page_attributes(
        supertag=supertag,
        org_id=org_id,
    )
    if not page_attributes:
        print('вики страница не найдена')
        sys.exit(1)
    page_id = page_attributes.get('id')
    print(f'найдена страница с кодом {page_id}')

    # создадим новую таблицу
    grid_id = create_wiki_grid(
        page_id=page_id,
        title='Новая таблица',
        org_id=org_id,
    )
    if grid_id:
        print(f'создана таблица с кодом {grid_id}')

    # добавим колонки в новую таблицу, колонки могут иметь разный тип
    is_changed = insert_grid_columns(
        grid_id=grid_id,
        org_id=org_id,
        columns=[
            {
                'slug': 'id',
                'title': 'ID',
                'type': 'number',
                'required': True,
            },
            {
                'slug': 'name',
                'title': 'Name',
                'type': 'string',
                'required': False,
            },
        ],
    )
    if is_changed:
        print('в таблицу добавлены новые колонки')

    # добавим строки в новую таблицу
    is_changed = insert_grid_rows(
        grid_id=grid_id,
        org_id=org_id,
        rows=[
            {'id': 1, 'name': 'Один'},
            {'id': 2, 'name': 'Два'},
            {'id': 3, 'name': 'Три'},
            {'id': 4, 'name': 'Четыре'},
            {'id': 5, 'name': 'Пять'},
        ],
    )
    if is_changed:
        print('в таблицу добавлены новые строки')

    # изменим ячейки на второй строке в таблице
    is_changed = change_grid_cells(
        grid_id=grid_id,
        org_id=org_id,
        cells=[
            {'row_id': 2, 'column_slug': 'id', 'value': 22},
            {'row_id': 2, 'column_slug': 'name', 'value': 'Двадцать два'},
        ],
    )
    if is_changed:
        print('в таблице изменена вторая строка')

    # поместим новую таблицу в конец страницы
    is_changed = append_wiki_page_content(
        page_id=page_id,
        org_id=org_id,
        content=f'\n{{% wgrid id="{grid_id}" %}}',
    )
    if is_changed:
        print('в конец страницы добавлена созданная таблица')


if __name__ == '__main__':
    main()
$ WIKI_TOKEN=$(cat .wiki-token) python api_example_2.py 'd3509bd2-b226-421a-94f1-1bf5b0e5fbf3'
найдена страница с кодом 464211
создана таблица с кодом 252a78f2-90c2-43ba-a608-df7da23f1fd2
в таблицу добавлены новые колонки
в таблицу добавлены новые строки
в таблице изменена вторая строка
в конец страницы добавлена созданная таблица
Предыдущая
Следующая