Chrome OS(Chromium OS)を使ってみた

お盆休みということで結構作業時間が取れるなあと思っていたら、胃腸風邪にかかってしまいほぼお盆休みは終わってしまった感じです。使える時間も少なくなったので以前ちょと興味本位で使ってみたChrome OSをもう一回入れてみようと思います。

以前と言っても、リリースされた当初なのでデバイスはほどんどNG、無線LANも使えなかったり、Chromeアプリがあまり整備されていなかったのでGmailChromeでのブラウジングだけだったような気がします。最近はかなり環境も変わっているので様子を見ようという感じです。(いい感じならChromeBookも購入の視野に入りますしね)

ちなみにですが、Chrome OSとは言っていますが、実際はオープンソース版のChromium OSを使用しています。

準備するもの

Chromium OSのインストールにあたって必要となるのは

になります。容量はイメージを作ってみてわかったのですが、8GByteあれば足りそうな気もしますが、16GByteぐらいあれば余裕があると思います。

今回は USBメモリにはSanDiskのものを使用しました。

また、PCにはOSインストールの実験台になっているAspire one 753(2010年製)をしようしました。Windows7時代のPCでしたが、メモリは増設して4GByteにしています。USB経由でRaspberryPi Desktopを起動していますが、Windows10ではかなり重たい動きになりますが、割といい動きをしています。

http://www2.acer.co.jp/catalog/1012/FIX_NBALL_0616.pdf

あと残るはOSのイメージになります。

OSのイメージ

起動に必要なChromium OSのイメージはオープンソースなのでクロスコンパイルしてねって感じになるのですが、さすがにそれは厳しいのであり物のイメージを使用します。

Chromium OS」をビルドしたイメージファイルを配布しているサイトはいくつかあるようです。リリース当初も配布サイトはありました。

Chromium OS Builds

海外有志のChromium OSのビルドイメージサイト。毎日最新版のビルドのイメージファイルを作成しているようです。特別なハード用のドライバを仕込んだイメージもあるようでした。問題点は機械的にbuildを行っているので動作しない可能性もあるそうです。

Directory Listing of . (Chromium OS Builds)

Chromium OS カスタムビルド配布ページ

日本有志の方が安定動作するChromium OSを提供していたサイトのようです。ただバージョンR60で活動を終了しているようです。

Chromium OS カスタムビルド配布ページは活動を終了しました — Chromium OS Custom Biuild

f:id:ueponx:20180814224636p:plain

CloudReady

Neverware社が製品化しているChromium OSとなります。個人利用は無料なのでビジネス用途、教育用途でなければ大丈夫そうです。

www.neverware.com

今回は、Chromium OS Buildsイメージをダウンロードしてみたのですが、うまく起動でき無かったので、CloudReadyのイメージをしようすることにしました。

イメージのダウンロード

Neverware社のホームページに行って 画面に表示されている【GET STARTED】ボタンをクリックします。

f:id:ueponx:20180814230403p:plain

すると、画面がスクロールして以下のような表示になります。

f:id:ueponx:20180814230655p:plain

ここで、個人向けなのかビジネス・教育向けなのかの選択を受けるので、左側の【INSTALL HOME EDITION】のボタンをクリックします。画面が以下のように遷移します。

f:id:ueponx:20180814230909p:plain

このページにはインストールするためのステップが書いてあります。Step2の部分でWindowsユーザはUSBMakerなるソフトウエアが必要なので…という記載がありますが、とりあえず無視します。

f:id:ueponx:20180814231046p:plain

STEP3の部分に進むと

Mac or Chromebook user? No problem!

という、Windowsユーザーをかなり不安にさせる記載がありますが、これも無視しますw画面に【DOWNLOAD 64-BIT】のボタンがあるのでこれをクリックすれば、イメージがダウンロードできます。

f:id:ueponx:20180814231249p:plain

USBへのイメージ書き込み

公式ページにはUSBMakerというソフトがいるよーって書いてありましたが、実際には EtcherとかWin32DiskImagerを使っても起動USBを作成できます。

Win32DiskImagerでは極稀にエラーが発生することもあったのでEtcherのほうがおすすめです。(エラーが発生するとLinux環境からのfdiskなどでUSBメモリをクリーンな状態に戻す必要がありました。かなりめんどくさい)

f:id:ueponx:20180814235716j:plain

f:id:ueponx:20180814235728j:plain

あとは起動だけです。

起動!

ちなみにスクリーンキャプチャのショートカットはCtrl+F5です。

f:id:ueponx:20180814235539p:plain

f:id:ueponx:20180814235556p:plain

無線LANも問題なく使用できますし、ChoromeリモートデスクトップなどでWindowsマシンへのRDP、カメラ・マイクを使用したHangoutなども問題なくできていました。 素晴らしい!

8年落ちのPCでここまで動くなら問題ないです。Youtubeの高画質動画に関してはダメそうな気がしますが、Web系のサービス利用なら難なくこなせる感じでしょう。気になるのはエディタ環境だけかなと思いました。この辺って本格的に使用している人はどう使っているのか聞いてみたいところです。

注意点

自分はUSB起動でRaspberryPi DesktopChromium OSを切り替えていたのですが、RaspberryPi Desktopを自動するときにChromium OSのUSBを挿したままで起動すると、Chromium OSのUSBのイメージが壊れてしましました。(ブート途中で反応しなくなる現象です) こういうこともああるかなと思いましたので、注記しておきます。

おわりに

本当に素晴らしい!こらならChrome BookをメインPCにしても行けるかなという気がしました。ネットワークはほぼ必須ですけどね。

動作のスピードに関してはRaspberryPi DesktopChromium OSはほぼ同等に感じましたが、日本語フォントなどの設定が少なくすぐ使えるという感じではありました。どちらも一長一短があると思いますが、ビギナー向け?Googleのサービスに慣れている人向けであればChromium OSもおすすめできるのではないでしょうか。

ようやくTensorFlowがRaspberryPiを正式にサポート

f:id:ueponx:20180811114152p:plain

おじさんは待っていました。そして正直うれしいです。 これまでも結構設定に苦労していましたが、これでようやく容易に準備できる環境になったと言ってもいいでしょう。

TensorFlow本家がようやくRaspberryPiがサポートしてくれました。

f:id:ueponx:20180811112248p:plain

インストールに関しては以下でFAです。

【本家のリンク参考】 Installing TensorFlow on Raspbian  |  TensorFlow

他にもエントリー書かれている方がいますのでそちらを御覧ください。

