Greasy Fork

Greasy Fork is available in English.

掘金日常操作

后台判断自动签到;抽奖;一键全赞

当前为 2021-12-06 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         掘金日常操作
// @version      2.4.3
// @description  后台判断自动签到;抽奖;一键全赞
// @match        https://juejin.cn/**
// @run-at       document-end
// @icon         https://img2.baidu.com/it/u=4226010475,2406859093&fm=26&fmt=auto
// @require      https://code.jquery.com/jquery-3.1.1.min.js
// @namespace    http://greasyfork.icu/users/823922
// @grant        GM.registerMenuCommand
// ==/UserScript==
{
    // aid 写死实测发现没大问题,有问题在自己换吧;uuid 不确定干嘛的,给个随机数拉到
    function createUUID() {
        return '7' + parseInt(Math.random() * (10 ** 9)) + '' + parseInt(Math.random() * (10 ** 9));
    }

    function userInfo() {
        return 'aid=2608&uuid=' + createUUID();
    }
    var run = (function() { // 用于处理,页面内点击时,异步刷新页面
        let clickTime;

        function once() {
            clearTimeout(clickTime);
            clickTime = setTimeout(() => {
                let sysDate = unsafeWindow.localStorage.juejinDayTask;
                if (sysDate == null || sysDate != currDate()) {
                    dayTask();
                }
                let $menu = $('.nav-list>.main-nav-list>ul');
                if ($('#ou-chi-mao').length > 0) return;
                // 当发现页面元素变化时,重写渲染,并绑定元素
                $menu.find('li:gt(4)').remove();
                $menu.find('li:last>a').attr({
                    'id': 'ou-chi-mao',
                    'href': 'javascript:void(0);',
                }).css({
                    'color': '#03f9',
                    // 'font-family': 'serif',
                    'font-weight': 'bolder'
                }).text('血统鉴定');
                // 通过 html 删除,再添加的方式,移除这个按钮上的绑定事件
                let html = $('#ou-chi-mao').parent().prop('outerHTML');
                $('#ou-chi-mao').parent().remove();
                $menu.append(html);
                $('#ou-chi-mao').click(function() {
                    choujiang();
                    console.log('false')
                    return false;
                })

            }, 500)

        };
        return {
            once: once,
        }
    })();

    // init
    unsafeWindow.$ = $;
    run.once();
    // 检查是否有未确认的中奖通知
    if ((unsafeWindow.localStorage.luckyGay || '') != '') {
        tipLuckyGay();
    }

    function choujiang() {
        console.log('调用抽奖函数');
        let obj = {};
        let flag = true;
        simpleDialog.open();
        new Promise((resolve, reject) => {
            call();

            function call() {
                fetch(`https://api.juejin.cn/growth_api/v1/lottery/draw?${userInfo()}`, httpConfig).then(resp => resp.json()).then(data => {
                    if (data.err_msg != 'success') {
                        resolve();
                        return;
                    }
                    let name = data.data.lottery_name;
                    console.log(name);
                    simpleDialog.addRecord(name)
                    obj[name] = obj[name] || 0;
                    obj[name] = obj[name] + 1;
                    setTimeout(() => call(), parseInt(Math.random() * 1500) + 300);
                    if (['66矿石', 'Bug'].indexOf(data.data.lottery_name) == -1) {
                        unsafeWindow.localStorage.luckyGay += ('\n' + name);
                    }
                })
            }
        }).then(data => {
            let keys = Object.keys(obj);
            simpleDialog.empty();
            let msg = keys.length > 0 ? keys.map(k => k + ': ' + obj[k]).join('<br>') : '抽奖次数不足!';
            simpleDialog.addRecord(msg);
            simpleDialog.close();
        })
        return false;
    }

    async function dayTask() {
        console.log('调用日活函数')
        // return false;
        let msgs = [];
        let freeLottery = true;
        let bigLottery = false; // 超级大奖
        // 签到
        await fetch(
            `https://api.juejin.cn/growth_api/v1/check_in?${userInfo()}&_signature=_02B4Z6wo00101q966EAAAIDCL3gSAGCq5SKvfuzAAMrJs3JkiZSLejXKJy5lR-3Rot9hYdZVnmHKrdQPh0MmwDCQsjT9tEIN0G3uIK8RsU7pcEznZ9.oqqfseed8PMV.rul6lxG-dkqFtwsq61`,
            httpConfig).then(resp => resp.json()).then(data => {
            if (data.err_msg == 'success') {
                msgs.push('签到成功!');
            } else {
                freeLottery = false;
                msgs.push(data.err_msg);
                unsafeWindow.localStorage.juejinDayTask = currDate();
            }
            console.log(data);
        });
        if (!freeLottery) return false; // 没有免费抽奖就退出
        await fetch(`https://api.juejin.cn/growth_api/v1/lottery/draw?${userInfo()}`, httpConfig).then(resp => resp.json()).then(data => {
            if (data.err_msg == 'success') {
                msgs.push(`获得奖品 ${data.data.lottery_name}`);
            }
            if (['66矿石', 'Bug'].indexOf(data.data.lottery_name) == -1) { // 特地标记中奖了!
                bigLottery = true;
                unsafeWindow.localStorage.luckyGay = `获得奖品 ${data.data.lottery_name}`;
            }
            console.log(data);
        });
        simpleDialog.open();
        simpleDialog.addRecord(msgs.join('<br>'));
        simpleDialog.close(1200);
        if (bigLottery) {
            tipLuckyGay();
        }
    }

    function tipLuckyGay() {
        // 缓存写入中奖信息,等手动确认了再清空
        if (confirm('请确认已经知道中奖!\n\n' + unsafeWindow.localStorage.luckyGay)) {
            unsafeWindow.localStorage.removeItem('luckyGay')
        }
    }

    function currDate() {
        let date = new Date();
        return [date.getFullYear(), date.getMonth() + 1, date.getDate()].join('-');
    }
    var httpConfig = {
        "headers": {
            "accept": "*/*",
            "accept-language": "zh-CN,zh;q=0.9",
            "content-type": "application/json",
            "sec-ch-ua": "\"Chromium\";v=\"94\", \"Google Chrome\";v=\"94\", \";Not A Brand\";v=\"99\"",
            "sec-ch-ua-mobile": "?0",
            "sec-ch-ua-platform": "\"Windows\"",
            "sec-fetch-dest": "empty",
            "sec-fetch-mode": "cors",
            "sec-fetch-site": "same-site"
        },
        "referrer": "https://juejin.cn/",
        "referrerPolicy": "strict-origin-when-cross-origin",
        "body": "{}",
        "method": "POST",
        "mode": "cors",
        "credentials": "include"
    };

    var simpleDialog = (function() { // 简易的弹窗效果
        return {
            open: () => {
                let html =
                    `<div id="lotteryResultDialog" style="position: absolute;z-index: 9999;width: 200px;height: 200px;left: calc(50vw - 100px);top: calc(30vh - 100px);
                           border-radius: 5px;padding: 10px;overflow: hidden;box-shadow:  0 0 7px 1px #f00a;background: #fffa;">
                           <div style="overflow: auto;width: 240px;height: 200px;"></div>
                        </div>
                        `;
                $('body').append(html);
            },
            addRecord: (msg) => {
                let html = `<div style="padding: 5px;font-size: 16px;display:none">${msg}</div>`;
                $('#lotteryResultDialog>div').prepend(html);
                $('#lotteryResultDialog>div>div:first').show(100).css({
                        'color': 'red'
                    })
                    .siblings().css({
                        'color': '#000'
                    })
            },
            close: (time = 1200) => {
                setTimeout(() => $('#lotteryResultDialog').slideUp(300, function() {
                    $('#lotteryResultDialog').remove()
                }), time)
            },
            empty: () => {
                $('#lotteryResultDialog>div').empty();
            }
        }
    })();
    unsafeWindow.simpleDialog = simpleDialog;
    // ------------------------------- 点赞 -------------------------------------------
    function myFetch(url, config) {
        return fetch(url, {
            "headers": {
                "accept": "*/*",
                "accept-language": "zh-CN,zh;q=0.9",
                "content-type": "application/json",
                "sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"96\", \"Google Chrome\";v=\"96\"",
                "sec-fetch-dest": "empty",
                "sec-fetch-mode": "cors",
                "sec-fetch-site": "same-site"
            },
            "referrer": "https://juejin.cn/",
            "referrerPolicy": "strict-origin-when-cross-origin",
            "body": config.body,
            "method": "POST",
            "mode": "cors",
            "credentials": "include"
        }).then(r => r.json());
    }
    // 文章获取
    function articleFetch(cursor) {
        return myFetch("https://api.juejin.cn/content_api/v1/article/query_list?" + userInfo(), {
            'body': JSON.stringify({
                user_id: getUserId(),
                sort_type: 2,
                cursor: cursor
            })
        });
    }
    // 点赞安排
    function diggFetch(articleId) {
        return myFetch("https://api.juejin.cn/interact_api/v1/digg/save?" + userInfo(), {
            'body': JSON.stringify({
                item_id: articleId,
                item_type: 2,
                client_type: 2608
            })
        });
    }

    // 判断文章的数量
    let arr = [];
    // 文章到底,或者连续 10 篇以点赞,就不继续遍历了
    function call(cursor = '0') {
        if (getUserId() == '') {
            alert('请到用户的主页,再执行此操作!')
            return false;
        }
        // console.log(cursor)
        articleFetch(cursor).then(d => {
            let temp = d.data.filter(n => !n.user_interact.is_digg).map(n => n.article_info.article_id);
            arr.push(...temp);
            if (d.count != parseInt(d.cursor) && temp.length > 0) {
                setTimeout(() => call(d.cursor), 100);
            } else {
                let msg = `共 ${arr.length} 篇文章点赞完成!`;

                function temp1() {
                    new Promise((resolve, reject) => {
                        if (arr.length == 0) {
                            reject();
                        } else {
                            resolve();
                        }
                    }).then(() => {
                        setTimeout(() => {
                            diggFetch(arr.pop());
                            temp1();
                        }, parseInt(Math.random() * 300) + 30)
                    }).catch(() => {
                        alert(msg);
                    })
                }
                temp1();

            }
        })
    }

    function getUserId() {
        let url = unsafeWindow.location.href;
        if (url.indexOf('https://juejin.cn/user/') == -1) {
            return '';
        } else {
            return url.split('/')[4];
        }
    }
    GM.registerMenuCommand('一键全赞', call)
}