ローカルでも動くSlackBot管理ツールができるまで 〜 Bot編 〜

ローカルでも動くSlackBot管理ツールができるまで 〜 WebUI編 2 〜の続き。 はてブからデータを取得し、Slackに投稿するBotを作成。   [amazonjs asin=”479804315X” locale=”JP” title=”Pythonプロフェッショナルプログラミング第2版”]   構成   githubから必要なファイルをダウンロード まずこれまでに作った仮想環境に入り、slack_botterディレクトリ配下にbotディレクトリを作成する。 [shell] $ cd /Users/umentu/Documents/slack_botter $ source ./bin/activate (slack_botter)$ mkdir bot (slack_botter)$ cd bot [/shell] gitからhatebubotをダウンロードする。 hatebu_bot.pyのみ必要なため、hatebu_bot.pyをbotディレクトリに入れる。 次にrequirements.txtの中身をpipでインストールしたらhatebubotディレクトリは削除する。 [shell] (slack_botter)$ git clone https://github.com/umentu/hatebubot (slack_botter)$ mv hatebubot/hatebu_bot.py ./ (slack_botter)$ pip install -r hatebubot/requirements.txt (slack_botter)$ rm -rf ./hatebubot [/shell] gitからslackbotをダウンロードする。 slack_bot.pyのみ必要なため、slack_bot.pyをbotディレクトリに入れる。 次にrequirements.txtの中身をpipでインストールしたらslackbotディレクトリは削除する。 (pipでのインストールに関しては、WebUI編2で行っている場合は同じパッケージのため必要ない。) [shell] (slack_botter)$ git clone https://github.com/umentu/slackbot (slack_botter)$ mv slackbot/slack_bot.py ./ (slack_botter)$ pip install -r slackbox/requirements.txt (slack_botter)$ rm -rf ./slackbot [/shell]   botディレクトリに bot.py を作成 botディレクトリ配下にBotの本体となるbot.pyを作成する。 Web編1 で作成したDB(sqlite3)のhatebu_listテーブルを読み込み、その情報を基にはてブから情報を取得してくる。 hatebu_listテーブルのlast_postよりも新しい情報である場合はSlackに投稿し、last_postに新しい日付を更新する。 [python title=”bot.pyの内容”] # -*- coding: utf-8 -*- import os import sys import sqlite3 import datetime # ライブラリのパスを追加 sys.path.append( os.path.dirname(__file__) ) from hatebu_bot import Hatebu from slack_bot import…

ローカルでも動くSlackBot管理ツールができるまで 〜 WebUI編 2 〜

前回の続き。 [amazonjs asin=”479804315X” locale=”JP” title=”Pythonプロフェッショナルプログラミング第2版”] 新規登録を実装 sites/sites.pyの冒頭の方に以下のimportを追加する。 [python title=”sites.pyの最初の方”] from bottle import get, post, request, response from bottle import redirect [/python] 更にsites/sites.pyにhatebu_create関数を作成 [python title=”hatebu_create関数を実装”] @route(‘/hatebu_create’, method=’GET’) def hatebu_create(): # 作成ボタンが押されずに/hatebu_createにアクセスが来たらリダイレクト if request.query.create is None: redirect("/hatebu") # データベースアクセス path = os.path.dirname(os.path.dirname( os.path.abspath(__file__))) + "/db" connect = sqlite3.connect(path + "/hatena.db") cursor = connect.cursor() sql = """ INSERT INTO hatebu_list ( channel, word, bookmark_count, last_post) VALUES ( ?, ?, ?, ?); """ # GETパラメータを変数に代入 channel = request.query.channel word = request.query.word bookmark_count = request.query.bookmark_count last_post = ‘2000-01-01T00:00:00’ # データベースにデータを挿入 cursor.execute(sql,(channel,word,bookmark_count,last_post)) # 変更を更新する connect.commit() # データベースを閉じる connect.close() # 元ページにリダイレクト redirect("/hatebu") [/python] pythonでsites.pyを実行してブラウザでhttps://localhost:8080/hatebuにアクセスし、作成ボタンを押すと作成できることがわかる。   更新・削除を実装 更新、削除を実装するため、hatebu_updel関数を作成する。 [python title=”hatebu_updel関数を実装”] @route(‘/hatebu_updel’, method=’GET’) def hatebu_updel(): # 更新・削除ボタンが押されずに/hatebu_updelにアクセスが来たらリダイレクト if request.query.updel…

ローカルでも動くSlackBot管理ツールができるまで 〜 WebUI編 1 〜

