Попробовать бессерверные технологии бесплатно? Почему нет.
На Хабре было несколько таких статей, эта мало чем отличается от них по сути, зато позволяет попробовать Serverless бесплатно.
К сути ( TL/DR):
- регистрируем бесплатный аккаунт на cloudflare.com
- создаем новый воркер
- регистрируем бота через @BotFather
- вставляем код бота в редактор
- нажимаем Save&Deploy
- получаем адрес (будет что-то типа: https://xxx.yyy.workers.dev)
- регистрируем вебхук бота (хорошо и с картинками описано в: https://habr.com/ru/post/486876/ )
- … (немного ждем)
- PROFIT!!!
Зачем
Например мне лично потребовался эхо-бот для уточнения некоторых моментов работы с telegram bot api.
Пример кода
Собрано на скорую руку из примеров clouflare:
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
const BOT_NAME = "myBotName"
/**
* readRequestBody reads in the incoming request body
* Use await readRequestBody(..) in an async function to get the string
* @param {Request} request the incoming request to read from
*/
async function readRequestBody(request) {
const { headers } = request
const contentType = headers.get("content-type") || ""
if (contentType.includes("application/json")) {
return JSON.stringify(await request.json())
}
else if (contentType.includes("application/text")) {
return await request.text()
}
else if (contentType.includes("text/html")) {
return await request.text()
}
else if (contentType.includes("form")) {
const formData = await request.formData()
const body = {}
for (const entry of formData.entries()) {
body[entry[0]] = entry[1]
}
return JSON.stringify(body)
}
else {
const myBlob = await request.blob()
const objectURL = URL.createObjectURL(myBlob)
return objectURL
}
}
/**
* Respond to the request
* @param {Request} request
*/
async function handleRequest(request) {
let reqBody = await readRequestBody(request);
// if any method accept POST - reply with 200 and self name
if (request.method !== "POST") {
return new Response(
`Hi, I'm ${BOT_NAME}, a test bot` ,{status: 200}
)
}
// other case - it's a telegram call - respond with original content (echo)
let body = JSON.parse(reqBody);
let answer = {
"method":"sendMessage",
"chat_id": body.message.chat.id,
"reply_to_message_id" : body.message.message_id,
"text" :JSON.stringify(body.message)
};
return new Response(JSON.stringify(answer),
{headers: {
"content-type": "application/json;charset=UTF-8",
},status: 200}
)
}
Особенности, которые надо отметить
После сохранения (Save&Deploy) нужно немного подождать — бот будет отвечать примерно через минуту. Изменений применяются тоже с задержкой, что ожидаемо.
Есть лимиты: на время выполнения — 10мс и на 100,000 запросов в сутки. Это надо иметь в виду. Зато есть триггеры.
Удачного ботоводства!