Оповещения
Приведенные в данном документе примеры методов оповещений, несут ознакомительный характер, и могут быть изменены под свои нужды.
Метод оповещения 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