我的小程序接口被刷爆了

自然流量的惊喜

      书接上文,凭着短视频的好奇,搭了个小程序,做了文案提取,配音等功能,也顺带写了两篇口水文章,不曾想居然收获历史最高的点赞与收藏。有兴趣的朋友可以点这里一看究尽:《短视频配音原来如此简单》,《短视频文案提取的简单实现》。做为一个食人间烟火的程序员,也偷偷的去看了数据,由于没抱太大的期望,自然流量给了我一个大大的惊喜,下图是没有任何推广的数据。我一度暗暗自喜,直到我上线了另一个小程序做对照组时,也就是上两个文章中提到的小程序,几乎没有自然流量,即使这个小程序功能更全,体验更好,所有用户都是从我的文章中关联而来的,没有自然流量。我瞬间明白了:论小程序取名的重要性。

告警呼啸而至

        小程序上线后,总于可以睡上安稳觉了。于是又开始早上6:30去学校带小朋友跑步了。跑了一年了,好几个小朋友算是跑上道了。跑得正酣畅淋漓之时,突然,企微告警群开始咚咚告警:resource pack exhausted! Please purchase resource packs... 30小时的资源包才买几天怎么就耗尽了呢。跑完步,在学校噌了早饭,小电驴儿一溜烟回家打开电脑,巴拉出访问日志,傻眼了。这样一个没名没份的小程序,居然有人在刷它的接口(大部分都是视频文案提取,原来还有这么多人在做短视频),心中顿感五味杂成,有人刷说明功能还不多,这样刷地主家也没有余粮了...

签名保驾护航

        既然来了,只能接招了。既然刷接口,那就对接口访问做一些校验。目前小程序只是提文案提取等功能,所以首先想到接口做个签名,防止别人使用程序自动刷。考虑小程序源码获取比较困难,签名字段根据sha1简单生成就可以了,未来如果这个也行不通,再使用RSA加密下sign字段就可以了。sign生成规则比较简单,timestamp,request,随机串,请求参数,排序 sha1就可以了。代码如下。

前端只需要在request中 生成签名,放到header里就行了。

function sign(json) {json.timestamp = getTimestamp();json.rand = mtRand(100000, 999999);json.appkey = app.globalData.secretKey;let valueArray = [];for (let key in json) {valueArray.push(json[key]);}valueArray.sort();let signStr = jsonVAL(valueArray);console.log("signStr", signStr);json.sign = sha1Util.sha1(signStr);delete json.appkey;return json;
}

后端也简单,根据一样的规则,一样的key,生成sign,对比前端的sign字段就可以了。自定义HandlerInterceptor,并注册到InterceptorRegistry中就。

代码如下;