shi3z.hateblo.jp

嬉しさのあまり、自分もエントリを書きますが、公式となにも変わらないと思いますので…

一応、今回の作業で

  • TensorFlow → 1.9
  • keras → 2.2.2
  • OpenCV → 3.4.2

となっています。最後にコマンドをまとめてあるので必要があればみてください。

インストールの環境

今回は最新のRaspbianを使用しました。 ダウンロードしたファイルは2018-06-27-raspbian-stretch.zipとなります。ひとしきりインストールの関連作業を行います。 インストールしたバージョンは以下のようになっていました。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 9.4 (stretch)
Release:        9.4
Codename:       stretch

必要条件としては

Raspberry Pi devices running Raspbian 9.0 or higher

とのことだったので問題はなさそうです。

pipもインストール時にこのようになっているので問題ありません。 Pythonは2系でも3系でも問題はなさそうなので、今回は3系でやってみます。

$ pip --version
pip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7)

$ pip3 --version
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.5)

インストール作業

あとはインストールをするだけです。 TensorFlowのインストールにはATLASというライブラリが必要(依存する)ということなので ライブラリをインストールしてから、TensorFlowをのインストールを行うことになります。

【ATLAS】 Automatically Tuned Linear Algebra Software (ATLAS)

$ sudo apt install libatlas-base-dev
$ pip3 install tensorflow

これで終わりです!自分の環境では有線のネット接続で5分くらいで終わりました。3系のインストールのほうが依存関係のパッケージがprebuildされているので早いということも書いてありましたので3系使ったほうがいいと思います。

実行してみる

REPL環境でimportの実行を行ってみると…おやあ?

$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170124] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
/usr/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: compiletime version 3.4 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.5
  return f(*args, **kwds)
/usr/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: builtins.type size changed, may indicate binary incompatibility. Expected 432, got 412
  return f(*args, **kwds)
/usr/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 56, got 52
  return f(*args, **kwds)

自分も以前にこんなメッセージ見たことあるぞw。

ドキュメントにもこんな風に書かれています。

If you're running with Python 3.5, you may see a warning when you first import TensorFlow. This is not an error, and TensorFlow should continue to run with no problems, despite the log message.

Python3.5だとimport時にWarningがでるよって…自分で作業していたときにも同じようなメッセージが表示されていたので、そのときに使用したバイナリと同じものがpip経由でインストールされているものだったのでしょう。ドキュメントには実行に問題ないということが書いてあるのでそのままテストコードを入力してみます。

【参考:pythonがバージョン3.4とかそういう件だった話】

uepon.hatenadiary.com

$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170124] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
/usr/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: compiletime version 3.4 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.5
  return f(*args, **kwds)
/usr/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: builtins.type size changed, may indicate binary incompatibility. Expected 432, got 412
  return f(*args, **kwds)
/usr/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 56, got 52
  return f(*args, **kwds)
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
b'Hello, TensorFlow!'
>>>

一応問題なく実行してくれたようです。

念の為バージョンを確認すると

>>> tf.__version__
'1.9.0'

最新バージョンのようです。

ついでにkerasもインストールしてみます。

$ sudo pip3 install keras

REPL環境で実行してみますが問題はなさそうです。

>>> import keras
Using TensorFlow backend.
>>> keras.__version__
'2.2.2'

さらについでにOpenCV3.4.2をインストール

$ wget https://github.com/mt08xx/files/blob/master/opencv-rpi/libopencv3_3.4.2-20180709.1_armhf.deb
$ sudo apt install -y ./libopencv3_3.4.0-20180115.1_armhf.deb
$ sudo ldconfig

github.com

Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170124] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.4.2'
>>>

認識なども問題ありません。

f:id:ueponx:20180811140136p:plain

こちらもすんなりインストールできました。以前のTensorFlowとKerasを使用したコードを実行してみます。コードは以下のようなものです。

sample.py

from keras.models import Sequential
from keras.layers import Activation, Dense, Dropout
from keras.utils.np_utils import to_categorical
from keras.optimizers import Adagrad
from keras.optimizers import Adam
import numpy as np
from PIL import Image
import os

image_list = []
label_list = []

# トレーニングデータを読み込む
for dir in os.listdir("data/train"):

    traindir = "data/train/" + dir
    if os.path.isdir(traindir) == False:
        continue

    label = 0              # 正解ラベル

    if dir == "apple":
        label = 0          # りんごの場合は、0
    elif dir == "orange":
        label = 1          # オレンジの場合は、1

    for file in os.listdir(traindir):
        if file != ".DS_Store":

            label_list.append(label)            # 正解ラベルを配列に入れる

            filepath = traindir + "/" + file  # ファイルパス

            resized_img = Image.open(filepath).resize((25, 25))                                                    # 画像を25x25にリサイズする
            image = np.array(resized_img)                                                                       # 25x25の2次元配列にする→[[R,G,B], [R,G,B]...]
            image = image.transpose(2, 0, 1)                                                                 # 配列を次元を変換する→[[R,R,R,...], [G,G,G,...], [B,B,B,...]]
            image = image.reshape(1, image.shape[0] * image.shape[1] * image.shape[2]).astype("float32")[0]     # 1次元配列に変換→[R,R,R,...,G,G,G,...,B,B,B]
            image_list.append(image / 255.)                                                            # 0.0〜1.0までの値にして配列に入れる

image_list = np.array(image_list)       # 画像リストをnumpy配列に変換

Y = to_categorical(label_list)          # 正解ラベルを配列にする(0→[1,0], 1→[0,1])

# 層を構築
model = Sequential()
# 入力層
model.add(Dense(200, input_dim=1875))
model.add(Activation("relu"))
model.add(Dropout(0.2))

# 隠れ層
model.add(Dense(200))
model.add(Activation("relu"))
model.add(Dropout(0.2))

# 出力層
model.add(Dense(2))
model.add(Activation("softmax"))

# オプティマイザにAdamを使用
opt = Adam(lr=0.001)
model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])
# nb_epoch: 学習回数
# batch_size: 1度に処理する分量(GPUモードの際は、メモリ制限がある場合がある)
model.fit(image_list, Y, nb_epoch=1500, batch_size=100, validation_split=0.1)
# model.fit(image_list, Y, nb_epoch=10, batch_size=100, validation_split=0.1)

total = 0.
ok_count = 0.

