Перейти к основному содержимому
Версия: 7.15

Оповещения

Справка

Приведенные в данном документе примеры методов оповещений, несут ознакомительный характер, и могут быть изменены под свои нужды.

Метод оповещения E-mail

print("subject:" .. subject)
print("body:" .. body)
print("")
print("recipients: ")

for k,v in pairs(recipients) do
print(v)
end

local from = { title = "<Отображаемое имя отправителя>", address =
"<Отображаемый адрес отправителя>"}

local result = smtp({
host = "<Почтовый сервер>", --string
port = <Порт>, --int
useSsl = true, --bool
username = "<Логин>", --string
password = "<Пароль>", --string
subject = subject,
body = body,
mailType = "plain",
from = from,
recipients = recipients
})

if (result.err ~= nil) then
print(result.err)
return -- Ранний выход из скрипта, если возникла ошибка.
end

print("result:".. tostring(result.data))

В данном примере измените следующие параметры на свои:

  • <Почтовый сервер> - адрес вашего SMTP сервера

  • <Порт> - порт SMTP сервера

  • <Логин> - логин доступа к почтовому ящику

  • <Пароль> - пароль доступа к почтовому ящику

  • <Отображаемое имя отправителя> - From: Имя <адрес>

  • <Отображаемый адрес отправителя> - *From: Имя <адрес>*

Метод оповещения Telegram

local botId = "<BotToken>"

local function sendMessage(recipient)
local requestBody = {
chat_id = recipient,
text = subject .. "\n" .. body
}

local args = {
uri = "https://api.telegram.org/bot" .. botId .. "/sendMessage",
method = "POST",
mediaType = "application/json",
body = json.encode(requestBody)
}
local response = curl(args)
if (response.err ~= nil) then
print(response.err)
return -- Ранний выход из скрипта, если возникла ошибка.
end

if (response.data.isSuccessStatusCode) == true then
print(response.data.content)
else
print(":( status code " .. response.data.statusCode)
end
end

for k, v in pairs(recipients) do
sendMessage(v)
end

В данном примере необходимо изменить <BotToken> на токен который принадлежит вашему боту Telegram

Метод оповещения Slack

local botToken = "<SlackToken>"

local function getUserId(email)
local args = {
uri = "https://slack.com/api/users.lookupByEmail",
method = "POST",
mediaType = "application/x-www-form-urlencoded",
headers = { authorization = "Bearer " .. botToken },
body = "email=" .. email
}

local response = curl(args)
if (response.err ~= nil) then
print(response.err)
return -- Ранний выход из скрипта, если возникла ошибка.
end

if (response.data.isSuccessStatusCode) == true then
local responseJsonTable = json.decode(response.data.content)
local userId =responseJsonTable["user"]["id"]
print("Got user Id for " .. email .. " : " .. userId)
return userId
else
print(":( status code " .. response.data.statusCode)
end
end

local function openDirectChat(userId)
local requestBody = {
users = userId,
return_im = true
}

local args = {
uri = "https://slack.com/api/conversations.open",
method = "POST",
mediaType = "application/json",
headers = { authorization = "Bearer " .. botToken },
body = json.encode(requestBody)
}

local response = curl(args)
if (response.err ~= nil) then
print(response.err)
return -- Ранний выход из скрипта, если возникла ошибка.
end

if (response.data.isSuccessStatusCode) == true then
local responseJsonTable = json.decode(response.data.content)
local channelId =responseJsonTable["channel"]["id"]
print("Created direct chat with user " .. userId .. ". ChannelId: " .. channelId)
return channelId
else
print(":( status code " .. response.data.statusCode)
end
end

local function sendMessage(conversation)
local requestBody = {
channel = conversation,
text= "*" .. subject .. "*" .. "\n" .. body
}

local args = {
uri = "https://slack.com/api/chat.postMessage",
method = "POST",
mediaType = "application/json",
headers = { authorization = "Bearer " .. botToken },
body = json.encode(requestBody)
}

local response = curl(args)
if (response.err ~= nil) then
print(response.err)
return -- Ранний выход из скрипта, если возникла ошибка.
end

if (response.data.isSuccessStatusCode) == true then
local responseJsonTable = json.decode(response.data.content)
local sentOk=responseJsonTable["ok"]
if (sentOk == true) then
print("Message sent successfully.")
end
print(response.data.content)
else
print(":( status code " .. response.data.statusCode)
end
end

