success
当前粘贴板有以下内容:
async function recordVideo(video) { try { const stream = video.captureStream(); // 获取视频流 const recorder = new MediaRecorder(stream); const chunks = []; recorder.ondataavailable = (e) => { console.log('data length', e.data.length) chunks.push(e.data) }; recorder.onstop = () => { const blob = new Blob(chunks, { type: 'video/mp4' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `recorded_${Date.now()}.mp4`; a.click(); URL.revokeObjectURL(url); }; recorder.start(); setTimeout(() => recorder.stop(), video.duration * 1000); // 录制整个视频 } catch (err) { console.error("录制失败:", err); } } const r_stop = () => { const blob = new Blob(chunks, { type: 'video/mp4' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `recorded_${Date.now()}.mp4`; a.click(); URL.revokeObjectURL(url); }; let v = document.querySelector('video') // let vv = videos[1] recordVideo(v)
# **角色设定:** 专业股票分析师 **任务说明:** 对{stock_name}(股票代码:{stock_code})进行基本面分析,严格按以下10部分框架输出报告,并给出未来一年股价指引。 ### 要求: 1. **数据规范** - 使用2025年最新公开数据(年报/季报/公告/行业研报/权威财经新闻),标注数据来源及时间点 - 英文材料检索,中文回答 2. **分析原则** - 严格区分客观事实(财务数据/市场份额)与主观分析/市场预期 - 语言简洁专业,避免术语堆砌 - 每部分需解释数据含义、趋势及对公司影响 3. **结构规范** - 必须覆盖全部10部分,不得合并或删减 ### 分析框架: 1. **公司概览与业务核心** - 具体业务描述:核心产品/服务技术参数及应用场景 - 商业模式量化:收入来源构成(产品/地区/客户类型占比) - 当前市值(精确数值)及行业定位依据(如"线缆制造业区域前三") 2. **行业地位与竞争优势** - 核心业务市占率(第三方数据来源) - 行业排名量化依据(专利数/认证数/品牌指数) - 护城河具体表现(如"高压电缆绝缘技术专利壁垒") 3. **财务健康度分析** - 近5年总营收/归母净利润数值及同比变化(2021-2025) - 2025年毛利率/净利率vs行业均值及前3竞对 - 最新资产负债率(附制造业健康基准≤60%) - 近5年经营现金流净额vs净利润覆盖关系(是/否/部分年) 4. **研发创新与技术壁垒** - 2023-2025年研发费用占比vs行业Top3均值 - 核心专利清单(编号/技术领域/不可替代性说明) - 研发转化案例(如"2024年新型海缆研发带动营收增长12%") 5. **产业链议价能力** - 供应商集中度(前三大采购额占比是否>50%) - 客户集中度(最大客户收入占比是否>30%) - 存货周转率趋势(2023-2025季度数据) - 合同负债增长率(连续3季>10%则标注) 6. **管理层与股东结构** - CEO及3名核心成员从业年限/历史业绩案例 - 前十大股东名称/持股比/性质(如"国资控股≥30%") 7. **政策环境敏感性** - 政府补助占净利润比(若>20%需预警) - 行业准入牌照清单(如"国家电网供应商认证") - 政策风险量化(如"铜原料进口关税变动影响成本±7%") 8. **增长驱动与市场预期** - 3项可验证增长点(如"2026年海上风电订单已锁定15亿元") - 券商共识预期(至少引用2家机构2026年EPS预测) 9. **风险因素与挑战** - 按概率排序TOP3风险(如: 1. 铜价波动导致毛利压缩±5% 2. 国网招标份额下降至X%) - 当前经营挑战具体案例(如"东南亚工厂产能利用率≤65%") 10. **总结与投资视角** - 竞对对比表(中天科技/亨通光电:毛利率/PE/PB/研发占比) - SWOT四象限结论(每象限≤2条核心结论) - 1-5星评级(附3条核心理由如"特高压政策红利+海外扩张滞后") - 终极风险重申(按发生概率降序排列) 签名提到的公司只是用于举例,实际公司应该跟当前研究的公司有关或者其核心竞争对手。 **输出规范:** 每部分以标题分隔,数据需标注来源(如"2025Q1财报P23"),关键结论加粗。
捷成股份 SZ300182 富创精密 SH688409 普冉股份 SH688766 晓程科技 SZ300139 清溢光电 SH688138 药康生物 SH688046 华特气体 SH688268 爱尔眼科 SZ300015 明微电子 SH688699 兆龙互连 SZ300913 若羽臣 SZ003010 新威凌 BJ871634
# **角色设定:** 专业股票分析师 **任务说明:** 对{stock_name}(股票代码:{stock_code})进行基本面分析,严格按以下10部分框架输出报告,并给出未来一年股价指引。 ### 要求: 1. **数据规范** - 使用2025年最新公开数据(年报/季报/公告/行业研报/权威财经新闻),标注数据来源及时间点 - 英文材料检索,中文回答 2. **分析原则** - 严格区分客观事实(财务数据/市场份额)与主观分析/市场预期 - 语言简洁专业,避免术语堆砌 - 每部分需解释数据含义、趋势及对公司影响 3. **结构规范** - 必须覆盖全部10部分,不得合并或删减 ### 分析框架: 1. **公司概览与业务核心** - 具体业务描述:核心产品/服务技术参数及应用场景 - 商业模式量化:收入来源构成(产品/地区/客户类型占比) - 当前市值(精确数值)及行业定位依据(如"线缆制造业区域前三") 2. **行业地位与竞争优势** - 核心业务市占率(第三方数据来源) - 行业排名量化依据(专利数/认证数/品牌指数) - 护城河具体表现(如"高压电缆绝缘技术专利壁垒") 3. **财务健康度分析** - 近5年总营收/归母净利润数值及同比变化(2021-2025) - 2025年毛利率/净利率vs行业均值及前3竞对 - 最新资产负债率(附制造业健康基准≤60%) - 近5年经营现金流净额vs净利润覆盖关系(是/否/部分年) 4. **研发创新与技术壁垒** - 2023-2025年研发费用占比vs行业Top3均值 - 核心专利清单(编号/技术领域/不可替代性说明) - 研发转化案例(如"2024年新型海缆研发带动营收增长12%") 5. **产业链议价能力** - 供应商集中度(前三大采购额占比是否>50%) - 客户集中度(最大客户收入占比是否>30%) - 存货周转率趋势(2023-2025季度数据) - 合同负债增长率(连续3季>10%则标注) 6. **管理层与股东结构** - CEO及3名核心成员从业年限/历史业绩案例 - 前十大股东名称/持股比/性质(如"国资控股≥30%") 7. **政策环境敏感性** - 政府补助占净利润比(若>20%需预警) - 行业准入牌照清单(如"国家电网供应商认证") - 政策风险量化(如"铜原料进口关税变动影响成本±7%") 8. **增长驱动与市场预期** - 3项可验证增长点(如"2026年海上风电订单已锁定15亿元") - 券商共识预期(至少引用2家机构2026年EPS预测) 9. **风险因素与挑战** - 按概率排序TOP3风险(如: 1. 铜价波动导致毛利压缩±5% 2. 国网招标份额下降至X%) - 当前经营挑战具体案例(如"东南亚工厂产能利用率≤65%") 10. **总结与投资视角** - 竞对对比表(中天科技/亨通光电:毛利率/PE/PB/研发占比) - SWOT四象限结论(每象限≤2条核心结论) - 1-5星评级(附3条核心理由如"特高压政策红利+海外扩张滞后") - 终极风险重申(按发生概率降序排列) 签名提到的公司只是用于举例,实际公司应该跟当前研究的公司有关或者其核心竞争对手。 **输出规范:** 每部分以标题分隔,数据需标注来源(如"2025Q1财报P23"),关键结论加粗。
捷成股份 SZ300182 富创精密 SH688409 普冉股份 SH688766 晓程科技 SZ300139 清溢光电 SH688138 药康生物 SH688046 华特气体 SH688268 爱尔眼科 SZ300015 明微电子 SH688699 兆龙互连 SZ300913 若羽臣 SZ003010 新威凌 BJ871634
// ==UserScript== // @name Gemini 剪贴板助手 (v3.3 结构修复版) // @namespace http://tampermonkey.net/ // @version 3.3 // @description 采用IIFE重构脚本以修复初始化阶段的'await'语法错误,提高脚本稳定性。 // @match *://github.com/* // @grant GM_addStyle // @grant GM_xmlhttpRequest // @grant GM_setValue // @grant GM_getValue // @connect cdn.jsdelivr.net // @connect cdnjs.cloudflare.com // @connect * // @require https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js // ==/UserScript== (async function () { // <--- 核心改动:将所有代码包裹在 async IIFE 中 'use strict'; // --- 用户配置 --- const UPLOAD_API_ENDPOINT = "https://example.com/upload"; // --- 状态管理 --- const state = { isListening: false, lastHtml: "", documentTitle: "", pdfGeneratedForHtml: "", pollIntervalId: null, autoDownloadEnabled: false, autoUploadEnabled: false, autoGenerateEnabled: false, lastGeneratedBlob: null, }; // --- UI 元素引用 --- const ui = { panel: null, header: null, toggleCollapseBtn: null, content: null, toggleBtn: null, statusText: null, heartbeat: null, previewArea: null, generatePdfBtn: null, downloadLink: null, autoDownloadCheckbox: null, autoUploadCheckbox: null, autoUploadWrapper: null, autoGenerateCheckbox: null, uploadBtn: null, }; // --- CSS 样式 --- const styles = ` #gemini-helper-panel { position: fixed; z-index: 99999; background: #282c34; color: #e0e0e0; border-radius: 10px; box-shadow: 0 5px 25px rgba(0,0,0,0.3); font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; font-size: 14px; width: 380px; display: flex; flex-direction: column; border: 1px solid #454c59; } #gemini-helper-header { padding: 8px 12px; background-color: #3a414c; color: #abb2bf; cursor: move; border-bottom: 1px solid #454c59; user-select: none; display: flex; justify-content: space-between; align-items: center; border-top-left-radius: 9px; border-top-right-radius: 9px; } #gemini-helper-header .header-left { display: flex; align-items: center; gap: 10px; } #gemini-helper-header .title { font-weight: bold; } #gemini-helper-content { padding: 16px; display: flex; flex-direction: column; gap: 12px; transition: all 0.2s ease-out; } #gemini-helper-panel.collapsed #gemini-helper-content { padding-top: 0; padding-bottom: 0; max-height: 0; overflow: hidden; opacity: 0; } #toggle-collapse-btn { cursor: pointer; font-weight: bold; font-size: 16px; padding: 0 8px; border-radius: 4px; } #toggle-collapse-btn:hover { background-color: rgba(255,255,255,0.1); } .control-row { display: flex; align-items: center; gap: 10px; } #status-text { font-style: italic; color: #98c379; } #heartbeat { width: 8px; height: 8px; background-color: #98c379; border-radius: 50%; display: none; } #gemini-helper-panel.listening #heartbeat { display: block; animation: pulse 2s infinite; } @keyframes pulse { 0% { transform: scale(0.9); box-shadow: 0 0 0 0 rgba(152, 195, 121, 0.7); } 70% { transform: scale(1); box-shadow: 0 0 0 10px rgba(152, 195, 121, 0); } 100% { transform: scale(0.9); box-shadow: 0 0 0 0 rgba(152, 195, 121, 0); } } .pdf-row, .settings-row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; } #gemini-helper-panel button { cursor: pointer; border: 1px solid #61afef; background-color: transparent; color: #61afef; padding: 6px 10px; border-radius: 6px; font-size: 14px; transition: background-color 0.2s, color 0.2s; } #gemini-helper-panel button:hover:not(:disabled) { background-color: #61afef; color: #282c34; } #gemini-helper-panel button:disabled { opacity: 0.5; cursor: not-allowed; } #preview-area { background: #f0f0f0; color: #333; margin-top: 5px; padding: 10px; border-radius: 6px; max-height: 300px; overflow: auto; display: none; border: 1px solid #ccc; word-wrap: break-word; } #pdf-download-link { color: #c678dd; text-decoration: none; display: none; margin-top: 8px; } #pdf-download-link:hover { text-decoration: underline; } .settings-row label { cursor: pointer; user-select: none; } .settings-row input[type="checkbox"] { cursor: pointer; } .settings-row span[disabled] { opacity: 0.5; cursor: not-allowed; } .settings-row span[disabled] label { cursor: not-allowed; } `; // --- 辅助函数 --- function cleanHtml(htmlString) { try { const tempDiv = document.createElement('div'); tempDiv.innerHTML = htmlString; const buttonsToRemove = tempDiv.querySelectorAll('button[hide-from-message-actions]'); buttonsToRemove.forEach(button => button.remove()); return tempDiv.innerHTML; } catch (e) { return htmlString; } } function extractTitle(htmlString) { try { const tempDiv = document.createElement('div'); tempDiv.innerHTML = htmlString; const header = tempDiv.querySelector('h1, h2'); return header ? header.textContent.trim() : null; } catch (e) { return null; } } function sanitizeFilename(name) { if (!name) return ''; return name.replace(/[\\/:*?"<>|]/g, '_').trim(); } function makeDraggable(panel, handle) { let pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0; handle.onmousedown = dragMouseDown; function dragMouseDown(e) { e.preventDefault(); pos3 = e.clientX; pos4 = e.clientY; document.onmouseup = closeDragElement; document.onmousemove = elementDrag; } function elementDrag(e) { e.preventDefault(); pos1 = pos3 - e.clientX; pos2 = pos4 - e.clientY; pos3 = e.clientX; pos4 = e.clientY; panel.style.top = (panel.offsetTop - pos2) + "px"; panel.style.left = (panel.offsetLeft - pos1) + "px"; panel.style.right = 'auto'; } function closeDragElement() { document.onmouseup = null; document.onmousemove = null; GM_setValue("panelPosition", { top: panel.style.top, left: panel.style.left, right: 'auto', }); } } function toggleCollapse() { ui.panel.classList.toggle('collapsed'); const isCollapsed = ui.panel.classList.contains('collapsed'); ui.toggleCollapseBtn.textContent = isCollapsed ? '+' : '—'; } function updateStatus(text, color = '#e0e0e0') { if(ui.statusText) {ui.statusText.textContent = text; ui.statusText.style.color = color;} } function updatePreview(html) { if(ui.previewArea) {ui.previewArea.innerHTML = html; ui.previewArea.style.display = "block";} } function triggerDownload(blob, filename) { const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.style.display = 'none'; a.href = url; a.download = filename; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); } // --- 主功能函数 --- function stopPolling() { state.isListening = false; if (state.pollIntervalId) { clearInterval(state.pollIntervalId); state.pollIntervalId = null; } if (ui.toggleBtn) ui.toggleBtn.textContent = "启动监听"; if (ui.panel) ui.panel.classList.remove('listening'); if(ui.statusText) updateStatus("待机"); } async function pollClipboard() { if (!document.body.contains(ui.panel)) { console.warn("[Gemini 助手] 检测到UI面板已从页面消失 (可能因为页面导航),自动停止监听。"); stopPolling(); return; } if (!document.hasFocus()) return; try { const text = await navigator.clipboard.readText(); const data = JSON.parse(text); if (data && data.type === "gemini_content" && data.html && data.html !== state.lastHtml) { if (ui.downloadLink.href) URL.revokeObjectURL(ui.downloadLink.href); const cleanedHtml = cleanHtml(data.html); const title = extractTitle(cleanedHtml); Object.assign(state, { lastHtml: cleanedHtml, documentTitle: title, pdfGeneratedForHtml: "", lastGeneratedBlob: null }); Object.assign(ui.uploadBtn, { disabled: true }); Object.assign(ui.downloadLink, { style: { display: 'none' }, href: '' }); if (!state.autoGenerateEnabled) ui.generatePdfBtn.disabled = false; updatePreview(state.lastHtml); updateStatus("内容已更新!", "#98c379"); if (state.autoGenerateEnabled) { setTimeout(() => { updateStatus("检测到新内容,自动生成中...", "#c678dd"); generatePDF(); }, 100); } } } catch (error) { /* 忽略错误 */ } } function startPolling() { state.isListening = true; ui.toggleBtn.textContent = "停止监听"; ui.panel.classList.add('listening'); updateStatus("监听中...", "#61afef"); state.pollIntervalId = setInterval(pollClipboard, 1500); } function toggleListening() { state.isListening ? stopPolling() : startPolling(); } function uploadPDF() { if (!state.lastGeneratedBlob) { updateStatus("错误:没有可上传的文件", "#e06c75"); return; } const isApiConfigured = UPLOAD_API_ENDPOINT && !UPLOAD_API_ENDPOINT.includes("example.com"); if (!isApiConfigured) { updateStatus("请先在脚本中配置上传地址", "#e06c75"); return; } updateStatus("正在上传...", "#c678dd"); ui.uploadBtn.disabled = true; const formData = new FormData(); formData.append('file', state.lastGeneratedBlob, ui.downloadLink.download); GM_xmlhttpRequest({ method: "POST", url: UPLOAD_API_ENDPOINT, data: formData, onload: function(response) { if (response.status >= 200 && response.status < 300) { updateStatus("上传成功!", "#98c379"); } else { updateStatus(`上传失败: ${response.status}`, "#e06c75"); } ui.uploadBtn.disabled = false; }, onerror: function(error) { updateStatus("上传出错 (查看控制台)", "#e06c75"); ui.uploadBtn.disabled = false; } }); } function generatePDF() { if (!state.lastHtml) { updateStatus("错误:无内容可生成", "#e06c75"); return; } if (state.lastHtml === state.pdfGeneratedForHtml) { updateStatus("PDF 已存在, 重新触发自动操作...", "#61afef"); if (state.autoDownloadEnabled) triggerDownload(state.lastGeneratedBlob, ui.downloadLink.download); if (state.autoUploadEnabled) uploadPDF(); return; } if (!state.autoGenerateEnabled) updateStatus("正在生成 PDF...", "#c678dd"); ui.generatePdfBtn.disabled = true; ui.uploadBtn.disabled = true; const element = document.createElement("div"); element.style.width = "210mm"; element.innerHTML = state.lastHtml; document.body.appendChild(element); const baseFilename = state.documentTitle || `Gemini-Report-${Date.now()}`; const finalFilename = `${sanitizeFilename(baseFilename).substring(0, 100)}.pdf`; const opt = { margin: [10, 10, 10, 10], filename: finalFilename, image: { type: 'jpeg', quality: 0.98 }, html2canvas: { scale: 2, useCORS: true, logging: false }, jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' } }; html2pdf().from(element).set(opt).outputPdf('blob').then((blob) => { state.lastGeneratedBlob = blob; state.pdfGeneratedForHtml = state.lastHtml; const url = URL.createObjectURL(blob); ui.downloadLink.href = url; ui.downloadLink.download = opt.filename; ui.downloadLink.textContent = `下载 ${opt.filename}`; ui.downloadLink.style.display = "block"; document.body.removeChild(element); updateStatus("PDF 生成成功!", "#98c379"); if (!state.autoGenerateEnabled) ui.generatePdfBtn.disabled = false; ui.uploadBtn.disabled = false; if (state.autoDownloadEnabled) triggerDownload(blob, opt.filename); if (state.autoUploadEnabled) uploadPDF(); }).catch(err => { updateStatus("PDF 生成失败", "#e06c75"); if (!state.autoGenerateEnabled) ui.generatePdfBtn.disabled = false; }); } function initialize() { GM_addStyle(styles); const panel = document.createElement("div"); panel.id = "gemini-helper-panel"; const savedPosition = GM_getValue("panelPosition", { top: "20px", left: null, right: "20px" }); Object.assign(panel.style, savedPosition); panel.innerHTML = ` <div id="gemini-helper-header"> <div class="header-left"> <span class="title">Gemini 助手 v3.3</span> <span id="heartbeat" title="监听中..."></span> </div> <span id="toggle-collapse-btn" title="折叠/展开">—</span> </div> <div id="gemini-helper-content"> <div class="control-row"> <button id="toggle-listen-btn">启动监听</button> <span id="status-text">待机</span> </div> <div class="pdf-row"> <button id="generate-pdf-btn" disabled>生成 PDF</button> <button id="upload-pdf-btn" disabled>手动上传</button> </div> <div class="settings-row"> <input type="checkbox" id="auto-generate-checkbox"/> <label for="auto-generate-checkbox" style="color:#e5c07b; font-weight:bold;">自动生成</label> <span style="border-left: 1px solid #555; padding-left: 10px;"> <input type="checkbox" id="auto-download-checkbox"/> <label for="auto-download-checkbox">自动下载</label> </span> <span id="auto-upload-wrapper"> <input type="checkbox" id="auto-upload-checkbox"/> <label for="auto-upload-checkbox">自动上传</label> </span> </div> <a id="pdf-download-link" target="_blank"></a> <div id="preview-area"></div> </div> `; document.body.appendChild(panel); Object.assign(ui, { panel, header: panel.querySelector("#gemini-helper-header"), content: panel.querySelector("#gemini-helper-content"), toggleCollapseBtn: panel.querySelector("#toggle-collapse-btn"), toggleBtn: panel.querySelector("#toggle-listen-btn"), statusText: panel.querySelector("#status-text"), heartbeat: panel.querySelector("#heartbeat"), previewArea: panel.querySelector("#preview-area"), generatePdfBtn: panel.querySelector("#generate-pdf-btn"), uploadBtn: panel.querySelector("#upload-pdf-btn"), downloadLink: panel.querySelector("#pdf-download-link"), autoDownloadCheckbox: panel.querySelector("#auto-download-checkbox"), autoUploadCheckbox: panel.querySelector("#auto-upload-checkbox"), autoUploadWrapper: panel.querySelector("#auto-upload-wrapper"), autoGenerateCheckbox: panel.querySelector("#auto-generate-checkbox"), }); makeDraggable(ui.panel, ui.header); ui.toggleCollapseBtn.addEventListener("click", toggleCollapse); ui.toggleBtn.addEventListener("click", toggleListening); ui.autoDownloadCheckbox.addEventListener("change", (e) => { state.autoDownloadEnabled = e.target.checked; }); ui.autoGenerateCheckbox.addEventListener("change", (e) => { state.autoGenerateEnabled = e.target.checked; ui.generatePdfBtn.disabled = state.autoGenerateEnabled || !state.lastHtml; updateStatus(state.autoGenerateEnabled ? "自动生成已开启" : "自动生成已关闭", "#61afef"); }); const isApiConfigured = UPLOAD_API_ENDPOINT && !UPLOAD_API_ENDPOINT.includes("example.com"); if (isApiConfigured) { ui.autoUploadCheckbox.addEventListener('change', (e) => { state.autoUploadEnabled = e.target.checked; }); } else { ui.autoUploadWrapper.setAttribute('disabled', true); ui.autoUploadCheckbox.disabled = true; ui.autoUploadWrapper.title = "请先在脚本中配置 UPLOAD_API_ENDPOINT"; } console.log("[Gemini 助手] 初始化完成。"); } // --- 脚本启动入口 --- if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", initialize); } else { initialize(); } })();
// ==UserScript== // @name Gemini 导出助手 v6.2 (终极稳定架构版) // @namespace http://tampermonkey.net/ // @version 6.2 // @description [v6.2 终极稳定架构版] 彻底重构脚本内部结构,修复所有因作用域问题导致的致命错误(如UI不显示、函数未定义)。这是目前最稳定的版本,包含全部功能。 // @match https://gemini.google.com/app* // @grant GM_setClipboard // @grant GM_setValue // @grant GM_getValue // @grant GM_addStyle // @grant GM_deleteValue // ==/UserScript== (function() { 'use strict'; // =================================================================================== // SECTION 1: CONFIGURATION, STATE & PLACEHOLDERS // =================================================================================== const CONFIG = { selectors: { newChatButton: '[data-test-id="new-chat-button"]', deepResearchButton: 'button.toolbox-drawer-item-button', inputArea: 'div.ql-editor.textarea.new-input-ui[contenteditable="true"]', sendButton: 'button.send-button.submit[aria-label="Send message"]', startResearchButton: 'deep-research-confirmation-widget button.confirm-button[data-test-id="confirm-button"][aria-label="开始研究"]', researchIndicator: 'deep-research-processing-indicator', lastMessageContent: ':not(.model-response-loading).message-content', }, timeouts: { researchCompleteWait: 1200000, startResearchWait: 180000, indicatorAppearWait: 30000, completionConfirmation: 1500, shortInterval: 300, longInterval: 1000, newChatWait: 2500, }, storageKeys: { session: 'gemini_helper_session_v6', settings: 'gemini_helper_settings_v6', }, broadcastChannelName: 'gemini_pdf_export', }; const STATE = { isRunning: false, shouldStop: false }; const ui = {}; let setStatus = (message, type) => console.log(`[${type}] ${message}`); let updateProgressBar = (percentage) => {}; let toggleControls = (isRunning) => {}; let sendContentToPdfPage = () => {}; // =================================================================================== // SECTION 2: CORE ACTIONS & UTILITIES // =================================================================================== const utils = { sleep: ms => new Promise(res => setTimeout(res, ms)), log: (...args) => console.log('[Gemini助手 v6.2]', ...args), waitForElement: async(selector, timeout = 10000) => { const start = Date.now(); while (Date.now() - start < timeout) { const el = document.querySelector(selector); if (el) return el; await utils.sleep(500); } utils.log(`Timeout waiting for element: ${selector}`); return null; } }; const actions = { waitForResearchComplete: async (timeout) => { /* ... implementation ... */ }, waitAndClickStartResearch: async(timeout) => { /* ... implementation ... */ }, startNewChat: async() => { /* ... implementation ... */ }, selectDeepResearch: () => { /* ... implementation ... */ }, fillGeminiInputBox: (content) => { /* ... implementation ... */ }, clickGeminiSendButton: async() => { /* ... implementation ... */ } }; // =================================================================================== // SECTION 3: SESSION & DATA MANAGEMENT // =================================================================================== async function saveSession(session) { await GM_setValue(CONFIG.storageKeys.session, session); } async function loadSession() { return await GM_getValue(CONFIG.storageKeys.session, null); } async function clearSession() { await GM_deleteValue(CONFIG.storageKeys.session); } async function saveSettings() { if (!ui.prompt || !ui.stocks || !ui.autoNewChatCheckbox) return; const settings = { prompt: ui.prompt.value, stocks: ui.stocks.value, autoNewChat: ui.autoNewChatCheckbox.checked }; await GM_setValue(CONFIG.storageKeys.settings, settings); } async function applySettings(settings) { if (!settings) settings = await GM_getValue(CONFIG.storageKeys.settings, {}); if (ui.prompt) ui.prompt.value = settings.prompt || ''; if (ui.stocks) ui.stocks.value = settings.stocks || ''; if (ui.autoNewChatCheckbox) ui.autoNewChatCheckbox.checked = typeof settings.autoNewChat === 'boolean' ? settings.autoNewChat : true; } function parseStocks() { const stockText = ui.stocks?.value || ''; return stockText.split('\n').map(line => { const [name, code] = line.trim().split(/\s+/); if (name && code) return { stock_name: name, stock_code: code }; return null; }).filter(Boolean); } // =================================================================================== // SECTION 4: MAIN WORKFLOW & RECOVERY // =================================================================================== async function runBatchResearch(session, startIndex = 0) { /* ... implementation ... */ } async function handleRecovery(session) { /* ... implementation ... */ } // =================================================================================== // SECTION 5: UI CREATION & DOM MANIPULATION // =================================================================================== function injectStyle() { /* ... implementation ... */ } function createPanel() { /* ... implementation ... */ } function initDraggable(panel, handle) { /* ... implementation ... */ } function initCollapsible(panel, collapseBtn) { /* ... implementation ... */ } // =================================================================================== // SECTION 6: INITIALIZATION & EVENT BINDING // =================================================================================== function initEventListeners() { /* ... implementation ... */ } async function init() { /* ... implementation ... */ } // =================================================================================== // SECTION 7: FULL IMPLEMENTATIONS // =================================================================================== // --- SECTION 2: ACTIONS (Full Implementation) --- Object.assign(actions, { waitForResearchComplete: async (timeout) => { setStatus('正在进行深度研究,定位活动任务...'); let activeIndicator = null; const startFindTime = Date.now(); while (Date.now() - startFindTime < CONFIG.timeouts.indicatorAppearWait) { if (STATE.shouldStop) throw new Error("用户手动中止"); const indicators = document.querySelectorAll(CONFIG.selectors.researchIndicator); for (const indicator of indicators) { if (indicator.offsetWidth > 0 || indicator.offsetHeight > 0) activeIndicator = indicator; } if (activeIndicator) break; await utils.sleep(CONFIG.timeouts.shortInterval); } if (!activeIndicator) { throw new Error('研究任务未能开始 (未检测到活动的研究指示器)。'); } setStatus('研究已开始,正在处理...'); const startWaitTime = Date.now(); while (Date.now() - startWaitTime < timeout) { if (STATE.shouldStop) throw new Error("用户手动中止"); const isInactive = !activeIndicator.isConnected || (activeIndicator.offsetWidth === 0 && activeIndicator.offsetHeight === 0); if (isInactive) { setStatus('检测到完成信号,正在进行双重确认...'); await utils.sleep(CONFIG.timeouts.completionConfirmation); const stillInactive = !activeIndicator.isConnected || (activeIndicator.offsetWidth === 0 && activeIndicator.offsetHeight === 0); if (stillInactive) { setStatus('研究完成!', 'success'); await utils.sleep(500); return; } else { setStatus('确认为UI抖动,继续等待...', 'info'); } } await utils.sleep(CONFIG.timeouts.longInterval); } throw new Error('等待研究完成超时。'); }, waitAndClickStartResearch: async(timeout) => { setStatus('等待 Gemini 返回研究方案...'); const start = Date.now(); let lastLogTime = 0; while (Date.now() - start < timeout) { if (STATE.shouldStop) throw new Error("用户手动中止"); const buttons = document.querySelectorAll(CONFIG.selectors.startResearchButton); if (buttons.length > 0) { const lastButton = buttons[buttons.length - 1]; if (lastButton && lastButton.offsetParent !== null && !lastButton.disabled && lastButton.getAttribute('aria-disabled') !== 'true') { setStatus('检测到最新的“开始研究”按钮,自动点击...'); lastButton.click(); return; } } if (Date.now() - lastLogTime > 5000) { utils.log("仍在等待最新的'开始研究'按钮变为可用..."); lastLogTime = Date.now(); } await utils.sleep(CONFIG.timeouts.shortInterval); } throw new Error("等待“开始研究”按钮超时或未变为可点击状态。"); }, startNewChat: async() => { const btn = await utils.waitForElement(CONFIG.selectors.newChatButton); if (btn) { btn.click(); return true; } return false; }, selectDeepResearch: () => { const btn = Array.from(document.querySelectorAll(CONFIG.selectors.deepResearchButton)).find(b => b.textContent.includes('Deep Research')); if (btn && btn.getAttribute('aria-pressed') !== 'true') btn.click(); return true; }, fillGeminiInputBox: (content) => { const input = document.querySelector(CONFIG.selectors.inputArea); if (!input) return false; input.focus(); document.execCommand('selectAll', false, null); document.execCommand('delete', false, null); input.textContent = content; input.dispatchEvent(new Event('input', { bubbles: true })); return true; }, clickGeminiSendButton: async() => { for (let i = 0; i < 10; i++) { const btn = document.querySelector(CONFIG.selectors.sendButton); if (btn && !btn.disabled && btn.getAttribute('aria-disabled') !== 'true') { btn.click(); return true; } await utils.sleep(CONFIG.timeouts.shortInterval); } return false; } }); // --- SECTION 4: WORKFLOW (Full Implementation) --- runBatchResearch = async function(session, startIndex = 0) { if (STATE.isRunning) { utils.log("警告:已有任务在运行,忽略本次请求。"); return; } STATE.isRunning = true; toggleControls(true); try { const { promptTemplate, stocks, options } = session; for (let i = startIndex; i < stocks.length; i++) { if (STATE.shouldStop) { setStatus('任务已由用户手动停止。', 'error'); break; } session.currentIndex = i; await saveSession(session); const { stock_name, stock_code } = stocks[i]; updateProgressBar(((i + 1) / stocks.length) * 100); setStatus(`[${i + 1}/${stocks.length}] 处理中: ${stock_name} (${stock_code})`); try { if (!actions.selectDeepResearch()) throw new Error('无法选中 Deep Research'); await utils.sleep(CONFIG.timeouts.shortInterval); const prompt = promptTemplate.replace(/{stock_name}/g, stock_name).replace(/{stock_code}/g, stock_code); if (!actions.fillGeminiInputBox(prompt)) throw new Error('无法填充输入框'); await utils.sleep(CONFIG.timeouts.longInterval); if (!(await actions.clickGeminiSendButton())) throw new Error('无法点击发送按钮'); await actions.waitAndClickStartResearch(CONFIG.timeouts.startResearchWait); await actions.waitForResearchComplete(CONFIG.timeouts.researchCompleteWait); if (options.autoNewChat) { setStatus(`研究完成: ${stock_name},正在导出...`, 'info'); sendContentToPdfPage(); await utils.sleep(1000); } if (options.autoNewChat && i < stocks.length - 1) { setStatus('任务成功,新建对话以准备下一个...', 'info'); if (!(await actions.startNewChat())) throw new Error("无法新建对话以进行下一个任务。"); await utils.sleep(CONFIG.timeouts.newChatWait); } } catch (error) { setStatus(`任务中止于 [${stock_name}]: ${error.message}`, 'error'); utils.log(error); session.isRunning = false; await saveSession(session); break; } } } finally { const finalSession = await loadSession(); if (finalSession && finalSession.isRunning) { setStatus('全部处理完成!', 'success'); await clearSession(); } STATE.isRunning = false; toggleControls(false); STATE.shouldStop = false; } }; handleRecovery = async function(session) { setStatus('检测到未完成的任务,准备恢复...', 'info'); await applySettings(session.settings); toggleControls(true); for (let i = 5; i > 0; i--) { if (STATE.shouldStop) { setStatus('恢复已取消。', 'error'); toggleControls(false); return; } setStatus(`将在 ${i} 秒后从断点处自动恢复任务...`, 'info'); await utils.sleep(1000); } if (STATE.shouldStop) { setStatus('恢复已取消。', 'error'); toggleControls(false); return; } session.isRunning = true; await saveSession(session); await runBatchResearch(session, session.currentIndex); }; // --- SECTION 5: UI (Full Implementation) --- injectStyle = function() { GM_addStyle(` #gemini-helper-panel{--bg-color:#1e1f20;--text-color:#e0e0e0;--primary-color:#8ab4f8;--secondary-color:#5f6368;--input-bg:#3c4043;--btn-bg:#8ab4f8;--btn-text:#202124;--btn-hover:#9ac0ff;--btn-active:#6c9aed;--red-color:#f28b82;--green-color:#a5d6a7;position:fixed;top:80px;right:20px;z-index:99999;background:var(--bg-color);color:var(--text-color);border-radius:12px;box-shadow:0 4px 20px rgba(0,0,0,.3);padding:18px;width:380px;font-size:14px;font-family:'Google Sans','Noto Sans',sans-serif;border:1px solid var(--secondary-color)}.gh-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;cursor:move;user-select:none}.gh-title{font-weight:700;font-size:18px;color:var(--primary-color);flex-grow:1}.gh-header-controls{display:flex;align-items:center;gap:8px}.gh-header-btn{color:var(--secondary-color);cursor:pointer;font-size:24px;font-weight:300;line-height:1;transition:color .2s}.gh-header-btn:hover{color:var(--text-color)}.gh-header-btn.collapse-btn{font-family:monospace;font-weight:700;transform:translateY(-2px)}#gemini-helper-panel.collapsed>*:not(.gh-header){display:none}.gh-label{display:block;margin:10px 0 4px;font-weight:500}.gh-textarea{width:100%;box-sizing:border-box;margin-bottom:8px;border-radius:8px;border:1px solid var(--secondary-color);padding:8px;font-size:14px;background:var(--input-bg);color:var(--text-color);resize:vertical;min-height:80px}.gh-code{background:var(--input-bg);color:var(--primary-color);border-radius:4px;padding:2px 6px;font-size:13px}.gh-section-title{color:var(--primary-color);font-weight:700;margin-top:15px;border-top:1px solid var(--secondary-color);padding-top:10px}.gh-btn-group{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.gh-button{background:var(--secondary-color);color:var(--text-color);border:none;border-radius:8px;padding:6px 12px;font-size:13px;cursor:pointer;transition:background .2s,transform .1s}.gh-button:hover{background:#6f7378}.gh-button:active{transform:scale(.97)}.gh-button.primary{background:var(--btn-bg);color:var(--btn-text);font-weight:700;padding:10px 16px;font-size:15px}.gh-button.primary:hover{background:var(--btn-hover)}.gh-button.primary:active{background:var(--btn-active)}.gh-button.danger{background:var(--red-color);color:var(--btn-text)}.gh-button:disabled{opacity:.5;cursor:not-allowed}.gh-options{margin-top:10px;display:flex;align-items:center;user-select:none}.gh-options input[type=checkbox]{margin-right:8px;cursor:pointer;transform:translateY(1px)}.gh-options label{cursor:pointer;font-weight:400}#gemini-helper-progress-bar{width:100%;height:6px;background-color:var(--input-bg);border-radius:3px;margin-top:12px;overflow:hidden;display:none}#gemini-helper-progress-fill{width:0%;height:100%;background-color:var(--primary-color);transition:width .3s ease-in-out}#gemini-helper-status{margin-top:8px;min-height:20px;display:block;font-size:13px;transition:color .3s}.gh-status-info{color:var(--primary-color)}.gh-status-success{color:var(--green-color)}.gh-status-error{color:var(--red-color)} `); }; createPanel = function() { const panel = document.createElement('div'); panel.id = 'gemini-helper-panel'; const createEl = (tag, classes = []) => { const el = document.createElement(tag); if (classes.length > 0) el.classList.add(...classes); return el; }; const createButton = (text, id, classes) => { const btn = createEl('button', ['gh-button', ...classes]); btn.id = id; btn.textContent = text; return btn; }; const createTextArea = (id, rows) => { const ta = createEl('textarea', ['gh-textarea']); ta.id = id; ta.rows = rows; return ta; }; const header = createEl('div', ['gh-header']); const title = createEl('span', ['gh-title']); title.textContent = 'Gemini 导出助手 v6.2'; const headerControls = createEl('div', ['gh-header-controls']); const collapseBtn = createEl('span', ['gh-header-btn', 'collapse-btn']); collapseBtn.id = 'gh-collapse-btn'; collapseBtn.textContent = '−'; collapseBtn.title = '折叠/展开'; const closeBtn = createEl('span', ['gh-header-btn']); closeBtn.id = 'gh-close-btn'; closeBtn.textContent = '×'; closeBtn.title = '关闭'; closeBtn.onclick = () => panel.remove(); headerControls.append(collapseBtn, closeBtn); header.append(title, headerControls); const promptLabel = createEl('label', ['gh-label']); promptLabel.htmlFor = 'gh-prompt'; promptLabel.append('Prompt 模板 (支持 ',Object.assign(createEl('code', ['gh-code']), { textContent: '{stock_name}' }),', ',Object.assign(createEl('code', ['gh-code']), { textContent: '{stock_code}' }),')'); const promptArea = createTextArea('gh-prompt', 4); promptArea.placeholder = '例如:请对 {stock_name} ({stock_code}) 进行一次全面的基本面分析。'; const stockLabel = createEl('label', ['gh-label']); stockLabel.htmlFor = 'gh-stocks'; stockLabel.textContent = '股票列表 (每行: 名称 代码)'; const stockArea = createTextArea('gh-stocks', 4); stockArea.placeholder = '例如:\n宁德时代 300750\n隆基绿能 601012'; const autoTitle = createEl('div', ['gh-section-title']); autoTitle.textContent = '自动化控制'; const autoBtnGroup = createEl('div', ['gh-btn-group']); autoBtnGroup.append(createButton('🚀 一键全流程', 'gh-start', ['primary']), Object.assign(createButton('⏹️ 停止', 'gh-stop', ['danger']), { style: { display: 'none' } }), createButton('📤 发送到PDF页面', 'gh-export', [])); const optionsDiv = createEl('div', ['gh-options']); const checkbox = createEl('input'); checkbox.type = 'checkbox'; checkbox.id = 'gh-auto-new-chat'; const checkboxLabel = createEl('label'); checkboxLabel.htmlFor = 'gh-auto-new-chat'; checkboxLabel.textContent = '自动导出并新建对话'; optionsDiv.append(checkbox, checkboxLabel); const progressBar = createEl('div'); progressBar.id = 'gemini-helper-progress-bar'; const progressFill = createEl('div'); progressFill.id = 'gemini-helper-progress-fill'; progressBar.append(progressFill); const status = createEl('div', ['gh-status-info']); status.id = 'gemini-helper-status'; status.textContent = '准备就绪。'; const testTitle = createEl('div', ['gh-section-title']); testTitle.textContent = '分步测试'; const testBtnGroup = createEl('div', ['gh-btn-group']); [{ text: '1. 选中Deep Research', step: 1 }, { text: '2. 填充输入框', step: 2 }, { text: '3. 发送', step: 3 }, { text: '4. 点击"开始研究"', step: 4 }, { text: '5. 等待研究完成', step: 5 }].forEach(b => { const btn = createButton(b.text, `gh-step-${b.step}`, []); btn.dataset.step = b.step; testBtnGroup.append(btn); }); panel.append(header, promptLabel, promptArea, stockLabel, stockArea, autoTitle, autoBtnGroup, optionsDiv, progressBar, status, testTitle, testBtnGroup); document.body.appendChild(panel); }; initDraggable = function(panel, handle) { handle.addEventListener('mousedown', (e) => { if (e.target.closest('.gh-header-btn')) return; e.preventDefault(); let hasMoved = false; const initialX = e.clientX - panel.offsetLeft; const initialY = e.clientY - panel.offsetTop; const move = (e) => { hasMoved = true; let newX = e.clientX - initialX; let newY = e.clientY - initialY; const bodyRect = document.body.getBoundingClientRect(); newX = Math.max(0, Math.min(newX, bodyRect.width - panel.offsetWidth)); newY = Math.max(0, Math.min(newY, bodyRect.height - panel.offsetHeight)); panel.style.left = `${newX}px`; panel.style.top = `${newY}px`; panel.style.right = 'auto'; panel.style.bottom = 'auto'; }; const stopMove = async () => { document.removeEventListener('mousemove', move); document.removeEventListener('mouseup', stopMove); if (hasMoved) await GM_setValue(CONFIG.storageKeys.panelPosition, { top: panel.style.top, left: panel.style.left }); }; document.addEventListener('mousemove', move); document.addEventListener('mouseup', stopMove); }); }; initCollapsible = function(panel, collapseBtn) { collapseBtn.addEventListener('click', async () => { const isCollapsed = panel.classList.toggle('collapsed'); collapseBtn.textContent = isCollapsed ? '+' : '−'; await GM_setValue(CONFIG.storageKeys.isCollapsed, isCollapsed); }); }; async function applySavedState() { const pos = await GM_getValue(CONFIG.storageKeys.panelPosition, null); if (pos && pos.top && pos.left) { ui.panel.style.top = pos.top; ui.panel.style.left = pos.left; ui.panel.style.right = 'auto'; ui.panel.style.bottom = 'auto'; } const isCollapsed = await GM_getValue(CONFIG.storageKeys.isCollapsed, false); if (isCollapsed) { ui.panel.classList.add('collapsed'); ui.collapseBtn.textContent = '+'; } const settings = await GM_getValue(CONFIG.storageKeys.settings, {}); await applySettings(settings); } // --- SECTION 6: INITIALIZATION (Full Implementation) --- initEventListeners = function() { const $ = sel => document.querySelector(sel); Object.assign(ui, { panel: $('#gemini-helper-panel'), collapseBtn: $('#gh-collapse-btn'), prompt: $('#gh-prompt'), stocks: $('#gh-stocks'), startBtn: $('#gh-start'), stopBtn: $('#gh-stop'), exportBtn: $('#gh-export'), status: $('#gemini-helper-status'), progressBar: $('#gemini-helper-progress-bar'), progressFill: $('#gemini-helper-progress-fill'), stepButtons: document.querySelectorAll('#gemini-helper-panel [data-step]'), autoNewChatCheckbox: $('#gh-auto-new-chat'), }); setStatus = (message, type = 'info') => { if (ui.status) { ui.status.textContent = message; ui.status.className = `gh-status-${type}`; } utils.log(message); }; updateProgressBar = (percentage) => { if (ui.progressBar && ui.progressFill) { ui.progressBar.style.display = 'block'; ui.progressFill.style.width = `${percentage}%`; }}; toggleControls = (isRunning) => { STATE.isRunning = isRunning; if(ui.startBtn) { ui.startBtn.style.display = isRunning ? 'none' : 'inline-block'; ui.stopBtn.style.display = isRunning ? 'inline-block' : 'none'; } [ui.startBtn, ui.prompt, ui.stocks, ui.autoNewChatCheckbox, ...ui.stepButtons].forEach(el => { if(el) el.disabled = isRunning; }); if (!isRunning) setTimeout(() => { if (!STATE.isRunning) { ui.progressBar.style.display = 'none'; updateProgressBar(0); }}, 2000); }; sendContentToPdfPage = () => { const msgDivs = document.querySelectorAll(CONFIG.selectors.lastMessageContent); const msgDiv = msgDivs.length > 0 ? msgDivs[msgDivs.length - 1] : null; if (!msgDiv) { setStatus('未找到要导出的内容', 'error'); return; } const data = { type: 'gemini_content', html: msgDiv.innerHTML }; try { const bc = new BroadcastChannel(CONFIG.broadcastChannelName); bc.postMessage(data); bc.close(); GM_setClipboard(JSON.stringify(data)); setStatus('内容已发送到PDF页面 (并存入剪贴板)', 'success'); setTimeout(() => {if (!STATE.isRunning) setStatus('准备就绪。')}, 2000); } catch (e) { setStatus(`发送失败: ${e.message}`, 'error'); utils.log(e); } }; initDraggable(ui.panel, ui.panel.querySelector('.gh-header')); initCollapsible(ui.panel, ui.collapseBtn); ui.startBtn.addEventListener('click', async () => { await saveSettings(); const stocks = parseStocks(); if (!ui.prompt.value.trim() || stocks.length === 0) { setStatus('请填写Prompt模板和格式正确的股票列表。', 'error'); return; } const session = { isRunning: true, promptTemplate: ui.prompt.value, stocks: stocks, currentIndex: 0, options: { autoNewChat: ui.autoNewChatCheckbox.checked }, settings: { prompt: ui.prompt.value, stocks: ui.stocks.value, autoNewChat: ui.autoNewChatCheckbox.checked } }; await saveSession(session); STATE.shouldStop = false; await runBatchResearch(session, 0); }); ui.stopBtn.addEventListener('click', async () => { setStatus('正在停止任务...', 'error'); STATE.shouldStop = true; const session = await loadSession(); if(session) { session.isRunning = false; await saveSession(session); }}); ui.exportBtn.addEventListener('click', sendContentToPdfPage); [ui.prompt, ui.stocks, ui.autoNewChatCheckbox].forEach(el => { if(el) el.addEventListener('change', saveSettings) }); ui.stepButtons.forEach(btn => { btn.addEventListener('click', async () => { const step = btn.dataset.step; setStatus(`测试步骤 ${step}...`); await saveSettings(); const stocks = parseStocks(); const firstStockPrompt = ui.prompt.value.trim().replace(/{stock_name}/g, stocks[0]?.stock_name || '示例名称').replace(/{stock_code}/g, stocks[0]?.stock_code || '示例代码'); try { switch (step) { case '1': actions.selectDeepResearch(); break; case '2': if (!actions.fillGeminiInputBox(firstStockPrompt)) throw new Error("输入框未找到"); break; case '3': if (!(await actions.clickGeminiSendButton())) throw new Error("发送按钮点击失败"); break; case '4': await actions.waitAndClickStartResearch(CONFIG.timeouts.startResearchWait); break; case '5': await actions.waitForResearchComplete(CONFIG.timeouts.researchCompleteWait); break; } setStatus(`步骤 ${step} 执行完毕`, 'success'); } catch (e) { setStatus(`步骤 ${step} 失败: ${e.message}`, 'error'); utils.log(e); } }); }); }; init = async function() { utils.log('开始初始化助手...'); injectStyle(); createPanel(); initEventListeners(); const session = await loadSession(); if (session && session.isRunning) { await handleRecovery(session); } else { await applySavedState(); setStatus('准备就绪。'); } utils.log('助手加载完成。'); }; // --- SCRIPT ENTRY POINT --- window.addEventListener('load', () => setTimeout(init, CONFIG.timeouts.longInterval)); })();
// ==UserScript== // @name WeRead 自动滚动(支持 Canvas 点击) // @namespace https://chat.openai.com/ // @version 1.1.0 // @description 模拟慢速阅读,自动滚动并点击 Canvas 区域“下一章”按钮(通过坐标) // @author Cove // @match https://weread.qq.com/* // @grant none // ==/UserScript== (function () { 'use strict'; (function () { const originalAddEventListener = EventTarget.prototype.addEventListener; EventTarget.prototype.addEventListener = function (type, listener, options) { const wrapped = function (event) { // 模拟真实事件,强行让 isTrusted === true(绕过某些检测逻辑) try { Object.defineProperty(event, 'isTrusted', { get: () => true }); } catch (_) {} return listener.call(this, event); }; return originalAddEventListener.call(this, type, wrapped, options); }; console.log('[Hook] 已注入 isTrusted 绕过'); })(); (function () { const EVENTS_TO_HOOK = [ 'click', 'mousedown', 'mouseup', 'pointerdown', 'pointerup', 'touchstart', 'touchend', 'mousemove', ]; const HOOK_TARGETS = [ window, document, document.body, ...document.querySelectorAll('*'), ]; const log = (...args) => { // console.log('%c[事件调试器]', 'color: #08f; font-weight: bold;', ...args); }; const hookEvent = (target, type) => { try { target.addEventListener( type, (e) => { const path = e.composedPath?.() || e.path || []; const targetInfo = (e.target?.tagName || '') + (e.target?.id ? `#${e.target.id}` : '') + (e.target?.className ? `.${e.target.className}` : ''); log( `事件: ${type}`, `\n→ 元素: ${targetInfo}`, `\n→ 坐标: (${e.clientX}, ${e.clientY})`, `\n→ isTrusted: ${e.isTrusted}`, `\n→ 路径长度: ${path.length}` ); }, true // 捕获阶段 ); } catch (err) { // 某些系统节点无法监听(如 window.chrome) } }; const initHook = () => { log('🔍 初始化 DOM & Canvas 事件监听器'); for (const evt of EVENTS_TO_HOOK) { for (const el of HOOK_TARGETS) { hookEvent(el, evt); } } // hook 所有 canvas document.querySelectorAll('canvas').forEach((canvas, idx) => { for (const evt of EVENTS_TO_HOOK) { hookEvent(canvas, evt); } log(`🎨 已监听 canvas #${idx}`); }); }; initHook(); })(); (function () { 'use strict'; const LS_KEY = '__ClickDebuggerState__'; const defaultSettings = { expanded: true, filter: [], top: null, left: null }; const settings = Object.assign({}, defaultSettings, JSON.parse(localStorage.getItem(LS_KEY) || '{}')); function saveSettings() { localStorage.setItem(LS_KEY, JSON.stringify(settings)); } function initClickDebuggerPro() { const panel = document.createElement('div'); panel.id = '__ClickDebuggerPanel__'; Object.assign(panel.style, { position: 'fixed', bottom: '10px', right: '10px', width: '380px', maxHeight: '300px', background: '#1e1e1e', color: '#0f0', fontSize: '12px', fontFamily: 'monospace', border: '1px solid #444', padding: '8px', overflow: 'hidden', zIndex: 999999, borderRadius: '6px', resize: 'both', boxSizing: 'border-box' }); if (settings.top !== null) panel.style.top = settings.top; if (settings.left !== null) { panel.style.left = settings.left; panel.style.right = 'auto'; panel.style.bottom = 'auto'; } const header = document.createElement('div'); header.style.cssText = 'display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;cursor:move;'; const title = document.createElement('span'); title.textContent = '🎯 Click Debugger Pro'; title.style.color = '#0ff'; title.style.fontWeight = 'bold'; const controls = document.createElement('div'); const btnToggle = document.createElement('button'); btnToggle.textContent = settings.expanded ? '收起' : '展开'; btnToggle.style.cssText = 'margin-right:4px'; const btnClear = document.createElement('button'); btnClear.textContent = '清空'; const btnCopy = document.createElement('button'); btnCopy.textContent = '复制'; [btnToggle, btnClear, btnCopy].forEach((btn) => Object.assign(btn.style, { fontSize: '12px', padding: '2px 6px', marginLeft: '4px', background: '#333', color: '#0f0', border: '1px solid #0f0', borderRadius: '4px', cursor: 'pointer' })); controls.append(btnToggle, btnClear, btnCopy); header.append(title, controls); panel.appendChild(header); const filterSelect = document.createElement('select'); filterSelect.multiple = true; ['click', 'mousedown', 'mouseup', 'pointerdown', 'pointerup', 'touchstart', 'touchend'].forEach((evt) => { const opt = document.createElement('option'); opt.value = evt; opt.textContent = evt; if (settings.filter.includes(evt)) opt.selected = true; filterSelect.appendChild(opt); }); filterSelect.style.width = '100%'; filterSelect.style.marginBottom = '6px'; panel.appendChild(filterSelect); const logContainer = document.createElement('div'); Object.assign(logContainer.style, { maxHeight: '200px', overflowY: 'auto', display: settings.expanded ? 'block' : 'none', borderTop: '1px solid #333', paddingTop: '6px' }); panel.appendChild(logContainer); document.body.appendChild(panel); // 拖动面板 let isDragging = false, offsetX = 0, offsetY = 0; header.addEventListener('mousedown', (e) => { isDragging = true; offsetX = e.clientX - panel.getBoundingClientRect().left; offsetY = e.clientY - panel.getBoundingClientRect().top; e.preventDefault(); }); window.addEventListener('mousemove', (e) => { if (isDragging) { panel.style.left = `${e.clientX - offsetX}px`; panel.style.top = `${e.clientY - offsetY}px`; panel.style.right = 'auto'; panel.style.bottom = 'auto'; settings.left = panel.style.left; settings.top = panel.style.top; saveSettings(); } }); window.addEventListener('mouseup', () => (isDragging = false)); // 控制逻辑 btnToggle.onclick = () => { settings.expanded = !settings.expanded; logContainer.style.display = settings.expanded ? 'block' : 'none'; btnToggle.textContent = settings.expanded ? '收起' : '展开'; saveSettings(); }; btnClear.onclick = () => (logContainer.innerHTML = ''); btnCopy.onclick = () => { const text = Array.from(logContainer.children).map((el) => el.textContent).join('\n'); navigator.clipboard.writeText(text).then(() => alert('已复制日志')); }; filterSelect.onchange = () => { settings.filter = Array.from(filterSelect.selectedOptions).map((opt) => opt.value); saveSettings(); }; // 限制最多 overlay 数量 const overlayQueue = []; function showClickOverlay(e) { const mark = document.createElement('div'); Object.assign(mark.style, { position: 'fixed', top: `${e.clientY - 5}px`, left: `${e.clientX - 5}px`, width: '10px', height: '10px', background: e.isTrusted ? 'lime' : 'red', borderRadius: '50%', zIndex: 999999, pointerEvents: 'none', opacity: '0.8', transition: 'all 0.6s ease-out' }); document.body.appendChild(mark); overlayQueue.push(mark); setTimeout(() => (mark.style.opacity = '0'), 10); setTimeout(() => mark.remove(), 800); while (overlayQueue.length > 20) { const old = overlayQueue.shift(); old.remove(); } } // 日志记录函数 function logEvent(e) { if (settings.filter.length && !settings.filter.includes(e.type)) return; const time = new Date().toLocaleTimeString(); const el = e.target; const tag = el.tagName || 'UNKNOWN'; const id = el.id ? `#${el.id}` : ''; const cls = el.className ? `.${el.className}` : ''; const line = document.createElement('div'); line.textContent = `[${time}] ${e.type.padEnd(12)} | isTrusted: ${e.isTrusted ? '✅' : '❌'} | (${e.clientX}, ${e.clientY}) | ${tag}${id}${cls}`; logContainer.appendChild(line); if (logContainer.children.length > 200) logContainer.removeChild(logContainer.children[0]); showClickOverlay(e); } const events = ['click', 'mousedown', 'mouseup', 'pointerdown', 'pointerup', 'touchstart', 'touchend']; events.forEach((evt) => window.addEventListener(evt, logEvent, true)); const boundCanvasSet = new WeakSet(); const hookCanvas = () => { document.querySelectorAll('canvas').forEach((canvas) => { if (boundCanvasSet.has(canvas)) return; boundCanvasSet.add(canvas); events.forEach((evt) => canvas.addEventListener(evt, logEvent, true)); }); }; hookCanvas(); new MutationObserver(hookCanvas).observe(document.body, { childList: true, subtree: true }); console.log('[ClickDebugger] Pro widget loaded'); } window.addEventListener('load', () => setTimeout(initClickDebuggerPro, 1000)); })(); const config = { enableScroll: true, // 是否启用滚动 enableBackScroll: false, // 是否允许上下翻滚 enableClickNext: true, // 滚动到底后是否点击“下一章” scrollInterval: 2000, // 每次滚动间隔(ms) scrollStepRange: [30, 80], // 每次滚动像素范围 maxIdleTimeBeforeNext: 3000, // 到底部后等待多久点击“下一章”(ms) // 🟡 Canvas 上“下一章”按钮的位置(相对于 viewport 的坐标) // 你可以通过手动打开控制台,移动鼠标定位该按钮的坐标(如 x: window.innerWidth - 60, y: window.innerHeight - 40) // nextChapterClickPos: { x: window.innerWidth - 740, y: window.innerHeight - 694 }, nextChapterClickPos: { x: 1287, y: 395 }, }; let scrollDirection = 1; let scrollTimer = null; let idleTimer = null; const log = (...args) => console.log('[WeRead模拟器]', ...args); const randomBetween = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; const scrollOnce = () => { const step = randomBetween(...config.scrollStepRange) * scrollDirection; const currentScroll = window.scrollY; const maxScroll = document.body.scrollHeight - window.innerHeight; let nextScroll = currentScroll + step; if (nextScroll >= maxScroll || nextScroll < 0) { if (config.enableBackScroll) { scrollDirection *= -1; nextScroll = currentScroll + step * -1; } else { nextScroll = maxScroll; clearInterval(scrollTimer); if (config.enableClickNext) { log('到达底部,准备点击下一章...'); idleTimer = setTimeout(clickCanvasNextChapter, config.maxIdleTimeBeforeNext); } return; } } window.scrollTo({ top: nextScroll, behavior: 'smooth', }); }; const clickCanvasNextChapter = () => { const { x, y } = config.nextChapterClickPos; const canvas = document.querySelector('.wr_canvasContainer canvas'); if (!canvas) { log('⚠️ 找不到 canvas 元素'); return; } const clickEvent = new MouseEvent('click', { bubbles: true, cancelable: true, clientX: x, clientY: y, view: window, }); log(`🖱️ 模拟点击 Canvas 坐标 (${x}, ${y})`); canvas.dispatchEvent(clickEvent); setTimeout(() => { log('✅ 新章节加载完成,重新滚动...'); window.scrollTo({ top: 0 }); scrollTimer = setInterval(scrollOnce, config.scrollInterval); }, 2500); }; const start = () => { if (config.enableScroll) { scrollTimer = setInterval(scrollOnce, config.scrollInterval); log('▶️ 已启动自动滚动'); } }; const stop = () => { clearInterval(scrollTimer); clearTimeout(idleTimer); log('⏹️ 已停止模拟'); }; // 暴露全局对象以便手动控制 window.__WeReadSim__ = { start, stop, config }; // 页面加载完成后延迟启动 window.addEventListener('load', () => { setTimeout(start, 1000); }); })();
const token = `eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiJYWVNjTXpQU2U1SFcxeUNXSkI2amxLUmlUclI1ZEhNWiIsImNsaWVudGlkIjoiZTVjZDdlNDg5MWJmOTVkMWQxOTIwNmNlMjRhN2IzMmUiLCJ0ZW5hbnRJZCI6IjAwMDAwMCIsInVzZXJJZCI6MSwidXNlck5hbWUiOiJhZG1pbiIsImRlcHRJZCI6MTAzLCJkZXB0TmFtZSI6IiIsImRlcHRDYXRlZ29yeSI6IiJ9._TQ6A82KPhfk09OiHZ0BdRfVN9YswaROyJygYnT-2K8`
首次公布!我国空间站内发现微生物新物种 来源: https://wallstreetcn.com/articles/3747282 近日,科研人员首次公布在我国空间站发现的一个微生物新物种,并将其命名为“天宫尼尔菌”,相关科研成果在线发表于国际权威期刊《International Journal of Systematic and Evolutionary Microbiology》上。 近日,科研人员首次公布在我国空间站发现的一个微生物新物种,并将其命名为“天宫尼尔菌(Niallia tiangongensis)”,相关科研成果在线发表于国际权威期刊《International Journal of Systematic and Evolutionary Microbiology》上。 什么是微生物新物种? 微生物是地球上最古老、最多样化的生命形式之一,体型微小却分布广泛。从空气悬浮颗粒到土壤深处,从深海高压环境到人体共生菌群,微生物构成了地球上庞大的“隐形”群落。微生物的世界就像一个神秘的宝藏,每发现一个微生物新物种,就像打开了一扇通往未知世界的大门。 什么是微生物新物种呢?简单来说,就是那些以前从未被人类发现、研究和命名的微生物。空间站内微重力、辐射、密闭、寡营养等复杂条件相互交织,其中蕴藏着多少未知的微生物新物种呢?科学家们对这些充满了好奇和想象。 天宫尼尔菌是如何被发现的? 此次微生物新物种发现是在空间站工程航天技术试验项目支持下实现的。研究团队聚焦于我国空间站长期运营过程中环境微生物的动态变化和安全控制,设计了多批次、全舱段、全景式的居留舱微生物监测任务CHAMP(China Space Station Habitation Area Microbiome Program)。 2023年5月,神舟十五号航天员乘组利用无菌采样擦巾对空间站舱内表面微生物进行在轨采集和低温储存。下行后,经过地面实验分析,科研人员发现了一种全新的微生物物种——天宫尼尔菌。该研究综合运用了形态观察、基因组测序、系统发育分析和代谢分析等多学科手段,最终确认了这一独特物种。 天宫尼尔菌有哪些独特性? 微生物凭借独特的生物学机制巧妙地适应着空间环境的压力,而空间环境也通过选择压力反过来塑造微生物的代谢和生理特征。此次发现的天宫尼尔菌是一类革兰氏阳性的产芽孢细菌,隶属于细胞杆菌科(Cytobacillaceae)尼尔属(Niallia),与近缘物种相比,天宫尼尔菌在适应空间环境方面表现出色: 第一,天宫尼尔菌具备卓越的“抗压”能力,通过调控杆菌硫醇(BSH)的生物合成,精准应对空间环境中的氧化应激。这种机制维持了细胞内的氧化还原平衡,保障其在极端条件下也能稳健生长。 第二,天宫尼尔菌在生物被膜形成、辐射损伤修复等方面表现出独特特征,这些能力集于一身,帮助其成为能够适应空间环境的“六边形战士”。 发现天宫尼尔菌带来哪些启示? 天宫尼尔菌在空间站环境中展现出独特的生存与适应能力,这一发现为科研人员带来了全新的启示:其空间环境适应机制不仅能助力定向的微生物控制策略设计,为航天、农业、工业和医疗等领域提供精准的干预思路;在空间微生物资源利用方面也存在惊喜——其对一些有机物的利用能力,为这些物质的可持续利用开辟了全新路径。 空间站平台为微生物新物种的发现和研究提供了独一无二的条件。随着空间站的长期运营,围绕微生物的活性物质、基因资源和代谢功能的研究有望迎来一次“大丰收”,这也将为地球上的科学研究和应用带来了新的发展机遇。 本文来源:央视新闻,原文标题:《首次公布!我国空间站内发现微生物新物种》 风险提示及免责条款 市场有风险,投资需谨慎。本文不构成个人投资建议,也未考虑到个别用户特殊的投资目标、财务状况或需要。用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。 ----------------------------------------
function CarouselIndicator({ className, classNameButton, }: CarouselIndicatorProps) { const { index, itemsCount, setIndex } = useCarousel(); return ( <div className={cn( 'absolute bottom-0 z-10 flex w-full items-center justify-center', className )} > <div className='flex space-x-2'> {Array.from({ length: itemsCount }, (_, i) => ( <button key={i} type='button' aria-label={`Go to slide ${i + 1}`} onClick={() => setIndex(i)} className={cn( 'h-2 w-2 rounded-full transition-opacity duration-300', index === i ? 'bg-zinc-950 dark:bg-zinc-50' : 'bg-zinc-900/50 dark:bg-zinc-100/50', classNameButton )} /> ))} </div> </div> ); }
'{"pois":[{"id":"B02F37UAJD","name":"市民广场","address":"福中三路","typecode":"110105","photo":"https://aos-comment.amap.com/B02F37UAJD/comment/1e64630c74702f4201bd55e4821b15e4_2048_2048_80.jpg"},{"id":"B0I13DT85A","name":"市民中心公园","address":"深南大道市民中心广场前(近市民中心)","typecode":"110101","photo":"https://aos-comment.amap.com/B0I13DT85A/comment/content_media_external_images_media_100001907_1734053206286_08870828.jpg"},{"id":"B0FFH06BUU","name":"中心书城南台阶广场","address":"深圳书城(少年宫地铁站D口步行270米)","typecode":"110105","photo":null},{"id":"B0I6BDNYL7","name":"典里","address":"福中一路2014号深圳书城南区","typecode":"110000","photo":null},{"id":"B0G3AZF0A3","name":"世界野生动物标本展厅","address":"深圳博物馆金田路馆(历史民俗)","typecode":"110000","photo":"https://aos-comment.amap.com/B0G3AZF0A3/comment/8237fed59ce731bdf5ff3ed79decfdb6_2048_2048_80.jpg"},{"id":"B0K39576UK","name":"深圳书城轮椅坡道","address":"福中一路2014号(少年宫地铁站D口步行120米)","typecode":"110200","photo":"http://store.is.autonavi.com/showpic/0dc89f23e414987ddd96c9f275f40820"},{"id":"B0GUBGMD5J","name":"深圳博物馆","address":"福中路市民中心A区(市民中心地铁站B口步行240米)","typecode":"110210","photo":"https://aos-comment.amap.com/B0GUBGMD5J/comment/content_media_external_file_8044_1745934749356_20432441.jpg"},{"id":"B0KUFC53BJ","name":"市民广场-水晶岛","address":"市民广场(福田地铁站15号口步行100米)","typecode":"110000","photo":null},{"id":"B0FFGM6YKB","name":"深圳博物馆新馆","address":"市民中心A区(市民中心地铁站B口步行350米)","typecode":"140100","photo":"https://aos-comment.amap.com/B0FFGM6YKB/comment/content_media_external_images_media_2438_1740888347639_00189815.jpg"},{"id":"B02F38IRTR","name":"深圳博物馆金田路馆(历史民俗)","address":"莲花街道福中社区福中三路2008号市民中心A区","typecode":"140100","photo":"http://store.is.autonavi.com/showpic/05f0c2bf1e89f61ad6768b5e4654735f"},{"id":"B0FFG2CC9U","name":"深圳证券交易所广场-西面广场","address":"深南大道2012号深圳证券交易所","typecode":"110105","photo":"http://store.is.autonavi.com/showpic/580cba9d9dbf508171e4ed4c932c969e"},{"id":"B0FFH15OG9","name":"深圳证券交易所广场-雕塑群","address":"民田路深圳证券交易所(福田地铁站31号口步行80米)","typecode":"110000","photo":"https://aos-comment.amap.com/B0FFH15OG9/comment/content_media_external_images_media_1000051322_ss__1735750689676_55883033.jpg"},{"id":"B0FFHWT4O0","name":"红领巾广场","address":"鹏程四路深圳市少年宫(少年宫地铁站D口步行130米)","typecode":"110105","photo":null},{"id":"B0FFH0ZFQ3","name":"市民广场南广场","address":"福华一路3号(市民中心地铁站F口步行420米)","typecode":"110100","photo":"https://aos-comment.amap.com/B0FFH0ZFQ3/comment/content_media_external_images_media_45861_ss__1742756048511_06083012.jpg"},{"id":"B0I0SUDODG","name":"深圳市卓建法律博物馆","address":"福中三路与鹏程五路交叉口东南60米","typecode":"140100","photo":"https://aos-comment.amap.com/B0I0SUDODG/comment/ad91a750587eb98a29137fac67b686f2_2048_2048_80.jpg"},{"id":"BZ7JPD0395","name":"金桂路起点","address":"红荔路6030号莲花山公园(西南角)","typecode":"110106","photo":null},{"id":"B0FFIV0L73","name":"向日葵公园","address":"深南大道市民广场南广场(东南角)","typecode":"110000","photo":"https://aos-comment.amap.com/B0FFIV0L73/comment/d4da3631033659b154e44b691ea87ac0_2048_2048_80.jpg"},{"id":"BZ7JPD0399","name":"红棉路起点","address":"红荔路6030号莲花山公园(西南角)","typecode":"110106","photo":null},{"id":"B02F38OXYB","name":"莲花山公园风筝广场","address":"红荔路6030号莲花山公园内(南侧)","typecode":"110105","photo":"http://store.is.autonavi.com/showpic/87375890cf4b25fe174e152c11bf7144"},{"id":"BZ7JPD038N","name":"红棉路","address":"红荔路6030号莲花山公园(西南角)","typecode":"110106","photo":null}]}'
角色设定: 请扮演一位专业的股票分析师。 任务说明: 我将提供一家公司的名称(以及股票代码,如果方便的话)。请你根据以下框架,对该公司进行全面深入的基本面分析。在分析过程中,请务必: * 使用最新、最可靠的公开数据: 包括但不限于公司年报/季报、官方公告、行业研究报告、权威财经新闻等。如果可能,请注明数据的来源或时间点。查找英文材料,用中文回答。 * 保持客观中立: 清晰区分客观事实陈述(如财务数据、市场份额)与主观分析/市场预期。 * 语言清晰简洁: 使用专业但易于理解的语言,避免不必要的术语堆砌。 * 结构完整: 严格按照以下框架的10个部分进行回答,确保覆盖所有要点。 * 深入分析: 不仅要列出数据,更要解释数据背后的含义、趋势及其对公司的影响。 分析框架: 公司名称: Zeta Global 股票代码: ZETA 1. 公司概览与业务核心 * 业务内容: 公司主要从事什么业务?其核心产品或服务具体是什么?请详细描述。 * 商业模式: 公司的主要盈利方式是什么?收入来源构成如何(例如,按产品/服务、按地区、按客户类型划分)?各项来源的占比大约是多少? * 市值与初步定位: 公司当前的市值大约是多少?在其所属的主要行业和细分领域中,大致处于什么位置(例如:绝对龙头、区域领先、细分市场专家、成长型企业等)? 2. 行业地位与竞争优势 * 细分市场市占率: 估算或引用第三方数据,说明公司在其核心业务领域的市场份额。与行业内主要竞争对手(特别是行业龙头和主要二线企业)相比如何? * 行业排名依据: 支持上述市场地位判断的主要依据是什么?(例如:市场份额数据、专利数量排名、产品线完整度、品牌影响力、技术认证等) * 核心竞争优势 (护城河): 相较于同行,公司拥有哪些独特的、难以复制的竞争优势?这些优势构成了怎样的竞争壁垒?(例如:技术领先、成本控制、品牌价值、客户粘性、网络效应、特许经营权、规模效应、优秀的管理等) 3. 财务健康度分析 * 营收与利润: 展示近3-5年的总营收、净利润(或归母净利润)的规模及其同比增长率。务必基于当下2025年 最新的数据,分析其增长趋势(加速/减速/稳定/波动)及其主要驱动因素 * 盈利能力: * 计算并评估近期的毛利率、净利率水平。 * 与行业平均水平及主要竞争对手进行比较。 * 分析净利润增长速度是否持续快于(或匹配)营收增长速度,这通常反映了盈利能力的提升或成本控制的有效性。 * 安全边际 (偿债能力): * 分析最新的资产负债率。 * 评估其是否处于健康或可接受的水平(可参考行业基准,如:一般制造业<50%-60%、高科技轻资产型<40%-50%,或根据公司具体情况判断)。 * 现金流质量: * 评估近3-5年经营活动产生的现金流量净额。 * 判断经营现金流是否持续为正,并且是否能够大体覆盖或超过同期的净利润?(回答 是/否/部分年份是,并简述原因)。这反映了利润的“含金量”。 4. 研发创新与技术壁垒 * 研发强度: 计算并展示近3年研发费用总额及其占营业收入的比例。与行业内研发投入领先的企业(如Top 3平均值或指定的主要竞争对手)相比如何? * 核心技术/专利: 公司是否拥有在行业内具有显著优势或不可替代性的核心技术、关键专利或专有知识?(例如:某种算法的效率、材料的性能、生物制剂的活性、制造工艺的精度等)。请简要说明其重要性。 * 技术转化效率: 定性描述近3年研发投入与新产品销售收入、市场份额提升或成本效率改善之间的关联性。研发成果是否能有效转化为商业价值? 5. 产业链议价能力 * 上游依赖度 (供应商): 分析公司的供应商集中度。是否存在对少数核心供应商的严重依赖(例如,前三大供应商采购额占比是否超过50%)?这可能带来哪些风险? * 下游话语权 (客户): 分析公司的客户集中度。是否存在对单一或少数大客户的严重依赖(例如,来自最大客户的收入占比是否超过30%)?这可能带来哪些风险? * 库存与订单 (如有相关数据): * 分析存货周转率的变化趋势,反映了库存管理效率和市场需求。 * 观察合同负债(或预收账款)的变化。如果连续多个季度显著增长,可能预示着下游需求旺盛或订单饱满。 6. 管理层与股东结构 * 核心管理层: 介绍公司CEO(或董事长/社长等关键决策者)及核心管理团队的主要背景、从业经验、历史业绩以及(基于公开信息的)管理风格特点。 * 股东结构: 列出公司的主要股东(通常是前十大股东)及其当前的持股比例。分析股权结构的特点(如:是否集中、是否存在实际控制人、机构投资者占比、是否有战略投资者等)。 7. 政策环境与敏感性 * 补贴依赖度: 分析政府补助(计入当期损益的部分)占公司净利润的比例。如果此比例持续较高(例如,超过20%),需要提示其对政策变化的敏感性。 * 牌照与准入门槛: 公司所处的行业或其核心业务是否需要特殊的牌照、资质认证或面临较高的政策准入门槛?(例如:金融、医药、教育、特定制造领域、低空经济运营等)。 * 政策风险: 评估公司当前业务在多大程度上可能受到宏观经济政策、产业政策调整、国际贸易关系(如关税、制裁)、数据安全法规、环保要求等政策性因素的正面或负面影响。 8. 增长驱动与市场预期 (股价上涨的潜在依据) * 未来增长点: 分析并列举支撑公司未来几年业绩持续增长的核心驱动因素是什么?(例如:新市场开拓计划、即将推出的重磅新产品/服务、行业本身的成长性、潜在的并购机会、成本优化空间、受益于某项技术趋势或政策红利等)。 * 市场预期: 结合券商研究报告、市场新闻等信息,总结当前市场对公司未来发展的主要预期是什么?有哪些积极的催化剂被市场关注? 9. 风险因素与挑战 (股价下跌的潜在风险) * 主要风险: 系统性地梳理并列出公司可能面临的主要内外部风险。(例如:宏观经济下行风险、行业竞争加剧导致价格战、核心技术被迭代或替代的风险、关键客户流失风险、原材料成本大幅上涨风险、政策监管收紧风险、管理层变动风险、财务风险如高负债或现金流恶化等)。 * 经营挑战: 公司当前在经营层面遇到的最突出的困难或挑战是什么?(例如:产能瓶颈、供应链中断、品牌形象受损、新业务拓展不力、人才流失等)。 10. 总结与投资视角 * (可选) 竞争对手关键指标对比: 如果方便且有代表性,选择1-2家核心竞争对手,制作一个简要的表格,对比它们在关键维度上的表现(如:毛利率、净利率、市盈率(PE)、市净率(PB)、研发占比、市场份额等)。 * SWOT简析: 基于以上所有分析,用SWOT(优势Strengths, 劣势Weaknesses, 机遇Opportunities, 威胁Threats)框架对公司进行凝练总结。 * 投资潜力评估: 综合考虑公司的技术壁垒、财务稳健性、成长潜力、管理能力、估值水平以及政策环境等因素,给出一个概括性的投资潜力评级(建议使用1-5星,1星最低,5星最高),并附上简短的核心理由。 * 核心风险提示: 再次强调,并按重要性或发生概率排序,列出投资者应重点关注的3项最大风险。 用中文回答。
"use client" import { Cloud, CloudLightning, CloudRain } from "lucide-react" import { Card, CardContent } from "@/components/ui/card" // 天气类型和对应图标的映射 const getWeatherIcon = (weather: string) => { if (weather.includes("多云")) { return <Cloud className="h-6 w-6 text-gray-500" /> } else if (weather.includes("雷阵雨")) { return <CloudLightning className="h-6 w-6 text-purple-500" /> } else if (weather.includes("雨")) { return <CloudRain className="h-6 w-6 text-blue-500" /> } else { return <Cloud className="h-6 w-6 text-gray-500" /> } } // 将数字周几转换为中文 const getChineseWeekday = (week: string) => { const weekMap: Record<string, string> = { "1": "周一", "2": "周二", "3": "周三", "4": "周四", "5": "周五", "6": "周六", "7": "周日", } return weekMap[week] || week } // 格式化日期为月/日 const formatDate = (dateString: string) => { const date = new Date(dateString) return `${date.getMonth() + 1}/${date.getDate()}` } // 天气数据类型 type WeatherForecast = { date: string week: string dayweather: string nightweather: string daytemp: string nighttemp: string daywind: string nightwind: string daypower: string nightpower: string daytemp_float: string nighttemp_float: string } type WeatherData = { city: string forecasts: WeatherForecast[] } // 示例天气数据 const weatherData: WeatherData = { city: "广州市", forecasts: [ { date: "2025-05-14", week: "3", dayweather: "多云", nightweather: "雷阵雨", daytemp: "32", nighttemp: "23", daywind: "北", nightwind: "北", daypower: "1-3", nightpower: "1-3", daytemp_float: "32.0", nighttemp_float: "23.0", }, { date: "2025-05-15", week: "4", dayweather: "雷阵雨", nightweather: "雷阵雨", daytemp: "31", nighttemp: "23", daywind: "北", nightwind: "北", daypower: "1-3", nightpower: "1-3", daytemp_float: "31.0", nighttemp_float: "23.0", }, { date: "2025-05-16", week: "5", dayweather: "雷阵雨", nightweather: "中雨", daytemp: "32", nighttemp: "24", daywind: "北", nightwind: "北", daypower: "1-3", nightpower: "1-3", daytemp_float: "32.0", nighttemp_float: "24.0", }, { date: "2025-05-17", week: "6", dayweather: "中雨", nightweather: "中雨", daytemp: "31", nighttemp: "24", daywind: "北", nightwind: "北", daypower: "1-3", nightpower: "1-3", daytemp_float: "31.0", nighttemp_float: "24.0", }, ], } export default function WeatherCard() { return ( <div className="mx-auto max-w-md px-4 py-3"> <Card className="overflow-hidden rounded-xl shadow-lg"> <CardContent className="p-0"> <div className="bg-gradient-to-r from-blue-500 to-blue-600 p-3 text-white"> <h2 className="text-base font-semibold">{weatherData.city} · 天气预报</h2> </div> <div className="flex overflow-x-auto scrollbar-hide py-2 px-1"> {weatherData.forecasts.map((forecast, index) => ( <div key={index} className="flex-shrink-0 px-2 first:pl-3 last:pr-3"> <div className="flex flex-col items-center justify-between w-16 h-20 p-1 rounded-lg bg-gray-50"> <div className="text-xs font-medium">{formatDate(forecast.date)}</div> <div className="text-[10px] text-gray-500">{getChineseWeekday(forecast.week)}</div> <div>{getWeatherIcon(forecast.dayweather)}</div> <div className="flex items-center text-xs"> <span className="font-bold text-red-500">{forecast.daytemp}°</span> <span className="mx-1 text-gray-300">/</span> <span className="font-medium text-blue-500">{forecast.nighttemp}°</span> </div> </div> </div> ))} </div> </CardContent> </Card> </div> ) }
'{"city":"广州市","forecasts":[{"date":"2025-05-14","week":"3","dayweather":"多云","nightweather":"雷阵雨","daytemp":"32","nighttemp":"23","daywind":"北","nightwind":"北","daypower":"1-3","nightpower":"1-3","daytemp_float":"32.0","nighttemp_float":"23.0"},{"date":"2025-05-15","week":"4","dayweather":"雷阵雨","nightweather":"雷阵雨","daytemp":"31","nighttemp":"23","daywind":"北","nightwind":"北","daypower":"1-3","nightpower":"1-3","daytemp_float":"31.0","nighttemp_float":"23.0"},{"date":"2025-05-16","week":"5","dayweather":"雷阵雨","nightweather":"中雨","daytemp":"32","nighttemp":"24","daywind":"北","nightwind":"北","daypower":"1-3","nightpower":"1-3","daytemp_float":"32.0","nighttemp_float":"24.0"},{"date":"2025-05-17","week":"6","dayweather":"中雨","nightweather":"中雨","daytemp":"31","nighttemp":"24","daywind":"北","nightwind":"北","daypower":"1-3","nightpower":"1-3","daytemp_float":"31.0","nighttemp_float":"24.0"}]}'
角色设定: 请扮演一位专业的股票分析师。 任务说明: 我将提供一家公司的名称(以及股票代码,如果方便的话)。请你根据以下框架,对该公司进行全面深入的基本面分析。在分析过程中,请务必: * 使用最新、最可靠的公开数据: 包括但不限于公司年报/季报、官方公告、行业研究报告、权威财经新闻等。如果可能,请注明数据的来源或时间点。 * 保持客观中立: 清晰区分客观事实陈述(如财务数据、市场份额)与主观分析/市场预期。 * 语言清晰简洁: 使用专业但易于理解的语言,避免不必要的术语堆砌。 * 结构完整: 严格按照以下框架的10个部分进行回答,确保覆盖所有要点。 * 深入分析: 不仅要列出数据,更要解释数据背后的含义、趋势及其对公司的影响。 分析框架: 公司名称: 江丰电子 股票代码: 300666 1. 公司概览与业务核心 * 业务内容: 公司主要从事什么业务?其核心产品或服务具体是什么?请详细描述。 * 商业模式: 公司的主要盈利方式是什么?收入来源构成如何(例如,按产品/服务、按地区、按客户类型划分)?各项来源的占比大约是多少? * 市值与初步定位: 公司当前的市值大约是多少?在其所属的主要行业和细分领域中,大致处于什么位置(例如:绝对龙头、区域领先、细分市场专家、成长型企业等)? 2. 行业地位与竞争优势 * 细分市场市占率: 估算或引用第三方数据,说明公司在其核心业务领域的市场份额。与行业内主要竞争对手(特别是行业龙头和主要二线企业)相比如何? * 行业排名依据: 支持上述市场地位判断的主要依据是什么?(例如:市场份额数据、专利数量排名、产品线完整度、品牌影响力、技术认证等) * 核心竞争优势 (护城河): 相较于同行,公司拥有哪些独特的、难以复制的竞争优势?这些优势构成了怎样的竞争壁垒?(例如:技术领先、成本控制、品牌价值、客户粘性、网络效应、特许经营权、规模效应、优秀的管理等) 3. 财务健康度分析 * 营收与利润: 展示近3-5年的总营收、净利润(或归母净利润)的规模及其同比增长率。务必基于当下2025年 最新的数据,分析其增长趋势(加速/减速/稳定/波动)及其主要驱动因素 * 盈利能力: * 计算并评估近期的毛利率、净利率水平。 * 与行业平均水平及主要竞争对手进行比较。 * 分析净利润增长速度是否持续快于(或匹配)营收增长速度,这通常反映了盈利能力的提升或成本控制的有效性。 * 安全边际 (偿债能力): * 分析最新的资产负债率。 * 评估其是否处于健康或可接受的水平(可参考行业基准,如:一般制造业<50%-60%、高科技轻资产型<40%-50%,或根据公司具体情况判断)。 * 现金流质量: * 评估近3-5年经营活动产生的现金流量净额。 * 判断经营现金流是否持续为正,并且是否能够大体覆盖或超过同期的净利润?(回答 是/否/部分年份是,并简述原因)。这反映了利润的“含金量”。 4. 研发创新与技术壁垒 * 研发强度: 计算并展示近3年研发费用总额及其占营业收入的比例。与行业内研发投入领先的企业(如Top 3平均值或指定的主要竞争对手)相比如何? * 核心技术/专利: 公司是否拥有在行业内具有显著优势或不可替代性的核心技术、关键专利或专有知识?(例如:某种算法的效率、材料的性能、生物制剂的活性、制造工艺的精度等)。请简要说明其重要性。 * 技术转化效率: 定性描述近3年研发投入与新产品销售收入、市场份额提升或成本效率改善之间的关联性。研发成果是否能有效转化为商业价值? 5. 产业链议价能力 * 上游依赖度 (供应商): 分析公司的供应商集中度。是否存在对少数核心供应商的严重依赖(例如,前三大供应商采购额占比是否超过50%)?这可能带来哪些风险? * 下游话语权 (客户): 分析公司的客户集中度。是否存在对单一或少数大客户的严重依赖(例如,来自最大客户的收入占比是否超过30%)?这可能带来哪些风险? * 库存与订单 (如有相关数据): * 分析存货周转率的变化趋势,反映了库存管理效率和市场需求。 * 观察合同负债(或预收账款)的变化。如果连续多个季度显著增长,可能预示着下游需求旺盛或订单饱满。 6. 管理层与股东结构 * 核心管理层: 介绍公司CEO(或董事长/社长等关键决策者)及核心管理团队的主要背景、从业经验、历史业绩以及(基于公开信息的)管理风格特点。 * 股东结构: 列出公司的主要股东(通常是前十大股东)及其当前的持股比例。分析股权结构的特点(如:是否集中、是否存在实际控制人、机构投资者占比、是否有战略投资者等)。 7. 政策环境与敏感性 * 补贴依赖度: 分析政府补助(计入当期损益的部分)占公司净利润的比例。如果此比例持续较高(例如,超过20%),需要提示其对政策变化的敏感性。 * 牌照与准入门槛: 公司所处的行业或其核心业务是否需要特殊的牌照、资质认证或面临较高的政策准入门槛?(例如:金融、医药、教育、特定制造领域、低空经济运营等)。 * 政策风险: 评估公司当前业务在多大程度上可能受到宏观经济政策、产业政策调整、国际贸易关系(如关税、制裁)、数据安全法规、环保要求等政策性因素的正面或负面影响。 8. 增长驱动与市场预期 (股价上涨的潜在依据) * 未来增长点: 分析并列举支撑公司未来几年业绩持续增长的核心驱动因素是什么?(例如:新市场开拓计划、即将推出的重磅新产品/服务、行业本身的成长性、潜在的并购机会、成本优化空间、受益于某项技术趋势或政策红利等)。 * 市场预期: 结合券商研究报告、市场新闻等信息,总结当前市场对公司未来发展的主要预期是什么?有哪些积极的催化剂被市场关注? 9. 风险因素与挑战 (股价下跌的潜在风险) * 主要风险: 系统性地梳理并列出公司可能面临的主要内外部风险。(例如:宏观经济下行风险、行业竞争加剧导致价格战、核心技术被迭代或替代的风险、关键客户流失风险、原材料成本大幅上涨风险、政策监管收紧风险、管理层变动风险、财务风险如高负债或现金流恶化等)。 * 经营挑战: 公司当前在经营层面遇到的最突出的困难或挑战是什么?(例如:产能瓶颈、供应链中断、品牌形象受损、新业务拓展不力、人才流失等)。 10. 总结与投资视角 * (可选) 竞争对手关键指标对比: 如果方便且有代表性,选择1-2家核心竞争对手,制作一个简要的表格,对比它们在关键维度上的表现(如:毛利率、净利率、市盈率(PE)、市净率(PB)、研发占比、市场份额等)。 * SWOT简析: 基于以上所有分析,用SWOT(优势Strengths, 劣势Weaknesses, 机遇Opportunities, 威胁Threats)框架对公司进行凝练总结。 * 投资潜力评估: 综合考虑公司的技术壁垒、财务稳健性、成长潜力、管理能力、估值水平以及政策环境等因素,给出一个概括性的投资潜力评级(建议使用1-5星,1星最低,5星最高),并附上简短的核心理由。 * 核心风险提示: 再次强调,并按重要性或发生概率排序,列出投资者应重点关注的3项最大风险。 用中文回答。
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
https://m.youku.com/video/id_XNTkxMTM5NTM5Ng==.html
magnet:?xt=urn:btih:0643282ff6b10759c1a41503c324a7b0b96d6676
magnet:?xt=urn:btih:0643282ff6b10759c1a41503c324a7b0b96d6676
https://juejin.cn/post/7273435095913283584
org-IASyStoAkiPFijqAOain0dY0
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
org-IASyStoAkiPFijqAOain0dY0
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
斗鱼丶影响
To do good work one must eat well, be well housed, have one’s fling from time to time, smoke one’s pipe, and drink one’s coffee in peace.
https://scholars-stage.org/losing-taiwan-means-losing-japan/
{ "poiList": [{ "poiId": "", // POI标识(即poiCode,选填,没有则有后端生成)【v1.10.0】 "poiName": "", // POI名称(可选,没有则默认为poiCode) "regionCode": "default", // 园区标识(必填,默认为default) "site1": "", // 建筑标识(必填,即buildingCode) "site2": "", // 区块标识(必填,即blockCode) "class1": "", // 点位一级分类标识(可选,即class1Code) "class2": "", // 点位二级分类标识(可选,即class2Code) "posX": 1.0, // 位置坐标值 "posY": 1.0, "posZ": 1.0, "scaleX": 1.0, // 缩放值 "scaleY": 1.0, "scaleZ": 1.0, "rotateX": 1.0, // 旋转值 "rotateY": 1.0, "rotateZ": 1.0, "enabled": false, // 是否开启(默认为false) "navigable": false // 是否可导航(默认为false) }] }
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; gzip on; gzip_min_length 10240; gzip_comp_level 1; gzip_vary on; gzip_disable msie6; gzip_proxied expired no-cache no-store private auth; server { listen 80; #server_name sensecloud-ar.sensetimetech.cn; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; proxy_max_temp_file_size 0; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # server { listen 443 ssl; #server_name meta.sensetime.com; #server_name $mr_name; server_name $dev_name; ssl_certificate /usr/local/etc/nginx/cert/sensetime.com+5.pem; ssl_certificate_key /usr/local/etc/nginx/cert/sensetime.com+5-key.pem; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; large_client_header_buffers 4 64k; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; #add_header Content-Security-Policy "script-src 'self' 'unsafe-eval'"; set $mr_server https://47.112.80.164; #set $dev_server https://47.112.80.164; #set $dev_server https://52.140.216.80; #set $dev_server https://172.20.52.38; set $dev_server https://172.20.52.14; #set $dev_server https://47.112.80.164; #set $dev_server https://54.178.207.85; #set $dev_server https://120.24.190.236; set $yapi_server https://172.20.52.38; set $mr_name mr-stage.sensetime.com; set $dev_name meta.sensetime.com; location / { #root html; #index index.html index.htm; proxy_max_temp_file_size 0; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; proxy_read_timeout 120s; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_cache_bypass $http_upgrade; proxy_set_header Host $host; #proxy_pass https://localhost:3000/; } #location /sense-inception { # return 301 /xr-platform/; #} #location /sense-magic { # return 301 /xr-magic/; #} location /nfs { proxy_pass $dev_server; } #location /xr-magic/ { # proxy_pass $dev_server; #} location /cms/ghost/api/ { proxy_hide_header 'Access-Control-Allow-Origin'; proxy_hide_header 'Access-Control-Allow-Methods'; proxy_hide_header 'Access-Control-Allow-Headers'; proxy_hide_header 'Access-Control-Allow-Credentials'; add_header 'Access-Control-Allow-Origin' $http_origin; add_header 'Access-Control-Allow-Methods' '*'; add_header 'Access-Control-Allow-Headers' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; proxy_set_header Host inception-dev.sensetime.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass https://ditu.sensetime.com; } location /sense-inception { proxy_pass https://127.0.0.1:3000; # 转发规则 #proxy_pass $mr_server; # 转发规则 proxy_set_header Host $proxy_host; # 修改转发请求头,让8082端口的应用可以受到真实的请求 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For 10.152.44.154; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_max_temp_file_size 0; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; proxy_read_timeout 120s; } location /xr-platform { proxy_pass https://127.0.0.1:4444; # 转发规则 #proxy_pass $dev_server; # 转发规则 proxy_set_header Host $proxy_host; # 修改转发请求头,让8082端口的应用可以受到真实的请求 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For 10.152.44.154; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_max_temp_file_size 0; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; proxy_read_timeout 120s; } location /xr-platform-next { proxy_pass https://127.0.0.1:4444; # 转发规则 #proxy_pass $mr_server; # 转发规则 proxy_set_header Host $proxy_host; # 修改转发请求头,让8082端口的应用可以受到真实的请求 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For 10.152.44.154; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_max_temp_file_size 0; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; proxy_read_timeout 120s; } location /sense-inception-next { proxy_pass https://127.0.0.1:3333; # 转发规则 #proxy_pass $dev_server; # 转发规则 proxy_set_header Host $proxy_host; # 修改转发请求头,让8082端口的应用可以受到真实的请求 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For 10.152.44.154; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_max_temp_file_size 0; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; proxy_read_timeout 120s; } location /sense-admin { proxy_pass https://127.0.0.1:5000; # 转发规则 #proxy_pass $dev_server; # 转发规则 proxy_set_header Host $proxy_host; # 修改转发请求头,让8082端口的应用可以受到真实的请求 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For 10.152.44.154; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_max_temp_file_size 0; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; proxy_read_timeout 120s; } location /webxr-studio { #alias /usr/local/var/www/webxr-studio; #try_files $uri $uri/ /usr/local/var/www/webxr-studio/inde.html; proxy_pass https://ditu.sensetime.com; } location /sense-webxr { #alias /usr/local/var/www/webxr-studio; #try_files $uri $uri/ /usr/local/var/www/webxr-studio/inde.html; proxy_pass $mr_server; } location /xr-sso { #proxy_pass https://127.0.0.1:5050; proxy_pass $dev_server; proxy_set_header Host $proxy_host; # 修改转发请求头,让8082端口的应用可以受到真实的请求 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #proxy_set_header X-Forwarded-For 10.152.44.154; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_max_temp_file_size 0; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; proxy_read_timeout 120s; } #location /sense-inception/login { # return 302 /xr-sso/login$is_args$args; #return 302 /xr-platform-next/login$is_args$args; #} location /sense-magic { #proxy_pass $dev_server; # 转发规则 proxy_pass https://127.0.0.1:4000; # 转发规则 proxy_set_header Host $proxy_host; # 修改转发请求头,让8082端口的应用可以受到真实的请求 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For 10.152.44.154; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_max_temp_file_size 0; client_max_body_size 500M; client_body_buffer_size 1M; #proxy_buffer_size 128k; #proxy_buffers 4 256k; #proxy_busy_buffers_size 256k; proxy_read_timeout 120s; } location /xr-editor/ { proxy_pass https://10.9.103.18:3000; } location /xr-magic { #proxy_pass $dev_server; # 转发规则 proxy_pass https://127.0.0.1:5555; # 转发规则 proxy_set_header Host $proxy_host; # 修改转发请求头,让8082端口的应用可以受到真实的请求 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For 10.152.44.154; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_max_temp_file_size 0; client_max_body_size 500M; client_body_buffer_size 1M; #proxy_buffer_size 128k; #proxy_buffers 4 256k; #proxy_busy_buffers_size 256k; proxy_read_timeout 120s; } location /xrmagic-studio { proxy_pass https://127.0.0.1:4000; proxy_set_header Host $proxy_host; # 修改转发请求头,让8082端口的应用可以受到真实的请求 proxy_set_header X-Real-IP $remote_addr; #proxy_set_header X-Forwarded-For 10.152.44.154; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_max_temp_file_size 0; client_max_body_size 500M; client_body_buffer_size 1M; #proxy_buffer_size 128k; #proxy_buffers 4 256k; #proxy_busy_buffers_size 256k; proxy_read_timeout 120s; } #location /sense-inception/login { # return 301 /xr-platform/login/?$args; #} #location /inception-iam/error { # return 302 /sense-inception/redirect; #} location /sense-webxr-bak { #proxy_pass $dev_server; # 转发规则 proxy_pass https://127.0.0.1:4000; # 转发规则 proxy_set_header Host $proxy_host; # 修改转发请求头,让8082端口的应用可以受到真实的请求 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For 10.152.44.154; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_max_temp_file_size 0; client_max_body_size 500M; client_body_buffer_size 1M; #proxy_buffer_size 128k; #proxy_buffers 4 256k; #proxy_busy_buffers_size 256k; proxy_read_timeout 120s; } location /api { #proxy_max_temp_file_size 0; proxy_pass $dev_server; # 转发规则 #proxy_set_header X-Real-IP $remote_addr; #proxy_set_header Host $proxy_host; # 修改转发请求头,让8082端口的应用可以受到真实的请求 client_max_body_size 500M; client_body_buffer_size 100M; #proxy_set_header Upgrade $http_upgrade; #proxy_set_header Connection "Upgrade"; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /yapi { proxy_max_temp_file_size 0; proxy_pass $yapi_server; # 转发规则 proxy_set_header Host $proxy_host; # 修改转发请求头,让8082端口的应用可以受到真实的请求 proxy_set_header X-Real-IP $remote_addr; client_max_body_size 500M; client_body_buffer_size 100M; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /inception-iam { #proxy_max_temp_file_size 0; proxy_pass $dev_server; # 转发规则 #proxy_set_header X-Real-IP $remote_addr; #proxy_set_header Host mr-stage.sensetime.com; # 修改转发请求头,让8082端口的应用可以受到真实的请求 #proxy_set_header X-Forwarded-For 10.152.44.154; #proxy_set_header X-Forwarded-Proto $scheme; } location /iam { proxy_max_temp_file_size 0; proxy_pass $dev_server; # 转发规则 #proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /xrmagic-ui { proxy_max_temp_file_size 0; proxy_pass http://127.0.0.1:12000; # 转发规则 #proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /content-creator { proxy_max_temp_file_size 0; proxy_pass https://127.0.0.1:6000; # 转发规则 #proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /sso { proxy_max_temp_file_size 0; proxy_pass https://armap.ais3.sony.net; # 转发规则 #proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /file-manager { proxy_max_temp_file_size 0; proxy_pass $dev_server; # 转发规则 proxy_set_header Host 'sensecloud-ar.sensetimetech.cn'; # 修改转发请求头,让8082端口的应用可以受到真实的请求 #proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /sony { alias /usr/local/var/www/sony; index /usr/local/var/www/sony/qiankun-h5-main/index.html; try_files $uri $uri/ /usr/local/var/www/sony/qiankun-h5-main/index.html; } } #server { #listen 443 ssl; ##server_name ~^([\w-]+)\.inception-dev\.sensetime\.com$; #server_name meta.sensetime.com; #ssl_certificate /usr/local/etc/nginx/cert/sensetime.com+5.pem; #ssl_certificate_key /usr/local/etc/nginx/cert/sensetime.com+5-key.pem; #set $root_path /usr/local/var/www/$1; #set $dev_server https://47.112.80.164; ##root /usr/local/var/www/$1; #index /qiankun-h5-main/index.html; #location / { # add_header Cache-Control "no-cache"; # root $root_path; # #alias /usr/local/var/www/sony; # #index /qiankun-h5-main/index.html; # #try_files $uri $root_path/qiankun-h5-main index.html; #} #location /xr-sso-bak { # #proxy_pass https://127.0.0.1:5050; # proxy_pass $dev_server; # proxy_set_header Host $proxy_host; # 修改转发请求头,让8082端口的应用可以受到真实的请求 # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-Forwarded-For 10.152.44.154; # proxy_set_header Upgrade $http_upgrade; # proxy_set_header Connection "Upgrade"; # proxy_max_temp_file_size 0; # proxy_buffer_size 128k; # proxy_buffers 4 256k; # proxy_busy_buffers_size 256k; # proxy_read_timeout 120s; #} ##location /index.html { # # #alias $root_path; # # alias /usr/local/var/www/sony/qiankun-h5-main/index.html; # # try_files $uri $uri/index.html index.html; # #} #} include servers/*; }
https://sub.ygjzjg.com/sub?target=clash&url=https%3A%2F%2Fapi.sztse.com%2Fmodules%2Fservers%2FV2raySocks%2Fosubscribe.php%3Fsid%3D83860%26token%3DPKMv9fq6mYvX&config=https%3A%2F%2Fd.justxj.com%2Frules.ini
https://cn.wsj.com/articles/%E4%B9%A0%E8%BF%91%E5%B9%B3%E5%91%8A%E8%AF%89%E6%AC%A7%E7%9B%9F%E4%BB%A3%E8%A1%A8%E5%9B%A2-%E6%9C%80%E8%BF%91%E7%9A%84%E6%8A%97%E8%AE%AE%E5%8F%8D%E6%98%A0%E4%BA%86%E5%AF%B9%E9%98%B2%E7%96%AB%E6%8E%AA%E6%96%BD%E7%9A%84%E4%B8%8D%E6%BB%A1-11670017207
罗永浩讲的一个故事:他住的新小区冬天取暖达不到规定温度,他就和一些小区论坛的刺儿头一起天天去折磨物业和开发商。一个月后物业和开发商终于崩溃了,同意加锅炉,然后大家就不冷了。再然后,他就看到有人在小区论坛说:最近屋里好温暖啊!其实大家不必整天抱怨的,要相信生活会慢慢变好的……
https://www.scmp.com/news/china/diplomacy/article/3201901/chinese-president-xi-jinping-believes-frustrated-students-are-behind-covid-protests-eu-officials-say?module=perpetual_scroll_0&pgtype=article&campaign=3201901
https://twitter.com/pK7qkLEE6TKEBRs/status/1597941964921765888/photo/1
https://sd.redditsave.com/download.php?permalink=https://reddit.com/r/real_China_irl/comments/z2m92v/%E6%B2%A1%E7%BB%B7%E4%BD%8F/&video_url=https://v.redd.it/moyo5g05no1a1/DASH_1080.mp4?source=fallback&audio_url=https://v.redd.it/moyo5g05no1a1/DASH_audio.mp4?source=fallback
https://sd.redditsave.com/download.php?permalink=https://reddit.com/r/real_China_irl/comments/z3aeza/%E9%9F%A9%E5%A6%88%E5%A6%88%E8%B7%B3%E8%88%9E/&video_url=https://v.redd.it/3s47pshfvt1a1/DASH_1080.mp4?source=fallback&audio_url=https://v.redd.it/3s47pshfvt1a1/DASH_audio.mp4?source=fallback
sub://aHR0cHM6Ly9hcGkueWdqempnLmNvbS9tb2R1bGVzL3NlcnZlcnMvVjJyYXlTb2Nrcy9zaGFkb3dyb2NrZXQucGhwP3NpZD04Mzg2MCZ0b2tlbj1QS012OWZxNm1Zdlg=
https://sub.xeton.dev/sub?target=clash&new_name=true&url=https%3A%2F%2Fapi.sztse.com%2Fmodules%2Fservers%2FV2raySocks%2Fosubscribe.php%3Fsid%3D83860%26token%3DPKMv9fq6mYvX&insert=false&config=https%3A%2F%2Fraw.githubusercontent.com%2FACL4SSR%2FACL4SSR%2Fmaster%2FClash%2Fconfig%2FACL4SSR_Online.ini
https://sub.ygjzjg.com/sub?target=quan&url=https%3A%2F%2Fapi.sztse.com%2Fmodules%2Fservers%2FV2raySocks%2Fosubscribe.php%3Fsid%3D83860%26token%3DPKMv9fq6mYvX&config=https%3A%2F%2Fd.justxj.com%2Frules.ini
https://1drv.ms/u/s!AoqIIlVqCRqpuly03YdSPSyKVGGl?e=dgBSXB
atob('aHR0cHM6Ly9mbHlhaXJwb3J0LnRvcC8=') 'https://flyairport.top/' atob('aHR0cHM6Ly9hbXlzZWN1cmUuY29tLw==') 'https://amysecure.com/' atob('aHR0cHM6Ly9zdS55Z2p6amcuY29tL2FmZi5waHA/YWZmPTEwMTgK') 'https://su.ygjzjg.com/aff.php?aff=1018\n' atob('aHR0cHM6Ly93Nncuc2hvcC8jL3JlZ2lzdGVyP2NvZGU9YW9TeVlDbXA=') 'https://w6w.shop/#/register?code=aoSyYCmp'
https://7ammel.net/get/1588833376789991424
https://pbs.twimg.com/media/FgyfberUYAIrFH6?format=jpg&name=large
希腊神话里,⻄⻄弗斯屡次冒犯神明,被抓到地狱。在那里,他每天要把一块沉重的大石 头推到非常陡的山上,再眼看着这个大石头滚到山脚下面,第二天又捡起来继续推。⻄⻄弗斯要永远地、没有任何希望地重复着这个毫无意义的动作。 当时,这叫“一天一捡”。
https://pbs.twimg.com/media/FgfvdeJUoAA-73R?format=jpg&name=large
https://t.co/Ni0dFVLT9L
https://github.com/xicilion/BitcoinWhitePaper
https://t.co/Rip5ssmNle
国内今年冬天Omicron大爆发,我在推特上建议你们准备的东西: 粮食、米、面、油、压缩饼干、方便面、牛肉干、麻绳、打火机、瑞士军刀、硝酸甘油、旅行背包、旅行箱、维生素片
https://7ammel.net/get/1586600351326965762
https://pbs.twimg.com/media/FgPWIemXoAE3cIT?format=jpg&name=medium
https://video.twimg.com/ext_tw_video/1583364875434459136/pu/vid/1280x720/7BZNo08xQhfR4d0z.mp4?tag=12
https://github.com/Snawoot/ss-replit
https://pbs.twimg.com/media/FfRUmKJaAAEbQ9b?format=jpg&name=small
https://pbs.twimg.com/media/FfRDXrjWQAEmAWd?format=jpg&name=900x900
https://pbs.twimg.com/media/Fe7wy6_WIAc5sMZ?format=jpg&name=large
https://preview.redd.it/2kbtrnqilit91.jpg?width=1080&format=pjpg&auto=webp&s=419b1116e096609b3883558f84ab017d9ebecd84
https://i.redd.it/39ctgs976us91.jpg
https://substack.com/app-link/login?token=8d567766-e7ac-4729-9332-07aade656b3a
Moderna refused China request to reveal vaccine technology
https://squalldb.medium.com/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E8%AE%A4%E4%B8%BA%E5%98%BB%E5%98%BB%E5%B1%81%E5%8D%81%E5%B9%B4%E4%B9%8B%E5%86%85%E4%BC%9A%E5%AE%8C%E8%9B%8B-719f4096385e
https://7ammel.net/get/1575303927314014209
(71689908)
【媒体:如北京袭击台湾,美国银行或将从中国撤资】俄罗斯卫星通讯社莫斯科9月22日电 据《金融时报》报道,摩根大通、美国银行和花旗集团领导人承诺,如果北京袭击台湾,将从中国撤出资金。
《霸王别姬》里,程蝶衣说:你道今儿个是小人作乱,祸从天降。不是,不对!是咱们自个儿,一步一步,一步步走到这步田地里来的!报应!
没有生活作风问题,没有数额特别巨大,没有影响极为深远,没有政治野心极度膨胀,没有妄议中央背叛核心,没有搞小山头搞政治团伙,已经是很收敛的实权部级高官了。
https://i.redd.it/q1f6suit6lo91.jpg
21487248
https://www.ilc.academy/post/%E5%8F%B2%E4%B8%8A%E6%9C%80%E5%85%A8%E9%9B%85%E6%80%9D%E8%80%83%E8%AF%95%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D%EF%BC%81
链接: https://pan.baidu.com/s/1L2rM73GUGasgcKRxvhg-eA 提取码: 8329 复制这段内容后打开百度网盘手机App,操作更方便哦 --来自百度网盘超级会员v6的分享
1. I really ran around eleven large roses late last night. 2. Rarely do lovers rely on rowdy relatives. 3. Are lucky red rabbits really real? 4. Rain on the rail will surely remain. 5. Larry looked long at a love letter.
https://cloudarchives2.camblychina.com/631da70be62892b5c6cd8459/7b981a75d64ee8c51d7852864ee811e2_cambly_631da70be62892b5c6cd8459_0.mp4?auth_key=1662897703-bcf84cca31b811ed968202c28f54aff5-0-9941a38d070432ba7700abea2883c5ff
https://d3um8n5v1w9jhj.cloudfront.net/15718351/b3226dfd-2f95-4e99-8199-36fb536b6743/archive.mp4?Expires=1662891565&Signature=d7xIPoTpyCAyB41jLiDVuRzq29dHP7JuR2kLNjFKkJBZmztNsj0xNthQ~pUOUtUSagCSGDMZhUcQT--toTarpePWZ~hRa-gNZJNqiwOqxPBQIbIIciDgSUftccdKiK1cqnJK-Wvl~mOLq2575qdfN8Ng3qVoLTP0rM3jKP8jXVeJJKspMepqcTqUe22HyGDNrArXTsWpi2cNCZxx2FjbW1eWv5i-lwTveZ2rtTtEwPPkrMAWSCwyYiNYLiOkVuL7otc8uQVy1DQgr1GoLh0pXUep4StiHSCvzmy7sPyALZTj4xvt1f59ceZ8vOopf4SaFgpPVUz1koOUNXasAdDikQ__&Key-Pair-Id=APKAIKYVFETQQHXNXQ5Q
631463c0eac2a8a59ab1b88a
3.cn/1z5A-GX6
https://preview.redd.it/2one5gfw26k91.jpg?width=720&format=pjpg&auto=webp&s=5f09148278b9eb3ddc105ed53601315b514d9056
https://tetrasai.sharepoint.com/:f:/s/ARMapPM/Eg-ReT9u479EqFbNU59eu3gBRIAcAVEHec52YhlhqR2NNQ?e=wJDG4R
https://t.me/+rOq6qzENJWhkMTc1
https://external-preview.redd.it/d_qLEfzvpVZPCrhj80YBVvI0-hD9hprtgZLccZUT9xU.jpg?auto=webp&s=5e3d6599bd06d5efdd813c3be357a972730aa339
b3184b77-bdc2-426e-bae2-a4665d92af89
https://m.youtube.com/watch?v=5m6JOJLy5B0
https://www.smashingmagazine.com/2021/06/managing-shared-state-vue3/#shared-singletons
BREAKING: @MoNDefense spokesperson Li-Fang Sun just confirmed to me that “no Su-35 has crossed the Taiwan Strait”, but acknowledged that other types of PLA aircrafts did. The Defence Ministry is currently handling the situation.
Test.
【深圳市疫情防控指挥办疫情防控组】深圳市严厉打击走私偷渡,请提高警惕,抵制走私偷渡行为和物品,有奖举报电话22222110。
【深圳突发事件预警】深圳市文明办提醒您:戴口罩,勤洗手,少聚集,多通风,用公筷,一米距,做核酸,需谨记。做好防疫靠大家,健康文明有你有我!