for dir in os.listdir("data/test"):
    
    testdir = "data/test/" + dir
    if os.path.isdir(testdir) == False:
        continue

    label = 0

    if dir == "apple":
        label = 0          # りんごの場合は、0
    elif dir == "orange":
        label = 1          # オレンジの場合は、1

    for file in os.listdir(testdir):
        if file != ".DS_Store":
            label_list.append(label)
            filepath = testdir + "/" + file

            resized_img = Image.open(filepath).resize((25, 25))    
            image = np.array(resized_img)
            image = image.transpose(2, 0, 1)
            image = image.reshape(1, image.shape[0] * image.shape[1] * image.shape[2]).astype("float32")[0]

            # 予測する
            print(filepath)
            result = model.predict_classes(np.array([image / 255.]))
            print("label:", label, "result:", result[0])

            total += 1.

            if label == result[0]:
                ok_count += 1.

print(ok_count / total * 100, "%")

実行結果

$ python3 07tf.py
Using TensorFlow backend.
/usr/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: compiletime version 3.4 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.5
  return f(*args, **kwds)
/usr/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: builtins.type size changed, may indicate binary incompatibility. Expected 432, got 412
  return f(*args, **kwds)
/usr/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 56, got 52
  return f(*args, **kwds)
07tf.py:65: UserWarning: The `nb_epoch` argument in `fit` has been renamed `epochs`.
  model.fit(image_list, Y, nb_epoch=1500, batch_size=100, validation_split=0.1)
Train on 35 samples, validate on 4 samples
Epoch 1/1500
35/35 [==============================] - 3s 86ms/step - loss: 0.7891 - acc: 0.5143 - val_loss: 0.0169 - val_acc: 1.0000
Epoch 2/1500
35/35 [==============================] - 0s 3ms/step - loss: 2.5033 - acc: 0.4286 - val_loss: 1.6119 - val_acc: 0.0000e+00
Epoch 3/1500

(中略)

Epoch 1500/1500
35/35 [==============================] - 0s 3ms/step - loss: 1.2697e-05 - acc: 1.0000 - val_loss: 1.1921e-07 - val_acc: 1.0000
data/test/orange/8242_1.jpg
label: 1 result: 1
data/test/orange/1152194_orange_isolated_on_white_background.jpg
label: 1 result: 1
data/test/orange/images (1).jpeg
label: 1 result: 1
data/test/orange/DKCcTzZXUAA0ckm.jpg
label: 1 result: 1
data/test/apple/81306024002557.jpg
label: 0 result: 0
data/test/apple/81306024002554.jpg
label: 0 result: 0
data/test/apple/1212043top.jpg
label: 0 result: 0
data/test/apple/1757f226647a6f1.jpg
label: 0 result: 0
100.0 %

こちらも無事に実行されています。

終わりに

過去の苦労がこれで解消されていくのかなと思います。 苦労が無駄だとは思いませんが、このくらい簡単になるとRaspberryPiのこの分野での存在感が高まってくるような気がします。

今回のインストール作業

$ sudo apt install libatlas-base-dev
$ pip3 install tensorflow
$ sudo pip3 install keras
$ wget https://github.com/mt08xx/files/blob/master/opencv-rpi/libopencv3_3.4.2-20180709.1_armhf.deb
$ sudo apt install -y ./libopencv3_3.4.0-20180115.1_armhf.deb
$ sudo ldconfig

【参考】

uepon.hatenadiary.com

uepon.hatenadiary.com

Twilioを使用して本当に5分でLineBotは作成できるのか?

以前のエントリーを書いている中で…

【参考】 uepon.hatenadiary.com

ハッカソンでも有名なTwilioの高橋さんから「TwilioならLINEbotがすぐ作れますよ」というコメントをもらったので、本当にそんなに簡単なのかを調べてみることにしました。

ググってみると…

www.youtube.com

という動画がありました。

「5分だと…」

前回までのエントリーが何だったのかを考えさせられてしまうパワーワード。Twilioは少しはかじってはいましたが、本格的に使ってはいなかったのですが、このタイミングで使用してみようと思います!そして本当に5分でできるのかも検証です! (ちなみに自分はboundio時代からユーザですw)

準備

5分というのは、TwilioとLINEの双方に詳しくないとそのぐらいの時間では難しいかなと思いますゆっくり準備などをしていきます。 基本は動画を見てもらえればいいかなと思いますので、その他は軽めで…

必要なものは

  • LINE Developerアカウント
  • Twilioのアカウント
  • ブラウザ(Chromeなど)

なのでこれらは事前に準備します。

LINE側の準備

まずはLINE側の設定を行います。基本は以前のエントリを参考にしてもらえればいいかなと思います。

【参考】 uepon.hatenadiary.com

以下のアドレスにアクセスを行い、画面右上の【ログイン】ボタンをクリックをします。

LINE Developers

f:id:ueponx:20180728140930p:plain

ユーザー名とパスワードを入力して【ログイン】ボタンをクリックします。

f:id:ueponx:20180726230905p:plain

ログインするとこれまでに作成したプロバイダー一覧が表示されるので、プロバイダーの選択または、新規で作成することになります。今回は事前に作成されていたプロバイダを使用することにします。リストから使用するプロバイダー名のもの(今回はMashup名古屋を例としています)をクリックします。

f:id:ueponx:20180728141336p:plain

すると、プロバイダーで作成されたChannelの一覧が表示されます。今回は新しいbotを作成するので新規のChannelを作成することにします。画面内の【新規チャンネル作成】にマウスオーバーするとボタン部分がグリーンに変わるので

f:id:ueponx:20180728141724p:plain

【新規チャンネル作成】ボタンをクリックします。

f:id:ueponx:20180728142049p:plain

するとダイアログが開き、

  • LINEログイン
  • Messaging API
  • Clovaスキル

からの選択になるので、Messaging APIをクリックします。

f:id:ueponx:20180728142255p:plain

新規チャンネルの作成画面に遷移するので

f:id:ueponx:20180728143804p:plain

まずは

を設定します。

自分はこんなふうに設定してみました。

  • アプリアイコン画像(いらすとやのオウムの画像)
  • アプリ名(TwilioParrot)
  • アプリ説明(オウム返し)

f:id:ueponx:20180728144640p:plain

続いては、画面をスクロールさせて

  • プラン(Developer Trial・フリー)
  • 大業種・小業種
  • メールアドレス

を設定します。気にしなければいけないのはプランで【Developer Trial】を選択します。

f:id:ueponx:20180728145857p:plain

すべての設定が完了したら画面下部にある【入力内容を確認する】ボタンをクリックします。

f:id:ueponx:20180728150206p:plain

情報利用に関する同意のダイアログが表示されるので【同意する】ボタンをクリックします。

f:id:ueponx:20180728150234p:plain

ダイアログが閉じると入力情報の確認画面になるので画面下部にある利用規約の同意チェックボックスの2つにチェックを入れて【作成】ボタンを押します。

f:id:ueponx:20180728150456p:plain

するとアプリが作成されます。

f:id:ueponx:20180728150617p:plain

今回作成したチャンネルを更に選択します。

f:id:ueponx:20180728150642p:plain

選択したチャンネルの基本設定画面に遷移します。

f:id:ueponx:20180728150734p:plain

この画面で表示されるChannel IDは以降で使用するのでメモなどをしておきます。

f:id:ueponx:20180728151214p:plain

続いて、アクセストークンの再発行を行います。

f:id:ueponx:20180728151318p:plain

【再発行】ボタンをクリックすると古いアクセストークンの失効時間の確認ダイアログが表示されます。 今回は新規作成したチャンネルですので0時間で問題ありません、そのまま【再発行】のボタンをクリックします。

f:id:ueponx:20180728151424p:plain

無事に新しいアクセストークンが発行されました。こちらも以降の処理で必要になるパラメータなのでメモをしておきます。

f:id:ueponx:20180728151505p:plain

更に画面を下にスクロールすると自動応答メッセージの設定があります。これらも【編集】ボタンをクリックして

f:id:ueponx:20180728151543p:plain

【利用しない】にラジオボタンを設定して、【更新】ボタンをクリックします。

f:id:ueponx:20180728151627p:plain

以下のようになっていればOKです。

f:id:ueponx:20180728151643p:plain

最後にWebhook送信の設定を変更します。【編集】ボタンをクリックして

f:id:ueponx:20180728151824p:plain

Botを作成する上では必須ともいえる設定なので忘れずに有効化してください。 ラジオボタンを【利用する】に合わせたら、【更新】ボタンをクリックします。

f:id:ueponx:20180728151846p:plain

設定の表示が以下のようになっていればOKです。

f:id:ueponx:20180728151903p:plain

一旦、これでLINE側の設定は終わりました。

Twilioの準備

続いては、Twilio側の設定になります。Twilio側で使用するのはChannelsとStudioになりますが、まずはChannels側の設定を行っていきます。 以下のリンクからTwilioへログインしていきます。

twilio.kddi-web.com

以下のような画面が表示されるのでアカウントを持っている人は画面右上にある【ログイン】ボタンをクリックします。アカウントが無い方は【サインアップ】ボタンをクリックして、まずはユーザーアカウントを作成してください。以下ではユーザーアカウントはあるものとして【ログイン】ボタンをクリックして処理を行っています。

f:id:ueponx:20180728152049p:plain

【ログイン】の画面に遷移しますので、メールアドレスを入力して【次】ボタンをクリックします。

f:id:ueponx:20180728152218p:plain

続いてはパスワードを入力して、【私はロボットではありません】というreCAPTCHAにチェックをいれて【ログイン】ボタンをクリックします。

f:id:ueponx:20180728152336p:plain

ログインが無事できたら、ダッシュボードの画面に進みます。初期状態がダッシュボード画面でないこともあるようなので、以下のようなダッシュボード画面に遷移をお願いします。

f:id:ueponx:20180728152601p:plain

今回設定するのはChannelsなので画面の左側にある【・・・】ボタン(マウスオーバーするとALL Products&Servicesが表示されます)をクリックして

f:id:ueponx:20180728152653p:plain

その中から【MARKETPLACE】の分類にある【Channels】をクリックします。

f:id:ueponx:20180728152730p:plain

すると画面がChannelsカタログの画面に遷移します。その中からLINEを選択してインストールを行います。【LINE】のアイコンをクリックします。

f:id:ueponx:20180728153129p:plain

LINEの設定になるので【インストール】ボタンをクリックしてインストールを行います。

f:id:ueponx:20180728153201p:plain

途中でサービス使用条件の同意ダイアログが表示されるのでチェックボックスにチェックをいれて(チェックをいれると【同意してインストール】ボタンがアクティブになります)

f:id:ueponx:20180728153246p:plain

【同意してインストール】ボタンをクリックします。これでインストール処理が行われます。画面が以下の様に遷移します。

f:id:ueponx:20180728153415p:plain

この画面で行う設定は

  • Programmable SMS Inbound
  • CHANNEL ID
  • CHANNEL ACCESS TOKEN

の3つのパラメータになります。画面の中程に集まっているのでここを設定していきます。

f:id:ueponx:20180728153738p:plain

Programmable SMS Inbound】のチェックボックスにチェックを入れ、LINEの設定側を行うときにメモをしたChannel IDを【CHANNEL ID】のテキストボックスへ、 LINEの設定画面で新たに発行したAccess Tokenを【CHANNEL ACCESS TOKEN】のテキストボックスへ入力します。

f:id:ueponx:20180728153909p:plain

設定が終わったら画面下にある【保存】ボタンをクリックします。

f:id:ueponx:20180728154103p:plain

【保存】ボタンをクリックすると設定内の【受信チャンネルURL】の文字列が長くなります。(保存の処理により生成されたことがわかります)

f:id:ueponx:20180728154223p:plain

この受信チャンネルURLの値をメモして、再びLINEのチャンネル設定の画面に戻ります。

再びLINEへ

LINEのChannel設定の画面に戻ったら、メッセージ送受信設定の分類にあるWebhook URLの値をTwilio Channelsでメモを行った【受信チャンネルURL】に変更します。

f:id:ueponx:20180728154339p:plain

【編集】ボタンをクリックして、テキストボックスを表示させます。

f:id:ueponx:20180728154411p:plain

Twilio Channelsでメモを行った【受信チャンネルURL】をテキストボックスに入力します。テキストボックスに入れる値はメモしたURLから先頭のhttp://を除いたものにするのを注意してください。

f:id:ueponx:20180728154526p:plain

設定したら【更新】ボタンをクリックします。更新が終わると【接続確認】が表示されるようになるので、クリックして接続テストを行います。

f:id:ueponx:20180728154608p:plain

設定値のしたに「成功しました」と表示されればOKです。

f:id:ueponx:20180728154648p:plain

これでLINE側の設定は完了しました。

再びTwilioへ

再び今度はTwilioの設定を行います。今回はStudio側(バックエンド側)の設定となります。 ダッシュボード画面の左側の【・・・】ボタン(All Products&Service)を開いて

f:id:ueponx:20180728154745p:plain

