위챗 애플릿 클라우드 개발 관련 공중번호 얻기 글 목록

7980 단어 소절차
최근에 받은 요구 사항은 작은 프로그램이 공공 번호와 관련된 글을 가져와 표시하는 것이다.
먼저 생각나는 것은 고객이 서버와 도메인을 사서 도메인 등록을 하고 고객을 위해 사이트를 개발하여 공중 플랫폼의 appid와 키를 통해 공중 번호의 소재 목록을 얻고 마지막으로 작은 프로그램에 인터페이스를 개발하여 사용할 수 있도록 해야 한다는 것이다.일반적으로 고객이 서버와 도메인 이름을 구매하는 것은 어려운 문제로 많은 사람들을 권고하고 물러났다.
그러나 나는 위챗 프로그램의 공식 문서를 봤는데 클라우드 개발 기능이 하나 있는데 그 중에서 클라우드 데이터베이스, 클라우드 저장소, 클라우드 함수 세 가지 기능이 있다.Serverless와 유사하게 우리는 서버와 도메인 이름을 살 필요가 없다. 작은 프로그램의 클라우드 개발 기능을 직접 사용하면 많은 일을 할 수 있다.나는 클라우드 개발 기능으로 대중적인 글을 얻을 수 있는지 시험해 보고 싶다.
클라우드 데이터베이스는 Redis와 유사한 Key-Value 데이터베이스로 위챗에서 제공하는 조회 API를 사용하여 체인 조작을 할 수 있다. 약간 비슷하다.Net의 Entity Framework
클라우드 저장소는 주로 파일을 업로드하고 다운로드하는 데 사용되며 앨범 등 응용 프로그램에 사용될 수 있다.
클라우드 함수는 Node를 제공합니다.Js의 운영 환경에서 우리는 자신의 코드를 배치할 수 있고 npm 설정을 사용하여 다른 소스 소프트웨어 패키지를 도입할 수 있다.구름 함수는 위챗 작은 프로그램 프레임워크에서 특유의 방식으로만 호출되고 결과를 되돌려줍니다.우리가 서버 자체 구축 서비스를 구매하는 것과 달리 우리는 도대체 몇 개의 실례가 실행되고 있는지 잘 모르겠다. 매번 실행할 때 반드시 같은 실례에 있는 것은 아니기 때문에 우리는 메모리에서 데이터를 캐시하고 상태를 유지하는 작업에 적합하지 않기 때문에 데이터를 클라우드 데이터베이스에 제때에 저장해야 한다.클라우드 개발의 클라우드 함수의 독특한 장점은 위챗 로그인 감권과 빈틈없는 통합에 있다.작은 프로그램이 구름 함수를 호출할 때 구름 함수의 전송 매개 변수에 작은 프로그램 사용자의 Openid가 주입되어 개발자가 이 Openid를 직접 사용할 수 있습니다.
이 기능을 하기 전에 먼저 작은 프로그램을 새로 만들어서 공공 플랫폼과 작은 프로그램을 연결시키고 공공 플랫폼의 개인 구독 번호도 가능하다.
그리고 작은 프로그램의 프로젝트에서, 프로젝트.config.json 파일에 클라우드 함수의 저장 디렉터리를 지정하는 설정 항목을 추가합니다.
"cloudfunctionRoot": "clouds/"

이 clouds 디렉터리를 새로 만듭니다. 예를 들어 우리는fetch라고 명명합니다. 나중에 클라우드 함수를 호출해도 이 이름을 사용하고 그 안에 index를 새로 만듭니다.js, 구름 함수의 입구로.하나의 구름 함수의 기본 구조는 다음과 같다.
//  
const cloud = require('wx-server-sdk');
const request = require('request');
cloud.init();

//  
exports.main = async (event, context) => {
  return {200: 40400, msg: 'success'};
}

우리는 MVC와 Servlet 등 웹 프레임워크처럼 클라이언트에게 action 파라미터를 전달하고 서로 다른 action 파라미터에 따라 대응하는 처리 함수를 선택하거나 여러 개의 구름 함수를 만들 수 있다.코드는 다음과 같습니다.
  var action = event.action;
  if(!action){
    return {code: 20000, msg: 'hello, world'};
  }
  //dispatcher
  var ret;
  if(action === 'role'){
    ret = await registerAndReturnUser(event);
  } else if(action === 'userlist'){
    ret = await fetchUserList(event);
  } else if(action === 'updaterole'){
    ret = await updateUser(event);
  }

물론 우리는 npm install--save를 사용하여 모든 npm 소스 패키지를 설치할 수 있으며 평소와 같이 패키지를 구축할 수 있습니다.json, 클라우드 함수를 업데이트할 때마다 클라우드 함수 폴더에서 오른쪽 단추를 누르고'업로드 및 배치 (클라우드 설치 의존)'를 선택해야 합니다.
애플릿 프론트에서 클라우드 함수를 호출하는 코드는 실제 URL을 알 필요가 없고 클라우드 함수 이름에 따라 호출하면 된다.
wx.cloud.callFunction({
      //  
      name: 'fetch',
      //  
      data: {
        keywords: this.data.keywords,
        page: this.data.page,
        limit: this.data.limit
      },
      success: function (res) {
        console.log(res);
      },
      fail: err => {
        console.log(err);
      }
});

일반 번호의 영구 소재 목록을 가져오면 이 문서를 참고할 수 있습니다https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Get_materials_list.html.Access Token이 필요합니다. Access Token의 만료 시간은 2시간이고 매일 신청 횟수를 제한합니다. 텐센트도 제3자 서버에 이 Access Token을 저장하는 것을 권장합니다.우리는 이 Access Token을 클라우드 데이터베이스에 저장할 수 있다.AccessToken을 요청하는 문서는https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html.
그리고 우리는 코드를 만들어서accessToken을 가져온 다음에 구름 함수의 로그를 보거나throw 문장을 주동적으로 추가하여 이상을 던진다. 작은 프로그램 디버깅 컨트롤러에서도 결과를 볼 수 있다. 40164 오류를 자주 볼 수 있다. 이 오류는 우리가 어떤 IP가 화이트리스트에 없으면 이 IP를 위챗 공중번호로 설정된 화이트리스트에 넣을 수 있다는 것을 알려준다.그러나 문제는 작은 프로그램 클라우드 개발의 수출 IP는 유동적이며 하나의 집단이 서비스를 제공하고 있기 때문에 어느 IP가 작용하는 것은 아니다.그러나 그는 한계가 있다. 우리가 십여 개의 IP를 추가했을 때 항상 우리의 화이트 리스트 리스트에 명중할 수 있다는 것을 발견했기 때문에 우리는 몇 번 더 시도하여 가능한 한 많은 IP를 찾아내야 한다.그래서 저는 이런 프로그램을 만들었습니다. AccessToken을 얻는 데 실패했고 오류가 40164일 때 데이터베이스에 이 IP를 저장하고 시간이 나면 이 IP를 화이트리스트에 넣고 몇 번 반복하면 저희 화이트리스트에 20개의 IP가 있습니다.이때 우리의 적중률이 상승한 것을 발견하고 여러 번 요청해야 한 번은 적중하지 못했다.그래서 저는 요청 작성에 실패한 후에 즉시 다시 한 번 요청하고 최대 다섯 번을 요청합니다.'재해시'와 같은 알고리즘입니다. 만약에 우리가 50%의 명중률을 가지고 5회 연속 명중하지 못할 확률이 3% 정도라고 가정하면 실험을 통해 보통 5회 안에 AccessToken을 성공적으로 얻을 수 있습니다.
이 코드는 다음과 같습니다.
var getWechatAccessToken = async function(counter) {

    // , token , , 
    var tokenInDb = await this.getAccessTokenFromDB();
    if (tokenInDb) {
      return tokenInDb['accessToken'];
    }
    var token_url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + this.appid + '&' + 'secret=' + this.secret;
    var result = await rp({
      url: token_url,
      method: 'GET'
    });
    var obj = (typeof result.body === 'object') ? result.body : JSON.parse(result.body);
    if (obj.errcode && obj.errcode === 40164) {
      var ip = obj.errmsg.split(' ')[2];
      // IP 
      await this.insertIp(ip);
      //try again and save ip to database;
      counter += 1;
      if (counter < 5) {
        return await this.getWechatAccessToken(counter);
      }
    }
    // AccessToken 
    if (obj['access_token']) {
      this.saveTokenToDb(obj['access_token']);
      return obj['access_token'];
    }
    return null;
  }

