Nowpick replace 999+ with actual data from the response

Capture a specific URL, replace 999+ with actual data from the response, and show job info in a toast with delay

As of 2025-08-12. See the latest version.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Nowpick replace 999+ with actual data from the response
// @description  Capture a specific URL, replace 999+ with actual data from the response, and show job info in a toast with delay
// @name:zh-CN   牛客优聘替换999+投递数为真实的数字
// @description:zh-CN   捕获特定URL,用响应中的实际数据替换999+,并在带有延迟的Toast中显示工作信息
// @name:ar          Nowpick استبدال 999+ بالبيانات الفعلية من الاستجابة
// @description:ar    التقط عنوان URL معين، واستبدل 999+ بالبيانات الفعلية من الاستجابة، واعرض معلومات الوظيفة في نافذة منبثقة مع تأخير
// @name:bg          Nowpick замяна на 999+ с действителни данни от отговора
// @description:bg    Захваща определен URL адрес, заменя 999+ с действителните данни от отговора и показва информация за работата в известие със закъснение
// @name:cs          Nowpick nahradit 999+ skutečnými daty z odpovědi
// @description:cs    Zachytí specifickou URL adresu, nahradí 999+ skutečnými daty z odpovědi a zobrazí informace o práci v notifikaci se zpožděním
// @name:da          Nowpick erstatter 999+ med faktiske data fra svaret
// @description:da    Indfang en specifik URL, erstat 999+ med faktiske data fra svaret, og vis jobinfo i en toast med forsinkelse
// @name:de          Nowpick ersetzt 999+ durch tatsächliche Daten aus der Antwort
// @description:de    Erfasst eine bestimmte URL, ersetzt 999+ durch tatsächliche Daten aus der Antwort und zeigt Jobinformationen in einem Toast mit Verzögerung an
// @name:el          Nowpick αντικαθιστά το 999+ με πραγματικά δεδομένα από την απάντηση
// @description:el    Καταγράφει μια συγκεκριμένη διεύθυνση URL, αντικαθιστά το 999+ με πραγματικά δεδομένα από την απάντηση και εμφανίζει πληροφορίες εργασίας σε ένα αναδυόμενο μήνυμα με καθυστέρηση
// @name:eo          Nowpick anstataŭigas 999+ per faktaj datumoj el la respondo
// @description:eo    Kaptas specifan URL, anstataŭigas 999+ per faktaj datumoj el la respondo, kaj montras laborinformojn en ŝprucfenestro kun prokrasto
// @name:es          Nowpick reemplaza 999+ con datos reales de la respuesta
// @description:es    Captura una URL específica, reemplaza 999+ con datos reales de la respuesta y muestra información del trabajo en una notificación con demora
// @name:fi          Nowpick korvaa 999+ todellisilla tiedoilla vastauksesta
// @description:fi    Kaappaa tietyn URL-osoitteen, korvaa 999+ todellisilla tiedoilla vastauksesta ja näyttää työpaikkatietoja ilmoituksessa viiveellä
// @name:fr          Nowpick remplace 999+ par les données réelles de la réponse
// @description:fr    Capture une URL spécifique, remplace 999+ par les données réelles de la réponse et affiche les informations sur l'emploi dans une notification avec délai
// @name:fr-CA       Nowpick remplace 999+ par les données réelles de la réponse
// @description:fr-CA    Capture une URL spécifique, remplace 999+ par les données réelles de la réponse et affiche les informations sur l'emploi dans une notification avec délai
// @name:he          Nowpick מחליף 999+ בנתונים ממשיים מהתגובה
// @description:he    לוכד כתובת URL ספציפית, מחליף 999+ בנתונים ממשיים מהתגובה ומציג מידע על עבודה בהודעה קופצת עם עיכוב
// @name:hr          Nowpick zamijeni 999+ stvarnim podacima iz odgovora
// @description:hr    Hvata određeni URL, zamjenjuje 999+ stvarnim podacima iz odgovora i prikazuje informacije o poslu u obavijesti s odgodom
// @name:hu          Nowpick lecseréli a 999+-t a válaszból származó tényleges adatokra
// @description:hu    Elfog egy adott URL-t, lecseréli a 999+-t a válaszból származó tényleges adatokra, és késleltetve jeleníti meg a munkainformációkat egy értesítésben
// @name:id          Nowpick mengganti 999+ dengan data aktual dari respons
// @description:id    Menangkap URL tertentu, mengganti 999+ dengan data aktual dari respons, dan menampilkan info pekerjaan dalam toast dengan penundaan
// @name:it          Nowpick sostituisce 999+ con i dati effettivi dalla risposta
// @description:it    Cattura un URL specifico, sostituisce 999+ con i dati effettivi dalla risposta e mostra le informazioni sul lavoro in un toast con ritardo
// @name:ja          Nowpickは999+をレスポンスからの実際のデータに置き換えます
// @description:ja    特定のURLをキャプチャし、999+をレスポンスからの実際のデータに置き換え、遅延のあるトーストでジョブ情報を表示します
// @name:ka          Nowpick ანაცვლებს 999+-ს პასუხიდან მიღებული ფაქტობრივი მონაცემებით
// @description:ka    იჭერს კონკრეტულ URL-ს, ანაცვლებს 999+-ს პასუხიდან მიღებული ფაქტობრივი მონაცემებით და აჩვენებს სამუშაოს ინფორმაციას შეტყობინებაში დაგვიანებით
// @name:ko          Nowpick은 응답에서 실제 데이터로 999+를 대체합니다.
// @description:ko    특정 URL을 캡처하고 응답에서 실제 데이터로 999+를 대체하고 지연 시간이 있는 토스트에 작업 정보를 표시합니다.
// @name:nb          Nowpick erstatter 999+ med faktiske data fra responsen
// @description:nb    Fang en spesifikk URL, erstatt 999+ med faktiske data fra responsen og vis jobbinfo i en toast med forsinkelse
// @name:nl          Nowpick vervangt 999+ door actuele gegevens uit de reactie
// @description:nl    Legt een specifieke URL vast, vervangt 999+ door actuele gegevens uit de reactie en toont taakinformatie in een toast met vertraging
// @name:pl          Nowpick zastępuje 999+ rzeczywistymi danymi z odpowiedzi
// @description:pl    Przechwytuje określony adres URL, zastępuje 999+ rzeczywistymi danymi z odpowiedzi i wyświetla informacje o pracy w powiadomieniu z opóźnieniem
// @name:pt-BR       Nowpick substitui 999+ pelos dados reais da resposta
// @description:pt-BR    Captura um URL específico, substitui 999+ pelos dados reais da resposta e mostra informações de trabalho em um toast com atraso
// @name:ro          Nowpick înlocuiește 999+ cu datele reale din răspuns
// @description:ro    Capturează un URL specific, înlocuiește 999+ cu datele reale din răspuns și afișează informații despre job într-o notificare tip toast cu întârziere
// @name:ru          Nowpick заменяет 999+ на фактические данные из ответа
// @description:ru    Перехватывает определенный URL, заменяет 999+ на фактические данные из ответа и отображает информацию о вакансии во всплывающем уведомлении с задержкой
// @name:sk          Nowpick nahradí 999+ skutočnými údajmi z odpovede
// @description:sk    Zachytí špecifickú URL adresu, nahradí 999+ skutočnými údajmi z odpovede a zobrazí informácie o práci v notifikácii s oneskorením
// @name:sr          Nowpick замењује 999+ стварним подацима из одговора
// @description:sr    Захвата одређени URL, замењује 999+ стварним подацима из одговора и приказује информације о послу у искачућем прозору са закашњењем
// @name:sv          Nowpick ersätter 999+ med faktiska data från svaret
// @description:sv    Fånga en specifik URL, ersätt 999+ med faktiska data från svaret och visa jobbinfo i en toast med fördröjning
// @name:th          Nowpick แทนที่ 999+ ด้วยข้อมูลจริงจากการตอบกลับ
// @description:th    ดักจับ URL ที่ระบุ แทนที่ 999+ ด้วยข้อมูลจริงจากการตอบกลับ และแสดงข้อมูลงานในข้อความแจ้งเตือนพร้อมการหน่วงเวลา
// @name:tr          Nowpick, 999+'ı yanıttan gelen gerçek verilerle değiştirir
// @description:tr    Belirli bir URL'yi yakalayın, 999+'ı yanıttan gelen gerçek verilerle değiştirin ve iş bilgilerini gecikmeli bir bildirimde gösterin
// @name:ug          Nowpick جاۋابتىن كەلگەن ھەقىقىي سانلىق مەلۇماتلار بىلەن 999+ نى ئالماشتۇرىدۇ
// @description:ug    مەلۇم بىر URL نى تۇتۇۋېلىپ ، جاۋابتىن كەلگەن ھەقىقىي سانلىق مەلۇماتلار بىلەن 999+ نى ئالماشتۇرۇڭ ۋە خىزمەت ئۇچۇرلىرىنى كېچىكتۈرۈلگەن ئەسكەرتىشتە كۆرسىتىڭ
// @name:uk          Nowpick замінює 999+ фактичними даними з відповіді
// @description:uk    Захоплює певну URL-адресу, замінює 999+ фактичними даними з відповіді та відображає інформацію про роботу у спливаючому повідомленні із затримкою
// @name:vi          Nowpick thay thế 999+ bằng dữ liệu thực tế từ phản hồi
// @description:vi    Chụp một URL cụ thể, thay thế 999+ bằng dữ liệu thực tế từ phản hồi và hiển thị thông tin công việc trong thông báo toast có độ trễ
// @name:zh          Nowpick替换999+为响应中的实际数据
// @description:zh    捕获特定URL,用响应中的实际数据替换999+,并在带有延迟的Toast中显示工作信息
// @name:zh-HK       Nowpick取代999+為響應中的實際數據
// @description:zh-HK    捕獲特定URL,用響應中的實際數據替換999+,並在帶有延遲的Toast中顯示工作信息
// @name:zh-SG       Nowpick替换999+为响应中的实际数据
// @description:zh-SG    捕获特定URL,用响应中的实际数据替换999+,并在带有延迟的Toast中显示工作信息
// @name:zh-TW       Nowpick取代999+為響應中的實際數據
// @description:zh-TW    捕獲特定URL,用響應中的實際數據替換999+,並在帶有延遲的Toast中顯示工作信息
// @namespace    http://tampermonkey.net/
// @version      1.0.4.3
// @author       aspen138
// @match        *://nowpick.nowcoder.com/*
// @grant        GM_xmlhttpRequest
// @grant        GM_addStyle
// @grant        GM_registerMenuCommand
// @require      https://update.greatest.deepsurf.us/scripts/462234/1322684/Message.js
// @icon         data:image/png;base64,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
// @license      MIT
// ==/UserScript==


