Pull to refresh

Serverless Telegram Bot for free

Попробовать бессерверные технологии бесплатно? Почему нет.


На Хабре было несколько таких статей, эта мало чем отличается от них по сути, зато позволяет попробовать Serverless бесплатно.


К сути ( TL/DR):


  1. регистрируем бесплатный аккаунт на cloudflare.com
  2. создаем новый воркер
  3. регистрируем бота через @BotFather
  4. вставляем код бота в редактор
  5. нажимаем Save&Deploy
  6. получаем адрес (будет что-то типа: https://xxx.yyy.workers.dev)
  7. регистрируем вебхук бота (хорошо и с картинками описано в: https://habr.com/ru/post/486876/ )
  8. … (немного ждем)
  9. 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 запросов в сутки. Это надо иметь в виду. Зато есть триггеры.


Удачного ботоводства!

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.