LINUX SB 快照站

大帅哥

用户 ID 12972 · 当前名首次快照 2026-08-12 10:14:48 · 当前名始于 2026-08-12 10:14:48 · 原站主页: https://linux.sb/user/12972

发言

共 47 楼

【插件】响应咱们站长,写了一个图床插件,不知道该不该发.
#0 · 大帅哥
发帖 2026-08-12 15:36:14 · 快照 2026-08-12 15:42:17

看到站长的帖子:
image
正好手头有现成的图床插件.非常的短小简单.
用法:
1.把代码加入油猴.
2.复制图片,在编辑器直接粘贴
提示上传:
image
然后上传会非常慢,因为脚本内置的服务器是示例,非常慢小,建议替换成你的图床.
image
3.注意:脚本把其他途径的撇了,只有简单图床的.然后里面内置的图床是我临时搭建的示例.很慢很慢有时候还不成功,换成自己的图床就好了.还有就是如果图片有外链帖子会被强制审核吧所以这个插件不知道该不该发.
4.肯定有很多错误,后续可能有上传失败的情况,可以自己任意修改和发布,本人放弃所有权限只为linux.sb更好发展

// ==UserScript==
// @name         图床linuxdoissb
// @namespace    https://linux.sb/
// @connect      22.2222222.best
// @version      0.9.0
// @description  为linux.sb专门写的图床插件,提供粘贴/拖放/按钮上传到 EasyImages
// @author       大帅哥
// @match        *://linux.sb/*
// @match        *://hostloc.com/*
// @icon         https://linux.sb/app/assets/index.svg
// @grant        GM_xmlhttpRequest
// @license      MPL-1.0 License
// ==/UserScript==



