LINUX SB 快照站

我爱吃大便

用户 ID 3264 · 当前名首次快照 2026-08-12 22:18:23 · 当前名始于 2026-08-12 22:18:23 · 原站主页: https://linux.sb/user/3264

改名历史

popok · 首次快照 2026-08-12 15:45:06 · 本次 2026-08-12 15:45:06 — 2026-08-12 22:18:23

发言

共 26 楼

gpt想入正了,求兄弟姐妹指导一下
#35 · 我爱吃大便
发帖 2026-08-17 14:22:58 · 快照 2026-08-17 20:59:31

@哈雷卫星 #34 对的,现在试用会员额度普遍低,和正价没法比

送3个gpt go账号
#14 · 我爱吃大便
发帖 2026-08-14 15:42:52 · 快照 2026-08-14 15:43:49

艹,我发现兑换卡密不能完全显示全部,我私发你们吧

送3个gpt go账号
#0 · 我爱吃大便
发帖 2026-08-14 14:48:59 · 快照 2026-08-14 14:52:43

cpa格式,有用的自己拿去玩吧。
image

收今天掉订阅的grok heavy 年或季
#1 · 我爱吃大便
发帖 2026-08-13 22:55:45 · 快照 2026-08-13 22:56:52

还有这种技术?

【插件】响应咱们站长,写了一个图床插件,不知道该不该发.
#13 · 我爱吃大便
发帖 2026-08-13 17:57:56 · 快照 2026-08-17 20:54:54

@一拳超人 #13 哦哦,点错人了,哈哈

gpt想入正了,求兄弟姐妹指导一下
#30 · 我爱吃大便
发帖 2026-08-13 16:13:34 · 快照 2026-08-13 16:16:20

@哈雷卫星 #26 我说的是成品号,就是别人弄好的账号,直接用。不是帮你代充。V站不是天天打广告那家,智友社的,日区号,还是挺稳的。之前只要20多,现在行情涨到68了,不过他家的东西确实稳的。我买过4个号,都是用完整个月

速蹬,速蹬-并发已达上限
#10 · 我爱吃大便
发帖 2026-08-13 16:01:24 · 快照 2026-08-13 16:02:40

@爱吃肉的棒男孩 #7 我们都是老吃家了

网上300元的super grok heavy,什么原理实现的啊?
#7 · 我爱吃大便
发帖 2026-08-13 16:00:59 · 快照 2026-08-13 16:02:44

@项少龙 #5 幸亏你没买,通通已经掉订阅了,买的人都是血亏两百多。昨天看到最便宜的一家198

【插件】响应咱们站长,写了一个图床插件,不知道该不该发.
#11 · 我爱吃大便
发帖 2026-08-13 15:54:16 · 快照 2026-08-17 20:54:54

这是修复完ctrl+enter的版本:

// ==UserScript==
// @name         图床linuxdoissb
// @namespace    https://linux.sb/
// @connect      22.2222222.best
// @version      0.9.1
// @description  为 linux.sb 专门写的图床插件,支持粘贴、拖放、按钮上传到 EasyImages,并修复 Ctrl+Enter 错误提交搜索框的问题
// @author       大帅哥
// @match        *://linux.sb/*
// @match        *://hostloc.com/*
// @icon         https://linux.sb/app/assets/index.svg
// @grant        GM_xmlhttpRequest
// @license      MPL-1.0 License
// @downloadURL  http://192.168.1.1/jiaoben/%E5%9B%BE%E5%BA%8Alinuxdoissb.user.js
// @updateURL    http://192.168.1.1/jiaoben/%E5%9B%BE%E5%BA%8Alinuxdoissb.user.js
// ==/UserScript==

