Greasy Fork

3DM 帖子列表内容提取

提取帖子列表内容到剪切板

// ==UserScript==
// @name         3DM 帖子列表内容提取
// @namespace    http://tampermonkey.net/
// @version      0.3.1
// @description  提取帖子列表内容到剪切板
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.slim.min.js
// @author       feirnova
// @license MIT
// @match        *://bbs.3dmgame.com/forum-*
// @match        *://bbs.3dmgame.com/forum.php?mod=guide*
// @icon         data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC0klEQVR4nJ1TS0hUYRT+/nuvd2Z0nMbRrpPpTJozoZliQmEFFkT0QlwIRWlUi4jIaFGLqE0ELlsEElGrGCKimhaVVmhW9CBSy5ohk/I1pvO66R3nOt7X30IxoyTog8OBc/i+83EOB1gEoRP8Yq3fQP5WvHxqW7kkKfkmXgx+D3PCmjLLuPYmNXyotevfAud9XhQEHZtLKpe3uAozS+12MyRJRTSc7O7tCp9uOPe0Y1GBGAUeXdiyc8vuIr8gmHgQgFACSgwQg0L8oWtP7w3s2Z/vvKse9v0pcLup3FpWV97v8S5xElBMz2hgGIKRgQRcRZmYljVEo4r45E5gVVmtMNH3UC3ifvOfZ693OC3OB50jUFRAkjTIsoqjB7xo7YhgaERChpU4isuXHUsNs+Km7Y5K8rl1L2/PHld8gSFUa6V+r6TXhWMzMNW4EArFQCMRGNMywLFgLOnIXZoD0/PIuHXfSnvUwHUuqTNdJJFvW5+WfSs3z7TVnJiB25WJyXQNjpwl0LJXQVM4ECLDYorDXWJDPM/qzPJmYaxbjHBQlFfFlc4jqZRyyr3aDgYABYXJXIFl6esAws7vm1IFRvIteOktDB0IDYg9zMfP4ZbhwamUp2SWDBBQvhhsxgYQwoEBAQOAAQVD0sBaN0JPc6O/XwoyRk4bE+tLGmJUluSkDk2nSKVUwLIGhC48EQFAQOYyNa99FUiMVQ1Vt8kkPhHnfCd3OYXCjKYCj+0gz0Oo2nEGhDHNEX7BAKAbFIFnzxsrdzb5AIDJsmWh8eK9cUvDjrOv28dqCEsGDarOTgLmwwCgaho+vHx5M3i1+ca8N0opBwDJxAzux9/hffMlW3WF7cqKQk+9RXCBsCx0g079+BpgRjv9Zvtqwb31eHtooQADALquYzQmom/yGnofqzb3txe1kw6PKEOYoBmsbKaKmVeT6SNJ9kvPp68xv98v//FZ/4OfGzYzfKjarqcAAAAASUVORK5CYII=
// @grant        none
// ==/UserScript==

(function ($) {
    'use strict';
    const _$ = $.noConflict()
    const copy_tbl_data = () => {
        const tbl_el = _$('#threadlist>.bm_c>table>tbody,#threadlisttableid>tbody')
        const is_personal = !tbl_el.parent().attr('id')
        const has_page = is_personal ? _$('#pgt .pg').length > 0 : _$('#fd_page_top strong').length > 0;
        const is_first_page = has_page && (is_personal ? _$('#pgt .pg a:first').text() === '下一页' : _$('#fd_page_top strong').text() === '1')
        const has_header = !has_page || is_first_page || tbl_el.length > 50
        const headers = ['链接地址', '标题', '回复数量', '作者', '最后发表', '发帖时间', '最后回复时间']
        if (is_personal) {
            headers.push('板块/群组')
        } else {
            headers.push('帖子类型')
        }
        const join_strs = []
        if (has_header) {
            join_strs.push(headers.join('\t'))
        }
        tbl_el.each((i, _e) => {
            const bel = _$(_e)
            const burl = bel.find('.common>a:last')
            const url = `https://bbs.3dmgame.com/${burl.attr('href')}`
            const title = burl.text()
            if (title === '') {
                return
            }
            const num = bel.find('.num>a').text()
            const author = is_personal ? bel.find('.by:eq(1)>cite>a').text() : bel.find('.by:first>cite>a').text()
            const replier = is_personal ? bel.find('.by:eq(2)>cite>a').text() : bel.find('.by:eq(1)>cite>a').text()
            const create_time = is_personal ? bel.find('.by:eq(1)>em>span').text() : bel.find('.by:first>em>span').text()
            const update_time = is_personal ? bel.find('.by:eq(2)>em>a').text() : bel.find('.by:eq(1)>em>a').text()
            const ex_str = is_personal ? bel.find('.by:first>a').text() : bel.find('.common>em>a').text()
            const content_str = [url, title, num, author, replier, create_time, update_time, ex_str].join('\t')
            join_strs.push(content_str)
        })
        navigator.clipboard.writeText(join_strs.join('\n')).then(() => {
            console.log('复制成功')
        }, (err) => {
            console.error('复制失败', err)
        });
    }
    const loadUI = () => {
        const el = _$(`<div id="r-box" style="height:100px;width:20px;z-index:9999999;position:fixed;top:187px;left:25px;padding-top:4px"><btn id="copy_tbl_list_data" style="cursor:pointer">列表内容复制</btn></div>`);
        el.children('btn').click(copy_tbl_data);
        _$('body').append(el);
    }
    const style = '#copy_tbl_list_data:hover{color:red}';
    const styleEl = document.createElement('style');
    styleEl.innerHTML = style;
    document.getElementsByTagName('head')[0].appendChild(styleEl);
    try {
        loadUI()
    } catch (e) {
    }
})(jQuery);