(function () {
    'use strict';

    // EasyImages 配置,你要配置的2项
    const imgHost = {
        type: 'EasyImages',
        url: 'https://22.2222222.best', // 图床地址,改为你自己的
        token: '4ed5cc908146b9318849e586dc0280f1', // 你的图床apikey,没有就留空
    };
    const mdImgName = 'image'; // 插入 markdown 时的 alt 文本
    const submitByKey = true; // Ctrl+Enter 触发提交

    const EDITOR_SELECTOR = 'textarea#markdown-textarea-1, textarea[name="body"]';
    const TOOLBAR_SELECTOR = '.markdown-textarea[data-markdown-textarea], .markdown-textarea';
    const IMAGE_BTN_SELECTOR = 'button[data-markdown-action="image"]';

    window.addEventListener('load', initEditorEnhancer, false);

    function getEditor() {
        return document.querySelector(EDITOR_SELECTOR);
    }

    function getToolbar() {
        return document.querySelector(TOOLBAR_SELECTOR);
    }

    function initEditorEnhancer() {
        // 粘贴上传
        document.addEventListener('paste', handlePasteEvt);

 
        bindDropZone();
        const dropTimer = setInterval(() => {
            if (bindDropZone()) clearInterval(dropTimer);
        }, 300);
        setTimeout(() => clearInterval(dropTimer), 15000);


        const btnTimer = setInterval(() => {
            const oldBtn = document.querySelector(IMAGE_BTN_SELECTOR);
            if (!oldBtn) return;
            clearInterval(btnTimer);
            const newBtn = oldBtn.cloneNode(true);
            oldBtn.parentNode.replaceChild(newBtn, oldBtn);
            newBtn.addEventListener('click', (e) => {
                e.preventDefault();
                e.stopPropagation();
                handleImgBtnClick();
            });
        }, 200);
        setTimeout(() => clearInterval(btnTimer), 15000);


        if (submitByKey) {
            document.addEventListener('keydown', (event) => {
                if (!(event.ctrlKey && event.key === 'Enter')) return;
                const button =
                    document.querySelector('.submit.btn') ||
                    document.querySelector('button[type="submit"]');
                if (button) button.click();
            });
        }
    }

    function bindDropZone() {
        const dropZone = getEditor();
        if (!dropZone || dropZone.dataset.easyimgDropBound === '1') return !!dropZone;
        dropZone.dataset.easyimgDropBound = '1';

        dropZone.addEventListener('dragover', (e) => {
            e.preventDefault();
            e.stopPropagation();
            e.dataTransfer.dropEffect = 'copy';
        });

        dropZone.addEventListener('drop', (e) => {
            e.preventDefault();
            e.stopPropagation();
            log('正在处理拖放内容...');
            const imageFiles = [];
            for (const file of e.dataTransfer.files) {
                if (/^image\//i.test(file.type)) {
                    imageFiles.push(file);
                    log(`拖放的文件名: ${file.name}`);
                }
            }
            log(`拖放的图片数量: ${imageFiles.length}`);
            if (imageFiles.length === 0) {
                log('你拖放的内容好像没有图片哦', 'red');
                return;
            }
            uploadImage(
                imageFiles.map((file) => ({
                    kind: 'file',
                    type: file.type,
                    getAsFile: () => file,
                }))
            );
        });
        return true;
    }

    function handlePasteEvt(event) {
        const items = (event.clipboardData || event.originalEvent.clipboardData).items;
        if (!items || items.length === 0) return;

        let hasImage = false;
        for (const item of items) {
            if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {
                hasImage = true;
                break;
            }
        }
        if (!hasImage) return;

 
        event.preventDefault();
        log('正在处理粘贴内容...');
        uploadImage(items);
    }

    function handleImgBtnClick() {
        const input = document.createElement('input');
        input.type = 'file';
        input.multiple = true;
        input.accept = 'image/*';
        input.onchange = (e) => {
            const files = e.target.files;
            if (!files || !files.length) return;
            const items = [...files].map((file) => ({
                kind: 'file',
                type: file.type,
                getAsFile: () => file,
            }));
            uploadImage(items);
        };
        input.click();
    }

    async function uploadImage(items) {
        const imageFiles = [];
        for (const item of items) {
            if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {
                imageFiles.push(item.getAsFile());
            }
        }
        if (imageFiles.length === 0) {
            log('你粘贴的内容好像没有图片哦', 'red');
            return;
        }

        for (let i = 0; i < imageFiles.length; i++) {
            if (imageFiles.length > 1) log(`上传第 ${i + 1} / ${imageFiles.length} 张图片...`);
            else log('上传图片...');
            await uploadToEasyImages(imageFiles[i]);
        }
    }

    async function uploadToEasyImages(file) {
        return new Promise((resolve, reject) => {
            let url = imgHost.url;
            const formData = new FormData();

            if (imgHost.token) {

                url += '/api/index.php';
                formData.append('token', imgHost.token);
                formData.append('image', file);
            } else {

                url += '/app/upload.php';
                formData.append('file', file);
                formData.append('sign', Math.floor(Date.now() / 1000));
            }

            GM_xmlhttpRequest({
                method: 'POST',
                url: url,
                data: formData,
                onload: (rsp) => {
                    let rspJson;
                    try {
                        rspJson = JSON.parse(rsp.responseText);

                    } catch (err) {
                        
                        log(`图片上传失败: 响应不是 JSON`, 'red');
                        reject(err);
                        return;
                    }

                    if (rsp.status !== 200) {
                        log(`图片上传失败: ${rsp.status} ${rsp.statusText}`, 'red');
                        reject(rspJson.result);
                        return;
                    }

                    if (rspJson.code === 200 && rspJson.url) {
                        log('图片上传成功', 'green');
                        insertToEditor(`![${mdImgName}](${rspJson.url})`);
                    } else if (rspJson.code === 200) {
                        log('图片上传成功, 但接口返回有误', 'red');
                        insertToEditor(`图片上传成功, 但接口返回有误: ${JSON.stringify(rspJson)}`);
                    } else {
                        log(`图片上传失败: ${JSON.stringify(rspJson)}`, 'red');
                    }
                    resolve();
                },
                onerror: (error) => {
                    log(`图片上传失败: ${error.status} ${error.statusText}`, 'red');
                    reject(error);
                },
            });
        });
    }


    function insertToEditor(text) {
        const ta =
            getEditor() ||
            document.querySelector('#e_textarea') ||
            document.querySelector('#fastpostmessage');

        if (!ta) {
            log('出现错误: 未找到编辑栏 (#markdown-textarea-1)', 'red');
            return;
        }

        const start = typeof ta.selectionStart === 'number' ? ta.selectionStart : ta.value.length;
        const end = typeof ta.selectionEnd === 'number' ? ta.selectionEnd : start;
        const before = ta.value.substring(0, start);
        const after = ta.value.substring(end);
        const insert = `\n${text}\n`;

        ta.value = before + insert + after;
        const pos = start + insert.length;
        ta.selectionStart = ta.selectionEnd = pos;
        ta.focus();


        ta.dispatchEvent(new Event('input', { bubbles: true }));
        ta.dispatchEvent(new Event('change', { bubbles: true }));

        if (text.startsWith('![')) log('图片已插入到编辑器~', 'green');
    }

    function log(message, color = '') {
        if (!document.getElementById('editor-enhance-logs')) {
            initEditorLogDiv();
        }
        const logDiv = document.getElementById('editor-enhance-logs');
        if (logDiv) {
            logDiv.innerHTML = `<div${color ? ` style="color:${color};"` : ''}>&nbsp;&nbsp;&nbsp;${message}&nbsp;</div>`;
        }
        console.log(`[Editor-EasyImages] ${message}`);
    }

    function initEditorLogDiv() {
        let logDiv = document.getElementById('editor-enhance-logs');
        if (!logDiv) {
            logDiv = document.createElement('div');
            logDiv.id = 'editor-enhance-logs';
            document.body.appendChild(logDiv);
        }
        const toolbar = getToolbar();
        if (toolbar && !toolbar.contains(logDiv)) {
            toolbar.appendChild(logDiv);
        }
    }
})();

