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


На Хабре было несколько таких статей, эта мало чем отличается от них по сути, зато позволяет попробовать 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 запросов в сутки. Это надо иметь в виду. Зато есть триггеры.


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