JavaScript、Cloudflareワーカー、Telegramボットの簡単なリンク短縮サービス

短いリンクをすばやく作成する必要がある場合はどうなりますか?もちろん、リンク短縮サービスを使用してください。このリンクも読みやすくするとどうなりますか?まだ自分のドメインを使用していますか?そして、追加のサーバーなしでそれを行う方が良いでしょう。答えがあるようです。






バックグラウンド

「簡単なリンク短縮サービス」のアイデアは、新しいクラブハウスソーシャルネットワークの部屋の1つにドメインを使用してリダイレクトオプションを探していたときに思いついたものですルームコール転送のアイデアの本質は、同じ名前で常にオンラインのルーム再起動することでしたこのようなリンクをサブドメインに駐車することで、部屋の住所を絶えず変更するという問題を解決する必要がありました。





サイトはCloudflareに事前に植えられていたので、決定はそれ自体で起こりました。当初は、リダイレクトルールなどを設定できる「ページルール」機能を使用していましたが、すぐにサービス設定に行かなくても、このリダイレクトをより柔軟に変更できるようになりました。もちろん、TelegramBotはそのようなソリューションになりました。





問題の定式化

私たちの計画を達成するために、いくつかの問題を解決する必要があります。





  • 特定のサブドメインからリダイレクトする方法は?





  • キー(省略形)-値(転送先アドレス)でリンクを保存する場所は?





  • そのような略語を作成する方法は?





ご想像のとおり、これらの質問に対する回答は、記事のタイトルそのものにあります。したがって、私は実際の部分に進むことを提案します。





前提条件

より詳細な説明については、私たちのプロジェクトの実施に必要な基本的な条件に注意します。





  • Cloudflareに接続されているドメイン。





  • JavaScriptの一般的な知識。





  • テレグラムボットが作成されました。





  • CloudflareワーカーTelegramBotAPIのドキュメント





必要な前提条件を満たす方法については、この記事では説明していません。これらの問題の解決策は読者にあります。





トレーニング

, , — « ?». :





1. – Cloudflare KV.





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





: Workers KV, , .





CloudflareKVページ
Cloudflare KV

. , . , , .





私たちの金庫の中

2. Worker .





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





これは、新しいワーカーのページがどのように見えるかです。
Worker'

«Settings» Telegram , .





ワーカー設定
Worker'

3. -





, url.mydomain.com



, «-» -.





私たちのドメインのワーカーページ
Workers

, «Workers» «Route» -.





新しいリダイレクトの追加

, , (path - ) .



.





, DNS DNS .





リンク短縮サービスを含む新しい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 ( );





  • 1日に最大100,000回データベースから読み取ります(最大訪問数)。





  • スクリプト自体は1日に最大100,000回実行できます(ボットへのメッセージ数と短縮リンクへのアクセス数)。





  • スクリプトは1分間に1000回を超えて実行する必要はありません。





これらの制限は個人的な使用には十分なはずです。コメントでこれについてのあなたの意見を共有してください。








All Articles