附带一个骂始皇的示例图:

image

krill已经在tg开骂ldo是男化粪池了
#13 · 大帅哥
发帖 2026-08-12 15:16:23 · 快照 2026-08-12 15:18:29

已经开始吃瓜

image

2天时间复刻了一个L站,论坛构建成本是如此的低,真正能留住人靠的是什么?
#17 · 大帅哥
发帖 2026-08-12 14:58:44 · 快照 2026-08-12 15:00:05

@codexun #5 nodeseek是用啥搭建的?

辉哥中转公益站 —— 免费大模型中转,注册就能用
#187 · 大帅哥
发帖 2026-08-12 14:56:57 · 快照 2026-08-12 14:58:07

我要中中中

 你们的UID都是多少?
#8 · 大帅哥
发帖 2026-08-12 08:02:22 · 快照 2026-08-12 10:15:21

12972

生物或者细胞最佳的环境是不是浸泡或者粘腻环境?
#2 · 大帅哥
发帖 2026-08-12 08:01:41 · 快照 2026-08-12 10:16:44

@token #1 是的,母体

生物或者细胞最佳的环境是不是浸泡或者粘腻环境?
#0 · 大帅哥
发帖 2026-08-12 07:47:18 · 快照 2026-08-12 10:16:44

联想到最近的高温和高湿度,人都讨厌高温和高湿度
但是恐怖电影里有潜力的怪物都是从那种粘腻的培养皿或者蛋里出来,貌似人是因为毛孔或者分泌汗液讨厌粘腻和高温高湿度,但是细胞都是浸润在高湿度里的.所以生物或者细胞最佳的环境是不是浸泡或者粘腻环境?

朋友30天撸了20次,问我有什么办法戒撸
#34 · 大帅哥
发帖 2026-08-12 07:37:23 · 快照 2026-08-12 10:19:09

30天才20次?不行赶紧吃中药

什么时候接入Linux.do登录
#41 · 大帅哥
发帖 2026-08-11 21:58:22 · 快照 2026-08-12 10:20:23

请不要把LinuxDO的戾气带来这里!

请问我抽奖会被封禁吗?
#8 · 大帅哥
发帖 2026-08-11 17:34:36 · 快照 2026-08-12 10:20:23

不会的,谁会像隔壁那个俊福一样自己搞不定高并发对用户搞<水面互加>那一套啊,蠢的脑子都没了

