Как защитить свои изображения на ШИКИ ?

pirate~
56
Для вашего сведения: все изображения, которые вы отправляете в личных сообщениях в закрытых клубах и т.п., могут быть доступны третьим лицам, поскольку есть люди которые их парсит, а админы даже не знают об этом. Если вы хотите обезопасить себя, я оставлю вам юзерскрипт, с помощью которого можно напрямую загружать изображения без dere \ nyaa и никто не сможет спарсить.

Для этого:
  • Создайте аккаунт на imgbb.com;
  • Получите API-ключ на api.imgbb.com;
  • Добавьте его в юзерскрипт.

В результате у вас появится загрузчик изображений в редакторах (старом и в новом), а также возможность самостоятельно удалять изображения через свой аккаунт.

Обратите внимание, что в шики (dere \ nyaa) изображение сохраняется даже после удаления комментария.

Еще вместо того чтобы использовать мой pirateimg.vercel.app/ вы сможете загружать изображения в отличном качестве сразу через шики а также через аккаунт удалять, если захотите.

Пример работы:

// ==UserScript==
// @name         imgbb uploader
// @namespace    http://shikimori.me/
// @version      1.0
// @description  Загрузчик изображений
// @author       pirate~
// @match        *://shikimori.one/*
// @match        *://shikimori.me/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    let APIKEY = 'СЮДА ВАШ КЛЮЧ';

    function insertBBCodeForEditor(editorContainer, imageUrl) {
        var bbcode = '[img]' + imageUrl + '[/img]';
        var field = editorContainer.querySelector('textarea[name="comment[body]"]') || editorContainer.querySelector('input[name="comment[body]"]');
        if (field) {
            if (field.tagName.toLowerCase() === 'textarea') {
                var start = field.selectionStart, end = field.selectionEnd;
                field.value = field.value.slice(0, start) + bbcode + field.value.slice(end);
                field.selectionStart = field.selectionEnd = start + bbcode.length;
                field.focus();
            } else {
                field.value += bbcode;
                field.dispatchEvent(new Event('input', { bubbles: true }));
            }
            return;
        }
        var proseMirror = editorContainer.querySelector('.ProseMirror');
        if (proseMirror) {
            proseMirror.focus();
            document.execCommand('insertText', false, bbcode);
            var hiddenInput = editorContainer.querySelector('input[name="comment[body]"]');
            if (hiddenInput) {
                hiddenInput.value += bbcode;
                hiddenInput.dispatchEvent(new Event('input', { bubbles: true }));
            }
        }
    }

    function createUploadButton(editorContainer, parentElement) {
        var btn = document.createElement('span');
        btn.classList.add('imgbb');
        btn.style.cursor = 'pointer';
        btn.style.marginLeft = '10px';
        btn.style.color = '#444';
        btn.textContent = '🖼';
        btn.addEventListener('click', function() {
            var fileInput = document.createElement('input');
            fileInput.type = 'file';
            fileInput.accept = 'image/*';
            fileInput.style.display = 'none';
            document.body.appendChild(fileInput);
            fileInput.addEventListener('change', function() {
                if (fileInput.files && fileInput.files[0]) {
                    var file = fileInput.files[0];
                    var reader = new FileReader();
                    reader.onload = function(e) {
                        var dataUrl = e.target.result;
                        var base64Index = dataUrl.indexOf('base64,') + 7;
                        var base64Data = dataUrl.substring(base64Index);
                        var formData = new FormData();
                        formData.append('key', APIKEY);
                        formData.append('image', base64Data);
                        formData.append('name', file.name);
                        fetch('https://api.imgbb.com/1/upload', { method: 'POST', body: formData })
                        .then(response => response.json())
                        .then(data => {
                            if (data.success) {
                                insertBBCodeForEditor(editorContainer, data.data.url);
                            } else {
                                alert('ошибка загрузки: ' + (data.error.message || 'неизвестная ошибка'));
                            }
                        })
                        .catch(error => {
                            console.error('ошибка запроса:', error);
                            alert('ошибка загрузки изображения');
                        })
                        .finally(() => { fileInput.remove(); });
                    };
                    reader.readAsDataURL(file);
                }
            });
            fileInput.click();
        });
        parentElement.appendChild(btn);
    }

    function addButtonToEditors() {
        var classicEditors = document.querySelectorAll('.b-shiki_editor:not(.b-shiki_editor-v2)');
        classicEditors.forEach(editor => {
            var controls = editor.querySelector('.editor-controls');
            if (controls && !controls.querySelector('.imgbb')) {
                createUploadButton(editor, controls);
            }
        });
        var v2Editors = document.querySelectorAll('.vue-node');
        v2Editors.forEach(editor => {
            var menubar = editor.querySelector('.menubar .menu_group-block');
            if (menubar && !menubar.querySelector('.imgbb')) {
                createUploadButton(editor, menubar);
            }
        });
    }

    document.addEventListener('DOMContentLoaded', addButtonToEditors);
    setInterval(addButtonToEditors, 100);
})();