今回から何回かに分けて、はてブから情報を取得しSlackに投稿するBOTを管理するツールを作成していく。 今までにこのブログ内で紹介しgithubにあげているソースを利用する。 [amazonjs asin=”B009Z30HPG” locale=”JP” title=”Dive Into Python 3 日本語版”] 完成形 [雑][Python] ローカルでも動くSlackのBot管理ツールを作成してみた(Bottle + jinja2 + Slacker)   構成   開発環境 今回はローカル(MacBookAir)で開発してみた。 brewでpython3をインストールしている前提とする。 [shell] $ sudo brew install python3 [/shell] データベースはローカルであることとPython標準ライブラリとして入っているため、 sqlite3で構築する。   venvで仮想環境を構築する pyvenvで仮想環境を構築し、pipをアップデートしておく。 [shell] $ cd ~/Documents $ pyvenv slack_botter $ cd slack_botter $ source bin/activate (slack_botter)$ pip install –upgrade pip [/shell]   githubから必要なファイルを取得する 以前、Pythonフレームワーク bottle とテンプレートエンジン jinja2 で作ったものを利用するため、githubからダウンロードする。 ダウンロードしたものをsitesという名前にリネームしておく。 [shell] (slack_botter)$ cd ~/Documents/slack_botter (slack_botter)$ git clone https://github.com/umentu/bottle_jinja2 (slack_botter)$ mv bottle_jinja2 sites [/shell]   pipで必要なライブラリをインストール githubからダウンロードしたものの中にrequirements.txtが入っているため、pipで必要なライブラリをインストールする。 [shell] (slack_botter)$ pip install -r ./sites/requirements.txt [/shell] sites/index.pyを実行し、ブラウザで https://localhost:8080/top/ にアクセスして表示できるかを確認してみる。 [shell] (slack_botter)$ python sites/index.py [/shell]   Slackのチャンネル名一覧を取得するため、gitからslackbotを取得 SlackBotを管理する際に、存在するチャンネル一覧を表示させたいため、Slackからチャンネル一覧を取得する。 これも以前作ったものを利用するため、 githubからダウンロードする。 今回はslack_bot.pyというファイルのみ必要なため、sites内に移動しておく。 また、requirements.txtがあるため、slackbot用に必要なライブラリをpipでインストールする。 以上が終わったらslackbotディレクトリは必要ないため、slackbotディレクトリを削除する。 [shell] (slack_botter)$ cd ~/Documents/slack_botter (slack_botter)$ git clone https://github.com/umentu/slackbot (slack_botter)$…

[雑][Python] ローカルでも動くSlackのBot管理ツールを作成してみた(Bottle + jinja2 + Slacker)

とても雑なSlackのBot管理ツールを作成してみた。 はてブからデータを取得してくるもの。 次回以降で製作過程を紹介していこうかと思う。 製作過程: ローカルでも動くSlackBot管理ツールができるまで 〜 WebUI編 1 〜   [amazonjs asin=”4873116554″ locale=”JP” title=”Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理”] 本体 umentu/slack_botter   環境 今回はローカル環境(MacbookAir)に構築してみた。 brew でpython3をインストール済み。 [shell] $ sudo brew install python3 [/shell]   構成   使い方 githubのREADMEに記載しているため、そちらをご参考に。 umentu/slack_botter   責任 ご利用は自己責任で。   解説 次回以降の製作過程で紹介していく。  

[CentOS7] Nginx + uwsgi + python3 + bottle でWebアプリケーションを公開

今回は長編。 色々試行錯誤した結果のため、うまくいかなかった場合はコメントに残してもらえると幸いです。。。 [amazonjs asin=”B00KO6P262″ locale=”JP” title=”Software Design (ソフトウェア デザイン) 2014年 07月号 雑誌”] ↑Nginxの項目、ちょっとだけ執筆させてもらっています。。。   構成 今回は以下の図のような構成を想定している。   準備 pyenv環境を構築 https://www.blog.umentu.work/?p=153 Nginxをインストール https://www.blog.umentu.work/?p=163 [CentOS7][Nginx] SELinuxを設定しホームディレクトリ配下のWebコンテンツを公開を許可 https://www.blog.umentu.work/?p=172   ディレクトリ構成 以下、簡単なディレクトリ構成。 ユーザー名を「centos」としている。 /home/centos/app/ uwsgi_venv/ : uwsgi用の仮想環境 bottle_jinja2/ : アプリケーション用の仮想環境 bin/ include/ lib/ lib64/ source/ : アプリケーションのソースを置くディレクトリ pyvenv.cfg uwsgi.ini : uWSGI用に作成するiniファイル var/ sock/ : uWSGIが生成するソケットを置くディレクトリ pid/ : uWSGIが生成するpidファイルを置くディレクトリ   uWSGI用の仮想環境の用意   (念のため)以降、 「#」 からはじまるコマンドラインはroot 「$」 からはじまるコマンドラインは一般アカウント(今回の場合はcentosユーザー)   今回はPythonの仮想環境を、uWSGI用とアプリケーション用に分けて管理する。 まずuWSGI用の仮想環境をappディレクトリに作成する。 [shell] $ mkdir ~/app $ cd ~/app $ mkdir -p ./var/{sock, pid} [/shell] 次にuWSGI用仮想環境を作成し、uWSGIをインストールする。 [shell title=”uWSGI用の仮想環境を作成”] $ pyvenv uwsgi_venv $ source uwsgi_venv/bin/activate $ pip install –upgrade pip $ pip install uwsgi [/shell]   アプリケーション用の仮想環境を用意 アプリケーション用の仮想環境を用意する。 今回は「bottle」と「jinja2」を利用するため、それらもインストールする。 uWSGI環境にまだ入っている場合は、「deactive」コマンドで脱出する。 [shell title=”アプリケーション用の仮想環境を作成”] $ cd ~/app $ deactivate $…

