꽃가루 알레르기 대책 디지털 의료 상담 Bot의 개발 GAS로 유저마다 비산 예측을 정시 푸시

개요



현재 삼나무 꽃가루 알레르기 환자를 대상으로 의료기관을 진찰하지 않아도 LINE에서 시판의 의료용 의약품을 구분할 수 있는 서비스를 개발 중입니다.

3월 4일까지 CAMPFIRE에서 테스트판 유저 모집중입니다. 꽃가루 알레르기 분은 꼭 참가해 주세요!
CAMPFIRE의 프로젝트 페이지는 이쪽
LINE에서 꽃가루 알레르기의 중증도나 최적의 시판약을 알 수 있는 디지털 의료 상담[알레르 내비]

이전 Qiita 기사는 여기
꽃가루 알레르기 대책 디지털 의료 상담 Bot 개발 사용자 ID와 위치 정보를 Firestore로 관리

유저가 특정한 지점의 핀 포인트 꽃가루 비산 예측을 정시에 푸시하는 기능을 개발중이므로 그 주변을 정리했습니다.

만드는 방법



1. 기상 예측 API
이번 앱에서는 이 기상 API를 이용하고 있습니다.
Lifesocket

2. 프로그램 작성
기상 데이터를 얻는 함수 getweather()
async function getweather(userlat,userlong) {

const BASE_URL = "***************************************";
let PATH = `/location/${userlat}/${userlong}`; //緯度経度
let url = BASE_URL + PATH + "?days=7"; //7日分取得の場合
let res = await axios.get(url, {
  headers: {
    "Content-Type": "application/json",
    Accept: "application/json",
    "x-access-key": "***********************************"
  }
});
return res.data;
}

비산 예측을 푸시하는 pushpollen() 함수
async function pushpollen() {
  //Firebaseから位置情報データを受ける    
  let locationsRef = db.collection('locations');  
  let alllocations = locationsRef.get()
    .then(snapshot => {
      snapshot.forEach(async doc => {
        console.log(doc.id, '=>', doc.data());
        let lineId = doc.data().line_user_id;
        let userlat = doc.data().latitude;
        let userlong = doc.data().longitude;        
        if (lineId == null) {
          console.log("IDなし")
        } else {
          let item2 = await getweather(userlat,userlong);
          console.log(item2);
          let url2;
          let [date, time] = item2.Daily[1].DateTime.split("T");
          if (item2.Daily[1].Index === 0) {
            url2 ="**********";
          } else if (item2.Daily[1].Index === 1) {
            url2 ="**********";
          } else if (item2.Daily[1].Index === 2) {
            url2 ="**********";
          } else if (item2.Daily[1].Index === 3) {
            url2 ="**********";
          } else if (item2.Daily[1].Index === 4) {
            url2 ="**********";
          }

          client.pushMessage(lineId, {            
            type: "template",
            altText: "This is a buttons template",
            template: {
              type: "buttons",
              thumbnailImageUrl: url2,
              imageAspectRatio: "rectangle",
              imageSize: "cover",
              imageBackgroundColor: "#FFFFFF",
              title: `${date}${item2.PinpointName}の花粉飛散情報`,      
              text: item2.Daily[1].IndexCommentary,
              defaultAction: {
                type: "uri",
                label: "View detail",
                uri: "**********"
              },
              actions: [               
                {
                  type: "message",
                  label: "花粉症の重症度を判定",
                  text: "判定"
                }
              ]
            }
          })          
        }
      });
    })
    .catch(err => {
      console.log('Error getting documents', err);
    });  
}

3. GAS로 정시 실행
1. GAS 파일 만들기
Google로 이동하여 로그인
Google App Script
새 프로젝트 선택


2. 코드 .js에 다음과 같이 씁니다.
function myFunction() {
UrlFetchApp.fetch("実行させたいURL/cron");
}

3. 트리거 추가
코드 편집 화면 메뉴에서 시계 마크를 클릭


푸시하고 싶은 시간대에 설정
(몇 분 간격이나 몇 시간 간격, 매주 수요일 이 시간 등도 설정할 수 있습니다)


4. 프로그램 재작성
다음을 추가하여 정시에 비산 예측을 푸시하는 pushpollen() 함수가 실행되도록 한다.
app.get("/cron", (req, res) => {
  pushpollen();
});

완성도



정시에 꽃가루 예측이 푸시되었습니다.


고찰



비동기 처리의 이해가 얕아서 사용자 ID마다 다른 비산 정보를 푸시하기까지 상당히 고생했습니다. 정시 실행에 관해서는 GAS를 사용하면 무료로 간단하게 Cron처럼 시간 지정으로 임의의 URL을 요청할 수 있기 때문에 매우 편리하네요.

좋은 웹페이지 즐겨찾기