Не забудьте в коде ввести тут апи ключ:
let APIKEY = 'СЮДА ВАШ КЛЮЧ';
Комментарии
Скрыть 36 комментариев
Показать 36 комментариев
Загрузить ещё 20 из 36 комментариев
S John
S John#
@pirate~, а как такое делается, идея в 3-х словах? Кроме поиска кандидатов в какой-нибудь хентайной коллекции.
Соnnоisseur_desu
Соnnоisseur_desu#
@pirate~, в любом случае, это далеко не самая приоритетная проблема для Шикимори. (Если вообще признать это как проблему)
MapleSyrup
MapleSyrup#
Чем же таким вы тут делитесь чтобы так заморачиваться? :lol:
pirate~
pirate~#
@Соnnоisseur_desu, еще как приоритетная, могу тебе в лс скинуть одного чела который пожаловался рнк… точнее его материал. и из за этих хентай пикч, проблемы были у сайта..


@S John, юзер загружает пикчу локально или через ссылку, чекер анализирует, если +18 = пикча удаляется, и вместо нее загружается шаблонная (осторожно взрослый контент) .
S John
S John#
чекер анализирует
А как он понимает, что это порно/хентай?
это далеко не самая приоритетная проблема для Шикимори
Если говорить про блокировку сайта, то в последние годы не просто приоритетная, а единственная.
pirate~
pirate~#
@S John,
А как он понимает, что это порно/хентай?
сканирует.
S John
S John#
@pirate~, а как понимает?
719x267

Для решения такой задачи нужен крутой комп, которого у Шики нет.
pirate~
pirate~#
@S John, он анализирует изображение с помощью нейронной сети, оценивает, насколько оно подходит под категории порно, хентай или секси, и если уверенность высокая, заменяет картинку на предупреждение.

на шики его легко установить.
S John
S John#
с помощью нейронной сети
Он использует мощности только самого компа или обращается к какому-нибудь сервису за нейронкой, что-то типа Eden AI?
pirate~
pirate~#
@S John, он использует мощности самого сервера, на который установлен, обрабатывая данные через локальную нейронную сеть через [которую я тебе не назову..] без обращения к внешним сервисам. :star:

хочешь установить к себе в вордпресс? :disappointment:
S John
S John#
@pirate~, нет, просто заинтересовался. Мне всегда представлялось, что задача слишком ресурсоемкая для обычных компов.
S John
S John#
@cgi-bin, спасибо. Получается, что такой пакет все равно требует человеческого вмешательства (пакет по твоей ссылке базируется на nsfw_model).
987x378
Источник: hal.science
Librake
Librake#
Забавно, меня эта статья наоборот побудила разобраться как можно запарисить картинки с Шики.
Что самое ироничное использовал этот же самый инструмент:
github.com/infinitered/nsfwjs
Из 10к скаченных фоток нейронка позволила выделить те, что с nsfw контентом, разумеется, сугубо в исследовательских целях :evil:
Ну что сказать...
Старались, честно говоря, потраченного времени жаль. Да.
По итогу лишь соточка хентайных артов/скринов, 1 эро-косплей японки и дикпик. Полагаю, эмпирически можно заявить, что описанная проблема не особо актуальна :8):
p.s. Ржу, что нейронка отправила мем с Билли Херрингтона в категорию порно. Как бы да, но :lol:
533x353
S John
S John#
разумеется, сугубо в исследовательских целях
720x730
:evil:
cgi-bin
cgi-bin#
@S John, да ну, человеки не нужны, точность распознавания - 93%, технологическая сингулярность уже буквально у нас под носом.
794x866911x866
chugou
chugou#
@cgi-bin, доктор, откуда у вас такие картинки?
S John
S John#
точность распознавания - 93%
Это по заявлениям авторов, а я привел результаты независимого тестирования - 72%, то есть по сути пятьдесят на пятьдесят. И это еще самый сложный и медленный алгоритм.
pirate~
pirate~#
@S John, Твой источник с 2023 года — за два года нейронки значительно эволюционировали. А твои 72% — цифры из воздуха.
Моя штучка отлично справляется с фильтрацией пикчей, а скоро будет фильтровать и гифки.

P.S | Будь это мой сайт, боты выполняли бы всю работу. Я бы не вводил баны, а просто добавил бота, который читает комментарии и удаляет те, что нарушают правила сайта. Как я и говорил - нейронки значительно эволюционировали.
S John
S John#
@pirate~, может быть.
назад
Твой комментарий
Вернуться к редактированию
Предпросмотр
Скрыть