Greasy Fork is available in English.

拉勾网职位隐藏脚本

隐藏拉勾网职位搜索列表的指定职位或公司

// ==UserScript==
// @name         拉勾网职位隐藏脚本
// @namespace    https://greasyfork.org/zh-CN/scripts/388495-%E6%8B%89%E5%8B%BE%E7%BD%91%E8%81%8C%E4%BD%8D%E9%9A%90%E8%97%8F%E8%84%9A%E6%9C%AC
// @version      0.2
// @description  隐藏拉勾网职位搜索列表的指定职位或公司
// @author       lyswhut
// @match        https://www.lagou.com/jobs/list_*
// @run-at       document-start
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    window.__tools__ = {
        hideCompany: [],
        hidePosition: [],
        jq: null,
        lgAjax: null,
        list: [],

        // 代理拉勾ajax
        proxyLgajax(options) {
            if (options.url.includes('positionAjax')) {
                options.success = window.__tools__.proxySuccess(options.success)
            }
            return window.__tools__.lgAjax(options)
        },

        // 代理响应成功函数
        proxySuccess(fn) {
            return function (data, textStatus, jqXHR) {
                window.__tools__.filterData(data)
                fn(data, textStatus, jqXHR)
            }
        },

        // 过滤职位
        filterData(data) {
            if (!data.content.positionResult.result.length) return
            let result = data.content.positionResult.result
            const filterList = []
            result = result
                .filter(p => this.hideCompany.find(i => i.companyId === p.companyId) ? !filterList.push(p) : true)
                .filter(p => this.hidePosition.find(i => i.positionId === p.positionId) ? !filterList.push(p) : true)
            data.content.positionResult.result = this.list = result
            console.log('本次已过滤的职位为:')
            console.log(filterList
                        .map(i => `${i.companyFullName} - ${i.positionName} - ${i.salary} - ${i.companySize}`)
                        .join('\n') || '空')
        },

        // 隐藏公司
        addHideCompany(dom_btn, index) {
            const item = this.list[index]
            if (!item) return
            if (this.hideCompany.find(i => i.companyId === item.companyId)) return
            this.hideCompany.push(item)
            this.saveData()
            this.removeDomLi(dom_btn)
        },

        // 隐藏职位
        addHidePosition(dom_btn, index) {
            const item = this.list[index]
            if (!item) return
            if (this.hideCompany.find(i => i.positionId === item.positionId)) return
            this.hidePosition.push(item)
            this.saveData()
            this.removeDomLi(dom_btn)
        },

        // 从dom列表中移除隐藏的职位
        removeDomLi(dom_btn) {
            let dom_li = dom_btn.parentNode.parentNode
            if (dom_li.tagName != 'LI') return
            dom_li.parentNode.removeChild(dom_li)
        },

        // 模板注入
        injectTemplate() {
            let t = document.getElementById('tpl-position-list')
            if (!t) throw new Error('找不到模板')
            const btn = `<div style="position: absolute; right: 0; top: 0;">
<button style="padding: 3px 5px; background: rgba(230,230,230, .8);" onclick="__tools__.addHidePosition(this, {{i}})">隐藏该职位</button>
<button style="padding: 3px 5px; background: rgba(230,230,230, .8);" onclick="__tools__.addHideCompany(this, {{i}})">隐藏该公司</button>
</div>`
            t.innerHTML = t.innerHTML.replace('</li>', btn + '</li>')
        },

        // 保存数据
        saveData() {
            localStorage.setItem(
                '__lgTools__',
                JSON.stringify({
                    hideCompany: this.hideCompany,
                    hidePosition: this.hidePosition,
                })
            )
        },

        // hook jQuery
        hookJQuery() {
            Object.defineProperty(window, 'jQuery', {
                set: v => {
                    this.jq = v
                    this.hookLgajax()
                },
                get: () => {
                    return this.jq
                },
            })
        },

        // hook拉勾ajax
        hookLgajax() {
            Object.defineProperty(this.jq, 'lgAjax', {
                set: v => {
                    this.lgAjax = v
                },
                get: () => {
                    return this.proxyLgajax
                },
            })
        },

        // 初始化
        init() {
            this.hookJQuery()
            document.addEventListener('DOMContentLoaded', () => {
                this.injectTemplate()
            })
            let list = localStorage.getItem('__lgTools__')
            if (!list) return
            list = JSON.parse(list)
            this.hideCompany = list.hideCompany
            this.hidePosition = list.hidePosition
        },
    }
    window.__tools__.init()
})();