自然流量的惊喜

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

告警呼啸而至

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

签名保驾护航

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

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

functionsign(json) {
json.timestamp
=getTimestamp();
json.rand
= mtRand(100000, 999999);
json.appkey
=app.globalData.secretKey;

let valueArray
=[];for (let key injson) {
valueArray.push(json[key]);
}
valueArray.sort();

let signStr
=jsonVAL(valueArray);
console.log(
"signStr", signStr);

json.sign
=sha1Util.sha1(signStr);deletejson.appkey;returnjson;
}

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

代码如下;

/*** sign校验拦截器
*
@authorJJ*/@Slf4j
@Component
public class CheckSignInterceptor implementsHandlerInterceptor {private static final String SecretKey = "*******";//签名过期时间(s) private static final Integer TimestampOut = 300;

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throwsIOException {


RequestWrapper requestWrapper
= newRequestWrapper(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校验
*
@paramtoken
*
@return */ privateResult 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)){returnResult.success();
}
return Result.failed(ErrorCodeEnum.ILLEGAL_ARGUMENT.code(), "签名失败");
}

}

/***@authorJJ
* @Classname InterceptorConfig
*/@Configurationpublic class InterceptorConfig implementsWebMvcConfigurer {

@Resource
CheckTokenInterceptor checkTokenInterceptor;
@Resource
CheckSignInterceptor checkSignInterceptor;

@Override
public voidaddInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(checkSignInterceptor).order(
1);

}
}

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

啥也挡不住RPA

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

无奈只能限量了

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

写在最后

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

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

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

小程序二维码 :

标签: none

添加新评论