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

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

分析页面


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

获取登录状态

  • 签到总要知道是哪个用户签的嘛,所以所有的请求都要带上用户登录标识,也就是在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点签到,签到失败发邮箱提醒。直接打包扔服务器上大功告成~




相关文章
|
1月前
|
运维 Linux Apache
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
51 3
|
1月前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
52 4
|
1月前
|
运维 Linux Apache
Puppet这一强大的自动化运维工具,涵盖其基本概念、安装配置及使用示例
【10月更文挑战第8天】本文介绍了Puppet这一强大的自动化运维工具,涵盖其基本概念、安装配置及使用示例。Puppet通过定义资源状态和关系,确保系统配置始终如一,支持高效管理基础设施。文章详细讲解了Puppet的安装步骤、配置方法及DSL语言示例,帮助读者快速掌握Puppet的使用技巧。
61 2
|
1月前
|
监控 虚拟化 云计算
从物理到云:使用自动化工具简化服务器迁移流程
【10月更文挑战第4天】随着云计算的快速发展,越来越多的企业选择将物理服务器迁移到云环境以提高效率和降低成本。本文详细介绍了使用自动化工具简化从物理到云的服务器迁移流程的技术实现细节,并提供了代码示例。
111 6
|
5天前
|
安全 前端开发 测试技术
如何选择合适的自动化安全测试工具
选择合适的自动化安全测试工具需考虑多个因素,包括项目需求、测试目标、系统类型和技术栈,工具的功能特性、市场评价、成本和许可,以及集成性、误报率、社区支持、易用性和安全性。综合评估这些因素,可确保所选工具满足项目需求和团队能力。
|
6天前
|
运维 Ubuntu 应用服务中间件
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
27 4
|
8天前
|
运维 监控 数据安全/隐私保护
自动化运维工具的设计与实现
【10月更文挑战第34天】在现代IT基础设施管理中,自动化运维工具扮演着至关重要的角色。它们不仅提高了运维效率,还确保了服务的连续性和稳定性。本文将深入探讨如何设计并实现一个自动化运维工具,从需求分析到功能实现,再到最终的测试与部署。我们将通过一个简单的代码示例来展示如何自动执行常见的运维任务,如日志清理和性能监控。文章旨在为读者提供一套完整的方法论,以便他们能够构建自己的自动化运维解决方案。
|
1月前
|
运维 关系型数据库 MySQL
自动化运维工具Ansible的实战应用
【10月更文挑战第9天】在现代IT运维领域,效率和可靠性是衡量一个系统是否健康的重要指标。自动化运维工具Ansible因其简洁、易用的特性,成为了众多企业和开发者的首选。本文将通过实际案例,展示如何利用Ansible进行日常的运维任务,包括配置管理、软件部署以及批量操作等,帮助读者深入理解Ansible的应用场景及其带来的效益。
|
1月前
|
人工智能 运维 监控
自动化运维:从脚本到工具的演变之路
【10月更文挑战第8天】在数字化时代的浪潮中,运维不再是简单的硬件维护,它已经演变成一场关于效率、稳定性和创新的技术革命。本文将带您领略自动化运维的魅力,从最初的脚本编写到现代复杂的自动化工具,我们将一探究竟,看看这些工具如何帮助运维人员简化日常任务,提升工作效率,并最终推动业务发展。
|
1月前
|
机器学习/深度学习 运维 监控
提升运维效率:自动化工具与实践的融合
【10月更文挑战第3天】 在当今信息技术迅猛发展的时代,运维作为保持系统稳定性和性能的关键角色变得越来越重要。本文将探讨如何通过结合自动化工具和最佳实践来优化运维流程,实现高效、可靠的运维管理。从基础监控到高级自动化,我们将一步步引导您了解如何搭建和维护一个高效的运维体系。
35 3