Files
CompanyInfoHelper/script2-old.js
manchuwork ebe60b3ae6 新增 "集团二级类型": {
name: "GROUP_TYPE2",
      default: "小微企业",
    },
2025-10-09 15:26:28 +08:00

596 lines
20 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ==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 = '<h2 style="margin-top: 0;">企业信息解析结果</h2>';
modal.appendChild(pre);
modal.appendChild(document.createElement("br"));
modal.appendChild(copyBtn);
modal.appendChild(closeBtn);
document.body.appendChild(modal);
}
// 解析公司信息函数
function parseCompanyInfo(html) {
// 创建临时DOM解析器
const parser = new DOMParser();
const doc = parser.parseFromString(html, "text/html");
// 常见公司信息字段解析
const companyInfo = {
name: extractText(doc, [
".company-name",
".company-title",
"h1",
"title",
]),
socialCreditCodeText: extractText(doc, [".social-credit-code-text"]),
legalRepresentative: extractText(doc, [
".legal-representative span.a",
".legal-person",
'[itemprop="founder"]',
]),
registeredCapital: extractText(doc, [
".registered-capital",
".capital",
'[itemprop="foundingFund"]',
]),
registrationDate: extractText(doc, [
".registration-date",
".establish-date",
'[itemprop="foundingDate"]',
]),
businessScope: extractText(doc, [
".business-scope",
".scope",
'[itemprop="knowsAbout"]',
]),
address: extractText(doc, [
".addr-enter-bg-ele",
".company-address",
".address",
'[itemprop="address"]',
]),
phone: extractText(doc, [
'[data-log-title="detail-head-phone"] span',
".company-phone",
".contact-phone",
'[itemprop="telephone"]',
]),
};
return companyInfo;
}
// 辅助函数:从多个可能的选择器中提取文本
function extractText(doc, selectors) {
for (const selector of selectors) {
const element = doc.querySelector(selector);
if (element && element.textContent.trim()) {
return element.textContent.trim();
}
}
return "";
}
// 辅助函数:复制到剪贴板
function copyToClipboard(content, successMessage) {
const textarea = document.createElement("textarea");
textarea.value = content;
textarea.style.position = "fixed";
textarea.style.top = "0";
textarea.style.left = "0";
textarea.style.width = "1px";
textarea.style.height = "1px";
textarea.style.opacity = "0";
document.body.appendChild(textarea);
textarea.select();
document.execCommand("copy");
document.body.removeChild(textarea);
if (successMessage) {
alert(successMessage);
}
}
// 添加按钮到容器
container.appendChild(copySourceButton);
container.appendChild(parseInfoButton);
document.body.appendChild(container);
}
// 页面加载完成后创建按钮
window.addEventListener("load", createButtonContainer);
})();