AccessToken을 신청하는 시간을 저장했습니다. 이 시간에 따라 이 데이터베이스에 저장된 Token을 사용하거나 새로운 Token을 다시 가져올 수 있습니다.다음은 소재 목록을 가져오는 인터페이스를 사용하여 모든 일반 문장을 가져오는 것이다.우리는 다음 작은 프로그램이 요청하면 클라우드 데이터베이스에서 직접 접근할 수 있도록 데이터베이스에 저장한다.공중번호 소재 목록을 가져오는 데는 한 번에 20개만 얻을 수 있는 제한이 있습니다. 우선 총수를 찾아서 페이지별로 가져가야 합니다.마찬가지로 클라우드 데이터베이스를 조회하면 한 번에 최대 100개를 얻을 수 있다. 우리도 먼저 총수를 찾아내고 페이지를 나누어 모든 것을 조회해야 한다.

  async fetchNewsFromServer(token, offset) {
    var url = 'https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=' + token;
    var body = {
      "type": "news",
      "offset": offset,
      "count": 20
    };
    var result = await rp({
      url: url,
      method: 'POST',
      headers: {
        'content-type': 'application/json',
      },
      body: JSON.stringify(body)
    });
    return result;
  }

  // 
  async collectDataFromServer(token, dbcount) {
    lastFetchTime = new Date();
    var countUrl = 'https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token=' + token;
    var countResult = await rp({
      url: countUrl,
      method: 'GET',
    });

    var countObj = (typeof countResult.body === 'object') ? countResult.body : JSON.parse(countResult.body);
    var total = 0;
    if (countObj) {
      total = countObj['news_count'];
      if (total === dbcount) {
        return;
      }
    } else {
      return;
    }
    // 20 
    var fetchTimes = parseInt((total - 1) / 20) + 1;
    var i;
    var newsList = [];
    for (i = 0; i < fetchTimes; i++) {
      var offset = i * 20;
      var newsResult = await this.fetchNewsFromServer(token, offset);
      var news = (typeof newsResult.body === 'object') ? newsResult.body : JSON.parse(newsResult.body);
      if (!news || !news.item_count) {
        continue;
      }
      var j = 0;
      var items = news.item;
      for (j = 0; j < news.item_count; j++) {
        newsList.push(items[j]);
      }
    }

    // 
    await this.clearTable('posts');

    for (var k = 0; k < newsList.length; k++) {
      var toSave = newsList[k];
      var toSaveObj = {
        mediaid: toSave.media_id,
        url: toSave.content.news_item[0].url,
        pic: toSave.content.news_item[0].thumb_url,
        title: toSave.content.news_item[0].title
      };
      await db.collection('posts').add({
        data: toSaveObj
      });
    }
  }

그 다음은 작은 프로그램 클라이언트가 클라우드 함수를 통해 데이터를 가져와 앞에서 보여주었다. 우리는 글의 링크를 가져와 웹View에서 보여줄 수 있다.WebView는 공통 번호와 애플릿 백그라운드에서 작성한 도메인 이름만 표시할 수 있습니다.WebView 문서는 개인 애플릿은 사용할 수 없지만 실제로 사용할 수 있습니다.https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html.
참고
클라우드 오픈 공식 문서https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/console.html
 

좋은 웹페이지 즐겨찾기