ENGAGEMENTS CLOUDの分類にあるStudioをクリックします。

f:id:ueponx:20180728154832p:plain

画面がStudio Dashboardに遷移するので【Create a flow】のボタンをクリックします。(この画面にならなくても違う形でボタンは表示されると思います。)

f:id:ueponx:20180728154929p:plain

作成するFlowの名前をつけるダイアログが表示されるので名前をテキストに入力します。今回はTwilioParrotという名前にしてみました。

f:id:ueponx:20180728155025p:plain

次に表示されるのは作り方になりますが、【Start from scratch】がデフォルトで選択されていましたので、このまま【NEXT】ボタンをクリックします。

f:id:ueponx:20180728155130p:plain

Flowが作られるとCanvasが表示されます。これを編集していくことになります。

f:id:ueponx:20180728155415p:plain

まずは、Canvasの右側にある【WIDGET LIBRARY】から【Send Message】をCanvasにドロップします。

f:id:ueponx:20180728155509p:plain

【ドロップ中】 f:id:ueponx:20180728155534p:plain

ドロップすると新たにBOXが表示されます。名前の表示が促されると思いますので適当に名前をつけてください。

f:id:ueponx:20180728155556p:plain

【Trigger】BOXの【Incoming Message】のコネクタと今作成した【send_message】BOXのコネクタをマウスで接続します。以下の様に矢印ができていればOKです。

f:id:ueponx:20180728155704p:plain

次に、【send_message】BOXをクリックします。すると、【SEND MESSAGE】の設定表示が行われるので、【Config】タブの【MESSAGE BODY】に

{{trigger.message.Body}}

と入力を行います。(入力補完されるので途中まで入力すると選択肢が表示されます) 入力が終わったら【Save】ボタンをクリックします。

f:id:ueponx:20180728160019p:plain

最後に【Trigger】BOXを選択して【FLOW CONFIGURATION】を表示させます。設定の中の【WEBHOOK URL】をメモしておきます。 これで、Twilio Studioとなります。

再度、Twilio Channelsの設定へ

先程メモしておいた【WEBHOOK URL】をCHANNELSのLINEの設定に埋め込みます。Configurationの分類にある【CALLBACK URL】のテキストボックスにメモをしておいた 【WEBHOOK URL】を入力して、【保存】ボタンをクリックすれば処理完了です。

f:id:ueponx:20180728160519p:plain

これで設定は完了です。(注)実は終わっていませんでした。残りは後述します。

テスト

あとはLINEのアプリからのテストになりますので、今回作成したBOTに友だち申請を行い、書き込みを行っていきます。LINEのチャンネル側設定画面にQRコードがあるのでそれを使うと便利です。

f:id:ueponx:20180728162137p:plain

友だち申請がされると以下のような画面になります。

f:id:ueponx:20180729115653p:plain

