dabanke-历史数据

导出文一科技历史交易数据到Markdown

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         dabanke-历史数据
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  导出文一科技历史交易数据到Markdown
// @author       YourName
// @match        *://www.dabanke.com/hangqing-*.html
// @grant        none
// @license MIT
// ==/UserScript==
(function() {
    'use strict';

    // 创建卡片内按钮
    const btn = document.createElement('button');
    btn.innerHTML = '<i class="bi bi-file-earmark-code"></i> 生成Markdown';
    btn.className = 'btn btn-sm btn-outline-danger ms-3';
    btn.style.verticalAlign = 'middle';

    // 创建增强版弹窗
    const modal = `
    <div class="modal fade" id="dataModal" tabindex="-1">
        <div class="modal-dialog modal-xl">
            <div class="modal-content">
                <div class="modal-header bg-light">
                    <h5 class="modal-title text-danger">数据预览 - 文一科技</h5>
                    <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
                </div>
                <div class="modal-body p-0">
                    <div class="d-flex">
                        <!-- 预览区域 -->
                        <div class="flex-grow-1 p-3 border-end" id="previewArea"
                             style="max-height: 600px; overflow-y: auto;">
                        </div>
                        <!-- 源码区域 -->
                        <textarea id="markdownSource" class="d-none"></textarea>
                    </div>
                </div>
                <div class="modal-footer bg-light">
                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">关闭</button>
                    <button type="button" class="btn btn-success" id="copyBtn">
                        <i class="bi bi-clipboard"></i> 复制Markdown源码
                    </button>
                </div>
            </div>
        </div>
    </div>`;

    // 添加点击事件
    btn.addEventListener('click', () => {
        // 获取标题
        const header = document.querySelector('.card-header').innerText;

        // 获取表格数据
        const table = document.querySelector('.table');
        const headers = Array.from(table.querySelectorAll('th')).map(th => th.textContent.trim());
        const rows = Array.from(table.querySelectorAll('tbody tr')).map(row =>
            Array.from(row.querySelectorAll('td')).map(td => td.textContent.trim())
        );

        // 生成Markdown
        let markdown = `# ${header}\n\n`;
        markdown += `| ${headers.join(' | ')} |\n`;
        markdown += `| ${headers.map(() => '---').join(' | ')} |\n`;
        rows.forEach(row => {
            markdown += `| ${row.join(' | ')} |\n`;
        });

        // 插入内容到弹窗
        const tempDiv = document.createElement('div');
        tempDiv.innerHTML = modal;
        document.body.appendChild(tempDiv);

        // 填充数据
        document.getElementById('markdownSource').value = markdown;

        // 生成预览HTML
        const previewArea = document.getElementById('previewArea');
        previewArea.innerHTML = `
            <h3 class="text-center mb-3">${header}</h3>
            <table class="table table-bordered table-hover">
                <thead class="table-light">
                    <tr>${headers.map(h => `<th>${h}</th>`).join('')}</tr>
                </thead>
                <tbody>
                    ${rows.map(row =>
                        `<tr>${row.map(cell => `<td>${cell}</td>`).join('')}</tr>`
                    ).join('')}
                </tbody>
            </table>
        `;

        // 初始化模态框
        const myModal = new bootstrap.Modal(document.getElementById('dataModal'));
        myModal.show();

        // 复制按钮事件
        document.getElementById('copyBtn').addEventListener('click', () => {
            const source = document.getElementById('markdownSource').value;
            navigator.clipboard.writeText(source)
                .then(() => {
                    const originalHTML = btn.innerHTML;
                    btn.innerHTML = '<i class="bi bi-check-circle-fill"></i> 复制成功!';
                    setTimeout(() => btn.innerHTML = originalHTML, 2000);
                })
                .catch(err => console.error('复制失败:', err));
        });
    });

    // 将按钮添加到数据卡片
    const dataCard = document.querySelector('.card.mt-3.mb-3');
    if (dataCard) {
        const cardHeader = dataCard.querySelector('.card-header');
        if (cardHeader) {
            // 创建按钮容器
            const btnGroup = document.createElement('div');
            btnGroup.className = 'd-inline-block float-end';
            btnGroup.appendChild(btn);
            // 插入到标题文字后面
            cardHeader.appendChild(btnGroup);
        }
    }
})();