Перейти к содержимому


Фотография

Telegram Interface

Telegram library interface

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 6

#1 Оффлайн   HeroBrine1st

HeroBrine1st
  • Пользователи
  • Сообщений: 76
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

        

Отправлено 18 Ноябрь 2017 - 11:16

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

Я сделал чуток лучше. Я сделал библиотеку для ботов.

 

Установка

Копируем вот этот код в /lib/Telegram.lua:

local TG = {}
local json = require("JSON")
local internet = require("internet")
local serial = require("serialization")
local fs = require("filesystem")
function TG.sendRequest(token,method,POST)
	local data = ""
	for chunk in internet.request("https://api.telegram.org/bot" .. token .. "/" .. method,POST) do
		data = data .. chunk
	end
	return json.decode(data)
end

function TG.sendMessage(token,chat_id,text)
	while true do
		local success, reason = pcall(TG.sendRequest,token,"sendMessage",{chat_id = chat_id, text = text})
		if success then return reason end
	end
end

function TG.getUpdates(token)
	while true do
		local success, reason = pcall(TG.sendRequest,token,"getUpdates",{offset = TG.lastUpdate})
		if success then
			for i = 1, #reason.result do
				TG.lastUpdate = reason.result[i].update_id + 1
			end
			return reason 
		end
	end
end

function TG.receiveMessages(token)
	local updates = TG.getUpdates(token,{offset = TG.lastUpdate})
	local messages = {}
	for i = 1, #updates.result do
		local update = updates.result[i]
		if update and update.message then
			local message = {update = update, text = update.message.text, chat_id = update.message.chat.id}
			table.insert(messages,message)
		end
	end
	return messages
end


return TG

Скачиваем эту библиотеку https://github.com/r...master/json.lua в /lib/JSON.lua

 

Создание бота

Здесь все подробно обьясняют: https://tlgrm.ru/docs/bots#botfather.

 

Документация

 

Эта библиотека имеет всего 4 функции. Трех последних вполне достаточно, что бы написать простого бота. Ну а что бы создавать шедевры, есть первая функция.

 

sendRequest(token: string,method: string[, POST: table]): table

Создает GET или POST запрос к API серверу. Возвращает таблицу, которую вернул сервер.

 

sendMessage(token: string,chat_id: number,text: string)

Отправляет в диалог chat_id сообщение text. Что-то возвращает, вроде таблицу, не проверял.

 

getUpdates(token: string): table

Получает все события, которые бот должен обработать. Исключает повторы.

 

receiveMessages(token: string): table

Возвращает массив с таблицами, каждая содержит 3 значения: update - обьект самого сообщения, text - текст в сообщении и chat_id - айди чата. Зависима от getUpdates, т.е. тоже исключает повторы.

 

Так же хочу пояснить за циклы в некоторых функциях.

Эти циклы исключают ошибку разрыва соединения. Например во время перезагрузки сервера, если программа сделает запрос, сервер закроет соединение, и получится ошибка. Цикл же ждет, пока функция не выполнится успешно, и если выполнится - цикл закрывается.

А еще в библиотеке нет защиты от дурака. Учитывайте.

 

P.s. надеюсь, что ничьи чувства вступлением не оскорбил


Сообщение отредактировал HeroBrine1st: 18 Ноябрь 2017 - 13:23


#2 Оффлайн   TC1061

TC1061
  • Пользователи
  • Сообщений: 39
  • Уровень сигнала: 7,96%
  • В игре: 59 час. 28 мин.

Отправлено 25 Январь 2018 - 14:20

А если сервера Telegram окажутся недоступны?



#3 Оффлайн   HeroBrine1st

HeroBrine1st
  • Автор темы
  • Пользователи
  • Сообщений: 76
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

        

Отправлено 29 Январь 2018 - 18:23

А если сервера Telegram окажутся недоступны?

API сервер никогда не отключается. В одиночной игре использование данной библиотеки бессмысленно, а сервера без интернета не остаются.



#4 Оффлайн   AtomicScience

AtomicScience
  • Пользователи
  • Сообщений: 16
  • Уровень сигнала: 1,3%
  • В игре: 9 час. 41 мин.

Отправлено 08 Февраль 2018 - 21:52

Вещица реально крута, но есть одно "но": если мы перезагрузим ПК и заного запустим нашу библиотеку и попытаемся получить события, то на нас вывалятся все сообщения вплоть до мезозоя. Поэтому если планируешь дорабатывать - добавь фичу сохранения последнего lastUpdate в файл



#5 Оффлайн   Litvinov

Litvinov
  • Пользователи
  • Сообщений: 25
  • Уровень сигнала: 0,47%
  • В игре: 3 час. 30 мин.

Награды

     

Отправлено 16 Февраль 2018 - 00:25

Спасибо за полезную библиотеку



#6 Оффлайн   HeroBrine1st

HeroBrine1st
  • Автор темы
  • Пользователи
  • Сообщений: 76
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

        

Отправлено 18 Февраль 2018 - 21:31

Вещица реально крута, но есть одно "но": если мы перезагрузим ПК и заного запустим нашу библиотеку и попытаемся получить события, то на нас вывалятся все сообщения вплоть до мезозоя. Поэтому если планируешь дорабатывать - добавь фичу сохранения последнего lastUpdate в файл

Согласно документации, если я вызову метод getUpdates с параметром offset, все обновления, меньшие или равные этому ID будут засчитаны как обработанные.

 

То есть API сервер сам сохраняет то, что я обработал обновление. Со стороны бота ничего сохранять в файл не нужно.

Однако есть одно но: при команде типа /reboot и последующей перезагрузке бот может зациклить перезагрузку. Решение - перед выключением или перезагрузкой надо еще раз получить обновления.

 

И да, лимит обновлений - 100 единиц. При получении нового обновления самое первое удаляется (если выходит за лимит). Если обновлению уже исполнился 1 день, оно автоматически удаляется.


Сообщение отредактировал HeroBrine1st: 18 Февраль 2018 - 21:33


#7 Гость_kovirolik_*

Гость_kovirolik_*
  • Гости
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 01 Март 2018 - 23:14

Спасибо)







Темы с аналогичным тегами Telegram, library, interface

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных