Задать вопрос
  • Как на странице с лайками instagram переходить на пост средней клавишей?

    @accountnujen Автор вопроса
    многобукав, поэтому пришлось на два поста
    spoiler

    // --- Temporary Click Interceptor/Redispatcher ---
                                    const clickInterceptor = (clickEvent) => {
                                        if (!clickEvent._isSimulatedByScript) return;
                                        // console.log("Capture-phase click interceptor RUNNING.");
                                        clickEvent.preventDefault();
                                        clickEvent.stopPropagation();
                                        clickEvent.stopImmediatePropagation();
                                        // console.log("Original simulated click propagation stopped.");
    
                                        const interceptorRef = currentClickInterceptor;
                                        currentClickInterceptor = null;
                                        document.removeEventListener('click', interceptorRef, true);
                                        // console.log("Capture-phase click interceptor REMOVED.");
    
                                        // console.log("Redispatching a new click event to:", targetElementForRedispatch);
                                        const redispatchEvent = new MouseEvent('click', { bubbles: true, cancelable: true });
                                        targetElementForRedispatch.dispatchEvent(redispatchEvent);
                                        // console.log("New click event redispatched.");
                                    };
    
                                    currentClickInterceptor = clickInterceptor;
                                    document.addEventListener('click', clickInterceptor, true);
                                    // console.log("Capture-phase click interceptor ADDED.");
    
                                    // Activate JSON interception
                                    capturedShortcode = null;
                                    isInterceptingJson = true; // Activate flag
                                    // console.log("JSON interception activated.");
    
                                    // Dispatch the INITIAL simulated click
                                    try {
                                        const initialClickEvent = new MouseEvent('click', { bubbles: true, cancelable: true });
                                        initialClickEvent._isSimulatedByScript = true;
                                        el.dispatchEvent(initialClickEvent);
                                        // console.log("Initial simulated click dispatched.");
                                    } catch (clickError) {
                                         console.error("Error dispatching initial simulated click:", clickError);
                                         cleanupState("initial_click_error");
                                         return;
                                    }
    
                                    // Wait for the shortcode
                                    const maxWait = 1000;
                                    const interval = 50;
                                    let waited = 0;
                                    let checkInterval = null;
    
                                    checkInterval = setInterval(() => {
                                        if (capturedShortcode) {
                                            clearInterval(checkInterval);
                                            console.log(`Shortcode captured: ${capturedShortcode}. Opening new tab AND calling history.back() immediately.`);
                                            // GM_log(`Shortcode captured: ${capturedShortcode}. Opening new tab AND calling history.back() immediately.`);
    
                                            const url = `https://www.instagram.com/p/${capturedShortcode}/`;
                                            let newTabOpened = false;
                                            try {
                                                const newTab = window.open(url, '_blank');
                                                if (newTab) {
                                                     newTabOpened = true;
                                                } else {
                                                     console.warn("window.open returned null or was blocked, but proceeding with history.back().");
                                                }
    
                                            } catch(openError) {
                                                console.error("window.open failed:", openError);
                                                // We still try history.back() even if window.open fails
                                            }
    
                                            // === ВЫЗЫВАЕМ history.back() СРАЗУ ===
                                            console.log("Calling history.back() NOW...");
                                            // GM_log("Calling history.back() NOW...");
                                            try {
                                                 history.back();
                                            } catch (backError) {
                                                 console.error("history.back() failed:", backError);
                                            }
    
                                            // Финальная очистка (флаг уже сброшен интерцептором)
                                            cleanupState("after_open_and_back");
    
    
                                        } else if (!isInterceptingJson) {
                                             // This case might happen if JSON parse happens but doesn't contain the shortcode
                                             // or if cleanup was called for some other reason before timeout
                                             clearInterval(checkInterval);
                                             console.warn("JSON interception stopped, but no shortcode was captured.");
                                             cleanupState("interception_stopped_no_code");
                                        } else {
                                            // Still waiting...
                                            waited += interval;
                                            if (waited >= maxWait) {
                                                clearInterval(checkInterval);
                                                console.warn(`Shortcode not captured within ${maxWait}ms.`);
                                                cleanupState("timeout");
                                            }
                                        }
                                    }, interval);
                                }); // end mousedown listener
                            }); // end candidates.forEach
                        }
                    });
                }
            }
        }); // end observer
    
        // Start observing
        observer.observe(document.body, { childList: true, subtree: true });
        console.log("MutationObserver started.");
    
    })();

    Написано
  • Как на странице с лайками instagram переходить на пост средней клавишей?

    @accountnujen Автор вопроса
    Aetae, Aetae, неполучаица(((
    вот мне gemini написала скрипт, но здесь работает по принципу: средней клавишей открывается пост, но действующая страница обновляется. Ну или не обновляется, а скорее переходит на эту страницу и возвращает обратно.
    gemini 2.5 pro

    // ==UserScript==
    // @name         Instagram Middle Click (Race Condition + history.back)
    // @namespace    http://tampermonkey.net/
    // @version      1.0.1
    // @description  Opens post in new tab, immediately calls history.back() to attempt cancelling navigation.
    // @author       GPT & User
    // @match        https://www.instagram.com/*
    // @grant        GM_log
    // ==/UserScript==
    
    (function() {
        'use strict';
    
        console.log("Instagram Likes Middle Click Script (v1.0.1) Loaded.");
    
        const originalJsonParse = JSON.parse;
        let capturedShortcode = null;
        let isInterceptingJson = false;
        let currentClickInterceptor = null;
    
        // --- JSON Interceptor ---
        JSON.parse = function(text, reviver) {
            const parsed = originalJsonParse.call(this, text, reviver);
            try {
                if (isInterceptingJson) {
                    const potentialShortcode = parsed?.payload?.result?.route_match_infos?.[0]?.instanceParams?.shortcode;
                    if (potentialShortcode && typeof potentialShortcode === 'string') {
                        console.log(`JSON Interceptor: Found potential shortcode: ${potentialShortcode}`);
                        capturedShortcode = potentialShortcode;
                        isInterceptingJson = false; // Deactivate immediately
                        // console.log("JSON interception deactivated after finding code.");
                    }
                }
            } catch (e) { /* Ignore errors */ }
            return parsed;
         };
    
        // --- Cleanup Function ---
        function cleanupState(reason = "unknown") {
            // console.log(`Cleanup state called (${reason}).`);
            isInterceptingJson = false;
            if (currentClickInterceptor) {
                const interceptorRef = currentClickInterceptor;
                currentClickInterceptor = null;
                document.removeEventListener('click', interceptorRef, true);
            }
            // console.log("Cleanup complete: JSON interception deactivated.");
         }
    
        // --- Mutation Observer ---
        const observer = new MutationObserver((mutationsList) => {
            for (const mutation of mutationsList) {
                if (mutation.type === 'childList') {
                    mutation.addedNodes.forEach(node => {
                        if (node.nodeType === Node.ELEMENT_NODE) {
                            const candidates = node.matches('div[role="button"][aria-label*="публикации"]') && !node.hasAttribute('data-gpt-bound')
                                ? [node]
                                : node.querySelectorAll('div[role="button"][aria-label*="публикации"]:not([data-gpt-bound])');
    
                            candidates.forEach(el => {
                                el.setAttribute('data-gpt-bound', 'true');
    
                                el.addEventListener('mousedown', e => {
                                    if (e.button !== 1) return;
    
                                    // console.log("Middle click detected on:", el);
    
                                    e.preventDefault();
                                    e.stopPropagation();
                                    e.stopImmediatePropagation();
    
                                    const targetElementForRedispatch = el.parentElement;
                                    if (!targetElementForRedispatch) {
                                         console.error("Cannot find parent element for redispatch!");
                                         return;
                                    }



    ну и разумеется оно не подходит, потому что если так нажать, то весь прогресс прокрутки пропадёт. кароч, помощь твоя нужна
    Написано
  • Может ли телеграм бот начислить пользователю звезды?

    @accountnujen
    я так понимаю, что можно как-то через fragment отправить звёзды в виде подарка. То есть бот получает звёзды, а затем их дарит. Или оно так не работает?
    Написано
  • Как в Windows10 увидеть путь обнаруженного "вируса"?

    @accountnujen
    а "подробнее" в "показать подробности"?
    Написано
  • Существуют ли на android экраны блокировки с двойным дном?

    @accountnujen Автор вопроса
    jusitnow, *facepalm* ...
    откройте настройки, нажмите на значок поиска (лупа) и напишите "второе пространство". У меня оно есть, несмотря на то, что настройка скрытия активирована. В лоб я второе пространство наверное не найду (если честно я и не знаю, где именно оно должно быть), а через поиск - пожалуйста.

    В honor тоже есть кнопка скрытия, но если написать в поиске parallel, то отобразится parallel space
    Написано
  • Существуют ли на android экраны блокировки с двойным дном?

    @accountnujen Автор вопроса
    N, ты не понял да схему? желающий откуда знает, что нужно "глубже" капать? если использовать "второе пространство" xiaomi, то желающий наверняка знает, что оно есть. А если бы было то, что описал я, то шансов нет.
    Написано
  • Существуют ли на android экраны блокировки с двойным дном?

    @accountnujen Автор вопроса
    jusitnow,
    Типа чтобы вместо обычной настройки второго пространства в меню настроек добавлялось фэйковой пункт с предложением типа "добавьте второе пространство"?) чтобы те кто шарятся по меню настроек видели что вы его еще не создавали? так чтоли?

    ближе, по смыслу но не совсем. меню второго пространства позволяет только создать его, попасть из меню в само пространство должно быть невозможно. То есть у тебя может быть хоть 10 вторых пространств (пока место не закончится)
    Я взял xiaomi и здесь если я создам второе пространство, а затем из базового состояния вновь зайду в меню второго пространства у меня просто запросят ключ для входа. То есть злоумышленник теперь точно знает, что это пространство есть. О чём я и говорил в своём вопросе изначально:
    скрытая папка от samsung - это всё очень хорошо, но оно оставляет следы

    Ровно такая же ситуация с parallel space (huawei/honor). Защита очень условная
    Написано
  • Существуют ли на android экраны блокировки с двойным дном?

    @accountnujen Автор вопроса
    N, нет. ну и по смыслу реализации примерно сказал @jusitnow
    Типа чтобы вместо обычной настройки второго пространства в меню настроек добавлялось фэйковой пункт с предложением типа "добавьте второе пространство"?) чтобы те кто шарятся по меню настроек видели что вы его еще не создавали? так чтоли?

    это когда закапывают труп на глубине 2 метров, а на глубине 1 метра закапывают собаку. После собаки никто копать не будет.
    Вообще это должно быть в духе вечного создания вторых пространств, чтобы нельзя было определить есть ли пространство вообще и вход в него будет через другой пин. То есть в "базовом" пространстве ты в настройках попадаешь на страницу создания "второго пространства" и можешь его создать, задав пинкод. Затем вновь открыв настройку в "базовом пространстве" тебе вновь предложат создать "второе пространство" и ты сможешь задать другой пин. Таким образом у тебя будет "базовое пространство" и два "вторичных" (2 и 3). При создании уже "четвёртого пространства" невозможно будет определить было ли "второе" и "третье".
    Написано
  • Существуют ли на android экраны блокировки с двойным дном?

    @accountnujen Автор вопроса
    Это - "второе пространство" на Xiaomi

    прочтите комментарии под вопросом и под другим ответом. это не оно
    и в самом вопросе я указал, что секретная папка оставляет следы.
    Написано
  • Существуют ли на android экраны блокировки с двойным дном?

    @accountnujen Автор вопроса
    ну тут же выше в комментариях писали:
    Так этой фиче уже столько лет, что ее даже и там знают :)

    я попадаю в этот раздел через настройки. и смысл скрывать? Чтобы чисто на первом экране не было? ну так все знают, что оно есть. проверить существование пространства можно просто открыв его через настройки.
    Написано
  • Существуют ли на android экраны блокировки с двойным дном?

    @accountnujen Автор вопроса
    вы не дочитали вопрос. я указал, что схема "скрытой папки" оставляет следы. скрытая папка, второе рабочее пространство, parallel space, private space - всё имеет одну схему. Ты открываешь приложение, у тебя запрашивают пароль и теперь ты точно знаешь, что второе дно есть.
    Написано
  • Существуют ли на android экраны блокировки с двойным дном?

    @accountnujen Автор вопроса
    CityCat4,
    А смысл-то в чем? "Вас остановил патруль"?

    остановит гопота и попросит открыть банковское приложение, чтобы деньги на дропа перевести.
    Так этой фиче уже столько лет, что ее даже и там знают :)

    вот у меня в вопросе не очень много слов, но вы всё равно понять не смогли принцип работы.
    вы заранее знаете, есть ли двойное дно? скрытая папка knox, parallel/private space - подразумевает вход в это пространство из системы. Вы можете зайти в настройки, найти приложение второго рабочего пространства, открыть его и если запросит пароль, то вы точно знаете, что второе пространство есть. схема в моём вопросе исключает возможность определения наличия второго дна на работающем устройстве без доп средств.

    N,
    P.S.: У меня назывался Private Space...а не Parallel...

    я посмотрел, тоже самое, название другое.
    Написано
  • Существуют ли на android экраны блокировки с двойным дном?

    @accountnujen Автор вопроса
    N, parallel space? работает ровно как скрытая папка. то есть, если зайти в приложение, то тебе предложат авторизоваться.
    Написано
  • Как через fail2ban обрабатывать access.log в json формате?

    @accountnujen Автор вопроса
    Василий Банников, сложно воспроизвести ошибку
    вот открытие сайта в браузере внутри телеграмма:
    {"status":404,"request":"GET /j.zip HTTP/1.1","remote_addr":"1.1.1.1","remote_user":"","body_bytes_sent":134,"http_referer":"","http_user_agent":"TelegramBot (like TwitterBot)","time_local":"24/Jan/2025:04:49:41 +0300","request_time":0.000}
    {"status":404,"request":"GET /j.zip HTTP/1.1","remote_addr":"2.2.2.2","remote_user":"","body_bytes_sent":197,"http_referer":"","http_user_agent":"Mozilla/5.0 (Linux; Android 11; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.6778.260 Mobile Safari/537.36","time_local":"24/Jan/2025:04:49:42 +0300","request_time":0.000}

    первый ip телеги, второй ip мой
    вот такой лог fail2ban
    2025-01-24 04:49:41,410 fail2ban.filter         [535953]: ERROR   Failed to process line: '{"status":404,"request":"GET /j.zip HTTP/1.1","remote_addr":"1.1.1.1","remote_user":"","body_bytes_sent":134,"http_referer":"","http_user_agent":"TelegramBot (like TwitterBot)","time_local":"24/Jan/2025:04:49:41 +0300","request_time":0.000}', caught exception: IndexError('string index out of range')
    2025-01-24 04:49:43,412 fail2ban.filter         [535953]: INFO    [error-404] Found 2.2.2.2 - 2025-01-24 04:49:42
    2025-01-24 04:49:43,594 fail2ban.actions        [535953]: NOTICE  [error-404] Ban 2.2.2.2
    Написано
  • Как через fail2ban обрабатывать access.log в json формате?

    @accountnujen Автор вопроса
    Василий Банников, так в ошибке строка цитируется
    {"status":403,"request":"GET /.env HT...
    вот это вот оно
    Написано
  • Можно ли провести видеокарту в Россию?

    @accountnujen
    Про Киргизию отзывов особо не помню.

    никого в живых не оставляли потому что
    Написано
  • Какие подводные при хранении токенов в memcached?

    @accountnujen Автор вопроса
    ThunderCat,
    чтение файла через функцию для вас одно и то же?

    ахахах)))) давайте добавим ещё десяток других обращений к диску))) с $_ENV что-то не так, раз его выпилили в дефолте, а использовать getenv() (если это действительно обращение к диску) - вообще идиотизм
    это можно так же руками все вводить при старте?

    куда писать-то?
    Написано
  • Какие подводные при хранении токенов в memcached?

    @accountnujen Автор вопроса
    ThunderCat,
    о, прикольно. Во первых будет $memcached->set("password",'12345678'), а во вторых значит в коде где-то всё-таки будет '12345678', что возвращает нас к начальной проблеме - для того чтобы засетить мемкеш нужно иметь где-то в доступном для кода месте данные. Ой, подождите... это же то от чего вы пытались избавиться?

    файлик с парами ключ-значение может быть зашифрован через aes-128-gcm и первый $mem-set() будет через ввод пароля от этого шифра. Поэтому, если ты получишь файлы - ты только увидишь зашифрованные пары.
    До конца читали? through getenv().

    есть подозрение, что getenv() и $_ENV не одно и тоже. иначе зачем иметь два разных способа по написанию.
    Написано