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, , .
. , . , , .
2. Worker .
«Create worker», Worker («Save and Deploy») .
«Settings» Telegram , .
3. -
, url.mydomain.com
, «-» -.
, «Workers» «Route» -.
, , (path - ) .
.
, DNS DNS .
! .
. , Cloudlfare. Worker. «Quick edit» .
:
(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})
}
, , :
. . 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"})
}
)
}
, , :
( ):
– 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.