// ==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.height = '40px'; container.style.overflow = 'hidden'; container.style.borderRadius = '50%'; container.style.backgroundColor = 'rgba(0,0,0,0.7)'; container.style.padding = '0'; container.style.cursor = 'move'; container.style.alignItems = 'center'; container.style.justifyContent = 'center'; // 创建+号指示器 const plusIndicator = document.createElement('div'); plusIndicator.textContent = '+'; plusIndicator.style.color = 'white'; plusIndicator.style.fontSize = '24px'; plusIndicator.style.textAlign = 'center'; plusIndicator.style.cursor = 'pointer'; plusIndicator.style.width = '100%'; plusIndicator.style.height = '100%'; plusIndicator.style.display = 'flex'; plusIndicator.style.alignItems = 'center'; plusIndicator.style.justifyContent = 'center'; // 存储按钮引用 let buttons = []; // 鼠标悬停加号时显示按钮 plusIndicator.addEventListener('mouseenter', function() { container.style.width = 'auto'; container.style.height = 'auto'; container.style.padding = '10px'; container.style.borderRadius = '5px'; buttons.forEach(btn => btn.style.display = 'block'); }); // 鼠标移出容器时隐藏按钮 container.addEventListener('mouseleave', function() { container.style.width = '40px'; container.style.height = '40px'; container.style.padding = '0'; container.style.borderRadius = '50%'; buttons.forEach(btn => btn.style.display = 'none'); }); // 点击+号也可以切换按钮显示 plusIndicator.addEventListener('click', function() { const isExpanded = container.style.width !== '40px'; if (isExpanded) { container.style.width = '40px'; container.style.height = '40px'; container.style.padding = '0'; container.style.borderRadius = '50%'; buttons.forEach(btn => btn.style.display = 'none'); } else { container.style.width = 'auto'; container.style.height = 'auto'; container.style.padding = '10px'; container.style.borderRadius = '5px'; buttons.forEach(btn => btn.style.display = 'block'); } }); // 添加拖动功能... container.appendChild(plusIndicator); document.body.appendChild(container); // 返回容器和按钮引用存储 return { container, addButton: function(button) { button.style.display = 'none'; // 初始隐藏按钮 buttons.push(button); container.appendChild(button); } }; } // 创建按钮(修改版) 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.style.minWidth = '120px'; 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 = '

企业信息解析结果

'; 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, addButton} = createButtonContainer(); addButton(createSourceButton()); addButton(createParserButton()); })();