local function processNotify(recipient)
if (recipient:match('[%w]*[%p]*%@+[%w]*[%.]?[%w]*')) then
-- если получатель - email
local userId = getUserId(recipient)
local chatId = openDirectChat(userId)
sendMessage(chatId)
else
-- получатель - Id канала
sendMessage(recipient)
return true
end
end

local function tablelength(T)
local count = 0
for _ in pairs(T) do count = count + 1 end
return count
end

if (recipients == nil or recipients == "") then
print("Список получателей пуст")
end

print("Количество получателей: " .. tablelength(recipients))

for k, v in pairs(recipients) do
local status, retval = pcall(processNotify, v)
end

В данном примере измените <SlackToken> на свой. Как получить токен для Slack

Метод оповещения Zulip

-- Секция переменных
local botEmail = "someemail@mail.com"
local botToken = "some_token"
local zulipUri = "http://some.uri"
local defaultTopic = "someTopic"

-- Функция отправки сообщения
local function sendMessage(stream, topic, body)
local args = {
uri = zulipUri .. "/api/v1/messages",
method = "POST",
mediaType = "application/x-www-form-urlencoded",
basicAuth = {
login = botEmail,
password = botToken
},
body = "type=stream&to=" .. stream .. "&topic=" .. topic .. "&content=" .. body

}
local response = curl(args)
if (response.err ~= nil) then
print(response.err)
return -- Ранний выход из скрипта, если возникла ошибка.
end

if (response.data.isSuccessStatusCode) == true then
print(response.data.content)
else
print(":( status code " .. response.data.statusCode .. ". " .. response.data.content)
end
end

-- Проверка наличия значения topic
if (string.len(subject) > 0) then
topic = subject
else
topic = defaultTopic
end

-- Цикл отправки оповещения всем получателям
for k, stream in pairs(recipients) do
sendMessage(stream, topic, body)
end

В данном примере измените переменные под свои:

  • botEmail - Email бота от которого будет производится отправка оповещений
  • botToken - Токен бота от которого будет производиться отправка оповещений
  • zulipUri - URI по которому доступен ваш инстанс zulip (например: https://user.zulipchat.ru)
  • defaultTopic - Тема по умолчанию, сообщения без указания темы будут отправлены с темой по умолчанию.

Метод оповещения msTeams

В качестве получателя используется полный webhookUri.

Инструкция по его созданию здесь.

В методе реализован функционал выбора формата текста оповещений: Plaintext или AdaptiveCard:

  • Plaintext: Для отправки в этом формате ничего делать не нужно, просто заполняете шаблон как Вам нравится.
  • AdaptiveCard: в поле темы указать AdaptiveCard, В теле разместить JSON описывающий Adaptive Card.

Описание карточек здесь.

ПОДСКАЗКА

Так как конструктор оповещений не позволяет отправлять json, выполнена замена фигурных скобок: { -> ```, } -> '''

Документация по используемым методам здесь.

-- Функция отправки adaptive card
local function sendAdaptiveCard(webhookUri)
local requestBody = '{"type":"message","attachments":[{"contentType":"application/vnd.microsoft.card.adaptive","contentUrl":null,"content":' .. string.gsub(string.gsub(body,"```","{"),"'''","}") ..'}]}'
local args = {
uri = webhookUri,
method = "POST",
mediaType = "application/json",
body = requestBody
}
local response = curl(args)
if (response.err ~= nil) then
print(response.err)
return -- Ранний выход из скрипта, если возникла ошибка.
end

if (response.data.isSuccessStatusCode) == true then
print(response.data.content)
else
print(":( status code " .. response.data.statusCode)
end
end

-- Функция отправки plaintext сообщения
local function sendMessage(webhookUri)
local requestBody = {
text = subject .. " " .. body
}

local args = {
uri = webhookUri,
method = "POST",
mediaType = "application/json",
body = json.encode(requestBody)
}
local response = curl(args)
if (response.err ~= nil) then
print(response.err)
return -- Ранний выход из скрипта, если возникла ошибка.
end

if (response.data.isSuccessStatusCode) == true then
print(response.data.content)
else
print(":( status code " .. response.data.statusCode)
end
end

-- Проверяем наличие флага "AdaptiveCard" в теме сообщения
-- Если флаг присутствует, то выполняем отправку как AdaptiveCard
if (subject == "AdaptiveCard") then
for k, v in pairs(recipients) do
sendAdaptiveCard(v)
end
-- Иначе как текст
else
for k, v in pairs(recipients) do
sendMessage(v)
end
end