Et si vous avez besoin de créer rapidement un lien court? Bien sûr, utilisez un raccourcisseur de lien. Et si vous rendez également ce lien lisible? Vous utilisez toujours votre propre domaine? Et il serait préférable de le faire sans serveurs supplémentaires. Il semble qu'il y ait une réponse.
Fond
L'idée d'un "raccourcisseur de lien facile" m'est venue lorsque je cherchais une option de redirection en utilisant un domaine pour l' une des salles du réseau social newfangled Clubhouse . L'essence de l'idée de transfert d'appel de salle était de redémarrer une salle avec le même nom, mais toujours en ligne . Il fallait résoudre le problème du changement constant d'adresse de la salle en garant un tel lien vers le sous-domaine.
La décision est venue d'elle-même, puisque le site était pré-planté sur Cloudflare. Au départ, j'ai utilisé la fonction «Règles de page», qui vous permet de définir, entre autres, des règles de redirection, mais bientôt l'idée est venue de rendre cette redirection plus flexible et évolutive sans avoir à entrer dans les paramètres du service. Bien sûr, Telegram Bot est devenu une telle solution.
Formulation du problème
Afin d'accomplir notre plan, plusieurs problèmes doivent être résolus:
Comment rediriger depuis un sous-domaine spécifique?
Où enregistrer les liens par clé (abréviation) - valeur (adresse de transfert)?
Comment créer de telles abréviations?
Comme vous l'avez peut-être deviné, les réponses à ces questions se trouvent dans le titre même de l'article. Par conséquent, je propose de passer à la partie pratique.
Conditions préalables
Pour une description plus détaillée, je noterai les conditions de base nécessaires à la mise en œuvre de notre projet:
Domaine connecté à Cloudflare;
Connaissance générale de JavaScript;
Création d'un robot Telegram;
Documentation pour Cloudflare Workers et Telegram Bot API .
Comment remplir les conditions préalables nécessaires n'est pas abordé dans cet article. La solution à ces problèmes reste avec le lecteur.
Formation
, , — « ?». :
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 ( );
lecture de la base de données jusqu'à 100 000 fois par jour (nombre maximum de visites);
le script lui-même peut être exécuté jusqu'à 100 000 fois par jour (le nombre de messages au bot et de visites de liens raccourcis);
le script ne doit pas s'exécuter plus de 1 000 fois par minute.
Ces restrictions devraient être suffisantes pour un usage personnel, partagez votre opinion à ce sujet dans les commentaires.