<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      我的小程序接口被刷爆了

      ?

      自然流量的驚喜

            書(shū)接上文,憑著短視頻的好奇,搭了個(gè)小程序,做了文案提取,配音等功能,也順帶寫(xiě)了兩篇口水文章,不曾想居然收獲歷史最高的點(diǎn)贊與收藏。有興趣的朋友可以點(diǎn)這里一看究盡:《短視頻配音原來(lái)如此簡(jiǎn)單》,《短視頻文案提取的簡(jiǎn)單實(shí)現(xiàn)》。做為一個(gè)食人間煙火的程序員,也偷偷的去看了數(shù)據(jù),由于沒(méi)抱太大的期望,自然流量給了我一個(gè)大大的驚喜,下圖是沒(méi)有任何推廣的數(shù)據(jù)。我一度暗暗自喜,直到我上線了另一個(gè)小程序做對(duì)照組時(shí),也就是上兩個(gè)文章中提到的小程序,幾乎沒(méi)有自然流量,即使這個(gè)小程序功能更全,體驗(yàn)更好,所有用戶(hù)都是從我的文章中關(guān)聯(lián)而來(lái)的,沒(méi)有自然流量。我瞬間明白了:論小程序取名的重要性。

       

       

      告警呼嘯而至

              小程序上線后,總于可以睡上安穩(wěn)覺(jué)了。于是又開(kāi)始早上6:30去學(xué)校帶小朋友跑步了。跑了一年了,好幾個(gè)小朋友算是跑上道了。跑得正酣暢淋漓之時(shí),突然,企微告警群開(kāi)始咚咚告警:resource pack exhausted! Please purchase resource packs... 30小時(shí)的資源包才買(mǎi)幾天怎么就耗盡了呢。跑完步,在學(xué)校噌了早飯,小電驢兒一溜煙回家打開(kāi)電腦,巴拉出訪問(wèn)日志,傻眼了。這樣一個(gè)沒(méi)名沒(méi)份的小程序,居然有人在刷它的接口(大部分都是視頻文案提取,原來(lái)還有這么多人在做短視頻),心中頓感五味雜成,有人刷說(shuō)明功能還不多,這樣刷地主家也沒(méi)有余糧了...

       

       

      簽名保駕護(hù)航

              既然來(lái)了,只能接招了。既然刷接口,那就對(duì)接口訪問(wèn)做一些校驗(yàn)。目前小程序只是提文案提取等功能,所以首先想到接口做個(gè)簽名,防止別人使用程序自動(dòng)刷。考慮小程序源碼獲取比較困難,簽名字段根據(jù)sha1簡(jiǎn)單生成就可以了,未來(lái)如果這個(gè)也行不通,再使用RSA加密下sign字段就可以了。sign生成規(guī)則比較簡(jiǎn)單,timestamp,request,隨機(jī)串,請(qǐng)求參數(shù),排序 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;
      }

       

      后端也簡(jiǎn)單,根據(jù)一樣的規(guī)則,一樣的key,生成sign,對(duì)比前端的sign字段就可以了。自定義HandlerInterceptor,并注冊(cè)到InterceptorRegistry中就。

      代碼如下;

      /**
       * sign校驗(yàn)攔截器
       * @author JJ
       */
      @Slf4j
      @Component
      public class CheckSignInterceptor implements HandlerInterceptor {
      
          private static final String SecretKey = "*******";
          // 簽名過(guò)期時(shí)間(s)
          private static final Integer TimestampOut = 300;
      
          @Override
          public 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);
                  // 設(shè)置狀態(tài)碼為401,表示未授權(quán)
                  response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                  // 設(shè)置響應(yīng)內(nèi)容類(lèi)型和字符集
                  response.setContentType("application/json;charset=UTF-8");
                  // 自定義輸出
                  response.getWriter().write(JSONUtil.toJsonStr(result));
                  // 返回false阻止后續(xù)處理
                  return false;
              }
              return true;
          }
      
          /**
           * token校驗(yàn)
           * @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")){
                      //如果時(shí)間戳為空
                      if (Strings.isNullOrEmpty(value.toString())){
                          return Result.failed(ErrorCodeEnum.ILLEGAL_ARGUMENT.code(), "時(shí)間戳不能為空");
                      }
                      timestamp = Long.parseLong(value.toString());
                  }
                  paramsValueList.add(value.toString());
              }
              paramsValueList.add(SecretKey);
              Collections.sort(paramsValueList);
      
              //判斷時(shí)間是否大于5分鐘
              if (System.currentTimeMillis()/1000 - timestamp > TimestampOut){
                  //return Result.failed(ErrorCodeEnum.ILLEGAL_ARGUMENT.code(), "時(shí)間戳無(wú)效");
              }
              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 {
      
          @Resource
          CheckTokenInterceptor checkTokenInterceptor;
          @Resource
          CheckSignInterceptor checkSignInterceptor;
      
          @Override
          public void addInterceptors(InterceptorRegistry registry) {
              registry.addInterceptor(checkSignInterceptor).order(1);
             
          }
      }

       

      以上代碼基本都是copy的原有代碼,沒(méi)半天就上線了,自以為可以高枕無(wú)憂了。

       

      啥也擋不住RPA

             上線后,購(gòu)買(mǎi)了資源包,也提心吊膽的統(tǒng)計(jì)著使用量。過(guò)了辦天,又有幾個(gè)用戶(hù)提取了超過(guò)70條視頻的文案。我一度懷疑簽名沒(méi)生效,直到我看非常規(guī)律的調(diào)用,我知道了,RPA來(lái)了。之前公司買(mǎi)過(guò)一個(gè)叫影刀RPA軟件,也玩了一些時(shí)間,編寫(xiě)過(guò)一些自動(dòng)化任務(wù)。它可以模擬人操作行為,完成自動(dòng)化任務(wù),當(dāng)然,我一直認(rèn)為未來(lái)RPA會(huì)有更多業(yè)務(wù)場(chǎng)景,一些邏輯明確的重復(fù)的事,都會(huì)由它們來(lái)完成。難怪小程序數(shù)據(jù)里有不少是從pc打開(kāi)的。我意識(shí)到我被薅羊毛了。

       

      無(wú)奈只能限量了

             本著大家都有機(jī)會(huì)體驗(yàn)這個(gè)小程序的原則,無(wú)奈之下,只能給每人每日限量了,畢竟小程序沒(méi)有收入。再本著能每個(gè)人都有極致體驗(yàn)的機(jī)會(huì),我限制了每人每天每個(gè)功能30次。這下基本上都限制到了,但是看著那些個(gè)RPA機(jī)器人,一大早就毫無(wú)感情的把30次機(jī)會(huì)耗盡,于是又增加了按UserId配置額度的功能,優(yōu)先級(jí)高于按功能分配的額度。一頓操作后,總算是基本控制住了。又心累又心喜。喜在小程序給部分人帶來(lái)了價(jià)值,即便是用RPA的那些人也是有價(jià)值,雖然沒(méi)有感情。累的是又不得不處理這些煩瑣之事。

       

      寫(xiě)在最后

      最近短劇火了起來(lái),就有不少人開(kāi)始提取長(zhǎng)視頻的文案以及長(zhǎng)視頻去水印。考慮到微信保存視頻時(shí),有個(gè)200M的限制,又在考慮支持視頻文件壓縮功能了。跟本停不下來(lái)了,把寫(xiě)代碼當(dāng)成樂(lè)趣也是不錯(cuò)的一件事兒。

       

      有興趣的同學(xué)可以掃碼體驗(yàn)下小程序(小程序名稱(chēng)正在申請(qǐng)修改名稱(chēng),建議掃碼)

      小程序名稱(chēng) :文字轉(zhuǎn)語(yǔ)音實(shí)用工具;

      小程序二維碼 : 

       

      ?
      posted @ 2024-04-13 09:14  2J  閱讀(2039)  評(píng)論(8)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产熟女一区二区三区蜜臀| 少妇人妻互换不带套| 国产精品中文一区二区| 午夜高清福利在线观看| 定兴县| 国产精品美女www爽爽爽视频 | 国产精品熟女孕妇一区二区| 亚洲精品岛国片在线观看| 玩弄放荡人妻少妇系列| 日本熟妇色xxxxx| 久久精品国产99久久6| 成人免费xxxxx在线观看| 免费无码久久成人网站入口| 国内揄拍国内精品人妻 | 免费无码黄十八禁网站| 国产人妻大战黑人20p| 欧美老熟妇乱子伦牲交视频| 一二三四中文字幕日韩乱码| 40岁大乳的熟妇在线观看| 成人免费无遮挡在线播放| 国产在线无码不卡播放| 一本色道婷婷久久欧美| 亚洲自拍偷拍福利小视频| 另类专区一区二区三区| av无码一区二区大桥久未| 国产精品中文字幕一区| 和顺县| 精品国产这么小也不放过| 强伦姧人妻免费无码电影| 精品无码久久久久久尤物| 亚洲综合久久精品国产高清 | 国产在线不卡精品网站| 色悠悠成人综合在线视频| 成人av午夜在线观看| 亚洲一二三区精品美妇| 成人av天堂网在线观看| 欧美大胆老熟妇乱子伦视频| 婷婷99视频精品全部在线观看| 少妇极品熟妇人妻无码| 国产午夜福利在线观看播放| 99re热这里只有精品视频|