【掘金自动签到】有手就行的自动化签到工具

简介: 掘金社区签到拿矿石能兑换礼品,每天签到又怕遗忘,搞个脚本每天自动签到岂不美哉~

分析页面


首先所有的自动化都是拟人操作,只需要模拟出正常的签到步骤并定时重复即可满足需求。

获取登录状态

  • 签到总要知道是哪个用户签的嘛,所以所有的请求都要带上用户登录标识,也就是在header中添加对应的cookie
  • 如何获取cookie呢,这里看了下掘金的登录请求还比较麻烦,对熟悉爬虫的同学可能小菜一碟,对后端来说虽然能做但是本着投入时间与收益的原则,我毅然决然的选择绕过登录,直接拦截请求把request header的cookie复制出来。
  • image.png

处理cookie失效

  • 没有登录逻辑的话等cookie失效签到请求会返回请登录,这里话通过邮箱提醒更换cookie也是可以接受的

处理https请求

  • 随便从网上找一个http方法即可

落地方案

为了快速满足直接用最熟悉的Java+SpringBoot撸出来个jar包,打开IDEA创建SpringBoot脚手架

创建脚手架

pom里直接引入springboot-web、springboot-mail、lombok、fastjson,版本管理直接继承下spring-boot-dependencies。

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.4.3</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.41</version></dependency></dependencies>

启动类上添加@EnableScheduling注解开启定时任务

@EnableScheduling@SpringBootApplicationpublicclassSignApplication {
publicstaticvoidmain(String[] args) {
SpringApplication.run(SignApplication.class, args);
    }
}

整体的骨架就这么简单。


通用http方法

publicstaticStringcommonReuqest(Stringurl, Stringmethod, Stringcookie) throwsException {
URLserverUrl=newURL(url);
HttpURLConnectionconn= (HttpURLConnection) serverUrl.openConnection();
conn.setRequestMethod(method);
conn.setRequestProperty("Content-type", "application/json");
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36");
conn.setRequestProperty("Cookie", cookie);
//必须设置false,否则会自动redirect到重定向后的地址conn.setInstanceFollowRedirects(false);
conn.connect();
Stringresult=getReturn(conn);
returnresult;
    }
/*请求url获取返回的内容*/publicstaticStringgetReturn(HttpURLConnectionconnection) throwsIOException {
StringBufferbuffer=newStringBuffer();
//将返回的输入流转换成字符串try (InputStreaminputStream=connection.getInputStream();
InputStreamReaderinputStreamReader=newInputStreamReader(inputStream);
BufferedReaderbufferedReader=newBufferedReader(inputStreamReader);) {
Stringstr=null;
while ((str=bufferedReader.readLine()) !=null) {
buffer.append(str);
            }
Stringresult=buffer.toString();
returnresult;
        }
    }

封装成一个util类,入口加上cookie即可。


邮箱逻辑

spring:
mail:
host: smtp.qq.com#发送者邮箱username: 
#申请到的授权码password: 
#端口号465或587port: 587#默认的邮件编码为UTF-8default-encoding: UTF-8#其他参数properties:
mail:
#配置SSL加密工厂smtp:
ssl:
#本地测试,先放开sslenable: falserequired: false#开启debug模式,这样邮件发送过程的日志会在控制台打印出来,方便排查错误debug: true
  • 邮箱业务类
@Service@Slf4jpublicclassSendMailServiceImplimplementsSendMailService {
@AutowiredprivateJavaMailSenderjavaMailSender;
@Value("${spring.mail.username}")
privateStringsendMailer;
publicvoidcheckMail(MailRequestmailRequest) {
Assert.notNull(mailRequest,"邮件请求不能为空");
Assert.notNull(mailRequest.getSendTo(), "邮件收件人不能为空");
Assert.notNull(mailRequest.getSubject(), "邮件主题不能为空");
Assert.notNull(mailRequest.getText(), "邮件收件人不能为空");
    }
@OverridepublicvoidsendMail(MailRequestmailRequest) {
SimpleMailMessagemessage=newSimpleMailMessage();
checkMail(mailRequest);
//邮件发件人message.setFrom(sendMailer);
//邮件收件人 1或多个message.setTo(mailRequest.getSendTo().split(","));
//邮件主题message.setSubject(mailRequest.getSubject());
//邮件内容message.setText(mailRequest.getText());
//邮件发送时间message.setSentDate(newDate());
//        JavaMailSender javaMailSender = new JavaMailSenderImpl();javaMailSender.send(message);
log.info("发送邮件成功:{}->{}",sendMailer,mailRequest.getSendTo());
    }
}

JavaMailSender为spring-boot-starter-mail依赖中封装好的业务类,yml中添加对应的配置该类会被注入到容器中。



签到请求