そこで会話をしてみると…帰ってこない…(´;ω;`)ブワッ

f:id:ueponx:20180729115955p:plain

設定漏れがないか確認してみました。

するとTwilio Studio側の設定で一つ漏れがありました。 画面上部に【Publish】ボタンが!!公開状態になっているのかなと思っていたのですが、逆にボタンを押さないと公開状態にならないということでした。 またこのボタン、一度押すと非アクティブになるので、初回のテスト時では必ず押しておく必要がありそうでした。

f:id:ueponx:20180728170430p:plain

【Publish】ボタンを押すと、確認ボタンがでますのでもう一度ダイアログ上で【Publish】ボタンを押します。

f:id:ueponx:20180728170512p:plain

処理が完了すると【Publish】ボタンが【Published】となり非アクティブ化されます。

f:id:ueponx:20180728170547p:plain

では、再度テストを行ってみます。(これ以外の設定は触らなくてもテスト出来ます。)

f:id:ueponx:20180729120626p:plain

ようやく動いてくれました。

終わりに

無事におわりました。時間からすると初めてだと5分では完成できないにしろ、流れがわかってしまえば2回目からは5分程度で作成できますね。 ほぼにノンコーディングでやれるのはいい感じです!

PythonでLINEBotはじめました(冷やし中華的な)【後編】

前回の続きのエントリーとなります。 今回は前回作成したプログラムをHerokuに移行することを目指します。

更新がかなり遅れたのですが、ずーっと悩んでいましたが原因がやっとわかったので更新となります。 自分の開発環境のみでの話だと思いますので、それについての記載の必要はなさそうです。

【前回のエントリー】 uepon.hatenadiary.com

Herokuとは?

jp.heroku.com

HerokuWikipediaによれば

Heroku - Wikipedia

Heroku(へろく)は2007年創業のアメリカ合衆国の企業。また、同社が開発と運営を行っているPaaSの名称でもある。

初期はRubyによるウェブアプリケーションフレームワークRuby on Railsのみのサポートであったが、Java、Node.js、ScalaClojurePythonPHP、Goなど複数のプログラミング言語をサポートするようになった。

かなり大雑把にいうなら、Herokuを使用すると開発したWEBアプリケーションを簡単に公開することができます。(※自分は慣れていないので少し苦労しました)

今回はこのHerokuを使用して前回作成したLINEBotを公開します。

Herokuを使用するための準備

まずは、Herokuを使用するための準備を行います。以前は、Heroku Toolbeltというアプリケーションを使用してHerokuへデプロイを行っていましたが、現在はHeroku CLIという名前になっています。

まずダウンロードしてみましょう。Herokuにアクセスを行います。ユーザアカウントがなければここで作成を行います。今回はこの部分は事前に行われている前提で話を進めていきます。

f:id:ueponx:20180620220221p:plain

画面の右上に【ログイン】ボタンがありますのでクリックしてログインを行います。 ユーザIDとパスワードを入力して【Log In】ボタンをクリックすればOKです。

f:id:ueponx:20180620220509p:plain

すると以下のような画面に遷移します。画面中に使用するサービスに使用する言語が表示されているのがわかるかと思います。

f:id:ueponx:20180620220937p:plain

拡大すると以下の様になっています。今回はpythonを選択します。

f:id:ueponx:20180620221057p:plain

pythonをクリックすると画面が以下のように遷移します。開発に必要なもののが表示されます。

f:id:ueponx:20180620221321p:plain

必要となるものは以下のように書いてありますが

  • Herokuのフリーアカウントの準備
  • ローカルの環境にPython version 3.6のインストール(OSはOS XWindowsLinux
  • ローカルの環境にPipenvのインストール
  • ローカルの環境にPostgresのインストール

ここで記載されているものは、以降のチュートリアルを行うために必要な環境なので、そのまま作業を進めても大丈夫です。 画面下部にある【I'm readly to start】ボタンをクリックします。

f:id:ueponx:20180701214523p:plain

画面表示が以下のようになるので画面内にある

f:id:ueponx:20180620221406p:plain

以下のボタン部分をクリックします。

f:id:ueponx:20180701214848p:plain

するとローカル側のOSを選択するプルダウンが開くので

f:id:ueponx:20180620221439p:plain

自分の環境にあったOSを選択します。今回使用している環境はWindows 64bitだったので【Windows 64】を選択します。するとプルダウンの部分が選択したOSになります。

選択前【Download the Heroku CLI for …】

選択後【Download the Heroku CLI for Windows 64】

f:id:ueponx:20180620221456p:plain

OSの選択後に表示が変更された【Download…】のボタンをクリックするとHeroku CLIインストーラーがダウンロードされます。Windows 64bitでは以下のようなファイルがダウンロード出来ます。

f:id:ueponx:20180620221542p:plain

このインストーラーを起動すると、インストールを行うコンポーネントの選択になります。このインストーラではHeroku CLI環境変数のPATHセット、Gitのインストールを行ってくれます。

f:id:ueponx:20180620221904p:plain

今回はそのまますべてインストールします。(Gitのインストールに関しては行うかどうかを決めたほうがいいかと思います。今回テストした環境ではGitのバージョンが2.8.1よりも低かったこともあり、一度Gitのアンインストールを行ってからインストールをしています。)

【Next >】ボタンをクリックしてインストールを進めます。

すると次はHeroku CLIのインストールパスの設定になります。基本的にはそのままで大丈夫だと思いますので【Install】ボタンをクリックします。

f:id:ueponx:20180620221947p:plain

プログレスバーが動きインストールが徐々に行われていきます。

f:id:ueponx:20180620222049p:plain

途中でGitのSetupのダイアログが表示されます。まずはライセンスの同意画面が表示されますので、確認後【Next >】ボタンをクリックします。

f:id:ueponx:20180620222311p:plain

続いてはGitのインストールパスに関してですが、そのままで大丈夫だと思いますので、確認後【Next >】ボタンをクリックします。

f:id:ueponx:20180620222341p:plain

次はGitのインストールコンポーネントの選択になります。ショートカットアイコンをデスクトップに作るかとか、Explorerの右クリックメニューでGit Bashを表示するか、.gitや.shの拡張子の関連付けするか、表示にTureTypeフォントを使用するかなどが聞かれています。インストール後でも変更はできるので、自分下記の様に選択してみました。

【Next >】ボタンをクリックします。

f:id:ueponx:20180620222444p:plain

Windowsのスタートメニューの表記もそのままで良いので【Next >】ボタンをクリックします。

f:id:ueponx:20180620222514p:plain

まだまだ続きます。次はGitのPATH設定です。Git Bashからしか使用しないか、cmd.exeから使用するか、はたcmd.exe上から違うUnixツールを使用して使うかという感じです。Git Bashからでいいような気もしますが、ここはUse Git from the Windows Command Promptを選択しました。(cmd.exeからの使用)

選択したら、【Next >】ボタンをクリックします。

f:id:ueponx:20180620222753p:plain

次は改行コードの設定になります。 checkoutの改行コードとcommit時の改行コードを選択することになりますが、 このあたりは好きに選んで頂いたほうがいいのかなと思います。 個人的にはcommitはUnix-styleが良いかと思いますので、Checkout Windows-style, commit Unix-style line encodingsを選択しました。

選択したら、【Next >】ボタンをクリックします。

f:id:ueponx:20180620222917p:plain

次はGit Bashのターミナル設定になりますがそのままにしました。

選択したら、【Next >】ボタンをクリックします。

f:id:ueponx:20180620223104p:plain

最後は追加機能になりますが、これもそのままインストールすることにしました。

選択したら、【Install】ボタンをクリックします。

f:id:ueponx:20180620223145p:plain

これでインストール処理が進んで行きます。インストーラーのほとんどがGitなのでGitインストールを行わなければここまで面倒な選択にはならないと思います。(この点はOS XLinuxは羨ましいです。)

f:id:ueponx:20180620223217p:plain

プログレスバーが100%になったらGitのインストールは完了です。【Finish】ボタンをクリックします。今、完了したのはあくまでもGitのインストールです。本当に必要なのはこのあとインストールされるHeroku CLIになります。

f:id:ueponx:20180620223255p:plain

Heroku CLIのインストールのプログレスバーが100%なったら処理は完了です。以下の様な画面になったら【Close】ボタンをクリックして、インストーラーを終了させます。

f:id:ueponx:20180620223421p:plain

インストール後はスタートメニューからGitをグループを検索してその中からGit CMDを選択して実行を行います。

f:id:ueponx:20180701224103p:plain

Git CMDが起動するので実際にGitコマンドを実行してバージョンを確認してみました。

C:\>git --version
git version 2.8.1.windows.1

f:id:ueponx:20180701224237p:plain

インストールを行ったVersion 2.8.1がインストールされていることがわかります。

続いてHeroku CLIのコマンドを実行してみます。Heroku CLIをダウンロードしたブラウザに戻るとHerokuへログインするコマンドを叩いてみてねというメッセージがあるので、これに従ってCLI経由でログインをしてみます。

f:id:ueponx:20180620222213p:plain

コンソール上(Git CMD)から以下の様に実行してみます。*の部分は自分のアカウントに合わせてください。

(base) C:\src > heroku login
Enter your Heroku credentials:
Email: *********@*********
Password: **************
Logged in as *********@*********

f:id:ueponx:20180620224743p:plain

Herokuへログインができ、Heroku CLIのインストールも無事に完了したことがわかりました。

インストールが終わったのでようやくHerokuLINEbotをデプロイする作業になります。

HerokuLINEBotをデプロイする

以下のエントリーがわかりやすかったです。参考にさせていただきました。

【参考】 qiita.com

設定ファイルの作成

Herokuでの実行環境の設定ファイルを可能であればローカルに合わせるためにローカル実行環境のバージョンを事前に調べて、設定ファイルを作成します。

(base) C:\src> python --version
Python 3.6.4 :: Anaconda, Inc.

(base) C:\src> pip freeze
alabaster==0.7.10
(中略)
Flask==0.12.2
(中略)
line-bot-sdk==1.6.0
(中略)
zict==0.1.3

作成するファイルは、

  • runtime.txt(Pythonのバージョンを記載)
  • requirements.txt(依存するライブラリの記載)
  • Procfile(プログラムの実行方法を定義)

あとはもちろん

  • main.py(アプリケーションのプログラム)

となります。

.gitignoreもあってもいいかなと思いますが、今回は最小単位での実行なので割愛しています。

runtime.txt(Pythonのバージョンを記載)

python-3.6.4

requirements.txt(依存するライブラリの記載)

Flask==0.12.2
line-bot-sdk==1.6.0

Procfile(プログラムの実行方法を定義)

web: python main.py

main.py(アプリケーションのプログラム)

from flask import Flask, request, abort
import os

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

app = Flask(__name__)

#環境変数取得
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]

line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)

@app.route("/")
def hello_world():
    return "hello world!"

@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))

if __name__ == "__main__":
#    app.run()
    port = int(os.getenv("PORT"))
    app.run(host="0.0.0.0", port=port)

これまでのファイルを作成するとディレクトリ構造は以下の様な感じになると思います。

(base) C:\linebot>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 9EF6-06E5 です

 C:\linebot のディレクトリ

2018/07/26  21:22    <DIR>          .
2018/07/26  21:22    <DIR>          ..
2018/07/26  08:53             1,641 main.py
2018/07/25  07:45                19 Procfile
2018/07/25  07:45                34 requirements.txt
2018/07/25  07:44                12 runtime.txt
               4 個のファイル               1,706 バイト
               2 個のディレクトリ  223,239,733,248 バイトの空き領域```

f:id:ueponx:20180726225127p:plain

Herokuへデプロイするアプリケーションの設定

Herokuにデプロイするアプリケーションの作成と、アプリケーション内部で使用している環境変数を設定します。

(base) C:\linebot> heroku create 【アプリケーション名】
(base) C:\linebot> heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="【LineDevelopersのChannelの設定ページで表示されたAccessトークン】" --app 【アプリケーション名】
(base) C:\linebot> heroku config:set YOUR_CHANNEL_SECRET="【LineDevelopersのChannelの設定ページで表示されたSECRET】" --app 【アプリケーション名】

設定をした【アプリケーション名】を使用して、Webアクセスをしたときのエンドポイントがhttps://【アプリケーション名】.herokuapp.com/になります。

これで設定できました。環境変数がセットされたかは以下のコマンドで確認ができます。

heroku config --app uepon-linebot

例えば、【アプリケーション名】をuepon-linebotとした場合には以下のような実行結果となります。

(base) C:\linebot>heroku create uepon-linebot
Creating ⬢ uepon-linebot... done
https://uepon-linebot.herokuapp.com/ | https://git.heroku.com/uepon-linebot.git

(base) C:\linebot>heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="【LineDevelopersのChannelの設定ページで表示されたAccessトークン】" --app uepon-linebot
Setting YOUR_CHANNEL_ACCESS_TOKEN and restarting ⬢ uepon-linebot... done, v3
YOUR_CHANNEL_ACCESS_TOKEN: 【LineDevelopersのChannelの設定ページで表示されたAccessトークン】
(base) C:\linebot>heroku config:set YOUR_CHANNEL_SECRET="【LineDevelopersのChannelの設定ページで表示されたSECRET】" --app uepon-linebot
Setting YOUR_CHANNEL_SECRET and restarting ⬢ uepon-linebot... done, v4
YOUR_CHANNEL_SECRET: 【LineDevelopersのChannelの設定ページで表示されたSECRET】

(base) C:\linebot>heroku config --app uepon-linebot
=== uepon-linebot Config Vars
YOUR_CHANNEL_ACCESS_TOKEN: 【LineDevelopersのChannelの設定ページで表示されたAccessトークン】
YOUR_CHANNEL_SECRET:  【LineDevelopersのChannelの設定ページで表示されたSECRET】

【実行のようす】 f:id:ueponx:20180726225905p:plain

Herokuへデプロイする

アプリケーションの作成と設定が終わったらGitを使用してデプロイを行います。 以下の様に実行していけばいいのですが・・・

(base) C:\src> git init
(base) C:\src> git add .
(base) C:\src> git commit -m "first commit"
(base) C:\src> git push heroku master

注意点1

実行していくと途中、(gitの初回使用の場合だと思いますが)コマンドラインでメールアドレスとユーザーネームを尋ねられてしまうことがあるので、その場合には下記のようにgit configで登録を行ってください。

【エラーの表示】

(base) C:\linebot> git commit -m "first commit"

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got '*****@*******.(none)')