HTML5 formとinputを分けて記述する方法

つい最近まで知らなかったので。 [amazonjs asin=”B00VV5C40M” locale=”JP” title=”現場のプロが教えるHTML+CSSコーディングの最新常識 知らないと困るWebデザインの新ルール4″] 管理画面などを作るときに、 のように、formとtableを組み合わせて作りたくなることがある。 そのときにformタグがtrタグ,tdタグの入れ子になって煩雑になってしまう。 (少なくとも自分は。。。)   そんな時にHTML5から、formタグとinputタグを分けて記述できることを知った。 手順としては formタグにidをつける。(下の例だと form_id ) formタグと関連付けたいinputタグ(selectタグ等も)にformプロパティを付加し、formタグのidを与える。(「form=”form_id”」) のようにする。具体的には、 [html title=”今までのフォーム”] <form action="/action" method="post"> <input type="text" name="name" /> <input type="submit" value="送信" /> </form> [/html]   としていたものを、   [html title=”html5的書き方”] <form action="/action" method="post" id="form_id"></form> …… <input type="text" form="form_id" name="name" /> <input type="submit" form="form_id" value="送信" /> [/html] のように記述することで、formタグを分けて記述できる。 ちなみにformタグはinputタグのあとに記述しても問題ない。   利用例 サンプルコードはこちら (他の回に紹介したコードも含む) フレームワークを利用して一括してフォームを作成したいときなどに便利。 (以降の手順はbottle+jinja2の紹介内容を踏まえている。それらの使い方に関しては割愛。)   まず、次のようなcsvファイルを用意する。 [shell title=”character.csv”] ID,名前,レベル 1,ネス,68 2,ポーラ,62 3,ジェフ,58 4,プー,34 5,ダンジョン男,99 [/shell]   上のcsvのデータを読み込んで、テンプレートファイルに渡す。 [python title=”index.py”] """省略""" @route(‘/form/’) def form(): import csv # キャラクター一覧を格納する配列 character_list = [] # character.csvを展開する with open("character.csv", "r") as csv_file: # csvライブラリでcsvファイルを読み込む reader = csv.reader(csv_file) # csvのタイトル部分を飛ばす next(reader) # 読み込んだcsvを一行ずつ処理 for row in reader: character_list.append( {…

「bottle」+「jinja2」を使ってサイト構築 3 共通テンプレートの利用

