API бота - KriseevM/vkschoolbot GitHub Wiki

Добавление информации о заданиях и изменениях в расписании напрямую через ручное редактирование файлов и таблиц базы данных крайне неудобно и непрактично, т.к. заполнять информацию сможете только Вы, а вместе с возможностью заполнения для другого человека Вы даёте ему доступ к серверу, что может быть небезопасно без правильной настройки. Поэтому у бота присутствует API, позволяющий сделать заполнение возможным без полного доступа к серверу - достаточно иметь только логин и пароль, заданный Вами в процессе настройки, о котором пойдёт речь далее. Также API позволяет Вам использовать клиентское приложение, заметно упрощающее заполнение информации как для Вас лично, так и для других людей, которым Вы, возможно, захотите предоставить доступ для заполнения информации. Вы можете также создавать несколько пользователей API, чтобы, в случае необходимости, иметь возможность аннулировать чей-то доступ к заполнению информации, не изменяя собственный пароль.

Как происходит взаимодействие с API?

Для того, чтобы выполнить любой метод API, ему необходимо передать HTTP-заголовок key, содержащий определённый ключ доступа. Ключ доступа действителен в течение 30 минут с момента последнего использования. Каждый ключ доступа привязан к конкретному IP адресу и имени пользователя из специальной таблицы базы данных. Если ключ был использован клиентом, имеющим IP-адрес, отличающийся от IP адреса клиента, создавшего ключ, то доступ к API не будет предоставлен, вместо этого будет выведена ошибка с кодом 4 ("Key is invalid for this IP address"). Пользователи также разделены по уровню привилегий на 2 группы, имеющие соответствующее значение в столбце pr_level таблицы пользователей в базе:

  • 1 - обычный пользователь, может использовать почти все методы, но не может изменять список предметов и добавлять/удалять пользователей.
  • 2 - пользователь с повышенными привилегиями, может использовать все методы API Получение ключа доступа происходит посредством обращения к скрипту api/auth.php (полный адрес будет выглядеть как https://your.domain/path/to/bot/ api/auth.php . В данной статье часть, не выделенная жирным шрифтом, указываться не будет).

Необходимо делать POST-запрос к данному скрипту с заголовком Content-Type: application/x-www-form-urlencoded и содержимым вида

user=username
pass=password

Вместо username и password имя пользователя и пароль соответственно.

Если логин и пароль верны, то будет отправлен json-объект, содержащий ключ, имя пользователя и pr_level этого пользователя в соответствующих полях. В противном случае будет возвращена ошибка.

В случае повторного обращения к скрипту api/auth.php, если в таблице базы данных уже присутствует действующий ключ для данного пользователя и ip адреса, и пароль введён верно, будет возвращён тот же ключ, и его действие будет продлено.

Методы API

Все методы данного API можно разделить на две группы:

  • get-методы
  • update-методы

Методы первой группы необходимы для получения уже записанной информации. Они вызываются при помощи GET-запроса и имеют небольшое число параметров, если вообще их имеют. В результате работы они возвращают определённый JSON-объект, содержащий необходимые сведения или информацию об ошибке, если где-то произошёл сбой. К этим методам относятся следующие:

  • api/getSubjects.php - получить список предметов и их ID
  • api/getHomework.php - получить информацию о задании по конкретному предмету
  • api/getTimetable.php - получить информацию о расписании на все 6 учебных дней в текстовом и числовом виде
  • api/getChanges.php - получить информацию об изменениях в расписании

Методы второй группы необходимы непосредственно для обновления информации, используемой ботом. Эти методы вызываются при помощи POST-запроса с заголовком Content-Type: application/json. В теле запроса должен быть, соответственно, json-объект, соответствующий определённой схеме. К этим методам относятся:

Следующие методы можно отнести в отдельную группу, но в целом они схожи с update-методами. Единственное отличие - пользователь, с данными которого создавался ключ доступа, должен иметь значение pr_level = 2. Вот эти методы:

Методы API

api/getSubjects.php

Метод для получения списка предметов и их ID.

Параметры:

Отсутствуют

Результат выполнения:

Если не возникло ошибок, то результатом будет JSON-объект, определяемый схемой:

{
    type':'array',
    'items':
    {
        'type':'object',
        'properties':
        {
            'ID':
            {
                'type':'integer',
                'required':true
            },
            'Name':
            {
                'type':'string',
                'required':true
            },
            'additionalProperties':false
        }
    }
}

api/getHomework.php

Метод для получения задания по одному конкретному предмету, определяемому по ID этого предмета.

Параметры:

  • id - ID предмета

Результат выполнения:

Если не возникло ошибок, то результатом будет JSON-объект, определяемый схемой:

{
    'type':'object',
    'properties':{
        'ID':{
            'type':'integer', 
            'required':true
        },
        'Homework':{
            'type':'string', 
            'required':true
        }
    }
}

api/getTimetable.php

Метод для получения расписания на всю неделю в числовом и текстовом виде.

Параметры:

Отсутствуют

Результат выполнения:

Если не возникло ошибок, то результатом будет JSON-объект, определяемый схемой:

{
    'type':'object',
    'properties':{
        'NumericTimetable':{
            'type': 'array',
            'items':{
                'type':'array',
                'items':{
                    'type':'integer'
                }
            },
            'required':true
        },
        'TextTimetable':{
            'type':'array',
            'items':{
                'type':'string'
            }, 
            'required':true
        }
    }
}

api/getChanges.php

Метод для получения изменений в расписании.

Параметры:

Отсутствуют

Результат выполнения:

Если не возникло ошибок, то результатом будет JSON-объект, определяемый схемой:

{
    'type':'object',
    'properties':{
        'TextChanges':{
            'type':'string',
            'required':true
        },
        'NumericChanges':{
            'type':'array', 
            'items':{
                'type':'integer'
            }, 
            'required':true
        }
    }
}

api/updateHomework.php

Метод для обновления домашнего задания по конкретному предмету, определяемому по ID.

Тело запроса:

В теле запроса должен быть JSON-объект, описываемый схемой:

{
    'type':'object',
    'properties':{
        'ID':{
            'type':'integer', 
            'required':true
        },
        'Homework':{
            'type':'string', 
            'required':true
        }
    }
}

Результат выполнения:

В случае успешного выполнения ответ сервера будет выглядеть следующим образом:

{"updated":true}

api/updateTimetable.php

Метод для обновления расписания.

Тело запроса:

В теле запроса должен быть JSON-объект, описываемый схемой:

{
    'type':'object',
    'properties':{
        'NumericTimetable':{
            'type': 'array',
            'items':{
                'type':'array',
                'items':{
                    'type':'integer'
                }
            },
            'required':true
        },
        'TextTimetable':{
            'type':'array',
            'items':{
                'type':'string'
            }, 
            'required':true
        }
    }
}

Результат выполнения:

В случае успешного выполнения ответ сервера будет выглядеть следующим образом:

{"updated":true}

Возможен вариант, когда будет возвращён результат false. Такого не должно происходить, но теоретически - это возможно. Если такое вдруг произойдёт - советую написать issue с описанием Ваших действий.

api/updateChanges.php

Метод для обновления изменений в расписании.

Тело запроса:

В теле запроса должен быть JSON-объект, описываемый схемой:

{
    'type':'object',
    'properties':{
        'TextChanges':{
            'type':'string',
            'required':true
        },
        'NumericChanges':{
            'type':'array', 
            'items':{
                'type':'integer'
            }, 
            'required':true
        }
    }
}

Результат выполнения:

В случае успешного выполнения ответ сервера будет выглядеть следующим образом:

{"updated":true}

Возможен вариант, когда будет возвращён результат false. Такого не должно происходить, но теоретически - это возможно. Если такое вдруг произойдёт - советую написать issue с описанием Ваших действий.

api/addSubjects.php

Метод для добавления предметов в таблицу базы данных. Может быть выполнен только с ключом доступа пользователя, имеющего pr_level = 2

Тело запроса:

В теле запроса должен быть JSON-объект, описываемый схемой:

{
    'type':'object',
    'properties':{
        'names':{
            'type':'array', 
            'items':{
                'type':'string',
                "pattern":"^[\\\\wА-Яа-яЁё\\\\s-]{1,50}$"
            }, 
            'required':true
        }
    }
}

Результат выполнения:

В случае успешного выполнения ответ сервера будет выглядеть следующим образом:

{"added_subjects":1}

Вместо 1 здесь число добавленных предметов. Если по каким-то причинам их добавится меньше, чем запланировано, то это можно будет сразу увидеть, сравнив количество предметов в запросе и количество, написанное в выводе.

api/deleteSubjects.php

Метод для удаления предметов из таблицы базы данных по их ID. Может быть выполнен только с ключом доступа пользователя, имеющего pr_level = 2

Тело запроса:

В теле запроса должен быть JSON-объект, описываемый схемой:

{
    'type':'object',
    'properties':{
        'IDs':{
            'type':'array', 
            'items':{
                'type':'integer'
            }, 
            'required':true
        }
    }
}

Результат выполнения:

В случае успешного выполнения ответ сервера будет выглядеть следующим образом:

{"deleted_subjects":1}

Вместо 1 здесь число удалённых предметов. Если по каким-то причинам их было удалено меньше, чем запланировано, то это можно будет сразу увидеть, сравнив количество предметов в запросе и количество, написанное в выводе.

api/addUser.php

Метод для добавления нового пользователя в базу данных. Может быть выполнен только с ключом доступа пользователя, имеющего pr_level = 2

Тело запроса

В теле запроса должен быть JSON-объект, описываемый схемой:

{
    'type': 'object',
    'properties': {
        'user': {
            'type': 'string',
            'pattern': '^[\\\\w]+$',
            'required': true
        },
        'pass': {
            'type': 'string',
            'required': true
        },
        'pr': {
            'type': 'int',
            'minimum': 1,
            'maximum': 2
            'required': true
        }
    }
}

Результат выполнения:

В случае успешного выполнения ответ сервера будет выглядеть следующим образом:

{"added":true}

api/deleteUser.php

Метод для удаления пользователя из базы данных. В случае попытки удалить пользователя, от имени которого выполняется запрос, будет выдана ошибка с кодом 7. Метод получает параметры через GET-запрос, т.е. параметры необходимо передавать в URL.

Может быть выполнен только с ключом доступа пользователя, имеющего pr_level = 2

Параметры:

  • user - имя пользователя, которого надо удалить

Результат выполнения:

В случае успешного выполнения ответ сервера будет выглядеть следующим образом:

{"deleted":true}

Коды ошибок

Внутренние серверные ошибки

Данные ошибки возникают, если ошибка произошла внутри метода независимо от ввода пользователя, например, если не удалось подключиться к базе данных.

  • Ошибка 1 - Ошибка соединения с базой данных
  • Ошибка 2 - Ошибка выполнения запроса к базе данных
  • Ошибка 8 - Невозможно произвести запись в файл.

Ошибки авторизации

  • Ошибка 3 - Неверный логин или пароль
  • Ошибка 4 - Неверный ключ доступа или ip адрес не соответствует изначальному ip-адресу
  • Ошибка 5 - Срок действия ключа доступа истёк
  • Ошибка 6 - Отсутствуют необходимые для авторизации параметры
  • Ошибка 9 - Недостаточно прав для выполнения запроса

Ошибки запросов

  • Ошибка 7 - Неправильный список параметров для метода