【第二十三弹】猜猜我是谁呢
#31 · 大帅哥
发帖 2026-08-11 17:28:26 · 快照 2026-08-12 10:24:57

非必要就抽奖

从 muyuan 事件中有点理解 linux.sb 成立的初衷了
#4 · 大帅哥
发帖 2026-08-11 11:33:59 · 快照 2026-08-12 10:25:04

你的分类还是太仁慈了
这里面有自以为是只手遮天的管理.进去就给你来个服从性测试:<人教人教不会,事教人不吱声>的逆天
有一群没进社会,整天爱举报别人,自己嘴欠天经地义别人指出错误就上蹿下跳,还对管理当亲叠的神人.
有蝇营狗苟一堆的倒钩奸商(排除经典的老的真公益),所以造就了<退了,0元>,还嘴硬几百楼<赠金算余额,>的恶臭无比的奸商
还有一群品牌的洗白沟,勾结管理,到处视奸围着他那个品牌捂嘴.某黄还装瞎捂嘴.
乱的一锅粥,搞得那么多发帖人心里谁不是人人自危.倒是一群嘴臭玩意如趴历史小鬼发回复<看你历史贴我释怀了>,这种阴阳怪气玩意不管,这种站还拿<友善>当原则,现在撕逼洗白骂战阴阳怪气多的一批了,某皇装瞎,友善在哪?友善在把人家新人参加个抽奖全部封禁然后还捂嘴警告不允许发帖询问,这tm太友善了
最后自己看隔壁站揭竿而已,意识到自己那点臭味实在遮不住,拿个狗屁不通的<面多加水>不知所云的垃圾理由当借口,自己不会有效维护,赚黑心钱不拓宽机器,伎俩和精力全用在搞用户<面多加水>的这一套上面还导出视奸,这恶臭站长,真以为自己中文社区老大了

最后编辑于 2026-08-11 11:38
这个b站能打过l站吗
#9 · 大帅哥
发帖 2026-08-11 09:29:55 · 快照 2026-08-12 10:27:42

希望那个始皇继续作死,继续搞抽奖永封,文字限制,特权阶级,互相举报,收钱办事富可敌国捂嘴假公平,等人心散了,他有一座破庙有什么用呢?

论坛的服务器在哪里
#5 · 大帅哥
发帖 2026-08-11 08:48:51 · 快照 2026-08-12 10:28:41

隔壁的服务器不是一半的卡,还是这里好

想给中转站接入linuxsb登录
#4 · 大帅哥
发帖 2026-08-11 08:46:39 · 快照 2026-08-12 10:28:29

期待,不过这个需要时间把

linux.sb快照存档站 保存所有楼层最初的样子 删帖找回、免积分的全局搜索精华
#1 · 大帅哥
发帖 2026-08-11 07:16:14 · 快照 2026-08-12 10:28:48

这是官方的吗?

听说现在回帖能加积分?真的假的?
#29 · 大帅哥
发帖 2026-08-11 07:15:19 · 快照 2026-08-12 10:14:48

真的哦

回帖不加积分了吗?
#2 · 大帅哥
发帖 2026-08-10 19:36:25 · 快照 2026-08-12 10:33:12

真的吗?

隔壁大赦天下了
#11 · 大帅哥
发帖 2026-08-10 19:35:11 · 快照 2026-08-12 10:34:01

不是他懂事了,是他怕死了

想问一下咱们这个站存活多久了
#4 · 大帅哥
发帖 2026-08-10 19:33:36 · 快照 2026-08-12 10:33:20

咱们这个站啊,要追溯到遥远的在我注册之前就在啦!

福站真好,每个人说话都好听
#2 · 大帅哥
发帖 2026-08-10 19:28:03 · 快照 2026-08-12 10:33:30

我超爱这里的!

颁发勋章系统,可上传图片,允许ai内容,用户等级显示精华
#0 · 大帅哥
发帖 2026-08-10 19:18:31 · 快照 2026-08-12 12:06:37

