가나자와의 렌터 사이클 「거리」의 빈 상황을 가르쳐 주는 LINE Bot을 만들었다
가나자와에는 「거리」라는 렌터사이클 서비스가 있습니다. 시내 22개소의 포트에서 대출·반납을 할 수 있어 30분 이내에 돌려주면 몇번 타고도 200엔으로 끝나므로, 관광의 이동 수단에 가져와 1 의 서비스입니다.
상술한 대로 매우 편리한 서비스입니다만, 최근에는 호쿠리쿠 신칸센이 개통해 관광객 증가에 의해 포트까지 갔는데 자전거가 없다고 하는 장면에 조우하는 것이 몇번인가 있었습니다. 2
거기서 이번은 LINE Bot의 개발의 공부도 겸해, 거리의 빈 상황을 가르쳐 오는 Bot를 만들어 보았습니다.
데모
LINE Bot에 위치 정보를 던지면 현재 위치 주변에서 1대 이상의 자전거를 대여할 수 있는 포트를 3건 가르쳐 줍니다.
또, 현재지로부터 포트까지의 길순을 Google Maps를 사용해 안내해 주는 기능도 아울러 붙이고 있습니다.
이번에 만든 Bot은 가나자와 빈 챠리 Bot이라는 이름으로 LINE에 등록되어 있어 3
구성
Bot가 동작하는 구조로는 LINE 앱에서 위치 정보를 전송하는 이벤트를 트리거로 Lambda가 동작해, 마을의 API로부터 취득한 정보를 가공해 현재지 주변의 대출 가능 포트 정보를 메시지로서 되돌려 보내는 형태가 된다 있습니다.
API Gateway와 Lambda를 결합하여 구현했으며 AWS SAM을 사용하여 구성을 템플릿화했습니다.
마을의 API
가나자와시에서는 공공 데이터를 2차 이용 가능한 형식으로 제공하는 오픈 데이터의 대처에 주력하고 있는 것 같습니다. 이번 이용한 거리 API는 오픈 데이터를 사용한 앱 콘테스트용으로 제공되고 있어, 각 포트마다의 위치 정보나 자전거의 대출·반환 가능 대수를 취득할 수 있습니다.
KANAZAWA Civic Tech Contest 2017 | KANAZAWA-AIR
$ curl https://interstreet.jp/kanazawa/api/get_info | jq
{
"port": [
{
"number": "00",
"name": "事務局",
"name_english": "Machinori Office",
"latitude": 36.576959,
"longitude": 136.651474,
"available_bikes": 2,
"racks": 0,
"empty_racks": 0
},
{
"number": "01",
"name": "金沢駅A",
"name_english": "Kanazawa Station A",
"latitude": 36.576393,
"longitude": 136.649853,
"available_bikes": 6,
"racks": 20,
"empty_racks": 13
},
...
}
위도·경도의 정보를 취득할 수 있으므로, 포트까지의 도보로 걸리는 시간이나 길 순서의 안내 기능에 이용하고 있습니다.
const distance = geolib.getDistance(
{ latitude: 51.5103, longitude: 7.49347 },
{ latitude: "51° 31' N", longitude: "7° 28' E" }
);
Geolib 이라는 지리 정보를 취급하는 패키지를 사용하면, 2점의 위도·경도를 건네주는 것만으로 거리를 돌려주므로 간단하게 실장할 수 있었습니다.
LINE Message API
LINE Message API은 Bot으로 응답 메시지를 보내는 데 사용됩니다. Webhook의 이벤트 정보에는 replyToken이라는 값이 포함되어 있는데, 이것이 어떤 사용자에게 회신할지 식별자가 됩니다. 보낼 수 있는 메시지의 종류에는 텍스트나 이미지 외에도 종류가 있어 이번에는 회전목마를 선택했습니다.
캐러셀의 구현은 아래 사이트가 상세합니다.
근처 신사를 가르쳐주는 LINE Bot을 만들어 보았습니다. - 타카 쿠스 일기
import request from 'request-promise';
const MESSAGE_API_ENDPOINT = 'https://api.line.me/v2/bot/message/reply';
export default class Line {
constructor(token) {
this.token = token;
}
async postMessage(replyToken, messages) {
try {
const options = {
method: 'POST',
uri: MESSAGE_API_ENDPOINT,
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${this.token}`,
},
body: {
replyToken,
messages,
},
json: true,
};
await request(options);
} catch (error) {
throw new Error(error.message);
}
}
}
사이고에게
처음의 LINE Bot 개발이었습니다만, 넷상을 찾으면 알기 쉬운 문서가 많이 고민하지 않고 실장할 수 있었습니다. 아이디어 나름으로 일상의 조금 곤란한 것을 해결하는데 도움이 될 것 같습니다.
또, 오픈 데이터를 사용하는 것도 처음으로 사전에 어떤 데이터를 사용할 수 있는지 바라보고 있었습니다만 전체적으로 가공이 필요한 데이터가 많을 것 같아 사용의 허들이 오르고 있는 느낌이 들었습니다.
리포지토리
kentaro-m/kanazawa-avaiable-bike-line-bot: 가나자와의 렌터 사이클 「거리」의 대출 가능한 포트를 안내해 주는 LINE Bot입니다.
도시락을 잊어도 우산을 잊지 말라는 단어가있을 정도로 비가 많은 지역이므로 갑작스러운 비에주의하십시오.
↩ 를 보면 빈 상황을 알 수 있으므로 회피할 수 있다. 마을의 공식 사이트
마을의 API 공개 중단이나 AWS 리소스 정리로 예고없이 삭제할 수 있으므로 양해 바랍니다 ↩
Reference
이 문제에 관하여(가나자와의 렌터 사이클 「거리」의 빈 상황을 가르쳐 주는 LINE Bot을 만들었다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kentaro_m/items/9ae86f5e66117691b6c2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)