Сервер предоставляющий интерфейс для взаимодействия с БД расписания. Модуль для VkScheduleBot.
Docker Hub: paladin705/vk_schedule_bot_api
Программа для взаимодействия с сервером: api_client
Модуль использует СУБД PostgreSQL для хранения данных. Адрес: http://<адрес сервера>/api/.
Сервер реализованный в docker контейнере не имеет прямого доступа к сети и использует сокет /api/socket/api.sock для обработки запросов. Чтобы передать поступающие запросы серверу, можно использовать nginx reverse proxy для передачи их на сокет сервера.
Для запуска docker контейнера загружаемого с Docker Hub можно использовать следующую команду:
docker run \
-v ./vk_bot_api/socket:/api/socket \
-v ./vk_bot_api/log:/api/log \
-e DB_NAME=<Введите значение параметра> \
-e DB_USER=Введите значение параметра<> \
-e DB_PASSWORD=<Введите значение параметра> \
-e DB_HOST=<Введите значение параметра> \
-e TZ=<Введите значение параметра> \
paladin705/vk_schedule_bot_api:latest/api/socket- В данной директории находится сокет сервера:api.sock. Он используется для обработки запросов к серверу/api/log- Директория где располагаются логи сервера
DB_NAME- Название базы данных (БД) PostgreSQLDB_USER- Имя пользователя БДDB_PASSWORD- Пароль пользователя БДDB_HOST- Адрес БДTZ- Часовой пояс. Необязательный параметр. По умолчаниюEurope/Moscow
Сервер реализует REST API для взаимодействия с базой данных бота. С API можно взаимодействовать не только с помощью программы api_client, но и с помощью http-запросов.
GET методы API (методы для получения данных) доступны без авторизации.
Для примеров запросов в качестве IP адреса и порта сервера API используются значения api_address и api_port.
- Создание пользователя API
- Авторизация и получение токена
- Доступ к данным всех организаций (DbInfoApi)
- Доступ к данным организации (OrganizationApi)
- Доступ к данным факультетов (FacultyApi)
- Доступ к данным групп (GroupApi)
- Доступ к данным расписания занятий выбранной группы (ScheduleApi)
- Доступ к данным расписания экзаменов выбранной группы (ExamsApi)
Для работы с API вам будет необходимо добавить в таблицу api_users базы данных, имя нового пользователя API и хеш пароля. Методов API для регистрации пользователей не предусмотрено. Вам необходимо создать имя пользователя и пароль, а затем сгенерировать bcrypt хеш пароля. Затем вам необходимо сохранить выбранное имя пользователя API и сгенерированный хеш пароля в таблицу api_users базы данных.
Тажке, если вы уже создали пользоватля для VkScheduleBot Control Panel, то вы можете использовать его данные.
Следующий пример показывает простой Python скрипт для создания нового пользователя API. Для его работы понадобятся библиотеки bcrypt и psycopg2:
pip install bcrypt psycopg2После установки библиотек bcrypt и psycopg2, необходимо создать и запустить следующий скрипт для Python 3:
import bcrypt
import psycopg2
# Данные нового пользователя API
api_username = 'Имя пользователя API'
api_password = 'Пароль пользователя API'
# Параметры подключения к базе данных
db_name = 'Название базы данных (БД) PostgreSQL'
db_user = 'Имя пользователя БД'
db_password = 'Пароль пользователя БД'
db_host = 'Адрес сервера БД'
db_port = Порт сервера БД (число)
# Создание хеша пароля
pw_hash = bcrypt.hashpw(api_password.encode('utf-8'), bcrypt.gensalt())
# Загрузка нового пользователя APi в базу данных
con = psycopg2.connect(
dbname=db_name,
user=db_user,
password=db_password,
host=db_host,
port=db_port)
cur = con.cursor()
cur.execute('INSERT INTO api_users(username, pw_hash) VALUES(%s,%s);', (api_username, pw_hash.decode('utf-8')))
con.commit()Вам необходимо записать в переменные api_username и api_password желаемое имя пользователя API и его пароль соответственно. Переменные db_name, db_user, db_password, db_host и db_port используются для установки соединения с сервером PostgreSQL базы данных. Вы должны использовать для их заполнения теже значения, что и для сервера API (если скрипт запускается не с компьютера, на котором запущен сервер API, то значение db_host и db_port может отличаться).
Для того, чтобы пользоваться функциями API, необходимо пройти авторизацию и получить api_token и api_refresh_token. api_token в дальнейшем будет использоваться при отправке запросов к API, при этом, он устаревает через 15 минут использования. Для обновления api_token, может использоваться api_refresh_token.
В случае ошибки сервер возвращает код 400 или 401, а также следующий код ошибки в виде json:
{
"error_code": 701,
"message": "Missing json in request"
}
{
"error_code": 702,
"message": "Missing username parameter"
}
{
"error_code": 703,
"errorMessage": "Missing password parameter"
}
{
"error_code": 704,
"errorMessage": "Bad username or password"
}
{
"error_code": 705,
"errorMessage": "Unknown error"
}
{
"msg":"Token has expired"
}
Для получения api_token и api_refresh_token, необходимо авторизоваться, путём ввода имени пользователя api_username и соответствующего ему пароля api_password.
POST /api/auth/login
curl -X POST -i -H 'Content-Type: application/json' -d '{"username":"api_username", "password":"api_password"}' http://api_address:api_port/api/auth/login
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 26 Jul 2021 16:44:02 GMT
Content-Type: application/json
Content-Length: 587
Connection: keep-alive
{"access_token":"api_token","refresh_token":"api_refresh_token"}
Этот метод служит для обновления значения api_token (будет получен новый токен new_api_token).
POST /api/auth/refresh
curl -X POST -i -H 'Authorization: Bearer refresh_token' http://api_address:api_port/api/auth/refresh
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 26 Jul 2021 17:29:34 GMT
Content-Type: application/json
Content-Length: 293
Connection: keep-alive
{"access_token":"new_api_token"}
Эта группа методов позволяет получить информацию о всех организациях хранящихся в базе данных
В случае ошибки сервер возвращает код 400, а также следующий код ошибки в виде json:
{
"error_code": 101,
"message": "Select organizations failed"
}
{
"errorCode": 102,
"errorMessage": "Delete organizations failed"
}
Метод для получения списка организаций в виде json массива. В примере возвращается список состоящий из организаций org1, org2 и org3.
GET /api/v1/
curl -X GET http://api_address:api_port/api/v1/
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 26 Jul 2021 18:14:08 GMT
Content-Type: application/json
Content-Length: 134
Connection: keep-alive
["org1","org2", "org3"]
Метод полностью удаляет все организации из базы данных, а также их расписание занятий и экзаменов.
DELETE /api/v1/
curl -X DELETE -i -H 'Authorization: Bearer api_token' http://api_address:api_port/api/v1/
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 26 Jul 2021 18:15:12 GMT
Content-Type: application/json
Content-Length: 3
Connection: keep-alive
{}
Эта группа методов позволяет получить информацию о выбранной организации
В случае ошибки сервер возвращает код 400, а также следующий код ошибки в виде json:
{
"error_code": 201,
"message": "Select organization failed"
}
{
"errorCode": 202,
"errorMessage": "Delete organization failed"
}
Метод для получения списка факультетов выбранной организации organization в виде json массива. В примере возвращается список состоящий из факультетов faculty1, faculty2 и faculty3.
GET /api/v1/organization
curl -X GET http://api_address:api_port/api/v1/organization
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 26 Jul 2021 18:48:08 GMT
Content-Type: application/json
Content-Length: 35
Connection: keep-alive
["faculty1","faculty2","faculty3"]
Метод удаляет выбранную организацию organization, а также её расписание занятий и экзаменов.
DELETE /api/v1/organization
curl -X DELETE -i -H 'Authorization: Bearer api_token' http://api_address:api_port/api/v1/organization
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 26 Jul 2021 18:50:32 GMT
Content-Type: application/json
Content-Length: 3
Connection: keep-alive
{}
Эта группа методов позволяет получить информацию о факультетах выбранной организации
В случае ошибки сервер возвращает код 400, а также следующий код ошибки в виде json:
{
"error_code": 301,
"message": "Select faculty failed"
}
{
"errorCode": 302,
"errorMessage": "Delete faculty failed"
}
Метод для получения списка групп выбранной факультета faculty, принадлежащего организации organization в виде json массива. В примере возвращается список состоящий из групп group1, group2 и group3.
GET /api/v1/organization/faculty
curl -X GET http://api_address:api_port/api/v1/organization/faculty
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 26 Jul 2021 19:14:50 GMT
Content-Type: application/json
Content-Length: 29
Connection: keep-alive
["group1","group2","group3"]
Метод удаляет выбранный факультет faculty организации organization, а также его расписание занятий и экзаменов.
DELETE /api/v1/organization/faculty
curl -X DELETE -i -H 'Authorization: Bearer api_token' http://api_address:api_port/api/v1/organization/faculty
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 26 Jul 2021 19:16:18 GMT
Content-Type: application/json
Content-Length: 3
Connection: keep-alive
{}
Эта группа методов позволяет получить информацию о выбранной группе
В случае ошибки сервер возвращает код 400, а также следующий код ошибки в виде json:
{
"error_code": 401,
"message": "Select group failed"
}
{
"errorCode": 402,
"errorMessage": "Delete group failed"
}
{
"error_code": 403,
"message": "Group already created"
}
{
"error_code": 404,
"message": "Create group failed"
}
{
"error_code": 405,
"message": "Missing json in request"
}
Возникла ошибка во время обновления группы (в запросе отсутствуют данные новой названия организации группы)
{
"error_code": 406,
"message": "Missing new_organization parameter"
}
Возникла ошибка во время обновления группы (в запросе отсутствуют данные нового названия факультета группы)
{
"error_code": 407,
"message": "Missing new_faculty parameter"
}
{
"error_code": 408,
"message": "Missing new_group parameter"
}
{
"error_code": 409,
"message": "Change group failed"
}
Метод для получения тега группы group (принадлежащей факультету faculty организации organization). В примере возвращается тег группы имеющий значение group_tag.
GET /api/v1/organization/faculty/group
curl -X GET http://api_address:api_port/api/v1/organization/faculty/group
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 26 Jul 2021 19:42:53 GMT
Content-Type: application/json
Content-Length: 33
Connection: keep-alive
"group_tag"
Метод позволяет добавить группу group принадлежащую факультету faculty организации organization в базу данных. Метод возвращает тег добавленной группы group_tag в случае успешного выполнения запроса.
POST /api/v1/organization/faculty/group
curl -X POST -i -H 'Authorization: Bearer api_token' http://api_address:api_port/api/v1/organization/faculty/group
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 26 Jul 2021 19:47:18 GMT
Content-Type: application/json
Content-Length: 33
Connection: keep-alive
"group_tag"
Метод позволяет изменить данные группы group принадлежащей факультету faculty организации organization. Он изменяет название группы на upd_group, а также изменяет факультет и организацию, которой принадлежит группа, на upd_faculty и upd_organization соответственно. Метод возвращает обновлённый тег группы upd_group_tag в случае успешного выполнения запроса.
PUT /api/v1/organization/faculty/group
curl -X PUT -i -H 'Authorization: Bearer api_token' -H 'Content-Type: application/json' -d '{"new_group":"upd_group", "new_faculty":"upd_faculty", "new_organization":"upd_organization"}' http://api_address:api_port/api/v1/organization/faculty/group
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 26 Jul 2021 19:54:29 GMT
Content-Type: application/json
Content-Length: 33
Connection: keep-alive
"upd_group_tag"
Метод удаляет выбранную группу group (принадлежащую факультету faculty организации organization), а также её расписание занятий и экзаменов.
DELETE /api/v1/organization/faculty/group
curl -X DELETE -i -H 'Authorization: Bearer api_token' http://api_address:api_port/api/v1/organization/faculty/group
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 26 Jul 2021 19:59:59 GMT
Content-Type: application/json
Content-Length: 3
Connection: keep-alive
{}
Эта группа методов позволяет получить информацию о расписании занятий выбранной группы
В случае ошибки сервер возвращает код 400, а также следующий код ошибки в виде json:
{
"error_code": 501,
"message": "Select schedule failed"
}
{
"errorCode": 502,
"errorMessage": "Delete schedule failed"
}
{
"error_code": 503,
"message": "Create schedule failed"
}
Возникла ошибка во время удаления расписания занятий выбранной группы (в запросе отсутствуют json данные расписания)
{
"error_code": 504,
"message": "Empty data"
}
{
"error_code": 505,
"message": "Unknown group"
}
Метод для получения расписания занятий группы group (принадлежащей факультету faculty организации organization). В примере возвращается json массив с тремя значениями (тремя занятиями).
Каждый элемент json массива имеет следующую структуру:
{
"day": "День недели (английское название)",
"number": Номер занятия (число),
"week_type": "Допустимы лишь следующие значения: odd - занятие проводится по нечётным неделям, even - по чётным неделям, all - каждую неделю",
"title": "Название занятия",
"classroom": "Аудитория в которой проводится занятие. Необязательный параметр",
"lecturer": "Преподаватель ведущий занятие. Необязательный параметр",
"time_start": "Время начала занятия (Формат: ЧЧ:ММ). Необязательный параметр",
"time_end": "Время окончания занятия (Формат: ЧЧ:ММ). Необязательный параметр"
}GET /api/v1/organization/faculty/group/schedule
curl -X GET http://api_address:api_port/api/v1/organization/faculty/group/schedule
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 26 Jul 2021 20:58:01 GMT
Content-Type: application/json
Content-Length: 468
Connection: keep-alive
[{"classroom":"classroom 1","day":"Monday","time_end":"10:05","lecturer":"lecturer 1","number":1,"time_start":"08:30","title":"Test title 1","week_type":"odd"},{"classroom":"classroom 2","day":"Tuesday","time_end":"11:55","lecturer":"lecturer 2","number":2,"time_start":"10:20","title":"Test title 2","week_type":"even"},{"classroom":"classroom 3","day":"Wednesday","time_end":"13:45","lecturer":"lecturer 3","number":3,"time_start":"12:10","title":"Test title 3","week_type":"all"}]
Метод позволяет добавить расписание занятий для выбранной группы group (принадлежащей факультету faculty организации organization). Добавляемое расписание должно быть представлено в виде json массива, формат которого рассматривается ниже.
В качестве примера запроса, для группы group (принадлежащей факультету faculty организации organization), будут добавлены следующие занятия в виде массива data:
{
"data": [
{
"day": "Понедельник",
"number": 1,
"week_type": "odd",
"title": "Test title 1",
"classroom": "classroom 1",
"lecturer": "lecturer 1",
"time_start": "08:30",
"time_end": "10:05"
},
{
"day": "Tuesday",
"number": 2,
"week_type": "even",
"title": "Test title 2",
"classroom": "classroom 2",
"lecturer": "lecturer 2",
"time_start": "10:20",
"time_end": "11:55"
},
{
"day": "Wednesday",
"number": 3,
"week_type": "all",
"title": "Test title 3",
"classroom": "classroom 3",
"lecturer": "lecturer 3",
"time_start": "12:10",
"time_end": "13:45"
}
]
}Поле week_type может принимать только значения odd, even или all. Они соответствуют парам, которые проходят лишь по нечётным (odd) и чётным (even) неделям, а также парам, которые проходят каждую неделю (all).
Поля classroom, time_start, time_end и lecturer, являются необязательными.
Метод возвращает массив из занятий, которые не удалось добавить (массив failed), если все занятия были добавлены, то массив failed будет пуст.
POST /api/v1/organization/faculty/group/schedule
curl -X POST -i -H 'Authorization: Bearer api_token' http://api_address:api_port/api/v1/organization/faculty/group/schedule -H 'Content-Type: application/json' -d '{"data": [{"day": "Monday","number": 1,"week_type": "odd","title": "Test title 1","classroom": "classroom 1","lecturer": "lecturer 1","time_start": "08:30","time_end": "10:05"}, {"day": "Tuesday","number": 2,"week_type": "even","title": "Test title 2","classroom": "classroom 2","lecturer": "lecturer 2","time_start": "10:20","time_end": "11:55"},{"day": "Wednesday","number": 3,"week_type": "all","title": "Test title 3","classroom": "classroom 3","lecturer": "lecturer 3","time_start": "12:10","time_end": "13:45"}]}'
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 26 Jul 2021 21:03:49 GMT
Content-Type: application/json
Content-Length: 14
Connection: keep-alive
{"failed":[]}
Метод производит удаление всего расписания занятий для выбранной группы group (принадлежащей факультету faculty организации organization).
DELETE /api/v1/organization/faculty/group/schedule
curl -X DELETE -i -H 'Authorization: Bearer api_token' http://api_address:api_port/api/v1/organization/faculty/group/schedule
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 26 Jul 2021 21:15:29 GMT
Content-Type: application/json
Content-Length: 3
Connection: keep-alive
{}
Эта группа методов позволяет получить информацию о расписании экзаменов выбранной группы
В случае ошибки сервер возвращает код 400, а также следующий код ошибки в виде json:
{
"error_code": 601,
"message": "Select exams failed"
}
{
"errorCode": 602,
"errorMessage": "Delete exams failed"
}
{
"error_code": 603,
"message": "Create exams failed"
}
Возникла ошибка во время удаления расписания экзаменов выбранной группы (в запросе отсутствуют json данные расписания)
{
"error_code": 604,
"message": "Empty data"
}
{
"error_code": 605,
"message": "Unknown group"
}
Метод для получения расписания экзаменов группы group (принадлежащей факультету faculty организации organization). В примере возвращается json массив с тремя значениями (тремя экзаменами).
Каждый элемент json массива имеет следующую структуру:
{
"day": "День проведения экзамена (Формат: ДД.ММ.ГГГГ)",
"title": "Название экзамена",
"classroom": "Аудитория в которой проводится экзамен. Необязательный параметр",
"lecturer": "Преподаватель принимающий экзамен. Необязательный параметр"
}GET /api/v1/organization/faculty/group/exams
curl -X GET http://api_address:api_port/api/v1/organization/faculty/group/exams
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 26 Jul 2021 21:44:09 GMT
Content-Type: application/json
Content-Length: 371
Connection: keep-alive
[{"classroom":"Test classroom 1","day":"Mon, 25 Jan 2021 00:00:00 GMT","lecturer":"Test lecturer 1","title":"Test title 1"},{"classroom":"Test classroom 2","day":"Tue, 26 Jan 2021 00:00:00 GMT","lecturer":"Test lecturer 2","title":"Test title 2"},{"classroom":"Test classroom 3","day":"Wed, 27 Jan 2021 00:00:00 GMT","lecturer":"Test lecturer 3","title":"Test title 3"}]
Метод позволяет добавить расписание экзаменов для выбранной группы group (принадлежащей факультету faculty организации organization). Добавляемое расписание должно быть представлено в виде json массива, формат которого рассматривается ниже.
В качестве примера запроса, для группы group (принадлежащей факультету faculty организации organization), будут добавлены следующие экзамены в виде массива data:
{
"data": [
{
"day": "25.01.2021",
"title": "Test title 1",
"classroom": "Test classroom 1",
"lecturer": "Test lecturer 1"
},
{
"day": "26.01.2021",
"title": "Test title 2",
"classroom": "Test classroom 2",
"lecturer": "Test lecturer 2"
},
{
"day": "27.01.2021",
"title": "Test title 3",
"classroom": "Test classroom 3",
"lecturer": "Test lecturer 3"
}
]
}Поля classroom и lecturer, являются необязательными.
Метод возвращает массив из экзаменов, которые не удалось добавить (массив failed), если все экзамены были добавлены, то массив failed будет пуст.
POST /api/v1/organization/faculty/group/exams
curl -X POST -i -H 'Authorization: Bearer api_token' http://api_address:api_port/api/v1/organization/faculty/group/exams -H 'Content-Type: application/json' -d '{"data": [{"day": "25.01.2021","title": "Test title 1","classroom": "Test classroom 1","lecturer": "Test lecturer 1"}, {"day": "26.01.2021","title": "Test title 2","classroom": "Test classroom 2","lecturer": "Test lecturer 2"}, {"day": "27.01.2021","title": "Test title 3","classroom": "Test classroom 3","lecturer": "Test lecturer 3"}]}'
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 26 Jul 2021 21:46:15 GMT
Content-Type: application/json
Content-Length: 14
Connection: keep-alive
{"failed":[]}
Метод производит удаление всего расписания экзаменов для выбранной группы group (принадлежащей факультету faculty организации organization).
DELETE /api/v1/organization/faculty/group/exams
curl -X DELETE -i -H 'Authorization: Bearer api_token' http://api_address:api_port/api/v1/organization/faculty/group/exams
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 26 Jul 2021 21:48:00 GMT
Content-Type: application/json
Content-Length: 3
Connection: keep-alive
{}