This commit is contained in:
manchuwork
2025-08-05 13:16:18 +08:00
commit f2f0e33b03
5 changed files with 4616 additions and 0 deletions

633
script.txt Normal file
View File

@@ -0,0 +1,633 @@
// ==UserScript==
// @name View HTML Source & Company Info
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 在所有网页添加按钮显示当前HTML源码并可复制
// @author Your Name *://*/*,
// @match https://aiqicha.baidu.com/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
// 创建主容器(修改版)
function createButtonContainer() {
const container = document.createElement('div');
container.id = 'tm-button-container';
container.style.position = 'fixed';
container.style.right = '20px';
container.style.bottom = '20px';
container.style.zIndex = '9999';
container.style.display = 'flex';
container.style.flexDirection = 'column';
container.style.gap = '10px';
container.style.transition = 'all 0.3s ease';
container.style.width = '40px'; // 初始宽度设为+号大小
container.style.overflow = 'hidden';
container.style.borderRadius = '50%';
container.style.backgroundColor = 'rgba(0,0,0,0.7)';
container.style.padding = '10px';
container.style.cursor = 'move';
// 添加悬浮效果
container.addEventListener('mouseenter', function() {
this.style.width = 'auto';
this.style.borderRadius = '5px';
});
container.addEventListener('mouseleave', function() {
this.style.width = '40px';
this.style.borderRadius = '50%';
});
// 添加拖动功能
let isDragging = false;
let offsetX, offsetY;
container.addEventListener('mousedown', function(e) {
isDragging = true;
offsetX = e.clientX - this.getBoundingClientRect().left;
offsetY = e.clientY - this.getBoundingClientRect().top;
this.style.cursor = 'grabbing';
});
document.addEventListener('mousemove', function(e) {
if (!isDragging) return;
const container = document.getElementById('tm-button-container');
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', function() {
isDragging = false;
document.getElementById('tm-button-container').style.cursor = 'move';
});
// 创建+号指示器
const plusIndicator = document.createElement('div');
plusIndicator.textContent = '+';
plusIndicator.style.color = 'white';
plusIndicator.style.fontSize = '24px';
plusIndicator.style.textAlign = 'center';
plusIndicator.style.marginBottom = '10px';
plusIndicator.style.cursor = 'pointer';
// 点击+号也可以展开
plusIndicator.addEventListener('click', function() {
const container = document.getElementById('tm-button-container');
if (container.style.width === '40px') {
container.style.width = 'auto';
container.style.borderRadius = '5px';
} else {
container.style.width = '40px';
container.style.borderRadius = '50%';
}
});
container.appendChild(plusIndicator);
document.body.appendChild(container);
return container;
}
// 创建按钮(修改版)
function createButton(text, onClick) {
const button = document.createElement('button');
button.textContent = text;
button.style.backgroundColor = 'transparent';
button.style.color = 'white';
button.style.padding = '8px 12px';
button.style.border = '1px solid white';
button.style.borderRadius = '4px';
button.style.cursor = 'pointer';
button.style.marginBottom = '5px';
button.style.width = '100%';
button.style.transition = 'all 0.2s ease';
button.addEventListener('mouseenter', function() {
this.style.backgroundColor = 'rgba(255,255,255,0.2)';
});
button.addEventListener('mouseleave', function() {
this.style.backgroundColor = 'transparent';
});
button.addEventListener('click', onClick);
return button;
}
// 创建显示源码的按钮
function createSourceButton(container) {
const buttton = createButton('显示HTML源码',function(){
const html = document.documentElement.outerHTML;
copyToClipboard(html, 'HTML源码已复制到剪贴板');
})
container.appendChild(buttton)
return;
const button = document.createElement('button');
button.textContent = '显示HTML源码';
button.style.backgroundColor = '#4CAF50';
button.style.color = 'white';
button.style.padding = '10px 15px';
button.style.border = 'none';
button.style.borderRadius = '5px';
button.style.cursor = 'pointer';
button.style.boxShadow = '0 2px 5px rgba(0,0,0,0.2)';
button.addEventListener('click', function() {
const html = document.documentElement.outerHTML;
copyToClipboard(html, 'HTML源码已复制到剪贴板');
});
container.appendChild(button);
}
// 创建解析公司信息的按钮
function createParserButton(container) {
const button = createButton('解析公司信息',function(){
// 获取目标表格
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);
})
container.appendChild(button)
return;
//const button = document.createElement('button');
button.textContent = '解析公司信息';
button.style.backgroundColor = '#2196F3';
button.style.color = 'white';
button.style.padding = '10px 15px';
button.style.border = 'none';
button.style.borderRadius = '5px';
button.style.cursor = 'pointer';
button.style.boxShadow = '0 2px 5px rgba(0,0,0,0.2)';
button.addEventListener('click', function() {
try {
const companyInfo = parseCompanyInfo(document.documentElement.outerHTML);
const jsonStr = JSON.stringify(companyInfo, null, 2);
copyToClipboard(jsonStr, '公司信息已复制到剪贴板');
} catch (e) {
alert('解析失败: ' + e.message);
}
// 获取目标表格
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);
});
container.appendChild(button);
}
// 法定代表人提取方法(优化版)
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);
}
}
// 初始化
const container = createButtonContainer();
createSourceButton(container);
createParserButton(container);
})();