// ==UserScript== // @name 页面工具按钮 // @namespace http://tampermonkey.net/ // @version 0.2 // @description 在页面右下角添加工具按钮,支持复制源码和解析公司信息 // @author You // @match https://www.qcc.com/firm/* // @match https://aiqicha.baidu.com/company_detail_* // @grant none // ==/UserScript== (function () { "use strict"; // 创建按钮容器 function createButtonContainer() { const container = document.createElement("div"); container.id = "tool-container"; Object.assign(container.style, { position: "fixed", right: "20px", bottom: "20px", zIndex: "9999", display: "flex", flexDirection: "column", gap: "10px", width: "40px", height: "40px", backgroundColor: "#4CAF50", borderRadius: "50%", transition: "all 0.3s ease", overflow: "hidden", cursor: "move", }); // +号指示器 const plusSign = document.createElement("div"); plusSign.textContent = "+"; Object.assign(plusSign.style, { color: "white", fontSize: "24px", textAlign: "center", lineHeight: "40px", width: "100%", }); container.appendChild(plusSign); // 悬停展开效果 container.addEventListener("mouseenter", () => { container.style.width = "150px"; container.style.height = "auto"; container.style.borderRadius = "8px"; }); container.addEventListener("mouseleave", () => { container.style.width = "40px"; container.style.height = "40px"; container.style.borderRadius = "50%"; }); // 添加拖动功能 let isDragging = false; let offsetX, offsetY; // 鼠标按下开始拖动 container.addEventListener("mousedown", (e) => { // 只有点击+号区域才允许拖动 if (e.target === plusSign || e.target === container) { isDragging = true; const rect = container.getBoundingClientRect(); offsetX = e.clientX - rect.left; offsetY = e.clientY - rect.top; container.style.cursor = "grabbing"; // 阻止事件冒泡和默认行为 e.stopPropagation(); e.preventDefault(); } }); // 鼠标移动时更新位置 document.addEventListener("mousemove", (e) => { if (!isDragging) return; container.style.left = e.clientX - offsetX + "px"; container.style.top = e.clientY - offsetY + "px"; container.style.right = "auto"; container.style.bottom = "auto"; }); // 鼠标释放结束拖动 document.addEventListener("mouseup", () => { if (isDragging) { isDragging = false; container.style.cursor = "move"; } }); // 创建功能按钮 function createButton(text, onClick) { const button = document.createElement("button"); button.textContent = text; Object.assign(button.style, { padding: "8px 12px", border: "none", borderRadius: "4px", backgroundColor: "white", color: "#333", cursor: "pointer", width: "100%", transition: "backgroundColor 0.2s", }); button.addEventListener( "mouseenter", () => (button.style.backgroundColor = "#f0f0f0") ); button.addEventListener( "mouseleave", () => (button.style.backgroundColor = "white") ); button.addEventListener("click", onClick); return button; } // 复制源码按钮 const copySourceButton = createButton("复制源码", () => { const html = document.documentElement.outerHTML; copyToClipboard(html, "HTML源码已复制到剪贴板"); /* navigator.clipboard .writeText(html) .then(() => { alert("源码已复制到剪贴板"); }) .catch((err) => { console.error("复制失败:", err); }); */ }); // 解析公司信息按钮 const parseInfoButton = createButton("解析公司信息", () => { // 这里添加解析公司信息的逻辑 // 获取目标表格 const table = document.querySelector("table.zx-detail-basic-table"); if (!table) { alert("未找到企业信息表格"); return; } // 解析表格数据 const companyData = { 企业名称: getOptimizedValue(table, "企业名称"), 统一社会信用代码: getUnifiedSocialCreditCode(table, "统一社会信用代码"), 法定代表人: getLegalRepresentative(table, "法定代表人"), 经营状态: getOptimizedValue(table, "经营状态"), 成立日期: getOptimizedValue(table, "成立日期"), 行政区划: getOptimizedValue(table, "行政区划"), 注册资本: getOptimizedValue(table, "注册资本"), 实缴资本: getOptimizedValue(table, "实缴资本"), 企业类型: getOptimizedValue(table, "企业类型"), 所属行业: getOptimizedValue(table, "所属行业"), 工商注册号: getBusinessRegistrationNo(table, "工商注册号"), 组织机构代码: getOrganizationCode(table), 纳税人识别号: getTaxpayerId(table, "纳税人识别号"), 纳税人资质: getOptimizedValue(table, "纳税人资质"), 营业期限: getOptimizedValue(table, "营业期限"), 核准日期: getApprovalDate(table, "核准日期"), 参保人数: getInsuranceNumber(table, "参保人数"), 登记机关: getOptimizedValue(table, "登记机关"), 曾用名: getOptimizedValue(table, "曾用名"), 注册地址: getOptimizedValue(table, "注册地址"), 经营范围: getOptimizedValue(table, "经营范围"), }; // 显示解析结果 showResult(companyData); }); // 法定代表人提取方法(优化版) function getLegalRepresentative(table) { // 方法1:通过特定class组合定位 const legalElements = Array.from(table.querySelectorAll("td")).filter( (td) => cleanText(td.textContent) === "法定代表人" ); if (legalElements.length > 0) { const valueCell = legalElements[0].nextElementSibling; if (valueCell && valueCell.classList.contains("image-text-content")) { // 从包含头像的复杂结构中提取姓名 const nameElement = valueCell.querySelector(".person-name-warp a"); if (nameElement) { return cleanText(nameElement.textContent); } // 备用方案:直接提取单元格文本 return cleanText(valueCell.textContent); } } // 方法2:通过标题文本定位(备用方案) const titleElements = Array.from(table.querySelectorAll("td")).filter( (td) => td.textContent.includes("法定代表人") ); if (titleElements.length > 0 && titleElements[0].nextElementSibling) { const valueCell = titleElements[0].nextElementSibling; return cleanText(valueCell.textContent); } return null; } // 核准日期提取方法(优化版) function getApprovalDate(table) { // 方法1:通过特定class组合定位 const approvalElements = Array.from( table.querySelectorAll(".poptip-wrap-annual-date") ).filter((el) => el.textContent.includes("核准日期")); if (approvalElements.length > 0) { const valueCell = approvalElements[0].closest("td").nextElementSibling; if (valueCell) { const rawValue = valueCell.textContent .replace(/[\r\n\t]/g, "") .trim(); // 验证日期格式 if (/^\d{4}-\d{2}-\d{2}$/.test(rawValue)) { return rawValue; } } } // 方法2:通过标题文本定位 const titleElements = Array.from(table.querySelectorAll("td")).filter( (td) => cleanText(td.textContent) === "核准日期" ); if (titleElements.length > 0 && titleElements[0].nextElementSibling) { const valueCell = titleElements[0].nextElementSibling; const rawValue = cleanText(valueCell.textContent); if (/^\d{4}-\d{2}-\d{2}$/.test(rawValue)) { return rawValue; } } return null; } // 组织机构代码提取方法 function getOrganizationCode(table) { // 方法1:通过特定class组合定位 const orgCodeElements = Array.from( table.querySelectorAll(".poptip-wrap-org-no") ).filter((el) => el.textContent.includes("组织机构代码")); if (orgCodeElements.length > 0) { const valueCell = orgCodeElements[0].closest("td").nextElementSibling; if (valueCell && valueCell.classList.contains("enter-bg")) { const rawValue = valueCell.querySelector(".enter-bg-ele")?.textContent || valueCell.textContent; return cleanText(rawValue); } } // 方法2:通过标题文本定位 const titleElements = Array.from(table.querySelectorAll("td")).filter( (td) => cleanText(td.textContent) === "组织机构代码" ); if (titleElements.length > 0 && titleElements[0].nextElementSibling) { const valueCell = titleElements[0].nextElementSibling; const rawValue = valueCell.querySelector(".enter-bg-ele")?.textContent || valueCell.textContent; return cleanText(rawValue); } return null; } // 纳税人识别号提取方法 function getTaxpayerId(table) { // 方法1:尝试直接获取纳税人识别号 const taxElements = Array.from(table.querySelectorAll("td")).filter( (td) => cleanText(td.textContent).includes("纳税人识别号") ); if (taxElements.length > 0 && taxElements[0].nextElementSibling) { const valueCell = taxElements[0].nextElementSibling; const rawValue = valueCell.querySelector(".enter-bg-ele")?.textContent || valueCell.textContent; return cleanText(rawValue); } // 方法2:使用统一社会信用代码(通常与纳税人识别号相同) const creditElements = Array.from(table.querySelectorAll("td")).filter( (td) => cleanText(td.textContent).includes("统一社会信用代码") ); if (creditElements.length > 0 && creditElements[0].nextElementSibling) { const valueCell = creditElements[0].nextElementSibling; const rawValue = valueCell.querySelector(".enter-bg-ele")?.textContent || valueCell.textContent; return cleanText(rawValue); } return null; } // 工商注册号提取方法 function getBusinessRegistrationNo(table) { const regElements = Array.from(table.querySelectorAll("td")).filter( (td) => cleanText(td.textContent).includes("工商注册号") ); if (regElements.length > 0 && regElements[0].nextElementSibling) { const valueCell = regElements[0].nextElementSibling; const rawValue = valueCell.querySelector(".enter-bg-ele")?.textContent || valueCell.textContent; return cleanText(rawValue); } return null; } // 专用参保人数提取方法 function getInsuranceNumber(table) { // 方法1:通过标题和特定class组合定位 const insuranceElements = Array.from(table.querySelectorAll("td")).filter( (td) => { return ( td.textContent.includes("参保人数") && td.querySelector(".insurance-info") ); } ); if (insuranceElements.length > 0) { const valueCell = insuranceElements[0].nextElementSibling; if (!valueCell) return null; // 提取纯文本内容,过滤掉img标签 const rawText = valueCell.textContent.replace(/[\r\n\t]/g, "").trim(); // 匹配"数字+人"格式 const match = rawText.match(/(\d+人)/); return match ? match[0] : null; } // 方法2:备用方案,通过相邻单元格内容定位 const registrationElements = Array.from( table.querySelectorAll("td") ).filter((td) => td.textContent.includes("登记机关")); if ( registrationElements.length > 0 && registrationElements[0].previousElementSibling ) { const valueCell = registrationElements[0].previousElementSibling; const rawText = valueCell.textContent.replace(/[\r\n\t]/g, "").trim(); const match = rawText.match(/(\d+人)/); return match ? match[0] : null; } return null; } // 优化后的统一社会信用代码提取方法 function getUnifiedSocialCreditCode(table) { // 方法1:直接通过标题定位 const codeElements = Array.from(table.querySelectorAll("td")).filter( (td) => { return ( td.textContent.includes("统一社会信用代码") && td.nextElementSibling && td.nextElementSibling.classList.contains("table-regCapital-lable") ); } ); if (codeElements.length > 0) { const valueCell = codeElements[0].nextElementSibling; const rawValue = valueCell.querySelector(".enter-bg-ele")?.textContent || valueCell.textContent; return cleanText(rawValue); } // 方法2:备用方案,通过纳税人识别号获取(通常与统一社会信用代码相同) const taxElements = Array.from(table.querySelectorAll("td")).filter( (td) => td.textContent.includes("纳税人识别号") ); if (taxElements.length > 0 && taxElements[0].nextElementSibling) { const valueCell = taxElements[0].nextElementSibling; const rawValue = valueCell.querySelector(".enter-bg-ele")?.textContent || valueCell.textContent; return cleanText(rawValue); } return null; } // 通用优化字段提取方法 function getOptimizedValue(table, title) { const cells = Array.from(table.querySelectorAll("td")); const titleCell = cells.find( (cell) => cleanText(cell.textContent) === title ); if (!titleCell) return null; // 查找值单元格(考虑多种DOM结构情况) let valueCell = titleCell.nextElementSibling; if (!valueCell) return null; // 优先提取.enter-bg-ele内的值,若无则直接取单元格文本 const valueElement = valueCell.querySelector(".enter-bg-ele") || valueCell.querySelector(".addr-enter-bg-ele") || valueCell; return cleanText(valueElement.textContent); } // 文本清理函数 function cleanText(text) { return text .replace(/\s+/g, " ") .replace(/[\r\n\t]/g, "") .trim(); } // 辅助函数:显示解析结果 function showResult(data) { // 创建弹窗 const modal = document.createElement("div"); modal.style.position = "fixed"; modal.style.top = "50%"; modal.style.left = "50%"; modal.style.transform = "translate(-50%, -50%)"; modal.style.width = "600px"; modal.style.maxHeight = "80vh"; modal.style.overflowY = "auto"; modal.style.backgroundColor = "white"; modal.style.padding = "20px"; modal.style.boxShadow = "0 0 10px rgba(0,0,0,0.3)"; modal.style.zIndex = "10000"; // 创建JSON显示区域 const pre = document.createElement("pre"); pre.textContent = JSON.stringify(data, null, 2); pre.style.whiteSpace = "pre-wrap"; pre.style.wordWrap = "break-word"; // 创建复制按钮 const copyBtn = document.createElement("button"); copyBtn.textContent = "复制JSON"; copyBtn.style.marginTop = "10px"; copyBtn.style.padding = "8px 16px"; copyBtn.style.backgroundColor = "#52c41a"; copyBtn.style.color = "white"; copyBtn.style.border = "none"; copyBtn.style.borderRadius = "4px"; copyBtn.style.cursor = "pointer"; copyBtn.addEventListener("click", function () { navigator.clipboard .writeText(JSON.stringify(data, null, 2)) .then(() => alert("已复制到剪贴板")) .catch((err) => alert("复制失败: " + err)); }); // 创建关闭按钮 const closeBtn = document.createElement("button"); closeBtn.textContent = "关闭"; closeBtn.style.marginLeft = "10px"; closeBtn.style.marginTop = "10px"; closeBtn.style.padding = "8px 16px"; closeBtn.style.backgroundColor = "#f5222d"; closeBtn.style.color = "white"; closeBtn.style.border = "none"; closeBtn.style.borderRadius = "4px"; closeBtn.style.cursor = "pointer"; closeBtn.addEventListener("click", function () { document.body.removeChild(modal); }); // 组装弹窗内容 modal.innerHTML = '