/*** sign校验拦截器* @author JJ*/
@Slf4j
@Component
public class CheckSignInterceptor implements HandlerInterceptor {private static final String SecretKey = "*******";// 签名过期时间(s)private static final Integer TimestampOut = 300;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {RequestWrapper requestWrapper = new RequestWrapper(request);String body = requestWrapper.getBody();Result result = this.check(body);if (!result.getSuccess()) {log.info("签名失败:{}", body);// 设置状态码为401,表示未授权response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);// 设置响应内容类型和字符集response.setContentType("application/json;charset=UTF-8");// 自定义输出response.getWriter().write(JSONUtil.toJsonStr(result));// 返回false阻止后续处理return false;}return true;}/*** token校验* @param token* @return*/private Result check(String body) {JSONObject jsonObject = JSONUtil.parseObj(body);String sign = "";Long timestamp = 0L;// jsonObject 值输入有序列表。List<String> paramsValueList = new ArrayList<>();Set<Map.Entry<String, Object>> entries = jsonObject.entrySet();for (Map.Entry<String, Object> entry : entries) {String key = entry.getKey();Object value = entry.getValue();if (key.equals("sign")){sign = value.toString();continue;}if (key.equals("timestamp")){//如果时间戳为空if (Strings.isNullOrEmpty(value.toString())){return Result.failed(ErrorCodeEnum.ILLEGAL_ARGUMENT.code(), "时间戳不能为空");}timestamp = Long.parseLong(value.toString());}paramsValueList.add(value.toString());}paramsValueList.add(SecretKey);Collections.sort(paramsValueList);//判断时间是否大于5分钟if (System.currentTimeMillis()/1000 - timestamp > TimestampOut){//return Result.failed(ErrorCodeEnum.ILLEGAL_ARGUMENT.code(), "时间戳无效");}String signStr = "";for (String value : paramsValueList) {signStr += value;}log.info("signStr:{}", signStr);String sha1Str = SecureUtil.sha1(signStr);if (sha1Str.equals(sign)){return Result.success();}return Result.failed(ErrorCodeEnum.ILLEGAL_ARGUMENT.code(), "签名失败");}}
/*** @author JJ* @Classname InterceptorConfig*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {@ResourceCheckTokenInterceptor checkTokenInterceptor;@ResourceCheckSignInterceptor checkSignInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(checkSignInterceptor).order(1);}
}

以上代码基本都是copy的原有代码,没半天就上线了,自以为可以高枕无忧了。

啥也挡不住RPA

       上线后,购买了资源包,也提心吊胆的统计着使用量。过了办天,又有几个用户提取了超过70条视频的文案。我一度怀疑签名没生效,直到我看非常规律的调用,我知道了,RPA来了。之前公司买过一个叫影刀RPA软件,也玩了一些时间,编写过一些自动化任务。它可以模拟人操作行为,完成自动化任务,当然,我一直认为未来RPA会有更多业务场景,一些逻辑明确的重复的事,都会由它们来完成。难怪小程序数据里有不少是从pc打开的。我意识到我被薅羊毛了。

无奈只能限量了

       本着大家都有机会体验这个小程序的原则,无奈之下,只能给每人每日限量了,毕竟小程序没有收入。再本着能每个人都有极致体验的机会,我限制了每人每天每个功能30次。这下基本上都限制到了,但是看着那些个RPA机器人,一大早就毫无感情的把30次机会耗尽,于是又增加了按UserId配置额度的功能,优先级高于按功能分配的额度。一顿操作后,总算是基本控制住了。又心累又心喜。喜在小程序给部分人带来了价值,即便是用RPA的那些人也是有价值,虽然没有感情。累的是又不得不处理这些烦琐之事。

写在最后

最近短剧火了起来,就有不少人开始提取长视频的文案以及长视频去水印。考虑到微信保存视频时,有个200M的限制,又在考虑支持视频文件压缩功能了。跟本停不下来了,把写代码当成乐趣也是不错的一件事儿。

有兴趣的同学可以扫码体验下小程序(小程序名称正在申请修改名称,建议扫码)

小程序名称 :智能配音实用工具;

小程序二维码 : 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/810218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

B02、GC日志分析-案例演示-6.4

1、案例一&#xff1a;堆溢出演示 1.1、简单springboot项目创建 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:s…

立方变自身 蓝桥杯 java

题目 观察下面的现象,某个数字的立方&#xff0c;按位累加仍然等于自身。 1^3 1 8^3 512 5128 17^3 4913 491317 … 请你计算包括1,8,17在内&#xff0c;符合这个性质的正整数一共有多少个&#xff1f; 请填写该数字&#xff0c;不要填写任何多余的内容或说明性的文字。 答…

环形队列的简单理解

多次遇到环形队列的情况&#xff0c;记不住什么情况是队列满&#xff0c;什么情况是队列空。一直也没有理解透彻。 仔细研究了一下&#xff0c;掌握了一些原理&#xff0c;记录一下。 1. 环形队列有一个头指针head&#xff0c;一个为指针tail。有一个疑问&#xff1a;head和ta…

更换淘宝镜像地址,旧的已经失效(https://registry.npm.taobao.org )

旧的镜像地址&#xff1a;npm install --registryhttps://registry.npm.taobao.org 新的镜像地址&#xff1a;npm install --registryhttps://registry.npmmirror.com

【2024最新博客美化教程重置版】今天教你如何使用SimpleMemory美化你的博客,体会一下大神是如何装逼的!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 SimpleMemory …

代理与反向代理

Java项目的代理与反向代理 1. 代理 定位&#xff1a;为客户端服务通信方向&#xff1a;客户端->代理服务器->远程服务器好处&#xff1a;对客户端行为进行过滤和控制&#xff1b;隐藏客户端IP地址&#xff1b;审计流量&#xff1b;缓存资源加快访问速度&#xff1b; 2…

ChatGPT 写作利器:探索ChatGPT在论文写作中的应用

ChatGPT无限次数:点击直达 ChatGPT 写作利器&#xff1a;探索ChatGPT在论文写作中的应用 引言 ChatGPT是一种强大的自然语言处理工具&#xff0c;能够为我们提供高效、准确的文本生成功能。在论文写作领域&#xff0c;ChatGPT的应用也逐渐受到关注。本文将探讨ChatGPT在论文写…

javascript:call()、apply()、bind()的区别和使用

javascript&#xff1a;call()、apply()、bind()的区别和使用 1 前言 记录javascript的call、apply、bind方法绑定this的区别以及使用。 call、apply、bind的区别&#xff1a; 【相同点】&#xff1a;作用相同&#xff0c;都是动态修改this指向&#xff1b;都不会修改原先函…

【算法基础】插入排序与二分查找、升级二分查找

文章目录 1. 插入排序1.1 插入排序的思想1.2 插入排序的实现 2. 普通二分查找2.1 普通二分查找的思想2.2 普通二分查找的实现 3. 升级二分查找3.1 升级二分查找思想3.2 升级二分查找实现 1. 插入排序 1.1 插入排序的思想 插入排序很类似于已有一副有序的扑克牌&#xff0c;不断…

【话题】AI技术创业有那些机会,简单探讨下

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景机会一、引言二、AI技术的创业机遇1.智能服务行业的兴起2.数据驱动的业务模式创新3.AI与产业融合的创新发展 三、AI技术创业的挑战1.技术门槛高2.法规政策的不确定性…

P1712 [NOI2016] 区间(线段树 + 贪心 + 双指针)

题目描述 在数轴上有 n 个闭区间从 1 至 n 编号&#xff0c;第 i 个闭区间为 [li​,ri​] 。 现在要从中选出 m 个区间&#xff0c;使得这 m 个区间共同包含至少一个位置。换句话说&#xff0c;就是使得存在一个 x &#xff0c;使得对于每一个被选中的区间 [li​,ri​]&#…

关于Ansible模块 ⑥

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 内容在继《关于Ansible的模块 ①》、《关于Ansible的模块 ②》、《关于Ansible的模块 ③》、《关于Ansible的模块 ④》与《关于a…

YOLOv8草莓生长状态(灰叶病缺钙需要肥料)检测系统(python开发,带有训练模型,可以重新训练,并有Pyqt5界面可视化)

本次检测系统&#xff0c;不仅可以检测图片、视频或摄像头当中出现的草莓叶子是否有灰叶病&#xff0c;还可以检测出草莓叶是否缺钙、是否需要施肥等状态。基于最新的YOLO-v8训练的草莓生长状态检测模型和完整的python代码以及草莓的训练数据&#xff0c;下载后即可运行&#x…

Java开发中的entity、vo和pojo

Java开发中的entity、vo和pojo 1.Entity实体2.vo3.pojo 1.Entity实体 定义&#xff1a; Entity 通常指的是与数据库表对应的对象。它包含了与数据库表字段相对应的属性和一些业务逻辑方法。Entity 通常用于数据的持久化操作&#xff0c;如增删改查。使用场景&#xff1a; 当需…

C语言——字符函数和字符串函数

Hello&#xff0c;大家好&#xff0c;今天和大家分享C语言中的几个字符函数和字符串函数&#xff0c;记得三连支持一下哦&#xff01; 在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了⽅便操作字符和字符串&#xff0c;C语⾔标准库中提供了⼀系列库函数…

积分短信群发平台:精准营销新利器,助力企业高效触达目标用户

在当今数字化营销时代&#xff0c;精准营销已成为企业获取竞争优势的关键手段。积分短信群发平台作为一种高效、精准的营销工具&#xff0c;正逐渐受到越来越多企业的青睐。通过该平台&#xff0c;企业可以针对目标用户进行个性化的积分活动推广&#xff0c;实现精准营销&#…

Jetpack Compose 阻尼动画效果之SplineBasedDecay

SplineBasedDecay() 是 Jetpack Compose 中的一个函数,用于创建一个基于曲线衰减的动画效果。它通常用于创建平滑的动画效果,比如惯性滚动或惯性拖动的动画效果。 作用: 创建基于曲线衰减的动画效果,使得动画在结束时会逐渐减速。提供了更自然和平滑的动画体验,特别是在实…

第一弹:HTML,学习记录

1.创建文件所需要注意事项 可以以中文命名&#xff0c;不使用中文。不使用特殊字符。HTML文件名推荐使用小写。如果是多个单词创建的文件名&#xff0c;推荐使用驼峰命名法&#xff0c;每个单词首字母大写 HelloWorld创建完HTML文件后依然是文本文件格式&#xff0c;那么需要将…

leetcode328.奇偶链表

1. 题目描述 在线练习 2. 解题思路 这道题&#xff0c;官方给的是中等难度。其实是一道基础题&#xff0c;大家应该都可以写得出来。 题目中给的示例可以清楚的看到&#xff0c;合并前后的奇偶链的各自包含的节点的顺序是不变的&#xff0c;我们基本可以确定使用尾插法来合并…

C++(15): STL算法:排序(sort)

1. 简述 std::sort 是 C 标准库 <algorithm> 中提供的一个函数&#xff0c;用于对容器&#xff08;如数组、向量等&#xff09;中的元素进行排序。它基于比较操作对元素进行排序&#xff0c;通常使用高效的排序算法&#xff0c;如快速排序、归并排序或堆排序等。 在实际应…