Was ist, wenn Sie schnell einen kurzen Link erstellen müssen? Natürlich - benutze einen Link Shortener. Was ist, wenn Sie diesen Link auch lesbar machen? Verwenden Sie immer noch Ihre eigene Domain? Und es wäre besser, es ohne zusätzliche Server zu tun. Es scheint eine Antwort zu geben.
Hintergrund
Die Idee eines "Easy Link Shortener" kam mir, als ich nach einer Weiterleitungsoption suchte, bei der eine Domain für einen der Räume im neuen sozialen Netzwerk des Clubhauses verwendet wurde . Die Idee der Raumweiterleitung bestand darin, einen Raum mit demselben Namen neu zu starten , aber immer online . Es war notwendig, das Problem der ständigen Änderung der Adresse des Raums zu lösen, indem ein solcher Link zur Subdomain geparkt wurde.
Die Entscheidung fiel von selbst, da die Site auf Cloudflare vorgepflanzt war. Anfangs habe ich die Funktion „Seitenregeln“ verwendet, mit der Sie unter anderem Umleitungsregeln festlegen können. Bald kam jedoch die Idee, diese Umleitung flexibler und änderbarer zu gestalten, ohne die Diensteinstellungen aufrufen zu müssen. Natürlich wurde Telegram Bot eine solche Lösung.
Formulierung des Problems
Um unseren Plan zu verwirklichen, müssen verschiedene Probleme gelöst werden:
Wie leite ich von einer bestimmten Subdomain um?
Wo werden Links nach Schlüssel (Abkürzung) - Wert (Weiterleitungsadresse) gespeichert?
Wie erstelle ich solche Abkürzungen?
Wie Sie vielleicht erraten haben, befinden sich die Antworten auf diese Fragen im Titel des Artikels. Daher schlage ich vor, mit dem praktischen Teil fortzufahren.
Voraussetzungen
Für eine detailliertere Beschreibung werde ich die Grundbedingungen beachten, die für die Durchführung unseres Projekts erforderlich sind:
Mit Cloudflare verbundene Domain;
Allgemeine Kenntnisse in JavaScript;
Telegrammbot erstellt;
Dokumentation für Cloudflare Worker und Telegram Bot API .
Wie die notwendigen Voraussetzungen erfüllt werden, wird in diesem Artikel nicht behandelt. Die Lösung dieser Probleme bleibt beim Leser.
Ausbildung
, , — « ?». :
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 ( );
bis zu 100.000 Mal am Tag aus der Datenbank lesen (maximale Anzahl von Besuchen);
Das Skript selbst kann bis zu 100.000 Mal am Tag ausgeführt werden (Anzahl der Nachrichten an den Bot und Besuche verkürzter Links).
Das Skript sollte nicht mehr als 1000 Mal pro Minute ausgeführt werden.
Diese Einschränkungen sollten für den persönlichen Gebrauch ausreichen. Teilen Sie Ihre Meinung dazu in den Kommentaren mit.