👍天下苦“手动”久矣,我要“全自动”——自动签到抽奖、及消息查看🔥

429 阅读4分钟

🔴 前言

🔻 自动化普及

装修房子要“自动家居”,包括窗帘要自动开关、扫地不用人工扫、洗碗不用我来洗...。同样,我们作为搬砖人,希望更多的是工具或者智能机器智能流程来省去频繁的手动人工的重复操作,能循环写绝不一个个来,能少写优雅写绝不整个篇幅写,现如今有一些东西来帮助我们自动操作。

所以说,天下人苦"频繁重复 手动人工"久矣,我要“自动”

🔻 自动化工具

手机端:

  • 1.有“按键精灵”-记录你的一些操作,下次自动帮你操作那一套流程。
  • 2.有"[auto.js、auto.js Pro]"-安卓手机上的Javascript自动化工具。
  • 3.有“Tasker”-安卓自动化应用程序。
  • 4.有“Automate”-在手机或者电脑上自动执行重复性任务。
  • 5.有"MacroDroid"-安卓自动化应用程序。
  • 6.有"Appium"-UI自动化应用程序平台,包括移动(ios、android),浏览器(chrome、firefox)等等。

电脑端

  • 1.有“robotjs”-node.js桌面自动化。
  • 2.有"pyautogui-面向人类的跨平台 GUI 自动化 Python 模块。用于以编程方式控制鼠标和键盘。“
  • 3.有"浏览器端的油猴,可放谷歌、可放火狐浏览器-JavaScript脚本“
  • ...等等,有很多自动化工具,真的一搜就有,我用过的觉得涵盖了很多鼠标ui操作的,上面👆这两个对目前我的需求来讲很多都够了。一些验证码自动验证模块这些自己去github或gitee上搜一下,不一一细细罗列了。

本文要点

那么这里着重讲一下,用油猴脚本来自动为自己的掘金账号,自动签到自动抽一次免费奖自动完成所有红点标信息

🔴 元素定位操作

一开始是直接用jq的定位去搞这些元素的,比如说 自动签到啊、自动抽一次免费奖啊、自动检查红色标点信息啊

🔻 掘金的自动签到抽奖

// 监听路由地址的变化
window.addEventListener('popstate', function () {
    // 地址变化了 调用urlReload()
    urlReload()
})

// 在哪个页面做哪个事
function urlReload() {
    // 获取当前窗口的URL地址
    const currentURL = window.location.href
    
    // 一般进入的是https://juejin.cn/这个页面
    if (currentURL === 'https://juejin.cn/') {
        // ... (在这里找元素做点击操作)
        
        const signed = $('.signedin-btn') // 已签到
        const signin = $('.signin-btn') // 未签到
        
        // 这里表示已经签到了 接着就可以去看消息列表了
        if (signed.length) checkRedCount()
        
        // 这里表示还没签到 先去签到页面
        if (signin.length) signin[0].click()
    }
 
     // ...还有其他页面,接着下面看👀
   
}

顺便说一下,由于掘金网站没有引入jq,那么获取元素,你可以写原生,但我一般用jq获取元素或者jq的ajax请求接口,那么油猴是这样引入的,代码如下:

image.png

注意:这里引入什么cdn,如果下文中需要用到的话,最好在最后一句这里👉写上/* globals jQuery, $ */。因为全文我通篇都需要用的$('元素')这样的写法去点击一些按钮一些文本的,如果不写上就会报警告。

签到页面:

if (currentURL.indexOf('https://juejin.cn/user/center/signin') !== -1) {
    const clickSigninNow = $('.signin-containerm .signin.btn')
    if (clickSigninNow.length) {
        // 点击签到
        clickSigninNow[0].click()

        // 检验那一次免费抽奖
        checkLottery()
    }
}

抽奖页面:

// 抽奖页面
if (currentURL.indexOf('https://juejin.cn/user/center/lottery') !== -1) {
    // 检验抽奖
    checkFreeLottery()
}

// 点击免费抽一次奖
function checkFreeLottery () {
    // 看看有没有那一次免费抽奖的机会
    checkElementAndClick('.lottery .text-free', function (element) {
        element.click()

        // 这个抽完,还要点获取才能是我们的
        checkGetCoin()
    })
}

