Как стать автором
Обновить

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 запросов в сутки. Это надо иметь в виду. Зато есть триггеры.


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

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.