前回、pipでHTTP通信ができるライブラリを有する requestsパッケージを使ってみる記事を書きました。
今回は、同じくpipを使って、入力した単語をwikipediaの情報から取得し表示させるというボットを作ってみます。
pipやvenvについては requestsパッケージの記事に書いてありますのでこちらもご参照ください。
WikipediaのAPI
実はWikipediaもWeb APIを公開しています。単語を検索し、該当する情報を取得することができます。
Pythonでは、しっかりそのライブラリがあります。(素晴らしい)
手順としては、以下の簡単4ステップです。
- venvで仮想環境に入る
- pip3コマンドでパッケージをインストールする
- wikipediaコマンド用の関数を作成する
- ボットに関数をインポートし、利用できるようにする
PythonでWikipediaを使う
venvで仮想環境に入る
前回の記事で行ったように仮想環境に入ります。
まだ仮想環境を用意していない場合は、以下のコマンドを実行します。
python3 -m venv 任意の環境名
そして、macであれば以下のコマンドを入力し、仮想環境に入ります。
source 作成した環境名(ディレクトリ名)/bin/activate
例
source env/bin/activate
Windowsであれば以下のコマンドを入力し、仮想環境に入ります。
作成した環境名(ディレクトリ名)\Scripts\activate.bat
例
env\Scripts\activate.bat
pip3コマンドでパッケージをインストールする
次にWikipediaのパッケージをインストールします。
pip3コマンドを入力していきます。
pip3 install wikipedia
確認するために listを使います。
pip3 list
出力されたリストに wikipedia があれば、問題なくインストールされています。
wikipediaコマンド用の関数を作成する
wiki.pyというファイルを作成し、以下のように書いていきます。関数名は、wikipedia_commandにしました。Wikipediaで調べたいコマンドをユーザーから受け付けるので、引数にcommandを設定しています。
# ライブラリのインポート
import wikipedia
# wikipedia_command関数を作成
def wikipedia_command(command):
# キーワードを抜き出す。(入力された内容を分割)
# maxsplitで最大分割回数を指定
cmd, keyword = command.split(maxsplit=1)
# 言語を指定
wikipedia.set_lang('ja')
try:
# (.pageメソッド)How To Check If Wiki Page Exists
page = wikipedia.page(keyword)
# (.titleメソッド)ページからタイトルを取得。
title = page.title
# (.summaryメソッド)ページからサマリーを取得。
summary = page.summary
response = 'タイトル: {}\n{}'.format(title, summary)
# エラー(ページが見つからない場合)の処理
except wikipedia.exceptions.PageError:
response = '【{}】ノ意味が見ツカリマセンデシタ'.format(keyword)
return response
ボットに関数をインポートし、利用できるようにする
前回のrequestsコマンドも入っていますが、そこにwikipediaコマンドも付け足す感じで記載しています。 from wiki import wikipedia_command でインポートを行います。
そして、以下を記載することで、ユーザーが wiki {調べたい言葉} と入力することでAPIが実行されてWikipediaの結果が表示されるようになります。(めっちゃ簡単!!)
# もし、 wiki が含まれていたら
if 'wiki' in command:
response = wikipedia_command(command)
# eto.pyで定義した、eto_command関数を利用できるようにする。
from eto import eto_command
# random.pyで定義した、choice_command関数とdice_command関数を利用できるようにする。
from random_random import choice_command, dice_command
# datetime.pyで定義した、today_command関数とnow_command関数とweekday_command関数を利用できるようにする。
from date_time import today_command, now_command, weekday_command
# requests_sample.pyで定義した、weather_command関数を利用できるようにする。
from requests_sample import weather_command
# wiki.pyで定義した、wikipedia_command関数を利用できるようにする。
from wiki import wikipedia_command
def heisei_command(command):
# 文字列を分割して、それぞれ heisei, year_str に代入
heisei, year_str = command.split()
# try ~ except : year_str に数字の文字列以外が入力された際の例外処理
#try:
# try ~ except を使わずに例外処理を作る。 isdigit()メソッド
if year_str.isdigit():
# int型に変換した year_strを year に代入
year = int(year_str)
if year >= 1989 and year < 2020:
heisei_year = year - 1988
response = '西暦{}年ハ、平成{}年デス'.format(year, heisei_year)
else:
response = '西暦{}年ハ、平成デハアリマセン...'.format(year)
# 例外として、以下をレスポンスさせる。
#except ValueError:
# try ~ except ではなく、elseで例外処理
else:
response = '数値ヲ指定シテクダサイ'
return response
def len_command(command):
# 文字列を分割して、それぞれ heisei, year_str に代入
cmd, text = command.split()
# int型に変換した year_strを year に代入
length = len(text)
response = '文字列ノ長サハ {} 文字デス'.format(length)
return response
# 別ファイル hello.txt をUTF-8でファイルオープン
command_file = open('hello.txt', encoding='utf-8')
# 開いたファイルを読む
raw_data = command_file.read()
# 読んだファイルを閉じる
command_file.close()
# 行ごとの文字列に分割し、linesに代入
lines = raw_data.splitlines()
# 挨拶用の空の辞書を作成
bot_dict = {}
for line in lines:
word_list = line.split(',')
key = word_list[0]
response = word_list[1]
bot_dict[key] = response
while True:
command = input('pybot> ')
response = ""
# 例外処理のため try ~ except
try:
for key in bot_dict:
if key in command:
response = bot_dict[key]
break
# もし平成が含まれていたら
if '平成' in command:
response = heisei_command(command)
# もし長さが含まれていたら
if '長さ' in command:
response = len_command(command)
# もし 干支 が含まれていたら
if '干支' in command:
response = eto_command(command)
# もし 選ぶ が含まれていたら
if '選ぶ' in command:
response = choice_command(command)
# もし さいころ が含まれていたら
if 'さいころ' in command:
response = dice_command()
# もし 今日 が含まれていたら
if '今日' in command:
response = today_command()
# もし 現在 が含まれていたら
if '現在' in command:
response = now_command()
# もし 曜日 が含まれていたら
if '曜日' in command:
response = weekday_command(command)
# もし、天気 が含まれていたら
if '天気' in command:
response = weather_command()
# もし、 wiki が含まれていたら
if 'wiki' in command:
response = wikipedia_command(command)
if not response:
response = 'イミワカラン'
print(response)
if 'さようなら' in command:
response = 'サヨウナラ'
break
# 上記でなければエラーを返す。
except Exception as e:
print('予期セヌ エラーガ 発生シマシタ...')
print('* 種類:', type(e))
print('* 内容:', e)
実装が終わったら早速実行してみます。
python3 pybot.py
バッチリとれてますね!
このWikipediaボットは結構面白くて好きです。
まとめ
今回はより具体的なwikipediaの機能実装を行ってきました。ライブラリってすごいですね。ほんの少しコードを追加するだけでWikipediaの機能が使えてしまうのですから。
こういったサードパーティ製パッケージはPyPI(パイピーアイ)というサービスで見つけることができます。(ググってもここにたどり着くことが多いです。)
まだ見たこと無い方は覗いてみてください。