757 Views
March 07, 18
スライド概要
みんなの Python 勉強会#33 の発表資料です
https://startpython.connpass.com/event/73168/
From: https://www.slideshare.net/laughk/python-webapi-nextsteppythonprograming
インフラエンジニア @ コネヒト (2022-08-20 現在)
入門書を読みおわったら何しよう? ~Python と WebAPI の使い方から学ぶ次の一歩~ 2018.03.07 みんなのPython勉強会#33 Kei IWASAKI at SQUEEZE Inc.
お前誰よ Kei IWASAKI Twitter: @laugh_k, Github: @laughk 株式会社SQUEEZE所属 スラスラわかるPython(翔泳社) という本の共著者の一人 最近は Django, AngularJS でWeb開発をやりながらもインフラ周りや それ以外の改善を模索したりしてます。 2
CM Python 入門者向けの本 スラスラわかる Python 発売中! おかげさまで1月に2刷が出ました! 3
今日話すこと 1. 入門書を読み終わった後の次の課題の見つけ方 2. 最低限の知識で自分のためのコードの書き始め方 ※ 今回は Python の入門書ということが前提です! 4
早速ですが 入門書っていいですよね!
入門書のいいところ 初学者のでも学ぶべき内容を体系的に学習することができる 特にプログラミングそのものが初心者の人にとっては心強い存在 6
じゃあ その入門書おわったらどうしよう? П
道は色々ある 1. 入門書の内容を自分でカスタムしてみる 2. 次のレベルの書籍を手にとって見る 3. 自分にとって実践的なコードを書いてみる など 8
入門書の内容を自分でカスタムしてみる 書籍の中で登場したコードを自分なりにアレンジしてみる方法 スクレイピングなら対象のサイトを変更してみる 簡単なゲームプログラムならルールを追加してみる など 9
次のレベルの書籍を手にとってみる 入門者じゃないひと対象の本を読んで見る方法 例えば 入門本 - 次のレベルの本 ➔ スラスラわかるPython Pythonエンジニアファーストブック 10
道は色々ある 1. 入門書の内容を自分でカスタムしてみる 2. 次のレベルの書籍を手にとって見る 3. 自分にとって実践的なコードを書いてみる など 11
自分にとって実践的なコードを書いてみる
今日紹介するのは 「自分にとって実践的なコードを書いてみる」 というアプローチ
「自分にとって実践的なコードを書いてみる」? 例えばこんなこと 微妙にコピペが面倒なCSVファイルをつくるスクリプト 気になる人の1日の Tweet 情報をとってくるスクリプト 自分がアサインされているチケット一覧をSlack通知する 今日がゴミを出す日かどうか教えてくれるbotをつくる 14
最初はこじつけでいいから 自分が楽をしたいことを見つけるのがいい 「それ〇〇でできるよ?」は一旦置いておく 「それ結構難しいのでは?」もあまり気にしない 業務・プライベート問わず、よく使うWebサービスがあるとネタに しやすいかも 15
今日考えてみる例 "Github の Pull Request 一覧を Slack で通知してみる"
Githubの Pull Request 一覧をSlackで通知してみる 「ブラウザでGithubのPullRequest一覧を見るのが面倒」 という悩みを解消するための課題 17
やりたいことは思いついた どうやってコードを書いていこう?
A. やりたいことの登場人物と その扱い方を整理しよう
やりたいことの登場人物を整理しよう 今回の例だと以下の登場人物がいる Github Slack これらを Python でどう使うのかを確認する 20
プログラミングでWebサービスを扱う方法
プログラミングでWebサービスを扱う方法 基本的には以下の2つのどちらか Web API* を使う スクレイピングする * すごく雑に言えば「ネットワーク越しに使える関数のようなもの」 22
まずは Web API が使えないかを確認する API と言ってもいろいろ。簡単に使えるものもある Webサービスは API が提供されていることも多い 今回のパターンも API が使える GitHub API v3 | GitHub Developer Guide Slack Web API | Slack 23
じゃあスクレイピングは? スクレイピングはAPIと比べて思い通りの情報を取得するのが大変 「Webサイトを扱うならばスクレイピングだな!」の前にAPIがある かは調べよう 場合によってはここで諦めて別の課題を探すのも一つの選択 スクレイピングはAPIが提供されていないときの最終手段 24
登場人物たちの情報 APIが提供されていることはわかった Github GitHub API v3 | GitHub Developer Guide ⇐これ Slack Slack Web API | Slack ⇐これ 25
対象のWebサービスの APIを使えばよさそうだとわかった!
ところで API ってどうやって使うの...?
A. ここで サードパーティーライブラリの出番
PyPI のライブラリを活用しよう 雑に言えば pip install ... で追加できるライブラリのこと PyPI - the Python Package Index に公開されているサードパーティー のライブラリを簡単に利用できる 29
PyPI のライブラリを活用しよう API が提供されているサービスの場合、PyPIに専用ライブラリが公 開されていことが多い 便利に扱うことができるライブラリがあるので活用しよう PyGithub 1.37 : Python Package Index slackapi/python-slackclient: Slack Developer Kit for Python slackpy 2.2.2 : Python Package Index 30
ところでこのライブラリって(ry
A. ライブラリのドキュメントを読みましょう
A. ライブラリのドキュメントを読みましょう ... とはいえ隅々まで目を通す必要はないです
ライブラリを雑に動かそう
コードを書く前にインタラクティブシェルでざっと動作を確認しておく
tokenなどの必要な情報もこのタイミングで取得しておく
>>> from github import Github
>>> github_token = '********************************'
>>> gh = Github(github_token)
>>> repo = gh.get_repo('laughk/py3-django-tutorial')
>>> repos = repo.get_pulls(state='close')
>>> for r in repos:
...
print(r)
...
PullRequest(title="[wip] 2016-05-24の分", number=7)
PullRequest(title="2016-05-17やった分", number=6)
# -- -- snip -- --
34
ライブラリを雑に動かそう コードを書く前にインタラクティブシェルでざっと動作を確認しておく 必要なtoken情報などもこのタイミングで取得しておく >>> import slackpy >>> WEBHOOK = 'https://hooks.slack.com/services/******/***********' >>> slack = slackpy.SlackLogger(WEBHOOK) >>> slack.info('hogehoge') <Response [200]> >>> 35
更に細かな部分は ライブラリのドキュメントを読みましょう
登場人物たちの情報 APIが提供されていることはわかった。APIの使い方もわかってきた Github GitHub API v3 | GitHub Developer Guide PyGithub 1.37 : Python Package Index ⇐これ Slack Slack Web API | Slack slackpy 2.2.2 : Python Package Index ⇐これ 37
そろそろ処理の流れを大まかに整理しよう 今回は大体以下のような感じ 1. Github から PR の情報を取得する (PyGithubを使ってやる) 2. 取得した PR の情報を処理しやすく形成する (普通にコードを書く) 3. 形成したデータを Slack へ投げる (Slackpyを使う) 38
ここまで来たら Try&Error でひたすらコードを書く
Try&Error でひたすらコードを書く インタラクティブシェルで小さく試行錯誤しながら徐々に広げてい くとやりやすい こまめに print() して動作を確認していくのもお手軽でオススメ 40
とにかく書いてみるを大切に 慣れないうちはまずコードを書くことに集中してOK コードがきれいか汚いかをあまり気にしない テストコードとかも無理に考えない 41
サンプルコード
import slackpy
from github import Github
GITHUB_TOKEN = '********************'
SLACK_WEBHOOK = 'https://hooks.slack.com/services/******/*******/********'
GITHUB_REPOSITORY = 'laughk/py3-django-tutorial'
gh = Github(GITHUB_TOKEN)
repository = gh.get_repo(GITHUB_REPOSITORY)
pull_request_info = []
for pr in repository.get_pulls(state='all'):
pull_request_info.append({'title': pr.title, 'url': pr.url})
slack_messages = ""
for info in pull_request_info:
slack_messages += '{0} {1}\n'.format(info["title"], info["url"])
slack = slackpy.SlackLogger(SLACK_WEBHOOK)
slack.info(slack_messages)
# Github から Pull Request 情報を取得
gh = Github(GITHUB_TOKEN)
repository = gh.get_repo(GITHUB_REPOSITORY)
pull_request_info = []
for pr in repository.get_pulls(state='all'):
pull_request_info.append({'title': pr.title, 'url': pr.url})
# Github から取得した情報の形成
slack_messages = ""
for info in pull_request_info:
slack_messages += '{0} {1}\n'.format(info["title"], info["url"])
# Slack へ通知
slack = slackpy.SlackLogger(SLACK_WEBHOOK)
slack.info(slack_messages)
保存して実行してみるまでの流れ github-pr-list-to-slack.py に保存して以下を実行してみると以下の通り ## PyPI ライブラリをインストール $ pip install slackpy PyGithub ## サンプルコードの内容を書く (エディタはお好みで) $ nvim github-pr-list-to-slack.py ## 実行 $ python github-pr-list-to-slack.py 45
こんな感じで通知される! 46
まとめ
自分にとって実践的なコードを書いてみるコツ 普段自分がやっていることをネタにするとイメージしやすい コードを書く前に登場人物を整理してプログラムにやらせることの イメージを明確にしよう Python は PyPI に便利なライブラリが多く存在する。無理せず頼ろ う! コードを書き始めたら細かいことを気にせず思いのままコードを書 いてみよう! 48
さいごに 入門書の基礎知識でもできることは結構ある 自分にとって身近なところから課題を見つけて行動してみると覚え たことの「使い方」を実体験として理解できる 次の書籍も良いけど、少ない知識で実際に手を動かすのもオススメ 49
Let's Enjoy Next Step!