以下のコマンドを自分の設定に合わせて行います。

(base) C:\linebot> git config --global user.email "【メールアドレス】"
(base) C:\linebot> git config --global user.name "【名前】"

注意点2

git push heroku masterを行ったときに以下の様なエラーが出た場合には

【エラーの表示】

(base) C:\linebot>git push heroku master
fatal: 'heroku' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

f:id:ueponx:20180726230148p:plain

こちらのエントリーを参考にして

【参考】 qiita.com

下記の様にコマンドを実行します。(このコマンドで.git/configにリモートリポジトリの設定が追加されます)

(base) C:\linebot>git remote add heroku https://git.heroku.com/【アプリケーション名】.git

その後、git push heroku masterするとエラーは発生せず実行が行われます。

(base) C:\linebot>git push heroku master
Counting objects: 10, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (10/10), 2.75 KiB | 0 bytes/s, done.
Total 10 (delta 1), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Python app detected
remote:  !     The latest version of Python 3.6 is python-3.6.6 (you are using python-3.6.4, which is unsupported).
remote:  !     We recommend upgrading by specifying the latest version (python-3.6.6).
remote:        Learn More: https://devcenter.heroku.com/articles/python-runtimes
remote: -----> Installing python-3.6.4
remote: -----> Installing pip
remote: -----> Installing requirements with pip
remote:        Collecting Flask==0.12.2 (from -r /tmp/build_6689ac1a6741420f3d4f4c7f8da40fe8/requirements.txt (line 1))
remote:          Downloading https://files.pythonhosted.org/packages/77/32/e3597cb19ffffe724ad4bf0beca4153419918e7fa4ba6a34b04ee4da3371/Flask-0.12.2-py2.py3-none-any.whl (83kB)
remote:        Collecting line-bot-sdk==1.6.0 (from -r /tmp/build_6689ac1a6741420f3d4f4c7f8da40fe8/requirements.txt (line 2))
remote:          Downloading https://files.pythonhosted.org/packages/17/f7/6babf86d300cd98671c94a695c72b961ce6eb26ccb46a2eabe53edc181e4/line_bot_sdk-1.6.0-py2.py3-none-any.whl
(中略)
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 44.6M
remote: -----> Launching...
remote:        Released v3
remote:        https://uepon-echo-linebot.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/uepon-echo-linebot.git
 * [new branch]      master -> master

