Push creators to Feishu

Show and update Feishu Table ID with a floating box (Persistent Storage)

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

You will need to install an extension such as Tampermonkey to install this script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @name         Push creators to Feishu
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  Show and update Feishu Table ID with a floating box (Persistent Storage)
// @match        *://pgy.xiaohongshu.com/solar/*
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_xmlhttpRequest
// ==/UserScript==

(async function () {
  "use strict";

  // Create the display box for Table ID
  const box = document.createElement("div");
  box.id = "tableIdBox";
  box.style.position = "fixed";
  box.style.bottom = "120px"; // Adjust to fit both buttons
  box.style.right = "30px";
  box.style.zIndex = "999999";
  box.style.padding = "10px";
  box.style.fontSize = "14px";
  box.style.background = "#fff";
  box.style.color = "#333";
  box.style.border = "1px solid #007bff";
  box.style.borderRadius = "5px";
  box.style.boxShadow = "2px 2px 10px rgba(0,0,0,0.2)";
  box.style.textAlign = "center";
  box.style.minWidth = "200px";
  document.body.appendChild(box);

  // Create the "Set Feishu Table ID" button
  const btnSet = document.createElement("button");
  btnSet.textContent = "Set Feishu Table ID";
  btnSet.style.position = "fixed";
  btnSet.style.bottom = "70px"; // Adjusted
  btnSet.style.right = "20px";
  btnSet.style.zIndex = "999999";
  btnSet.style.padding = "0.7em 1.2em";
  btnSet.style.fontSize = "1.5rem";
  btnSet.style.background = "#007bff";
  btnSet.style.color = "#fff";
  btnSet.style.border = "none";
  btnSet.style.borderRadius = "5px";
  btnSet.style.cursor = "pointer";
  btnSet.style.boxShadow = "2px 2px 10px rgba(0,0,0,0.2)";
  // Create the "Send Data to Feishu" button
  const btnSend = document.createElement("button");
  btnSend.textContent = "Send Data to Feishu";
  btnSend.style.position = "fixed";
  btnSend.style.bottom = "20px";
  btnSend.style.right = "20px";
  btnSend.style.zIndex = "999999";
  btnSend.style.padding = "0.5em 1.2em";
  btnSend.style.fontSize = "1.5rem";
  btnSend.style.background = "#28a745"; // Green color
  btnSend.style.color = "#fff";
  btnSend.style.border = "none";
  btnSend.style.borderRadius = "5px";
  btnSend.style.cursor = "pointer";
  btnSend.style.boxShadow = "2px 2px 10px rgba(0,0,0,0.2)";
  // Hover effect
  // Hover effects
  btnSet.addEventListener(
    "mouseover",
    () => (btnSet.style.background = "#0056b3")
  );
  btnSet.addEventListener(
    "mouseout",
    () => (btnSet.style.background = "#007bff")
  );
  btnSend.addEventListener(
    "mouseover",
    () => (btnSend.style.background = "#218838")
  );
  btnSend.addEventListener(
    "mouseout",
    () => (btnSend.style.background = "#28a745")
  );

  // Function to update and display Table ID
  async function updateTableIdDisplay() {
    let savedTableId =
      (await GM_getValue("feishu_table_id", null)) ||
      localStorage.getItem("feishu_table_id") ||
      "Not Set";
    box.textContent = "Feishu Table ID: " + savedTableId;
  }

  function askTableId() {
    let savedTableId = localStorage.getItem("feishu_table_id") || "";

    let tableId = prompt("Enter your Feishu Table ID:", savedTableId);

    if (tableId) {
      GM_setValue("feishu_table_id", tableId);
      localStorage.setItem("feishu_table_id", tableId);
      alert("✅ Table ID updated: " + tableId);
      updateTableIdDisplay(); // Update the box immediately
    } else {
      alert("❌ No Table ID entered. Keeping the old one.");
    }
  }

  /// Fetch Feishu Auth Token with Tampermonkey CORS Bypass
  async function fetchAuth() {
    return new Promise((resolve, reject) => {
      GM_xmlhttpRequest({
        method: "POST",
        url: "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal",
        headers: {
          "Content-Type": "application/json",
        },
        data: JSON.stringify({
          app_id: "cli_a7ed50b93cf81013", // Replace with your real App ID
          app_secret: "UpfwudsU6XjexK12atBW2dHIJ8cpHoiO", // Replace with your real App Secret
        }),
        onload: function (response) {
          try {
            const data = JSON.parse(response.responseText);
            if (data.tenant_access_token) {
              resolve(data.tenant_access_token);
            } else {
              alert("❌ Failed to fetch auth token. Check your credentials.");
              reject(null);
            }
          } catch (error) {
            console.error("❌ JSON Parse Error:", error);
            reject(null);
          }
        },
        onerror: function (error) {
          console.error("❌ Feishu Auth API Request Error:", error);
          reject(null);
        },
      });
    });
  }

  // ✅ Send Data to Feishu Table using GM_xmlhttpRequest (Bypass CORS)
  async function postToFeishu() {
    let tableId = localStorage.getItem("feishu_table_id");
    if (!tableId || tableId === "Not Set") {
      alert("❌ No Feishu Table ID saved. Please set one first.");
      return;
    }

    const authToken = await fetchAuth();
    if (!authToken) return;

    const url = `https://open.feishu.cn/open-apis/bitable/v1/apps/H6yybtp50azBCTsUMVNc8HD3nob/tables/${tableId}/records`;

    const element = document.querySelector(
      "#body_wrapper > section > div > div > div > div.d-spinner-nested-loading > div > div > div.blogger-detail__left > div > div.blogger-info-cell > div.blogger-info-cell-content > div.blogger-base-info > div.base-info-list > div:nth-child(1) > div.blogger-name"
    );
    let extractedText = element ? element.textContent.trim() : "No Data Found"; // Default if element not found

    // ✅ Get the current page URL
    const currentPageUrl = window.location.href;

    return new Promise((resolve, reject) => {
      GM_xmlhttpRequest({
        method: "POST",
        url: url,
        headers: {
          "Content-Type": "application/json",
          Authorization: `Bearer ${authToken}`,
        },
        data: JSON.stringify({
          fields: {
            达人昵称: extractedText,
            其他备注: currentPageUrl,
          },
        }),
        onload: function (response) {
          try {
            const data = JSON.parse(response.responseText);
            if (data.code === 0) {
              alert("✅ Data successfully sent to Feishu Table!");
              console.log("📨 Response:", data);
              resolve(data);
            } else {
              alert(`❌ API Error: ${data.msg}`);
              console.error("❌ API Response:", data);
              reject(null);
            }
          } catch (error) {
            console.error("❌ JSON Parse Error:", error);
            reject(null);
          }
        },
        onerror: function (error) {
          console.error("❌ Feishu API Request Error:", error);
          alert("❌ Failed to send data.");
          reject(null);
        },
      });
    });
  }

  // Update Table ID box on page load
  await updateTableIdDisplay();

  // Button Click Events
  btnSet.addEventListener("click", askTableId);
  btnSend.addEventListener("click", postToFeishu);

  // Add buttons to the webpage
  document.body.appendChild(btnSet);
  document.body.appendChild(btnSend);
})();