Help us understand the problem. What is going on with this article?

金沢のレンタサイクル「まちのり」の空き状況を教えてくれるLINE Botを作った

More than 1 year has passed since last update.

IMG_3004.JPG

金沢には「まちのり」というレンタサイクルサービスがあります。市内22箇所のポートで貸出・返却ができ、30分以内に返せば何度乗っても200円で済むので、観光の移動手段に持って来い1のサービスです。

上述したとおり非常に便利なサービスですが、近年では北陸新幹線が開通し観光客増加によってポートまで行ったのに自転車がないという場面に遭遇することが何度かありました。2

そこで今回はLINE Botの開発の勉強も兼ねて、まちのりの空き状況を教えてくるBotを作ってみました。

デモ

usage.png
LINE Botに対して位置情報を投げると、現在地周辺で1台以上の自転車が貸し出しできるポートを3件教えてくれます。

usage2.png
また、現在地からポートまでの道順をGoogle Mapsを使用して案内してくれる機能もあわせてつけています。

20171201002300.png
今回作ったBotは金沢空きチャリBotという名前でLINEに登録しており 3、上記QRコードをLINEアプリで撮影すると簡単に試すことができます。

構成

architecture.png

Botが動作する仕組みとしてはLINEアプリから位置情報を送信するイベントをトリガーにLambdaが動作して、まちのりAPIから取得した情報を加工して現在地周辺の貸出可能ポート情報をメッセージとして送り返す形となっています。

API GatewayとLambdaを組み合わせて実装し、AWS SAMを使って構成をテンプレート化しました。

まちのりAPI

金沢市では公共データを二次利用可能の形式で提供するオープンデータの取り組みに力を入れているようです。今回利用したまちのり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です。


  1. 弁当忘れても傘忘れるなという言葉があるくらい雨が多い地域なので突然の雨にはご注意を 

  2. まちのり公式サイトを見れば空き状況が分かるので回避できる 

  3. まちのりAPIの公開中止やAWSのリソース整理で予告なしで削除することがありますのでご了承ください 

kentaro_m
金沢のゲーム会社で働くフロントエンドエンジニアです。プライベートではかゆいところに手が届くツールを開発してGitHubに公開しています。
https://kentarom.com/
dmmcom
総合エンタテイメントサイト「DMM.com」を運営。会員数は2,900万人を突破。動画配信、FX、英会話、ゲーム、太陽光発電、3Dプリンタなど40以上のサービスを展開。沖縄での水族館事業参入、ベルギーでのサッカークラブ経営など、様々な事業を手掛ける。また2018年より若手起業家の支援を強化、「DMM VENTURES」による出資や、M&Aなどを積極的に展開している。
https://dmm-corp.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした