第一次发文,仅供学习,请勿用于不正当用途
使用技术
golang、cron(定时任务)、selenium(浏览器自动化)
实现思路
- 登录掘金
- 进入签到页面
- 点击签到按钮
- 点击去抽奖
- 点击免费抽奖
- 定时执行
登录掘金输入密码或者验证码登录时,需要滑动验证,所以需要使用selenium打开已经登录掘金的浏览器,并且保证session不丢失
使用selenium需要对应浏览器和驱动,在此我使用的是chorme浏览器和chromedriver
开发步骤
第一步:确认chrome浏览器版本
谷歌浏览器打开地址栏输入chrome://settings/help
第二步:下载对应版本的chromedriver,如果没有对应的版本,就下载相近的版本
registry.npmmirror.com/binary.html…
第三步:打开一个chrome浏览器并监听端口
进入chrome的文件目录(右键谷歌浏览器图标,打开文件所在位置)
使用cmd命令行输入以下命令
chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenum\AutomationProfile"
在打开的浏览器中登录掘金账号
第四步:写代码
-
新建juejin-auto文件夹将chromedriver解压下来的exe文件放进去
-
打开终端初始化gomod文件
-
安装cron和selenium
-
编写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, "秒") } -
运行程序
go run main.go
搞定!!