// 抽完那一次奖后,得到的币收回来
function checkGetCoin () {
    checkElementAndClick('.byte-modal__body .wrapper .submit', function (element) {
        element.click()
    })
}

这里值得一提的是,抽了一个方法去等元素回来,得到了就点,得不到就作罢:

checkElementAndClick

function checkElementAndClick (selector, clickCallback) {
    let count = 0;
    const interval = setInterval(() => {
        count++
        if (count >= 3) {
            clearInterval(interval)
            return
        }

        const elements = $(selector)
        if (elements.length) {
            clearInterval(interval)
            clickCallback(elements[0])
            console.log('点击了')
        }
    })
}

🔻 掘金的消除消息标记

// 检查消息红点
function checkRedCount () {
    // 点击去消息页面
    checkElementAndClick('.main-header-box .notification .count', function (element){
        $('.notification-a')[0].click()
    })
}

在消息页面

// 在消息页面
if (currentURL === 'https://juejin.cn/notification') {
    // 每个元素都点一遍
    $('.nav-list .nav-item .unread-count').each(function() {
        const unreadElement = $(this)
        unreadElement.click()
    });
}

效果如下,全部开着油猴自动点完

image.png

至此根据元素自动点击的完毕。接下来就是看接口的了,接口的比较好点,就单纯请求接口就完事(我个人觉得)。


🔴 调用接口操作

🔻 掘金的自动签到抽奖

签到

function signIn () {
    // 签到接口
    $.ajax({
        url: `/growth_api/v1/check_in`,
        type: 'POST',
        data: JSON.stringify({
            aid: 'xxx',
            uuid: 'xxx',
            spider: 0
        }),
        contentType: 'application/json',
        dataType: 'json',
        // 这个xhrFields有点重要,带上去就是有cookies值的,就是跨域请求,跟携带数据过去的,没有,全篇都不用搞了,行不通。
        xhrFields: {
            withCredentials: true
        },
        success: function(data) {
            // 处理成功的响应
            console.log('data', data.err_msg, data)
        },
        error: function(xhr, status, error) {
            // 处理失败的响应
            console.error(error);
        }
    });
}

注意: 这里最重要的就是xhrFields这个玩意,带上它,畅通无阻,抛弃它,不用玩了。

xhrFields这个选项呢,允许我们设置一些ajax请求行为,比如,withCredentialstrue,代表着,既能跨域,又能携带杂七杂八的凭据(token啊\cookies啊\http认证啊\tls客户端证书什么的)

🔻 掘金的消除消息标记

async function setAllRead (val) {
    const id = await lastId(val) // 获取最后的那个消息id的

    $.ajax({
        url: `https://api.juejin.cn/interact_api/v1/message/set_all_read`,
        type: 'POST',
        data: JSON.stringify({
            message_type: Number(val),
            latest_id: id
        }),
        contentType: 'application/json',
        dataType: 'json',
        xhrFields: {
            withCredentials: true
        },
        success: function(data) {
            console.log('data', data.err_msg, data)
        },
        error: function(xhr, status, error) {
            console.error(error);
        }
    });
}

// 🙅‍♂️ 不多贴代码了,无非就是各种请求...

油猴不难,无非就是找元素,新加元素,请求接口,操作界面等等...


🔴 总结

很多时候我们都很不喜欢自己手动去做一些繁琐重复的操作,甚至到很多人找我微信聊天,我都觉得要不群发算了(可奈何不同人的消息又针对不同场景不同需求的),这就需要”自动聊天机器人🤖“去帮我完成这么一个操作流程。

无论在开发中还是个人生活中,我尽量希望做到有高效点有规律点,毕竟人生短短3万天(82年)(或许都活不到那个岁数...😅苦笑:))...除非是想锻炼肌肉线条,身体耐受力等等,要不然还是会遵从”工具是人类智慧的结晶“这么一说,用好且善用工具,确实会事半功倍。

题外话: 快到2024年了,㊗各位有钱有闲有滋味🥂!