f:id:ueponx:20180726230351p:plain

念の為、先程【アプリケーション名】をuepon-linebotとした場合には以下のような実行結果となります。

(base) C:\linebot>git init
Initialized empty Git repository in C:/linebot/.git/

(base) C:\linebot>git add .

(base) C:\linebot>git commit -m "first commit"
[master (root-commit) 66e2d01] first commit
 4 files changed, 61 insertions(+)
 create mode 100644 Procfile
 create mode 100644 main.py
 create mode 100644 requirements.txt
 create mode 100644 runtime.txt

(base) C:\linebot>git remote add heroku https://git.heroku.com/uepon-linebot.git

(base) C:\linebot>git push heroku master
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (6/6), 1.23 KiB | 0 bytes/s, done.
Total 6 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Python app detected
remote:  !     The latest version of Python 3.6 is python-3.6.6 (you are using python-3.6.4, which is unsupported).
remote:  !     We recommend upgrading by specifying the latest version (python-3.6.6).
remote:        Learn More: https://devcenter.heroku.com/articles/python-runtimes
remote: -----> Installing python-3.6.4
remote: -----> Installing pip
remote: -----> Installing requirements with pip
remote:        Collecting Flask==0.12.2 (from -r /tmp/build_75a6e194f23fb5b2bfc239b6b8f891b7/requirements.txt (line 1))
remote:          Downloading https://files.pythonhosted.org/packages/77/32/e3597cb19ffffe724ad4bf0beca4153419918e7fa4ba6a34b04ee4da3371/Flask-0.12.2-py2.py3-none-any.whl (83kB)
remote:        Collecting line-bot-sdk==1.6.0 (from -r /tmp/build_75a6e194f23fb5b2bfc239b6b8f891b7/requirements.txt (line 2))
remote:          Downloading https://files.pythonhosted.org/packages/17/f7/6babf86d300cd98671c94a695c72b961ce6eb26ccb46a2eabe53edc181e4/line_bot_sdk-1.6.0-py2.py3-none-any.whl
(中略)
remote:        Successfully installed Flask-0.12.2 Jinja2-2.10 MarkupSafe-1.0 Werkzeug-0.14.1 certifi-2018.4.16 chardet-3.0.4 click-6.7 future-0.16.0 idna-2.7 itsdangerous-0.24 line-bot-sdk-1.6.0 requests-2.19.1 urllib3-1.23
remote:
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 44.6M
remote: -----> Launching...
remote:        Released v5
remote:        https://uepon-linebot.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/uepon-linebot.git
 * [new branch]      master -> master

実行環境の設定

念の為、実行時の環境変数とHerokuの実行環境のワーカープロセスの設定を行います。

(base) C:\src> heroku ps:scale web=1

テスト

(base) C:\src> heroku open

これでHelloWorldが表示されれば、作業は成功しています。

f:id:ueponx:20180726224746p:plain

Herokuのダッシュボードも念の為確認してみると、問題なくデプロイされているのがわかります。

f:id:ueponx:20180726230610p:plain

LINE側の設定

ここまできたらあとはLINE側のChannel設定のエンドポイントをHerokuでデプロイしたリンクに変更します。あと一歩です。

まずはLineDevelopersのページにアクセスし、画面の右上にある【ログイン】ボタンをクリックしてログインを行います。

f:id:ueponx:20180726230838p:plain

メールアドレスとパスワードでログインを行います。それぞれ入力を行って【ログイン】ボタンをクリックします。

f:id:ueponx:20180726230905p:plain

ログインを行うと作成しているプロバイダーリストが表示さえるので設定するプロバイダーを選択します。以前作成したプロバイダーは【Mashup名古屋】だったのでそれをクリックします。

f:id:ueponx:20180726230919p:plain

続いて、プロバイダー内にあるChannelを選択します。前回作成したbotは【MashupNagoyaEcho】という名前でしたのでそれをクリックします。

f:id:ueponx:20180726230931p:plain

チャンネル基本設定の画面になるので画面をスクロールさせて

f:id:ueponx:20180726230958p:plain

【メッセージ送受信設定】の項目までいきます。その中にあるエンドポイントの設定、つまり【Webhook URL】をHerokuのアプリケーションのURLに変更します。【編集ボタン】をクリックしてURLを編集します。 すでにhttps://は書かれているのでそれ以降のURLを記載します。先程Herokuにデプロイしたアプリ名はuepon-linebot でしたので、この場合uepon-linebot/callbackを入力します。入力後は【更新】ボタンをクリックします。

f:id:ueponx:20180726231052p:plain

これで設定完了です。普通であればここで【接続確認】のボタンをクリックして接続テストするのですが…

f:id:ueponx:20180726231110p:plain

何故かエラー…泣けますが、とりあえずこのまま進めていきます。

f:id:ueponx:20180726231123p:plain

ではスマートフォン側のLineアプリでBotに対してメッセージを送信してみましよう。エラーがでているのでクソ不安ですが。すでに友だち登録はしているので呼び出しはすぐにできるかと思います。接続テストはNGでしたが、うまく動作しているようです。

f:id:ueponx:20180727001441p:plain

念の為、Herokuのアクセスログも確認してみます。

(base) C:\linebot> heroku logs

f:id:ueponx:20180726231149p:plain

実行もうまく行えているのが確認できました。(接続テストのエラーがよくわかってないですが…)

おわりに

今回のエントリーで書いている間によくわからないトラブルがあってうまく行かなかったのですが、ようやくエントリーも書き終えました。これで…

www.line-community.me

へのファーストステップが迎えられたかなと思います。 みなさんもいいBotライフを!

【参考】

uepon.hatenadiary.com

このブログもHTTPS化しました

このブログもHTTPS配信の設定に変更しました。過去のエントリーでも若干HTTPの混在状態になっていますが、ほとんどが画像やリンクという感じでしたので、更新は諦めました。(具体的にはリンク先のプレビュー表示が抜けていますが、リンクをクリックすれば、問題なく表示されていますので実害はないかなと思います)

あと今まで使用していたテーマの一部がHTTPSに対応していなかったので別のテーマに変更しました。(CSS全くわからない…のでかなりあっさりしています。)

引き続きよろしくお願いいたします。