初心者のPythonアプリ開発記

Pythonアプリで一人働き方改革を実現

簡単!Python & HerokuでLINEボットを実装②

前回に引き続き、LINEボットの実装方法をまとめていきます。

今回はHerokuの設定についてまとめました。Herokuアカウントの作成、ログイン→アプリ登録→アドオン追加という流れで設定していきます。まだまだ初期準備ですが、めげずにやっていきましょう。一つずつ確実に実行すれば、必ず動いてくれます。

目次

Herokuアカウントの作成、ログイン

①Herokuアカウントを作成

まずはHerokuアカウントを作成します。Herokuトップページの「Sign Up」をクリックし、必要な情報を入力してアカウントを作成します。

②Heroku CLIのインストール

Herokuをターミナルから操作するために、Heroku CLIというツールをインストールします。

macの場合は$ brew tap heroku/brew && brew install herokuでターミナルから直接インストール可能なようですが、Windowsの場合はwindows 64bitか、windows 32bitからインストールします。これでターミナルからHerokuの操作が可能になります。

③Herokuにログイン

ターミナルから、heroku loginと入力すると、heroku: Press any key to open up the browser to login or q to exit:が表示されるので、q以外を入力します。その後、登録したメールアドレスとパスワードを入力すればログイン完了です。

Herokuにアプリを登録、アドオンを追加

①Heroku上にアプリを登録

ターミナルから、heroku create アプリ名と入力します。今回は、アプリ名をlineoumugaeshiとしました。

適当な名前を付けてOKですが、ほかの人が作成したアプリと同名にはできないので、重複していると警告が出たら、別の名前で試してみてください。

アプリ名は小文字のアルファベット、数字とダッシュのみ使用できます。また、アプリ名の頭文字は小文字のアルファベットのみです。

アプリが登録されると、ターミナル上にアプリのアドレスとgitリポジトリのアドレスが表示されます。今回の例では、以下アドレスが表示されました。

gitリポジトリのアドレスは後程使用するので、どこかにメモしておくと後々便利ですが、いつでもHerokuのWebページから確認することもできます。

②クレジットカード情報の登録

ラインボットを使用するには接続元IP(ここではHerokuのIP)を指定する必要があります。Herokuに無料で使用できる「Fixie」アドオンを追加すればOKですが、クレジットカードの登録が必須になります。

まずはWebブラウザからHerokuにログインし、1.右上のアイコンをクリック -> 2.Account settings -> 3.Billing -> 4.Add Credit Card と進めてクレジットカード情報を登録します。

これで「Fixie」アドオンを使用する準備ができました。

③「Fixie」アドオンの追加

ターミナルからheroku addons:create fixie:tricycle --app アプリ名と入力すればアドオンの設定は完了です。 アプリ名は③で登録したアプリの名前です。今回の例ではlineoumugaeshiです。

これでIPが固定され、ラインボットの利用が可能になります。

以上でHerokuの初期設定は完了です。

次回からようやくPythonを使用します。

簡単!Python & HerokuでLINEボットを実装①

とても面白そうかつ便利そうだったので、PythonとHerokuを使ったLINEボットにチャレンジしてみました。ライン上でPythonの入出力ができるので、インターフェイスを準備する手間が省けて非常に便利です。

チャレンジしたのは、サンプルコードがある単純なechoボットですが、いくつかハマるポイントがあったのと、一貫した設定方法を説明しているところが少なかったのでまとめておきたいと思います。

全体的な流れとしては、LINEの設定、Herokuの設定、スクリプトの作成、デプロイとなります。

今回は、LINEの設定についてまとめました。具体的には、LINE BUSINESS ID取得→プロバイダとMessagingAPIチャネル作成→チャネルの基本設定という流れになります。

目次

LINE BUSINESS ID登録からMessagingAPIのチャネル作成まで

LINE BUSINESS IDにログイン。

※既存のLINEでログイン可能です。なければ別途IDを登録してください。

② 「新規プロバイダー作成」をクリック

③ 「プロバイダー名」を入力(今回の例:python_LINEボットテスト用)し、「確認する」をクリック

④ 「作成する」をクリック→プロバイダー作成完了

