====== Send via Telegram bot messages to multiply persons chat from Lua via Telegram API ====== Nota bene, \\ This bot will work only with Raspberry PI and VirtualBox machine. It is purpose is the ability to be invited in the chat. \\ OTHERWISE, please use [[level2:send_telegram_messages_via_level2|Level 2 bot]], which is running on the Level2 server, unlike this one, which should be ran on VM via Lua script. {{ :telegram:telegram-api-bot-groups-chat-backup-2021-03-11-firmware-4.0_1_.zip |Sample Project (token used from @WHtest2_bot, human host @tolstov_x)}} When WebHMI is connected to internet it is possible to send Telegram messages via Telegram API. There is a need to create a new bot via [[https://telegram.me/BotFather|@BotFather]]. {{ :telegram:bot_father.png?nolink |}} Send him ''/start'' command. Then it will show all of comands you can use to create and manage your bots. Pick ''/newbot'' command.\\ Then type in the name of bot. It will be telegram link, like ''@BotFather_bot'' for example. The only note, all of bot names should end with regular expression ''_bot'' When you will finish the creation you will get your own bot token. {{ :telegram:bot_token_api.png?direct |}} Keep it secure, because everyone can get control if it is compromised. Copy HTTP API Token to ''botToken'' variable in the first line of script. Also, there is a few registers should be created to work correctly. There is a register map to import to your project to make creation easier. If it is unable to import it with tool, you should create it manually. \\ {{ ::telegram:registers_map_for_telegram_api_chat_bot.zip |Download register map.zip}} Copypaste that script to you device. function main (userId) local botToken = "1556884060:AAFjT5F4IWXTbrcbuUkoL7qhDTrZCf8EA94" --example of Token local bot_id = tonumber(string.sub(botToken, 1, string.find( botToken, ":")-1)) lastSentTime = R("telegram_last_sent_time") -- function main (userId) now = os.time(); local message = "Hello, Telegram! It's " .. tostring(os.date("%H:%M", os.time())) .. " o'clock!" -- your message that will be sent TRACE(message) local condition_to_send = (tonumber(os.date("%s")) % 10 == 0 and now - lastSentTime >= ( 1 * 60 - 5)) -- check if it is initialisation or not if (R("chat_id")) == "" then first_request_no_chat_id = true -- chat_id = "" -- return else first_request_no_chat_id = false chat_id = R("chat_id") end if first_request_no_chat_id then TRACE("first_request_no_chat_id " .. tostring(first_request_no_chat_id)) end -- initialisation branch if first_request_no_chat_id == true then local initialisation_request_ulr = 'https://api.telegram.org/bot'.. botToken .. "/getUpdates" DEBUG(initialisation_request_ulr ) c = cURL.easy_init() c:setopt_timeout(5) c:setopt_url(initialisation_request_ulr) local res = "" c:perform({ writefunction = function(str) res = res .. str; end}) DEBUG(res) local table = cjson.decode(res) --- Check when bot is invited to group for jj, jvalue in pairs ( table.result) do if tonumber(table.result[jj].my_chat_member.chat.id) < 0 then new_chat_id = tostring(table.result[1].my_chat_member.chat.id) WriteReg("chat_id", new_chat_id) break end end -- work branch else lastSentTime = R("telegram_last_sent_time") -- local condition_to_send = (tonumber(os.date("%s")) % 10 == 0 and now - lastSentTime >= ( 1 * 60 - 5)) if condition_to_send == true then local url = 'https://api.telegram.org/bot'.. botToken .. '/sendMessage?chat_id=' .. chat_id .. '&text=' .. urlencode(message); local res = ""; c = cURL.easy_init() c:setopt_url(url) --INFO(message); c:perform({ writefunction = function(str) res = res .. str; end}) local table = cjson.decode(res) local error_code = nil if table.ok == false then error_code = table.error_code lastErrorCode = error_code lastSentTime = tonumber(os.date("%s")) -- DEBUG(lastErrorCode) WriteReg("telegram_last_sent_status_unsuccesful", lastErrorCode); else lastSentTime = tonumber(os.date("%s")) lastSentTimeSuccesful = lastSentTime lastStatus = table.result.message_id WriteReg("telegram_last_sent_status", lastStatus) end c:close() WriteReg("telegram_last_sent_time", lastSentTime); -- Останній час повідомлення в Telegram (DS15@WebHMI) WriteReg("telegram_last_sent_time_succesful", lastSentTimeSuccesful); end end -- end end function urlencode(str) if (str) then str = string.gsub (str, "\n", "\r\n") str = string.gsub (str, "([^%w ])", function (c) return string.format ("%%%02X", string.byte(c)) end) str = string.gsub (str, " ", "+") end return str end At the rest, invite that bot to your chat. Do not forget to enable bot access to messages in BotFather's settings. Run script and it will initialise. In the ''chat_id'' register will became id like ''//-123456789//''. From this moment, your ''message'' variable content will be sent to your Telegram chat, when your variable ''condition_to_send'' equals to **''true''**