Boss直聘AI投递助手【推荐工作页面专用】

在推荐工作页面,通过AI自动给Boss打招呼,支持AI个性化招呼语,可设定最低薪资,可设定公司、岗位、地点、介绍黑名单,可保存设置

目前為 2024-09-10 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Boss直聘AI投递助手【推荐工作页面专用】
// @namespace    https://ai.putaojie.top/
// @version      1.3.0
// @description  在推荐工作页面,通过AI自动给Boss打招呼,支持AI个性化招呼语,可设定最低薪资,可设定公司、岗位、地点、介绍黑名单,可保存设置
// @author       dst1213
// @match        https://www.zhipin.com/web/geek/job-recommend*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=zhipin.com
// @grant        none
// @require      https://update.gf.qytechs.cn/scripts/449444/1081400/Hook%20Vue3%20app.js
// @require      https://unpkg.com/[email protected]/dist/protobuf.js
// @run-at       document-start
// @license      AGPL-3.0
// ==/UserScript==

(function () {
  "use strict";
  //暴露变量到全局
  window._vueUnhooked_ = vueUnhooked;
  window._vueHooked_ = vueHooked;

  function waitForElement(selector, callback) {
    const element = document.querySelector(selector);
    if (element) {
      callback(element);
    } else {
      setTimeout(() => waitForElement(selector, callback), 1000);
    }
  }

  waitForElement("#wrap > div.job-recommend-main", (element) => {
    loadSystem();
  });

  // ... (rest of the existing code remains unchanged)

  function loadSystem() {
    console.log("开始自动打招呼模块加载");
    // 初始化app
    let app = document.querySelector("#wrap > div.job-recommend-main").__vue__;

    // 创建悬浮面板
    const panel = document.createElement("div");
    Object.assign(panel.style, {
      position: "fixed",
      top: "10px",
      right: "10px",
      zIndex: "10000",
      backgroundColor: "white",
      border: "1px solid black",
      padding: "10px",
      boxShadow: "0 4px 8px rgba(0, 0, 0, 0.1)",
      borderRadius: "8px",
      fontFamily: "Arial, sans-serif",
    });
    const style = document.createElement("style");
    style.innerHTML = `
      #startAutoApply:disabled, #stopAutoApply:disabled, #saveSettings:disabled {
        background-color: #ccc !important;
        cursor: not-allowed;
      }
      #panelContent {
        display: none;
      }
      #togglePanel {
        cursor: pointer;
      }
    `;
    document.head.appendChild(style);
    panel.innerHTML = `
        <div id="togglePanel" style="margin-bottom: 10px; padding: 8px 16px; background-color: blue; color: white; border: none; border-radius: 4px;">展开/收起面板</div>
        <div id="panelContent">
          <button id="startAutoApply" style="margin-bottom: 10px; padding: 8px 16px; background-color: #4CAF50; color: white; border: none; border-radius: 4px;">开始自动投递</button>
          <button id="stopAutoApply" style="margin-bottom: 20px; padding: 8px 16px; background-color: red; color: white; border: none; border-radius: 4px;" disabled="true">停止自动投递</button>
          <br>
          <label for="blacklist" style="display: block; margin-bottom: 5px; font-weight: bold;">黑名单工作信息(逗号分隔,可以是公司名,可以是岗位名,可以是地点,会检测工作信息是否包含):</label>
          <input type="text" id="blacklist" style="width: 100%; margin-bottom: 20px; padding: 8px; border: 1px solid #ccc; border-radius: 4px;">
          <br>
          <label for="minSalary" style="display: block; margin-bottom: 5px; font-weight: bold;">最低薪资(k):</label>
          <input type="number" id="minSalary" style="width: 100%; margin-bottom: 20px; padding: 8px; border: 1px solid #ccc; border-radius: 4px;">
          <br>
          <label for="skipInactiveBoss" style="display: block; margin-bottom: 5px; font-weight: bold;">跳过不活跃Boss(一周以上未活跃):</label>
          <input type="checkbox" id="skipInactiveBoss" style="margin-left: 5px;">
          <br>
          <label for="customGreeting" style="display: block; margin-bottom: 5px; font-weight: bold;">自定义打招呼语:</label>
          <input type="text" id="customGreeting" style="width: 100%; margin-bottom: 20px; padding: 8px; border: 1px solid #ccc; border-radius: 4px;">
          <br>
          <label for="useGPT" style="display: block; margin-bottom: 5px; font-weight: bold;">使用GPT个性化招呼:</label>
          <input type="checkbox" id="useGPT" style="margin-left: 5px;">
          <br>
          <label for="gptBaseUrl" style="display: block; margin-bottom: 5px; font-weight: bold;">GPT Base URL:</label>
          <input type="text" id="gptBaseUrl" style="width: 100%; margin-bottom: 20px; padding: 8px; border: 1px solid #ccc; border-radius: 4px;">
          <br>
          <label for="gptApiKey" style="display: block; margin-bottom: 5px; font-weight: bold;">GPT API Key:</label>
          <input type="text" id="gptApiKey" style="width: 100%; margin-bottom: 20px; padding: 8px; border: 1px solid #ccc; border-radius: 4px;">
          <br>
          <label for="whitelist" style="display: block; margin-bottom: 5px; font-weight: bold;">白名单工作信息(逗号分隔,可以是公司名,可以是岗位名,可以是地点,会检测工作信息是否包含):</label>
          <input type="text" id="whitelist" style="width: 100%; margin-bottom: 20px; padding: 8px; border: 1px solid #ccc; border-radius: 4px;">
          <br>
          <button id="saveSettings" style="margin-bottom: 10px; padding: 8px 16px; background-color: #008CBA; color: white; border: none; border-radius: 4px;">保存设置</button>
        </div>
    `;
    document.body.appendChild(panel);

    document.getElementById("togglePanel").addEventListener("click", () => {
      const panelContent = document.getElementById("panelContent");
      panelContent.style.display =
        panelContent.style.display === "none" ? "block" : "none";
    });

    // Load saved settings
    loadSettings();

    // Add save settings functionality
    document.getElementById("saveSettings").addEventListener("click", saveSettings);

    // ... (rest of the existing code remains unchanged)
  }

  function loadSettings() {
    const settings = JSON.parse(localStorage.getItem("bossZhipinSettings") || "{}");
    document.getElementById("blacklist").value = settings.blacklist || "字节跳动,北京,猎头,老师,信息安全";
    document.getElementById("minSalary").value = settings.minSalary || "10";
    document.getElementById("skipInactiveBoss").checked = settings.skipInactiveBoss !== false;
    document.getElementById("customGreeting").value = settings.customGreeting || "您好,岗位还在招人吗";
    document.getElementById("useGPT").checked = settings.useGPT || false;
    document.getElementById("gptBaseUrl").value = settings.gptBaseUrl || "https://xxxx/v1/chat/completions";
    document.getElementById("gptApiKey").value = settings.gptApiKey || "sk-xxx";
    document.getElementById("whitelist").value = settings.whitelist || "开发";
  }

  function saveSettings() {
    const settings = {
      blacklist: document.getElementById("blacklist").value,
      minSalary: document.getElementById("minSalary").value,
      skipInactiveBoss: document.getElementById("skipInactiveBoss").checked,
      customGreeting: document.getElementById("customGreeting").value,
      useGPT: document.getElementById("useGPT").checked,
      gptBaseUrl: document.getElementById("gptBaseUrl").value,
      gptApiKey: document.getElementById("gptApiKey").value,
      whitelist: document.getElementById("whitelist").value,
    };
    localStorage.setItem("bossZhipinSettings", JSON.stringify(settings));
    alert("设置已保存");
  }

  // ... (rest of the existing code remains unchanged)
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址