⑤ 作成したプロバイダーを選択し、MessagingAPIの「チャネルを作成する」をクリック

⑥ アプリ名(今回の例:オウム返し)とアプリ説明(今回の例:入力した言葉をオウム返しするアプリ)を入力

⑦ 「DeveloperTrial」と「フリー」の2種類からプランを選択。今回のオウム返しアプリ用にはどちらでもよいが、Developer Trialを選択した。

※DeveloperTrial利用時は追加可能友達数は50人に制限されるが、PUSH通知ができる。他プランへの切り替えやプレミアムIDの購入は不可。一方、フリーは人数制限はないが、PUSH通知ができない。

⑧ 「大業種」、「小業種」を選択。個人で問題ない。

⑨ メールアドレスを入力

⑩ 同意文書を読み、「同意する」をクリック。

⑪ 同意項目2つにチェックを入れ、「作成」をクリック。

以上でチャネル作成が完了です!!

次は作成したチャネルを選択し、チャネルの基本設定をしていきます。

チャネル基本設定

① 「Channel Secret」の項目に記載されている文字列をメモしておく。Herokuサーバー設定時に使用します。

② 「アクセストークン(ロングターム)」の項目にある「再発行ボタン」をクリックし、生成された長いランダムの文字列をメモしておく。こちらも後程Herokuサーバー設定時に使用。

③ 「Webhook送信」の項目にある「編集」をクリックし、「利用する」にチェックを入れ、「更新」をクリック。

④ 「Webhook URL」の項目は現時点は触りませんが、Heroku設定後に編集します。

⑤ 「自動応答メッセージ」の項目にある「編集」をクリックし、「利用しない」にチェックを入れて「更新」をクリックする。

以上で最初の設定は完了です。

この後Herokuの設定をしていきます。

tkinter flashメソッドによるボタンの点滅 Python

tkinterGUIを作成しているときに、ボタンを点滅させたい場面があったので少し方法を調べてみました。

ネット上を検索してもあまり良い情報がなかったので、なんとなくtkinter__init__.pyを見に行ってボタンウィジェットのコードを確認したところ、デフォルトでflashメソッドがあるとのこと!(__init__.pyの2367行目)

早速動作確認してJupyter Notebookにまとめてみました。

テストコード(Jupyter Notebook)

gistf47e1b7cffecf34111ef7e792287c9b7

実行結果

上記のテストコードを実行すると、次のような画面が現れ、ボタンをクリックするとボタンが数回点滅します。

f:id:vigilantPotato:20190119214716j:plain

点滅時の色指定等はできませんが、単純に点滅させたいだけならこれで十分そうです。

Pandas CSVファイルの読み込み・保存 Python

Pandasを用いたCSVファイルの読み込みと保存方法についてまとめました。 (今回は、試しにJupyter notebookでコードを解説し、Gistにアップしたものを張り付けてみます。)

仮想環境に機械学習環境を構築! Python

Pythonを始めたからにはいつか挑戦しようと思っていた機械学習Pythonの基本とGUI作成はそれなりにできるようになったので、とうとう始めてみることにしました。

とりあえず、amazonで「Pythonではじめる機械学習」という本を購入。

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

この本では、必要なツールがすべてパッケージされているAnacondaを使用することを勧めていますが、これまで素人なりにプロジェクトごとに仮想環境を構築するようにしてきたので、機械学習の環境も仮想環境でできないか試しにやってみました。また、PCの容量にもあまり余裕がないので、不要なライブラリ等はできるだけインストールしないようにしたかったというのもあります。

最初から教科書の流れに逆らってしまい少し不安でしたが、意外とうまくいったので記録に残しておきます。

ライブラリ、ツールのインストール

上記の教科書で必要になるライブラリは、NumPy、SciPy、matplotlib、IPython、scikit-learn、pandasなどです。これらは通常通り、コンソール上で仮想環境を構築するフォルダに移動後、pipenv installで仮想環境にインストールできます。

また、Jupyter Notebookも必要になりますが、こちらもpipenv installで仮想環境にインストール可能です。

仮想環境の起動

インストールが完了したら、pipenv shellで仮想環境を起動させます。

