Báo Lỗi Bài Viết Cho Blogspot Qua Telegram

28.2.26 | 5 nhận xét | lượt xem
Nội Dung Chính

    Giới thiệu

    • “Báo lỗi” trong từng bài viết
    • Tự động lấy URL và tiêu đề bài viết
    • Chuyển sang trang báo lỗi
    • Gửi dữ liệu về Telegram
    • Có captcha + chống spam
    • Free 😁
    Xem DEMO tại đây

    Phần 1: Tạo API bảo mật bằng Cloudflare Worker

    Bước 1: Vào Cloudflare → Compute → Workers & Pages → Create application → Chọn "Start with Hello World!" → Deploy

    Bước 2: Edit code và Dán code sau:

    export default {
      async fetch(request, env) {
    
        const origin = request.headers.get("Origin");
    
        const corsHeaders = {
          "Access-Control-Allow-Origin": origin || "*",
          "Access-Control-Allow-Methods": "POST, OPTIONS",
          "Access-Control-Allow-Headers": "Content-Type",
          "Content-Type": "application/json"
        };
    
        if (request.method === "OPTIONS") {
          return new Response(null, { headers: corsHeaders });
        }
    
        if (
          origin &&
          !origin.endsWith("vncoding.com")
        ) {
          return new Response(
            JSON.stringify({ error: "Forbidden" }),
            { status: 403, headers: corsHeaders }
          );
        }
    
        if (request.method !== "POST") {
          return new Response(
            JSON.stringify({ error: "Method Not Allowed" }),
            { status: 405, headers: corsHeaders }
          );
        }
    
        const body = await request.json();
        const { 
          title, 
          errorType, 
          content, 
          email, 
          imageUrl, 
          pageUrl, 
          userAgent, 
          secret 
        } = body;
    
        if (secret !== env.FORM_SECRET) {
          return new Response(
            JSON.stringify({ error: "Unauthorized" }),
            { status: 401, headers: corsHeaders }
          );
        }
    
        const botToken = env.TELEGRAM_TOKEN;
        const chatId = "-YOUR_CHAT_ID";
    
        const ip = request.headers.get("CF-Connecting-IP") || "Unknown";
        const dateTime = new Date().toLocaleString("vi-VN");
    
        const message = `
    🚨 BÁO LỖI WEBSITE
    
    Tiêu đề: ${title}
    Loại lỗi: ${errorType}
    
    Nội dung:
    ${content}
    
    Email: ${email}
    Trang: ${pageUrl}
    Thiết bị: ${userAgent}
    Ảnh: ${imageUrl || "Không có"}
    IP: ${ip}
    Thời gian: ${dateTime}
    `;
    
        await fetch(`https://api.telegram.org/bot${botToken}/sendMessage`, {
          method: "POST",
          headers: { "Content-Type": "application/json" },
          body: JSON.stringify({
            chat_id: chatId,
            text: message
          })
        });
    
        return new Response(
          JSON.stringify({ success: true }),
          { headers: corsHeaders }
        );
      }
    };
    
    Thay vncoding.com thành domain của bạn
    Thay -YOUR_CHAT_ID thành chat ID telegram của bạn. Nếu chưa biết có thể tham khảo bài viết này

    Bước 3: Thêm Variables trong Worker:

    Chọn tab "Settings" → Tại "Variables and Secrets" click button "Add" sau đó nhập

    TELEGRAM_TOKEN = Token bot của bạn

    FORM_SECRET = chuoi_bi_mat


    Phần 2: Thêm nút “Báo lỗi” trong bài viết

    <button onclick="vncodingGoToReport()">🚨 Báo lỗi</button>
    
    <script>
    function vncodingGoToReport(){
    
      const currentUrl = window.location.href;
    
      let articleTitle = "";
      const h1 = document.querySelector("h1");
      if(h1){
        articleTitle = h1.innerText.trim();
      }else{
        articleTitle = document.title;
      }
    
      const reportPage = "/p/bao-loi.html";
    
      const finalUrl =
        reportPage +
        "?url=" + encodeURIComponent(currentUrl) +
        "&title=" + encodeURIComponent(articleTitle);
    
      window.open(finalUrl, "_blank", "noopener,noreferrer");
    }
    </script>
    
    /p/bao-loi.html chính là link của trang báo lỗi

    Phần 3: Tạo trang báo lỗi /p/bao-loi.html

    Thêm phần hiển thị thông tin bài viết:

    <h2>🚨 Báo lỗi bài viết</h2>
    
    <div class="vncoding-article-info">
      <p><strong>📄 Bài viết đang báo lỗi:</strong></p>
      <p id="vncoding_display_title" class="vncoding-title"></p>
    
      <p><strong>🔗 Link bài viết:</strong></p>
      <p>
        <a id="vncoding_display_url" href="#" target="_blank"></a>
      </p>
    </div>
    
    <div class="vncoding-report-wrapper">
    
      <select id="vncoding_type">
        <option value="Bản quyền nội dung">Bản quyền nội dung</option>
        <option value="Nội dung sai sự thật">Nội dung sai sự thật</option>
        <option value="Lỗi hiển thị giao diện">Lỗi hiển thị giao diện</option>
        <option value="Link hỏng (404)">Link hỏng (404)</option>
        <option value="Lỗi trên mobile">Lỗi trên mobile</option>
        <option value="Không đăng nhập được">Không đăng nhập được</option>
        <option value="Khác">Khác</option>
      </select>
    
      <textarea id="vncoding_content" placeholder="Mô tả chi tiết lỗi"></textarea>
    
      <input type="email" id="vncoding_email" placeholder="Email liên hệ">
    
      <input type="url" id="vncoding_image_url" placeholder="Link ảnh minh họa (nếu có)">
    
      <div class="vncoding-captcha-box">
        <span id="vncoding_captcha_question"></span>
        <input type="text" id="vncoding_captcha_answer" placeholder="Nhập kết quả">
      </div>
    
      <button id="vncoding_sendBtn" onclick="vncodingSendReport()">
        Gửi báo lỗi
      </button>
    
      <p id="vncoding_msg"></p>
    </div>
    
    <style>
    .vncoding-article-info{
      background:#f5f7fa;
      padding:15px;
      border-radius:8px;
      margin-bottom:20px;
      border-left:4px solid #007bff;
    }
    
    .vncoding-title{
      font-size:18px;
      font-weight:600;
      margin-bottom:15px;
    }
    
    .vncoding-report-wrapper input,
    .vncoding-report-wrapper select,
    .vncoding-report-wrapper textarea{
      width:100%;
      padding:12px;
      margin-bottom:12px;
      border:1px solid #ddd;
      border-radius:8px;
      font-size:14px;
    }
    
    .vncoding-report-wrapper textarea{
      min-height:120px;
      resize:vertical;
    }
    
    .vncoding-report-wrapper button{
      width:100%;
      padding:14px;
      border:none;
      border-radius:8px;
      background:linear-gradient(90deg,#007bff,#0056ff);
      color:white;
      font-size:15px;
      cursor:pointer;
    }
    
    .vncoding-captcha-box{
      display:flex;
      gap:10px;
    }
    
    #vncoding_msg{
      margin-top:10px;
      font-weight:bold;
      text-align:center;
    }
    </style>
    
    <script>
    const WORKER_URL = "https://api.ten-worker-cua-ban.workers.dev/";
    const FORM_SECRET = "chuoi_bi_mat";
    
    let captchaResult = 0;
    let lastSendTime = 0;
    
    function getQueryParam(name){
      const urlParams = new URLSearchParams(window.location.search);
      return urlParams.get(name);
    }
    
    function generateCaptcha(){
      const a = Math.floor(Math.random()*10)+1;
      const b = Math.floor(Math.random()*10)+1;
      captchaResult = a + b;
      document.getElementById("vncoding_captcha_question").innerText =
        "Mã kiểm tra: " + a + " + " + b + " = ?";
    }
    
    window.onload = function(){
    
      const articleUrl = getQueryParam("url");
      const articleTitle = getQueryParam("title");
    
      if(articleUrl){
        const decodedUrl = decodeURIComponent(articleUrl);
        document.getElementById("vncoding_display_url").innerText = decodedUrl;
        document.getElementById("vncoding_display_url").href = decodedUrl;
        window.currentArticleUrl = decodedUrl;
      }
    
      if(articleTitle){
        const decodedTitle = decodeURIComponent(articleTitle);
        document.getElementById("vncoding_display_title").innerText = decodedTitle;
        window.currentArticleTitle = decodedTitle;
      }
    
      generateCaptcha();
    };
    
    async function vncodingSendReport(){
    
      const now = Date.now();
      if(now - lastSendTime < 60000){
        document.getElementById("vncoding_msg").innerText =
          "Vui lòng chờ 60 giây trước khi gửi lại.";
        return;
      }
    
      const pageUrl = window.currentArticleUrl || "";
      const autoTitle = window.currentArticleTitle || "";
    
      const type = document.getElementById("vncoding_type").value;
      const content = document.getElementById("vncoding_content").value.trim();
      const email = document.getElementById("vncoding_email").value.trim();
      const imageUrl = document.getElementById("vncoding_image_url").value.trim();
      const captcha = document.getElementById("vncoding_captcha_answer").value.trim();
    
      if(!content || !email){
        document.getElementById("vncoding_msg").innerText =
          "Vui lòng nhập đầy đủ thông tin.";
        return;
      }
    
      if(parseInt(captcha) !== captchaResult){
        document.getElementById("vncoding_msg").innerText =
          "Mã kiểm tra không đúng.";
        generateCaptcha();
        return;
      }
    
      const btn = document.getElementById("vncoding_sendBtn");
      btn.disabled = true;
      btn.innerText = "Đang gửi...";
    
      try{
        const res = await fetch(WORKER_URL,{
          method:"POST",
          headers:{ "Content-Type":"application/json" },
          body: JSON.stringify({
            title: autoTitle,
            errorType: type,
            content,
            email,
            imageUrl,
            pageUrl,
            userAgent: navigator.userAgent,
            secret: FORM_SECRET
          })
        });
    
        if(res.ok){
          document.getElementById("vncoding_msg").innerText =
            "Gửi thành công!";
          document.getElementById("vncoding_content").value="";
          document.getElementById("vncoding_email").value="";
          document.getElementById("vncoding_image_url").value="";
          document.getElementById("vncoding_captcha_answer").value="";
          generateCaptcha();
          lastSendTime = Date.now();
        }else{
          document.getElementById("vncoding_msg").innerText =
            "Có lỗi xảy ra.";
        }
    
      }catch(e){
        document.getElementById("vncoding_msg").innerText =
          "Không thể kết nối máy chủ.";
      }
    
      btn.disabled=false;
      btn.innerText="Gửi báo lỗi";
    }
    </script>
    
    https://api.ten-worker-cua-ban.workers.dev/ thay bằng link Worker của bạn

    🎯 Kết quả

    • Người dùng đang đọc bài viết
    • Click “Báo lỗi”
    • URL + Tiêu đề được tự động điền
    • Gửi lỗi về Telegram

    🔐 Bảo mật

    • Không lộ Bot Token
    • Chống spam
    • Gửi kèm IP + thiết bị

    Hãy để lại bình luận bên dưới nếu bạn gặp khó khăn trong quá trình thực hiện 👇

    Bạn đang xem bài viết "Báo Lỗi Bài Viết Cho Blogspot Qua Telegram" tại chuyên mục: Blogspot , Telegram

    5

    nhận xét
    Mới nhất ⇅

    Bình luận

    Chèn hình ảnh: Chỉ cần dán link hình ảnh - Upload ảnh

    Chèn code: [pre]Code đã mã hóa [/pre]

    Chèn emoji: Nhấn tổ hợp phím “Windows + . (dấu chấm)”

    Chèn link: Click để chèn link