- // ==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);
- })();