Penyingkat tautan mudah di JavaScript, Cloudflare Workers dan Telegram Bot

Bagaimana jika Anda perlu membuat tautan pendek dengan cepat? Tentu saja - gunakan pemendek tautan. Bagaimana jika Anda juga membuat tautan ini dapat dibaca? Masih menggunakan domain Anda sendiri? Dan akan lebih baik melakukannya tanpa server tambahan. Sepertinya ada jawabannya.






Latar Belakang

Ide tentang "penyingkat tautan mudah" muncul saat saya mencari opsi pengalihan menggunakan domain untuk salah satu ruangan di jejaring sosial Clubhouse bermodel baru . Inti dari ide penerusan panggilan ruangan adalah memulai ulang ruangan dengan nama yang sama, tetapi selalu online . Itu perlu untuk memecahkan masalah terus-menerus mengubah alamat ruangan dengan memarkir tautan seperti itu ke sub-domain.





Keputusan itu muncul dengan sendirinya, karena situs tersebut telah ditanam sebelumnya di Cloudflare. Awalnya, saya menggunakan fungsi "Aturan Halaman", yang memungkinkan Anda untuk mengatur, antara lain, aturan pengalihan, tetapi segera muncul ide untuk membuat pengalihan ini lebih fleksibel dan dapat diubah tanpa perlu masuk ke pengaturan layanan. Tentu saja Telegram Bot menjadi solusinya.





Rumusan masalah

Untuk mencapai rencana kami, beberapa masalah perlu diselesaikan:





  • Bagaimana cara mengalihkan dari sub-domain tertentu?





  • Di mana menyimpan tautan dengan kunci (singkatan) - nilai (alamat penerusan)?





  • Bagaimana cara membuat singkatan seperti itu?





Seperti yang mungkin sudah Anda duga, jawaban atas pertanyaan-pertanyaan ini ada di judul artikel. Oleh karena itu, saya mengusulkan untuk melanjutkan ke bagian praktis.





Prasyarat

Untuk penjelasan yang lebih rinci, saya akan mencatat kondisi dasar yang diperlukan untuk pelaksanaan proyek kami:





  • Domain terhubung ke Cloudflare;





  • Pengetahuan umum tentang JavaScript;





  • Bot Telegram dibuat;





  • Dokumentasi untuk Cloudflare Workers dan Telegram Bot API .





Cara memenuhi prasyarat yang diperlukan tidak tercakup dalam artikel ini. Solusi untuk masalah ini tetap ada pada pembaca.





Latihan

, , — « ?». :





1. – Cloudflare KV.





Cloudflare KV — Worker' « - ». , Cloudflare.





: Workers KV, , .





Halaman Cloudflare KV
Cloudflare KV

. , . , , .





Di dalam lemari besi kami

2. Worker .





«Create worker», Worker («Save and Deploy») .





Seperti inilah tampilan halaman Pekerja baru
Worker'

«Settings» Telegram , .





Pengaturan pekerja
Worker'

3. -





, url.mydomain.com



, «-» -.





Halaman pekerja untuk domain kami
Workers

, «Workers» «Route» -.





Menambahkan pengalihan baru

, , (path - ) .



.





, DNS DNS .





Data DNS baru yang akan berisi penyingkat tautan
DNS

! .





. , Cloudlfare. Worker. «Quick edit» .





Editor kode

:













(URL path) . 404.





addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

/**
 * Respond to the request
 * @param {Request} request
 */
async function handleRequest(request) {
  const requestUrl = new URL(request.url);
  const path = requestUrl.pathname.substring(1); //   "/"
  return await redirect(path)
}

/**
 * Make redirect
 * @param {string} shortName
 */
async function redirect(shortName) {
  //        
  const url = await db.get(shortName);
  if (url) {
    //   
    return Response.redirect(url)
  }
  //    
  return new Response(null, {status: 404})
}

      
      



, , :





Ada kontak!
!

. . Telegram URL. , Telegram User ID . . webhook'.





addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

const ADMIN = 11111111; //   Telegram User ID

/**
 * Respond to the request
 * @param {Request} request
 */
async function handleRequest(request) {
  const requestUrl = new URL(request.url);
  const path = requestUrl.pathname.substring(1);
  //        
  if (path == BOT_TOKEN) {
    return await bot(await request.json())
  }

  return await redirect(path)
}

/**
 * Make redirect
 * @param {string} shortName
 */
async function redirect(shortName) {
  const url = await db.get(shortName);
  if (url) {
    return Response.redirect(url)
  }
  return new Response(null, {status: 404})
}

/**
 * Create new shorten URL
 * @param {Object} update
 */
async function bot(update) {
  //     
  if (update.message.from.id != ADMIN) {
    return new Response("OK", {status: 200})
  }
  //    "shortname url"
  const [shortName, url] = update.message.text.split(" ");
  //    
  await db.put(shortName, url);
  const response = {
    //         
    "method": "sendMessage",
    //        -  
    "text": ` ${url}     url.mydomain.com/${shortName}`,
    //   ,     ADMIN (  ), 
    //  update.message.chat.id      
    //     
    "chat_id": update.message.from.id
  }

  return new Response(
    JSON.stringify(response), 
    {
      status: 200,
      headers: new Headers({"Content-Type": "application/json"})
    }
  )
}

      
      



, , :





Sepertinya bisa diterapkan

( ):





Kerja

– Telegram Bot Webhook. , :





https://api.telegram.org/bot[BOT_TOKEN]/setWebhook?url=url.domain.com/[BOT_TOKEN]







Telegram API :





{"ok":true,"result":true,"description":"Webhook was set"}
      
      



. , , .



« !»





« » .





, Cloudflare Worker'. , :





  • 1000 ( );





  • membaca dari database hingga 100.000 kali sehari (jumlah kunjungan maksimum);





  • skrip itu sendiri dapat dijalankan hingga 100.000 kali sehari (jumlah pesan ke bot dan kunjungan ke tautan yang dipersingkat);





  • skrip harus berjalan tidak lebih dari 1000 kali per menit.





Pembatasan ini harus cukup untuk penggunaan pribadi, bagikan pendapat Anda tentang ini di komentar.








All Articles