仮想環境起動後、コンソール上でjupyter notebookと打ち込むと、Jupyter Notebookが起動します。その他、仮想環境にインストールしたライブラリ群も、Jupyter Notebookから使用することができます。

以下に、実際にJupyterNotebookを起動させたときの画面を載せておきます。

f:id:vigilantPotato:20190107225833j:plain

このように、仮想環境起動後、jupyter notebookと打ち込むと。。。

f:id:vigilantPotato:20190107230042j:plain

ブラウザが自動で開いて、JupyterNotebookが実行されました。

まとめ

機械学習の環境も、簡単に仮想環境に構築することができました。 ただ単に教科書通りに進めていくだけでなく、これまでに得た知識を応用できるとなんだか進歩した気がしてよいですね。 すでにPython環境があって、今からAnacondaを入れるのは嫌で、仮想環境を使いたい人はこの方法が簡単です。

tkinter.ttk Notebookの使い方 Python

tkinter.ttkで利用できるNotebookの使い方を、実際にコードを書きながらまとめました。

Notebookの概要

Notebookは複数のウィンドウをタブで管理するためのウィジェットです。 一つのウィンドウにたくさんの情報を詰め込みすぎると、ウィンドウサイズが大きくなってしまいますし、使いづらいですが、Notebookをうまくタブを使って情報を整理してあげると、ユーザーフレンドリーなアプリにすることができそうです。

実際にコードを書いて、動作を確認しましょう。

アプリ概要

とても単純ですが、タブを使ってテキストボックスの画面とボタンの画面を切り替えるアプリを作ってみたいと思います。

以下が、完成したアプリの画面です。

f:id:vigilantPotato:20190106145121j:plain

タブが二つ作成されていて、テキストボックスが表示されています。

ボタンのタブをクリックしてみます。

f:id:vigilantPotato:20190106145206j:plain

画面が切り替わり、ボタンが表示されました。

コード

以下が、上記のアプリのコードになります。 非常に短いです。

import tkinter
from tkinter import ttk

class TestNotebook(ttk.Notebook):
    def __init__(self, master=None):
        super().__init__(master)
        f1 = tkinter.Text(self)
        f2 = tkinter.Button(self, text="Button")
        self.add(f1, text="Text")
        self.add(f2, text="Button")


if __name__ == "__main__":
    root = tkinter.Tk()
    f = TestNotebook(master=root)
    f.pack()
    root.mainloop()

TestNotebookクラスは、Notebookクラスを継承させて、タブ内に表示させるウィジェットを生成しています。 f1がテキストボックスウィジェットで、f2がボタンウィジェットですね。

タブは、.addで追加することができます。引数としてタブ内に表示させるウィジェットと、textオプションでタブ部に表示するテキストを渡しています。 複数のウィジェットを渡す場合は、FrameやLabelFrameでまとめたうえで、.addに渡してあげればOKです。

今回はタブを作成するだけのアプリを作ってみましたが、.forgetでタブの削除も簡単にできます。 また、タブを選択したときには仮想イベント<<NotebookTabChanged>>が生成されるので、.bindを用いてメソッドと紐づけることも可能です。

まとめ

tkinter.ttkの、Notebookの使い方を簡単にまとめました。 画面の整理にとても有用なので、積極的に使っていきたいと思います。

追記

以前、過去に作成した2つののアプリをgridを用いて同じ画面に横並びで表示させたのですが、今回Notebookを使えるようになったので、試しにタブ表示させてみました。

以下が、タブ表示させたときの画面です。

まずはWordClipperのタブです。

f:id:vigilantPotato:20190106151400j:plain

次は、GetWeatherのタブです。

f:id:vigilantPotato:20190106152304j:plain

アプリごとにタブで画面を分けることで、非常にスマートな画面になりました。

以下がコードです。

import tkinter
from tkinter import ttk
import WeatherGetter
import WordClipper

if __name__ == '__main__':
    root = tkinter.Tk()
    root.title('usefulApp')

    app = ttk.Notebook(master=root)
    app1 = WordClipper.WordClip(master=root)
    app2 = WeatherGetter.ShowWeather(master=root)

    app.add(app1, text='WordClipper')
    app.add(app2, text='WeatherGetter')

    app.pack()
    root.mainloop()