(function () {
    'use strict';

    const imgHost = {
        type: 'EasyImages',
        url: 'https://22.2222222.best',
        token: '4ed5cc908146b9318849e586dc0280f1',
    };

    const mdImgName = 'image';
    const submitByKey = true;
    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', (event) => {
                event.preventDefault();
                event.stopPropagation();
                handleImgBtnClick();
            });
        }, 200);
        setTimeout(() => clearInterval(btnTimer), 15000);

        if (submitByKey) {
            document.addEventListener('keydown', handleCtrlEnter);
        }
    }

    function handleCtrlEnter(event) {
        if (!(event.ctrlKey && event.key === 'Enter')) return;

        const editor = event.target instanceof Element
            ? event.target.closest(EDITOR_SELECTOR)
            : null;
        if (!editor) return;

        const form = editor.closest('form.ajax-reply-form, form[action="/reply_edit"]');
        if (!form) return;

        const submitButton = form.querySelector('button[type="submit"], input[type="submit"]');
        if (!submitButton || submitButton.disabled) return;

        event.preventDefault();
        event.stopPropagation();
        form.requestSubmit(submitButton);
    }

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

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

        dropZone.addEventListener('drop', (event) => {
            event.preventDefault();
            event.stopPropagation();
            log('正在处理拖放内容...');

            const imageFiles = [];
            for (const file of event.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 clipboard = event.clipboardData || event.originalEvent?.clipboardData;
        const items = clipboard?.items;
        if (!items || items.length === 0) return;

        const hasImage = Array.from(items).some(
            (item) => item.kind === 'file' && item.type.startsWith('image/')
        );
        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 = (event) => {
            const files = event.target.files;
            if (!files?.length) return;
            uploadImage([...files].map((file) => ({
                kind: 'file',
                type: file.type,
                getAsFile: () => file,
            })));
        };
        input.click();
    }

    async function uploadImage(items) {
        const imageFiles = [];
        for (const item of items) {
            if (item.kind === 'file' && item.type.startsWith('image/')) {
                imageFiles.push(item.getAsFile());
            }
        }

        if (imageFiles.length === 0) {
            log('你粘贴的内容好像没有图片哦', 'red');
            return;
        }

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

    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,
                data: formData,
                onload: (response) => {
                    let data;
                    try {
                        data = JSON.parse(response.responseText);
                    } catch (error) {
                        log('图片上传失败: 响应不是 JSON', 'red');
                        reject(error);
                        return;
                    }

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

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

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

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

        const start = typeof textarea.selectionStart === 'number'
            ? textarea.selectionStart
            : textarea.value.length;
        const end = typeof textarea.selectionEnd === 'number'
            ? textarea.selectionEnd
            : start;
        const insert = `\n${text}\n`;

        textarea.value = textarea.value.substring(0, start)
            + insert
            + textarea.value.substring(end);
        const position = start + insert.length;
        textarea.selectionStart = textarea.selectionEnd = position;
        textarea.focus();
        textarea.dispatchEvent(new Event('input', { bubbles: true }));
        textarea.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.con
【插件】响应咱们站长,写了一个图床插件,不知道该不该发.
#10 · 我爱吃大便
发帖 2026-08-13 15:53:41 · 快照 2026-08-17 20:54:54

@douzi #10 这是我自己本地cockpit的号池啊,其中的号是我P的,没有那么多20x

gpt想入正了,求兄弟姐妹指导一下
#25 · 我爱吃大便
发帖 2026-08-13 15:53:01 · 快照 2026-08-13 15:53:59

买月抛产品好就得了,codex兑换反正在本地,
月抛才70左右,还不需要长效接码,不需要什么支付方式啥的

AI破甲工具箱1.0
#77 · 我爱吃大便
发帖 2026-08-13 15:51:05 · 快照 2026-08-13 15:53:26

已成功兑换虚拟卡「软件下载链接」。

速蹬,速蹬-并发已达上限
#4 · 我爱吃大便
发帖 2026-08-13 15:50:45 · 快照 2026-08-13 15:51:09

你两个的名字真般配

【插件】响应咱们站长,写了一个图床插件,不知道该不该发.
#8 · 我爱吃大便
发帖 2026-08-13 15:48:48 · 快照 2026-08-17 20:54:54

@一拳超人 #7 你这个脚本好像有问题,会导致ctrl+enter直接回首页。编辑完回复内容,一按,直接回首页了,搞了我好几次脑子。刚刚让codex查出来是你脚本的bug。我自己修复了。

豆包输入法win版怎么还没出来
#7 · 我爱吃大便
发帖 2026-08-13 15:36:00 · 快照 2026-08-13 15:38:58

豆包其实有免费的 API 可以用,然后用codex搓一个就行了。
image
image

【插件】响应咱们站长,写了一个图床插件,不知道该不该发.
#5 · 我爱吃大便
发帖 2026-08-13 11:51:20 · 快照 2026-08-17 20:54:54

让我试试效果
image

它不仅是本站功能最全的插件之一,更是UI最匹配本站的插件。
#2 · 我爱吃大便
发帖 2026-08-13 11:43:30 · 快照 2026-08-17 20:47:06

@b友 #1 现在有 AI 加持,啥功能会做不下去?那倒不是分分钟的事情吗

“签到”按钮藏的有点深
#3 · 我爱吃大便
发帖 2026-08-13 11:41:40 · 快照 2026-08-13 11:44:38

青龙,启动

豆包输入法win版怎么还没出来
#4 · 我爱吃大便
发帖 2026-08-13 11:40:09 · 快照 2026-08-13 11:42:20

内测版不是出了吗,我感觉不好用。我只需要他的语音识别功能,打字功能还太弱。

我们到底是饼友,还是b友
#6 · 我爱吃大便
发帖 2026-08-13 11:15:38 · 快照 2026-08-13 11:40:35

不,你们是傻逼,我们都是傻逼

最后由 我爱吃大便 编辑于 2026-08-13 11:15
【灯塔加速器】庆祝LinuxSB开业,送一万现金余额
#192 · 我爱吃大便
发帖 2026-08-12 21:51:24 · 快照 2026-08-12 22:18:23

我来试试运气

又被攻击了?
#2 · 我爱吃大便
发帖 2026-08-12 18:45:02 · 快照 2026-08-12 22:19:19

肯定是屎黄干的,骂他就对了

送 100 个 5U token
#6 · 我爱吃大便
发帖 2026-08-12 18:42:42 · 快照 2026-08-17 20:56:00

这平台没限制只能兑换一次吗

秦💩皇亲自回应LINUX SB的珍贵画面
#20 · 我爱吃大便
发帖 2026-08-12 15:53:30 · 快照 2026-08-17 20:57:36

@siliconbird #11 我摸了一下,下面全湿了

每天收入100多U ,属于什么级别?
#10 · popok
发帖 2026-08-12 15:49:34 · 快照 2026-08-12 15:50:40

属于需要在linux.sb给我们发福利的级别

今天筛简历筛到三级佬了
#33 · 我爱吃大便
发帖 2026-08-12 15:43:40 · 快照 2026-08-17 20:57:13

把他筛掉,炫耀自己linux.do三级的,能是什么好东西