@Slf4j@ServicepublicclassActionService {
//签到publicstaticfinalStringCHECK_IN="https://api.juejin.cn/growth_api/v1/check_in";
//抽奖publicstaticfinalStringDRAW="https://api.juejin.cn/growth_api/v1/lottery/draw";
@Value("${spring.mail.username}")
privateStringusername;
@AutowiredSendMailServicesendMailService;
/*** 签到*/publicvoidcheckIn(Stringcookie) throwsException {
Stringresponse=BaseRequest.commonReuqest(CHECK_IN, "POST", cookie);
log.info("get result from juejin {}", response);
Map<String, Object>resultMap=JSONObject.parseObject(response, Map.class);
if((Integer) resultMap.get("err_no") !=0){
log.error((String) resultMap.get("err_msg"));
// 推送失败消息MailRequestmailRequest=newMailRequest();
mailRequest.setText("掘金签到失败!err_msg: "+resultMap.get("err_msg"));
mailRequest.setSendTo(username);
mailRequest.setSubject("juejin sign");
sendMailService.sendMail(mailRequest);
        }
    }
/*** 抽奖*/publicvoiddraw(Stringcookie) throwsException {
Stringresponse=BaseRequest.commonReuqest(DRAW, "POST", cookie);
DrawResponcedata=JSON.parseObject(response,newTypeReference<DrawResponce>(){});
log.info(response);
    }
}

签到请求和抽奖请求都很简单没有参数,带上cookie发一下矿石就到账了,每天第一次抽奖不花矿石,默认第一次抽一下。签到成功就不发邮箱了发多了烦,签到失败会把失败原因发送到配置的邮箱内。


定时任务

@Slf4j@Componentpublicclasstask {
@Value("${uptown.cookie}")
Stringcookie;
@ResourceActionServiceactionService;
@Scheduled(cron="0 0 5 * * ?")
publicvoidrun() throwsException {
log.info("{} start!", newSimpleDateFormat("yyyy-MM-dd").format(newDate()));
this.actionService.checkIn(cookie);
// 第一次免费抽奖this.actionService.draw(cookie);
    }
}

最后加上定时任务就完事了,每天5点签到,签到失败发邮箱提醒。直接打包扔服务器上大功告成~




相关文章
|
16天前
|
敏捷开发
【sgCreatePinyin】自定义小工具:敏捷开发→自动化生成拼音字段名称(字段名生成工具)
【sgCreatePinyin】自定义小工具:敏捷开发→自动化生成拼音字段名称(字段名生成工具)
|
1月前
|
移动开发 安全 数据安全/隐私保护
iOS 全局自动化代码混淆工具!支持 cocoapod 组件代码一并混淆
iOS 全局自动化代码混淆工具!支持 cocoapod 组件代码一并混淆
|
1月前
|
Web App开发 前端开发 测试技术
探索自动化测试工具:Selenium的威力与应用
探索自动化测试工具:Selenium的威力与应用
探索自动化测试工具:Selenium的威力与应用
|
2月前
|
Web App开发 人工智能 自然语言处理
【人工智能时代】AI赋能编程 | 自动化工具助力高效办公
【人工智能时代】AI赋能编程 | 自动化工具助力高效办公
【人工智能时代】AI赋能编程 | 自动化工具助力高效办公
|
1月前
|
测试技术
现代软件测试中的自动化工具与挑战
传统软件测试面临着越来越复杂的系统架构和不断增长的测试需求,自动化测试工具应运而生。本文将探讨现代软件测试中自动化工具的应用和挑战,深入分析其优势与局限性,为软件测试领域的发展提供思路和启示。
|
30天前
|
jenkins 测试技术 持续交付
现代软件测试中的自动化工具与挑战
随着软件开发领域的不断发展,自动化测试工具在测试过程中扮演着越来越重要的角色。本文将探讨现代软件测试中自动化工具的应用及面临的挑战,旨在帮助开发人员和测试人员更好地理解和应对自动化测试中的问题。
|
3月前
|
Web App开发 前端开发 测试技术
如何对自动化工具选型?
如何对自动化工具选型?
|
1天前
|
存储 运维 Shell
Ansible自动化运维工具安装和基本使用
Ansible 是一款无代理的IT自动化工具,通过SSH连接目标主机执行配置管理、应用部署和云端管理任务。它使用YAML编写的Playbook定义任务,核心组件包括Playbook、模块、主机清单、变量等。Ansible的优势在于易用、功能强大、无须在目标主机安装额外软件,并且开源。安装过程涉及配置网络源、yum安装和SSH密钥设置。通过定义主机清单和使用模块进行通信测试,确保连接成功。
Ansible自动化运维工具安装和基本使用
|
16天前
|
敏捷开发
【sgCreateTableData】自定义小工具:敏捷开发→自动化生成表格数据数组[基于el-table]
【sgCreateTableData】自定义小工具:敏捷开发→自动化生成表格数据数组[基于el-table]
|
23天前
|
Java 测试技术 API
软件测试中的自动化工具与策略
软件测试是确保软件质量的重要环节,而自动化测试工具和策略的应用在提高测试效率和准确性方面发挥着重要作用。本文将介绍几种常见的自动化测试工具,并探讨在软件测试中应用自动化测试的最佳实践和策略。

热门文章

最新文章