今回はbottleやjinja2の使い方というより、フレームワークの開発方法。 複数ページに渡るサイトをフレームワークで開発するとき、ヘッダー、フッターなどの各ページの共通部分を ベースとなるテンプレートファイルに作成しておき、各ページごとにベースのテンプレートファイルを呼び出して 作成する。 ベースのテンプレートファイルを作成 まずベースのテンプレートファイル base.html をviewsディレクトリに作成する。 ({# … #}で囲まれている部分は、jinja2のコメント) <!DOCTYPE html> <html> <head> <meta charset=”utf-8″ /> {# 各ページごとにタイトルを定義できる #} <title>bottle’s Page – {% block title %}{% endblock %}</title> <script type=”text/javascript” src=”/js/jquery.min.js”></script> <script type=”text/javascript” src=”/js/jquery-ui.min.js”></script> <script type=”text/javascript” src=”/js/bootstrap.min.js”></script> <link rel=”stylesheet” href=”/css/jquery-ui.min.css” /> <link rel=”stylesheet” href=”/css/jquery-ui.theme.min.css” /> <link rel=”stylesheet” href=”/css/jquery-ui.structure.min.css” /> <link rel=”stylesheet” href=”/css/bootstrap.min.css” /> <link rel=”stylesheet” href=”/css/bootstrap-theme.min.css” /> {# base.tplを呼び出した先でヘッダーを追加する #} {% block header %} {% endblock %} </head> <body> <div class=”navbar navbar-inverse” role=”navigation”> <div class=”container”> <div class=”navbar-header”> <button type=”button” class=”navbar-toggle” data-toggle=”collapse” data-target=”.navbar-collapse”> <span class=”sr-only”>ナビゲーションの切替</span> <span class=”icon-bar”></span> <span class=”icon-bar”></span> <span class=”icon-bar”></span> </button> <a class=”navbar-brand” href=”#”>Slackツール</a> </div><!– /.navbar-header –> <div class=”navbar-collapse collapse”> <ul class=”nav navbar-nav”> <li class=”active”><a href=”/top”>ホーム</a></li> <li class=”active”><a…

「bottle」+「jinja2」を使ってサイト構築 2 jQueryとBootstrap導入

導入に引き続き。 [amazonjs asin=”4774173207″ locale=”JP” title=”Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)”] 導入で用意したjs,css,imgディレクトリを利用できるようにする。 また、jQuery、bootstrapを導入する。     サンプルコードはこちら (次回以降に紹介したコードも含む)   js,css,img,fontsディレクトリを指定する static_fileメソッドを使って、js,css,imgディレクトリを指定する。 bootstrapにはfontsディレクトリも必要だったため、追加した。 [python title=”index.py”] # -*- coding: utf-8 -*- import os from bottle import route, run from bottle import TEMPLATE_PATH, jinja2_template as template from bottle import static_file # index.pyが設置されているディレクトリの絶対パスを取得 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # テンプレートファイルを設置するディレクトリのパスを指定 TEMPLATE_PATH.append(BASE_DIR + "/views") @route(‘/css/<filename>’) def css_dir(filename): """ set css dir """ return static_file(filename, root=BASE_DIR+"/static/css") @route(‘/js/<filename>’) def js_dir(filename): """ set js dir """ return static_file(filename, root=BASE_DIR+"/static/js") @route(‘/img/<filename>’) def img_dir(filename): """ set img file """ return static_file(filename, root=BASE_DIR+"/static/img") @route(‘/font/<filename>’) def font_dir(filename): """ set font file """ return static_file(filename, root=BASE_DIR+"/static/fonts") @route(‘/top’) def top(): # 配列を渡すための準備 fizzbuzz = [] for i in range(1, 100):…

「bottle」+「jinja2」を使ってサイト構築 1

最近は一時期よりは下火になっているものの、PythonでフレームワークといえばDjango。 でもさくっとページを作りたいときにはちょっとがっちりしすぎていて作りづらい。 ということで、最近は bottle を使っている。 ただ、bottle標準のテンプレートエンジンが使い慣れないため、テンプレートエンジンは Djangoで使われているテンプレートエンジンエンジン jinja2 を使っている。     サンプルコードはこちら (次回以降に紹介したコードも含む)   bottle、jinja2をインストール   virtualenv で切ってbottleをインストールする。 [shell] $ mkdir python_bottle $ cd python_bottle $ virtualenv-3.4 python $ source python/bin/activate (python)$ pip install bottle jinja2 [/shell]   使い方の確認 以降の説明では、どこからがbottleの機能、もしくはjinja2の機能といった紹介をせず に説明していく。 ソースファイルを設置するsourceディレクトリを作成する。 また、sourceディレクトリ内にテンプレートファイルを設置するviewsディレクトリと、 スタティックなファイルを設置するstaticディレクトリを作成する。 更に、staticディレクトリ内にjs、css、imgディレクトリを作成する。 [shell] (python)$ mkdir -p source/{views,static} (python)$ mkdir -p source/static/{js,css,img} [/shell] 以下のソースファイル index.py と views内にトップページのテンプレートファイル top.html を作成する。 [python title=”source/index.py”] # -*- coding: utf-8 -*- import os from bottle import route, run from bottle import TEMPLATE_PATH, jinja2_template as template # index.pyが設置されているディレクトリの絶対パスを取得 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # テンプレートファイルを設置するディレクトリのパスを指定 TEMPLATE_PATH.append(BASE_DIR + "/views") # 今回の場合は https://localhost:8080/top にアクセスが来た場合に公開する内容を指定。 # route関数をデコレータとして呼び出し、route関数の引数で/以降のアクセス先を指定する。 @route(‘/top’) def top(): return template(‘top’) if __name__ == "__main__": # localhost:8080 で公開するように実行…