Golang掘金自动签到工具实现

724 阅读2分钟

第一次发文,仅供学习,请勿用于不正当用途

使用技术

golang、cron(定时任务)、selenium(浏览器自动化)

实现思路

  • 登录掘金
  • 进入签到页面
  • 点击签到按钮
  • 点击去抽奖
  • 点击免费抽奖
  • 定时执行

登录掘金输入密码或者验证码登录时,需要滑动验证,所以需要使用selenium打开已经登录掘金的浏览器,并且保证session不丢失

使用selenium需要对应浏览器和驱动,在此我使用的是chorme浏览器和chromedriver

开发步骤

第一步:确认chrome浏览器版本

谷歌浏览器打开地址栏输入chrome://settings/help

image-20230505000934242

第二步:下载对应版本的chromedriver,如果没有对应的版本,就下载相近的版本

registry.npmmirror.com/binary.html…

image-20230505001344674

image-20230505001520835

第三步:打开一个chrome浏览器并监听端口

进入chrome的文件目录(右键谷歌浏览器图标,打开文件所在位置)

使用cmd命令行输入以下命令

chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenum\AutomationProfile"

在打开的浏览器中登录掘金账号

第四步:写代码

  1. 新建juejin-auto文件夹将chromedriver解压下来的exe文件放进去

  2. 打开终端初始化gomod文件

  3. 安装cron和selenium

    image-20230505004008042

  4. 编写main.go文件

    package main
    ​
    import (
        "fmt"
        "math/rand"
        "time"
    ​
        cron "github.com/robfig/cron/v3"
        "github.com/tebeka/selenium"
        "github.com/tebeka/selenium/chrome"
    )
    ​
    func main() {
        c := cron.New()
        c.AddFunc("30 9 * * *", autoCheckIn)
        c.Start()
        select {} // 因为定时任务是协程,所以在这里阻塞一下,防止程序直接退出
    }
    ​
    func autoCheckIn() {
        // 随机延时,防止每天同一时间签到检测
        randomSleep(600)
        ops := []selenium.ServiceOption{}
        s, _ := selenium.NewChromeDriverService("./chromedriver.exe", 1000, ops...)
        defer s.Stop()
        c := selenium.Capabilities{}
        var args []string
        args = append(args, "--remote-debugging-port=9222")                   // 监听9222端口
        args = append(args, "--user-data-dir=C:\selenum\AutomationProfile") // 设置浏览器数据文件目录,保证session、cookie不丢失
        c.AddChrome(chrome.Capabilities{
            Path: "C:\Program Files\Google\Chrome\Application\Chrome.exe",
            Args: args,
        })
        wd, err := selenium.NewRemote(c, "http://127.0.0.1:1000/wd/hub")
        if err != nil {
            fmt.Printf("err: %v\n", err)
        }
        defer wd.Quit()
        fmt.Println("---进入掘金抽奖页面---")
        err = wd.Get("https://juejin.cn/user/center/signin?avatar_menu")
        randomSleep(5)
        fmt.Println("---点击签到按钮---")
        we, err := wd.FindElement(selenium.ByCSSSelector, (".code-calender .signin"))
        we.Click()
        randomSleep(5)
    ​
        fmt.Println("---点击去抽奖---")
        we, _ = wd.FindElement(selenium.ByCSSSelector, (".btn-area .btn"))
        we.Click()
        randomSleep(5)
    ​
        fmt.Println("---点击免费抽奖---")
        we, _ = wd.FindElement(selenium.ByCSSSelector, (".cost-box #turntable-item-0"))
        we.Click()
        randomSleep(5)
    ​
        fmt.Println("---点击收下奖励---")
        we, _ = wd.FindElement(selenium.ByCSSSelector, (".byte-modal__body .wrapper .submit"))
        we.Click()
        randomSleep(5)
    ​
        fmt.Println("---收下奖励后去百度,避免长时间停留页面检测(猜的)---")
        wd.Get("https://www.baidu.com")
    }
    ​
    func randomSleep(n int) {
        rand.Seed(time.Now().UnixNano()) // 设置随机数种子
        delay := rand.Intn(n) + 3        // 随机延时秒数
        time.Sleep(time.Second * time.Duration(delay))
        fmt.Println("延时了", delay+3, "秒")
    }
    ​
    
  5. 运行程序

    go run main.go
    

    image-20230505005013291

搞定!!