Greasy Fork

Greasy Fork is available in English.

3DM 帖子列表内容提取

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==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);