对面不当人,我们不应该不当人.
隔壁这个<ai内容图片>已经被一堆小孩当成了举报臆想的手段了.
我觉得现在应该:
1.允许ai内容,在发帖时,像b站投稿一样,有<本贴含有AI生成内容>的标识.即可.而不是像隔壁魔怔一样拿来炼丹.
2.颁发勋章系统,比如种子用户.吸引用户,增加网站开站用户基数.
3.用户等级显示,每次的积分回帖提示,不如,增加一个用户等级提示.这是显示用户活跃,老用户的标识.
4.建议增加图床,当然没有也行.

关于隔壁某个小心眼追踪身份的隐水印,仅提醒一下
#16 · 大帅哥
发帖 2026-08-10 18:27:27 · 快照 2026-08-12 10:34:22

@L站站长冒充网络皇帝 #17 因为人会向往真正美好,公平,阳光的地方

关于隔壁某个小心眼追踪身份的隐水印,仅提醒一下
#14 · 大帅哥
发帖 2026-08-10 18:23:50 · 快照 2026-08-12 10:34:22

@狐鸣 #15 是呀,正是本人~

关于隔壁某个小心眼追踪身份的隐水印,仅提醒一下
#12 · 大帅哥
发帖 2026-08-10 18:22:09 · 快照 2026-08-12 10:34:21

@御史大夫 #8 是的,我转载这个也是2月份的了,只是提醒下

关于隔壁某个小心眼追踪身份的隐水印,仅提醒一下
#11 · 大帅哥
发帖 2026-08-10 18:22:02 · 快照 2026-08-12 10:34:21

@ky #7 是的,我转载这个也是2月份的了,只是提醒下

关于隔壁某个小心眼追踪身份的隐水印,仅提醒一下
#10 · 大帅哥
发帖 2026-08-10 18:21:48 · 快照 2026-08-12 10:34:21

@汉堡包 #6 是的,我转载这个也是2月份的了,只是提醒下

关于隔壁某个小心眼追踪身份的隐水印,仅提醒一下
#3 · 大帅哥
发帖 2026-08-10 18:10:12 · 快照 2026-08-12 10:34:21

@Yan #3 是的,我转载这个也是2月份的了,只是提醒下

关于隔壁某个小心眼追踪身份的隐水印,仅提醒一下
#2 · 大帅哥
发帖 2026-08-10 18:08:01 · 快照 2026-08-12 10:34:21

@秦小王 #1 我也是转载,原帖:https://www.chonglangtv.org/t/topic/1915,你可以去问

关于隔壁某个小心眼追踪身份的隐水印,仅提醒一下
#0 · 大帅哥
发帖 2026-08-10 18:04:43 · 快照 2026-08-12 10:34:21

这个是2月份的事很久之前的事,只是提醒下,如果你直到有哪些更改进更牛逼的监控可以说出来提醒大家,这个帖子只是做提醒
我也是隔壁的隔壁的隔壁看的.搬运.记得不要直接截图,免得小心眼黄嘴上说不在意结果天天视奸永封你:
来源:https://x.com/realNyarime/status/2017309021280342064

据奶昔论坛上的佬友提到,知名粉红技术论坛LINUX DO站长“秦始皇”Neo(Zhile Peng)引入了隐写水印(盲水印),一旦讨论此事就秒删帖。 只要在LINUX DO登录账号,并调节成深色模式即可展现背景满屏斜着的 @自己用户名 的水印(默认白色背景只是对比度太低,肉眼上看得并不是很明显)。
图片描述
图片描述

刚来 没什么能送的 给1k个grok build普号吧
#2 · 大帅哥
发帖 2026-08-10 17:50:07 · 快照 2026-08-12 10:34:51

我来参与一下

v2ex,nodeseek,linux.do,nodeloc,linux.sb都是什么垃圾论坛
#10 · 大帅哥
发帖 2026-08-10 17:47:56 · 快照 2026-08-12 10:35:28

<在座的各位都是**>

因为l站被永封,现把l站我的教程搬过来(hermes使用经验分享)精华
#5 · 大帅哥
发帖 2026-08-10 17:29:05 · 快照 2026-08-12 10:36:23

感谢,分享,很实用的教程

