qcc
This commit is contained in:
526
script2-1.js
526
script2-1.js
@@ -1,5 +1,5 @@
|
|||||||
// ==UserScript==
|
// ==UserScript==
|
||||||
// @name 页面工具按钮
|
// @name 爱企查&企查查等
|
||||||
// @namespace http://tampermonkey.net/
|
// @namespace http://tampermonkey.net/
|
||||||
// @version 0.2
|
// @version 0.2
|
||||||
// @description 在页面右下角添加工具按钮,支持复制源码和解析公司信息
|
// @description 在页面右下角添加工具按钮,支持复制源码和解析公司信息
|
||||||
@@ -376,19 +376,116 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// QCC解析类 - 预留扩展
|
// QCC解析类
|
||||||
class QCCParser {
|
class QCCParser {
|
||||||
constructor() {
|
constructor() {
|
||||||
// 预留QCC网站解析逻辑
|
this.table = null;
|
||||||
}
|
|
||||||
|
|
||||||
parseCompanyInfo() {
|
|
||||||
alert("QCC解析功能即将上线");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 初始化表格
|
||||||
|
initTable() {
|
||||||
|
const cominfoNormal = document.querySelector('div.cominfo-normal');
|
||||||
|
if (!cominfoNormal) {
|
||||||
|
alert("未找到企业信息容器");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.table = cominfoNormal.querySelector('table.ntable');
|
||||||
|
if (!this.table) {
|
||||||
|
alert("未找到企业信息表格");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取优化后的值
|
||||||
|
getOptimizedValue(title) {
|
||||||
|
const rows = Array.from(this.table.querySelectorAll('tr'));
|
||||||
|
let value = null;
|
||||||
|
|
||||||
|
rows.forEach(row => {
|
||||||
|
const th = row.querySelector('th');
|
||||||
|
if (th && ToolUtils.cleanText(th.textContent) === title) {
|
||||||
|
const td = row.querySelector('td');
|
||||||
|
if (td) {
|
||||||
|
value = ToolUtils.cleanText(td.textContent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取法定代表人
|
||||||
|
getLegalRepresentative() {
|
||||||
|
return this.getOptimizedValue('法定代表人') || this.getOptimizedValue('法人');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取统一社会信用代码
|
||||||
|
getUnifiedSocialCreditCode() {
|
||||||
|
return this.getOptimizedValue('统一社会信用代码') || this.getOptimizedValue('信用代码');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取工商注册号
|
||||||
|
getBusinessRegistrationNo() {
|
||||||
|
return this.getOptimizedValue('工商注册号') || this.getOptimizedValue('注册号');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取组织机构代码
|
||||||
|
getOrganizationCode() {
|
||||||
|
return this.getOptimizedValue('组织机构代码');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取纳税人识别号
|
||||||
|
getTaxpayerId() {
|
||||||
|
return this.getOptimizedValue('纳税人识别号') || this.getUnifiedSocialCreditCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取参保人数
|
||||||
|
getInsuranceNumber() {
|
||||||
|
const value = this.getOptimizedValue('参保人数');
|
||||||
|
return value ? value.replace(/[^0-9]/g, '') + '人' : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取核准日期
|
||||||
|
getApprovalDate() {
|
||||||
|
return this.getOptimizedValue('核准日期') || this.getOptimizedValue('成立日期');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解析公司信息主方法
|
||||||
|
parseCompanyInfo() {
|
||||||
|
if (!this.initTable()) return;
|
||||||
|
|
||||||
|
const companyData = {
|
||||||
|
企业名称: this.getOptimizedValue('企业名称') || this.getOptimizedValue('公司名称'),
|
||||||
|
统一社会信用代码: this.getUnifiedSocialCreditCode(),
|
||||||
|
法定代表人: this.getLegalRepresentative(),
|
||||||
|
经营状态: this.getOptimizedValue('经营状态'),
|
||||||
|
成立日期: this.getOptimizedValue('成立日期'),
|
||||||
|
行政区划: this.getOptimizedValue('行政区划'),
|
||||||
|
注册资本: this.getOptimizedValue('注册资本'),
|
||||||
|
实缴资本: this.getOptimizedValue('实缴资本'),
|
||||||
|
企业类型: this.getOptimizedValue('企业类型'),
|
||||||
|
所属行业: this.getOptimizedValue('所属行业'),
|
||||||
|
工商注册号: this.getBusinessRegistrationNo(),
|
||||||
|
组织机构代码: this.getOrganizationCode(),
|
||||||
|
纳税人识别号: this.getTaxpayerId(),
|
||||||
|
纳税人资质: this.getOptimizedValue('纳税人资质'),
|
||||||
|
营业期限: this.getOptimizedValue('营业期限'),
|
||||||
|
核准日期: this.getApprovalDate(),
|
||||||
|
参保人数: this.getInsuranceNumber(),
|
||||||
|
登记机关: this.getOptimizedValue('登记机关'),
|
||||||
|
曾用名: this.getOptimizedValue('曾用名'),
|
||||||
|
注册地址: this.getOptimizedValue('注册地址'),
|
||||||
|
经营范围: this.getOptimizedValue('经营范围'),
|
||||||
|
};
|
||||||
|
|
||||||
|
ToolUtils.showResult(companyData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 创建按钮容器
|
// 创建按钮容器
|
||||||
function createButtonContainer() {{
|
function createButtonContainer() {
|
||||||
const container = document.createElement("div");
|
const container = document.createElement("div");
|
||||||
container.id = "tool-container";
|
container.id = "tool-container";
|
||||||
Object.assign(container.style, {
|
Object.assign(container.style, {
|
||||||
@@ -526,414 +623,7 @@
|
|||||||
parser.parseCompanyInfo();
|
parser.parseCompanyInfo();
|
||||||
});
|
});
|
||||||
|
|
||||||
// 法定代表人提取方法(优化版)
|
|
||||||
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(copySourceButton);
|
||||||
|
|||||||
596
script2.js
596
script2.js
@@ -0,0 +1,596 @@
|
|||||||
|
// ==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);
|
||||||
|
})();
|
||||||
Reference in New Issue
Block a user