// @iconbackup         https://static.nowcoder.com/fe/common/share-logo.png


// key: "getDeliverNum",
// value: function(t) {
//     if (1 === t.showStatus)
//         return "- -";
//     var e = t.inviteSuccessCnt + t.initiativeDeliverCnt;
//     return e > 999 ? "999+" : e
// }





// Replace 999+ with actual number
(function () {
    'use strict';

    // Function to execute the main functionality
    async function executeMainFunctionality() {
        if (window.location.href === "https://nowpick.nowcoder.com/w/hrconsole/job-manage") {
            window.QMSG_GLOBALS = {
                DEFAULTS: {
                    showClose: true,
                    autoClose: false,
                    timeout: 3600 * 1000 // ms
                }
            };

            const name = "JobUpdater";

            function toast(s, error = false) {
                if (error) {
                    Qmsg.error(`[${name}] ${s}`);
                    console.error(`[${name}] ${s}`);
                } else {
                    Qmsg.success(`[${name}] ${s}`);
                    console.log(`[${name}] ${s}`);
                }
            }

            // Function to show a toast message
            function showToast(message) {
                toast(" " + message, false); // Display
            }

            // Function to escape special characters in CSS selectors
            function escapeCSSSelector(selector) {
                return selector.replace(/([!"#$%&'()*+,.\/:;<=>?@[\\\]^`{|}~])/g, '\\$1');
            }

            // Function to replace the '999+' value with actual data
            async function replaceValues(jobName, unProcessCount) {
                const jobTitleElements = document.querySelectorAll('.job-title-name');
                const updateTasks = Array.from(jobTitleElements).map(async (el) => {
                    if (el.textContent.trim() === jobName) {
                        const jobInfoParent = el.closest('.job-info').parentElement.parentElement;
                        const unProcessElement = jobInfoParent.querySelector('.tw-font-semibold');
                        if (unProcessElement && unProcessElement.textContent.trim() === '999+') {
                            unProcessElement.textContent = unProcessCount;
                            showToast(`Updated job "${jobName}" with deliverNum: ${unProcessCount}`);
                        }
                    }
                });
                await Promise.all(updateTasks);
            }

            // Function to delay the update (parallelized for faster updates)
            async function delayUpdate(summaryDetailList) {
                await new Promise(resolve => setTimeout(resolve, 0.0001*1000)); // 1 second delay //why we need the delay here???

                const updateTasks = summaryDetailList.map(async (job) => {
                    const deliverNum = job.unProcessCount + job.successCount + job.failCount + job.unDetermined + job.writtenInterviewCount;
                    await replaceValues(job.jobName, deliverNum);
                });

                await Promise.all(updateTasks);
            }

            // Function to fetch data and initiate update (parallelized)
            async function fetchDataAndInitiateUpdate() {
                try {
                    const response = await fetch("https://nowpick.nowcoder.com/h/resume-deliver/summary");
                    if (response.ok) {
                        const jsonResponse = await response.json();
                        if (jsonResponse.data && jsonResponse.data.summaryDetailList) {
                            const summaryDetailList = jsonResponse.data.summaryDetailList;
                            await delayUpdate(summaryDetailList);
                        } else {
                            showToast("Unexpected response format");
                        }
                    } else {
                        showToast("Error: " + response.statusText);
                    }
                } catch (e) {
                    showToast("Request failed: " + e.message);
                }
            }

            // Execute only if we are on the specific URL
            await fetchDataAndInitiateUpdate();
        }
    }

    // Execute the main functionality on page load
    executeMainFunctionality();

    // Listen for hash change or pop state to detect URL changes
    window.addEventListener('hashchange', executeMainFunctionality);
    window.addEventListener('popstate', executeMainFunctionality);

    // Use a MutationObserver to detect URL changes if the page uses JavaScript-based navigation
    const observer = new MutationObserver(() => {
        executeMainFunctionality();
    });

    observer.observe(document, { childList: true, subtree: true });
})();






(function() {
    'use strict';

    // Function to click all buttons with text "一键擦亮"
    function clickAllPolishButtons() {
        const buttons = document.querySelectorAll('button[data-v-55eaa2d2] span');
        buttons.forEach(button => {
            if (button.textContent.trim() === '一键擦亮') {
                button.closest('button').click();
            }
        });
    }

    // Add click event listener to all buttons with the specific class
    document.addEventListener('click', function(event) {
        const target = event.target.closest('button[data-v-55eaa2d2]');
        if (target && target.querySelector('span')?.textContent.trim() === '一键擦亮') {
            // Prevent infinite loop by using setTimeout
            setTimeout(clickAllPolishButtons, 0);
        }
    });
})();




// 右键菜单里选择“一键邀约”
(function() {
    'use strict';

    // Function to click all matching buttons
    function clickAllInviteButtons() {
        const buttons = document.querySelectorAll('button.el-button.invite-wrap.txt-center.fs-14.el-button--primary');
        buttons.forEach(button => {
            button.click();
        });
    }

    // Register context menu item
    GM_registerMenuCommand('Click All Invite Buttons', clickAllInviteButtons, 'c');
})();