嬴政的大赦是害怕和恐惧的表现
#2 · 大帅哥
发帖 2026-08-10 17:24:29 · 快照 2026-08-12 10:35:31

字太多不看,但是的确是急了

这界面比DO清爽多了。
#10 · 大帅哥
发帖 2026-08-10 17:17:43 · 快照 2026-08-12 10:38:10

简洁,速度快,而且不像隔壁的又占内存又卡,历史记录填屎

我一大赦天下,你还不是像狗一样跑过来
#9 · 大帅哥
发帖 2026-08-10 16:54:11 · 快照 2026-08-12 10:36:38

抽奖被炼化:<人教人教不会,事教人不吱声>
先给你服从性测试搞上,你还在隔壁站有啥好发言的呢?都不如一条狗

我ns站账号咋死了
#13 · 大帅哥
发帖 2026-08-10 16:46:04 · 快照 2026-08-12 10:37:00

@raven #4 早就不宽松了,杠精一堆,挑事的小孩一堆,互相指责对方-10+1是必不可少的每天重复几千遍的节目.

我ns站账号咋死了
#10 · 大帅哥
发帖 2026-08-10 16:44:58 · 快照 2026-08-12 10:37:00

@一拳超人 #7 是的

如何评价隔壁非必要不抽奖/回帖限制最小字数/被举报炼化积分
#6 · 大帅哥
发帖 2026-08-10 16:42:50 · 快照 2026-08-12 10:36:52

@余公疑删 #1 特权真好,还打着<团结友善...>的幌子聚拢了一堆孝子,太乐了.

如何评价隔壁非必要不抽奖/回帖限制最小字数/被举报炼化积分
#5 · 大帅哥
发帖 2026-08-10 16:41:14 · 快照 2026-08-12 10:36:52

@余公疑删 #1 对的,尤其那个<人教人教不会,事教人不吱声>,给我气笑了,把用户甚至公民的平等,变成他论坛里的训话,一进来给你个<事教人>,用本来论坛的霸权唯我独尊的当成事教人,还有一堆孝子在旁边吹捧这句话的.只能说....

我ns站账号咋死了
#2 · 大帅哥
发帖 2026-08-10 16:29:15 · 快照 2026-08-12 10:37:00

肯定给你<不适合的内容>...然后鸡腿-1000,封禁10年.

如何评价隔壁非必要不抽奖/回帖限制最小字数/被举报炼化积分
#0 · 大帅哥
发帖 2026-08-10 16:27:54 · 快照 2026-08-12 10:36:52

非必要不抽奖:->人教人教不会,事教人不吱声.
回帖限制最小字数->始皇后想发几字发几字,你多了凑字被炼化👇
水军洗(比如某0退款公益维护者,某品牌的维护者)可以->你有意见被炼化积分
_________________
如何评价呢?我们能从中汲取什么经验教训?

苦 Linux.do 久矣:用户不是可以炼化的数字!一名用户写给 Linux.do 的檄文精华
#46 · 大帅哥
发帖 2026-08-10 16:23:55 · 快照 2026-08-12 10:43:27

还真是,隔壁举报狗一堆,给我看乐了

回帖就送1百万元支付宝余额
#11 · 大帅哥
发帖 2026-08-10 16:21:39 · 快照 2026-08-12 10:37:22

真的吗?我信了

闭关锁国Linux-do
#9 · 大帅哥
发帖 2026-08-10 14:20:53 · 快照 2026-08-12 10:40:53

@隔壁一群捧臭脚的 #7 没错,那点捧臭脚的添购是最恶心的,从发帖的风格来看,都是点小p孩还在最墨迹最爱咬文嚼字杠精的阶段,尤其恶臭的一种发帖风格是:<....的喵><...的喵>,这种发帖的像个弱智一样

baidu.sb
#33 · 大帅哥
发帖 2026-08-09 20:16:10 · 快照 2026-08-12 10:47:54

这个是可以抽到的吗?

[积分换额度]需要新鲜的血液
#40 · 大帅哥
发帖 2026-08-09 20:14:40 · 快照 2026-08-12 10:46:13

已成功兑换虚拟卡「5rmb额度卡-永久有效」。