仕事でPython使うことになったので、0から勉強してみた(番外編-その1)

はじめに

前回の記事では”Cloud9”を使って”Django”のチュートリアルを実践してみました。

今回はPythonを使って最近気になっていた”Slack”の”BOT”を作ってみたのでそのことについて書きます。

BOT作成にはSlackのIntegrationの”Hubot”や”Bots”を使った方法があり、Python用のSlackライブラリもいくつかあるのですが最初は単純なSlack Web APIを利用して特定のチャンネルに投稿してみます。

SlackのWebAPIを利用する為にトークンの取得が必要なので以下の手順で取得しましょう。

  1. Slack Web APIページ下部の”Generate test tokens”をクリック。
  2. 下記の”Create token”をクリック。
  3. ”Confirm”をクリック。
  4. トークンが生成され”Token”の列にAPIトークンが表示されます。

[トークン取得画面]

トークン取得画面(取得前)
これでWebAPIを利用する準備は整ったのでコーディングを行います。

前回同様Cloud9にログインし、”Create a new workspace”をクリックし、適当なワークスペース名(今回は「slackbot_python」)をつけて、テンプレートを選択。前回は”Django”を選択しましたが、今回は”Python”を選択します。

その後下記の様にフォルダやファイルを作成し、リクエストを行う為の”urllib.request”と、パラメーターをクエリ文字列に変換する為の”urllib.parse”をImportします。

今のところこんな感じです。

slack API用コーディング1

上記のようにエラーが表示される場合は、Cloud9のエディタ右上の歯車アイコンをクリックして”Run Configurations”の”Python Version:”を”Python3”に変更(地味にハマりました)。

自動保存のようなので、変更後に”Preferences”タブは閉じてしまってOKです。

Cloud9プロジェクト設定

Python2.7 Python3.5.1
import urllib<br>import urllib2 import urllib.request<br>mport urllib.parse

Python2系と3系でリクエスト用のライブラリが異なるようです。

 

post_message.pyを開き直して、投稿先と投稿内容を設定。

def main():
# chat.postMessageのURL
url = 'https://slack.com/api/chat.postMessage'
# パラメータ
params = {
# slack上で取得したAPIトークン
'token' : 'xoxp-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX',
# 投稿先チャンネル
'channel' : '#general',
# 投稿メッセージ
'text' : '@syoppy おーい'
}
# クエリ文字列に変換
params = urllib.parse.urlencode(params)
params = params.encode('utf-8')
# リクエスト生成
req = urllib.request.Request(url, params)
# ヘッダ追加
req.add_header('Content-Type', 'application/x-www-form-urlencoded')
# URLを開く
res = urllib.request.urlopen(req)
# レスポンス取得
body = res.read()
# レスポンスを表示
print (body.decode('utf-8'))
if __name__ == '__main__':
main()

この状態で保存して、コマンドを実行!

$ python3 ./webapi/post_message.py

slack API用コーディング2

投稿はうまくいきましたが、メンションがリンクになっていませんね。

APIを調べてみると”link_names”に”1”を設定する必要があるようです。

paramsの値を下記の様に修正します。

params = {'token' : 'xoxp-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX',
'channel' : '#general',
'text' : '@syoppy おーい',
'link_names' : '1'}

もう一度実行!

slack API用コーディング3

今度はちゃんと表示されました!!

ちなみにCloud9ではPython2系の場合は

$ python ./webapi/post_message.py

3系の場合は

$ python3 ./webapi/post_message.py

と打つとそれぞれのインタプリターで実行してくれます。

発言者が”BOT”のままだと面白くないので名前とアイコンを変えてみます設。

この方法も簡単で”username”と”icon_url”を追加するだけです。

params = {'token' : 'xoxp-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX',
'channel' : '#general',
'text' : '@syoppy おーい',
'username' : 'コアラ',
'icon_url' : '.http://pic.prepics-cdn.com/hirasawayui/11970948.jpeg',
'link_names' : '1'}

Cloud9 API用コーディング4
”BOT”と表示されているものの、名前とアイコンの設定ができました。

こうなるとやることは1つしかありませんね。

僕が使っているSlackのチームには女性がいません。

 

 

 

 

 

Cloud9 API用コーディング5
素晴らしいですね。みんな喜んでくれそうです。

毎回手動実行するのも面倒なので何かいいものはないかと探していたら、ありがたいことにAWS Lambdaがスケジュール実行可能かつ、Pythonでも書けるようになった(Python2系にしか対応してませんが・・・)とのことでした。

詳しくはこちらです。

長くなってしまいそうなので、AWS Lambdaについては次回書きたいと思います。

おわりに

今回も前回同様書籍を紹介します。

  • Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!]
  • 本書は、Python による開発を行うために知っておきたい知識を1 冊にまとめた書籍です。Python の歴史や特徴に始まり、言語入門、開発環境、Web開発、データ活用、環境構築まで、現場で活躍するために必読の知識をわかりやすくまとめました。

※以前Java養成読本を読んでとても勉強になったので購入しました。Python版はJavaに比べると薄いので、大判で購入しても持ち運びには苦労しません。また後半は”Ansible”について書かれているので、”Ansible”に興味がある方にもオススメです。逆に興味がない方はすぐに読み終えることができる内容でよくまとまっていますのでパッと読むにも良いと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>