Python Web ペ-ジ自動操作
Pear::Auth 認証 自動ログインファイル作成
ここまでで、Pear::Auth 認証に自動ログインするファイル作成準備ができました。
引き続き、
Pear::Auth 認証 サンプル表示に自動ログインするファイル
sc_63pear.py
を作成します。
- お決まりの作法
Pyton がインスト-ルされている場所を示めします。
#!/usr/bin/python3
Pyton3 のインスト-ル場所がわからない場合は
$ which python3
で知ることができます。
ファイルで使用する文字コ-ドを設定します。
#coding: utf-8
HTTP ヘッダーを出力
print("Content-type: text/html; charset=UTF-8\n\n")
これで Python から出力された文字は Web で見ることができるようになります。 - ライブラリを取り込み
取り込む必要があるライブラリは4つです。
mechanicalsoup の動作のために
import logging
import mechanicalsoup
そして環境変数読込みのために
import os
from dotenv import load_dotenv
dotenv のなかにある load_dotenv ライブラリ
を読み込み
load_dotenv()
で実行しておきます。 - 環境変数値読出
Python OS モジュールを使用し
import os
os.getenv(key, default=None)
とすると環境変数 key が存在すればその値を返し、存在しなければ default を返します。
key、default、および返り値は文字列です。
default=None は省略することができます。 なお、os.getenv は os.environ.get の alias なので、 使い方に違いはありません。 - 読出環境変数読出
読出した環境変数値を設定、表示します。
PEAR_LOGIN = os.getenv('PEAR_LOGIN')
PEAR_PASSWORD = os.getenv('PEAR_PASSWORD')
print(PEAR_LOGIN)
print(PEAR_PASSWORD) - def main()ブロック作成Ⅰ
StatefulBrowser オブジェクトを作成します。
browser = mechanicalsoup.StatefulBrowser()
次に、途中経過報告をします。
想定された通りのことが起こったことの確認です。
プログラムの通常の操作中に発生したイベントの報告 (例えば、状態の監視や障害の分析)をします。
なくてもよいです。
例えば
logging.info('I told you so')
とすると、うまく通過すると
INFO:root:I told you so
のように表示されます。
ここでは、
logging.info('Navigating...')
としました。
うまく通過したときは
INFO:root:Navigating...
と表示されます。 - def main()ブロック作成Ⅱ
認証組込ドキュメントページを開きます。
ログイン後のペ-ジが表示される URL は
https://63pear.devel.jp/auth/Auth-30.php
ですので、browser.open('https://63pear.devel.jp/auth/Auth-30.php')
とします。
次にログインページが開いていることを確認します。
assert '/Auth-30.php' in browser.get_url()
assert 文は与えられた式が True の場合は何もせず、False の場合に 例外 AssertionError を発生させます。
今回の場合正常ならば、URL に /Auth-30.php はあるはずなので
True になり何も起こりません。 - def main()ブロック作成Ⅲ
ログインフォーム(form は1つしかない)を選択します。
フォームの選択は
browser.select_form(name="inputForm")
名前がない場合は、表示順を指定して
browser.select_form(nr=0)
のように取得します。
今回は、form は1つしかないので単純に
browser.select_form()
としました。
次に、name="username" という入力ボックスを埋めます。
browser['username'] = PEAR_LOGIN
name="password" という入力ボックスを埋めます。
browser['password'] = PEAR_PASSWORD - def main()ブロック作成Ⅳ
途中経過報告をします。
logging.info('Signing in...')
submit ボタンを選択してフォームを送信します。
browser.submit_selected()
最後に、ログイン後の現在のページの HTML ソースを表示します。
get_current_page() メソッドを使用すると現在のページの HTML ソースを取得します。print(browser.get_current_page().prettify())
なお Beautiful Soup オブジェクトの prettify()メソッドを使用すると 1行に1タグのきれいにフォーマットされた形で HTML を表示します。
- if ブロック作成
ファイルが直接実行された場合は、 INFO レベル以上のログを出力するよう設定し、 main() が実行されるようにします。
if __name__ == '__main__': logging.basicConfig(level=logging.INFO) main()
以上をまとめると以下のようになります。
#!/usr/bin/python3
#coding: utf-8
print("Content-type: text/html; charset=UTF-8\n\n")
import os
import logging
import mechanicalsoup
from dotenv import load_dotenv
load_dotenv()
# 認証の情報は環境変数から取得する。
# ここでは、getenv の代わりに environ を使用
PEAR_LOGIN = os.environ['PEAR_LOGIN']
PEAR_PASSWORD = os.environ['PEAR_PASSWORD']
print(PEAR_LOGIN)
print(PEAR_PASSWORD)
def main():
browser = mechanicalsoup.StatefulBrowser()
# 認証組込ドキュメントページを開く。
logging.info('Navigating...')
browser.open('https://63pear.devel.jp/auth/Auth-30.php')
# ログインページが開いていることを確認する。
assert '/Auth-30.php' in browser.get_url()
# ログインフォーム(form は1つしかない)を埋める。
browser.select_form()
browser['username'] = PEAR_LOGIN
# name="username" という入力ボックスを埋める。
browser['password'] = PEAR_PASSWORD
# name="password" という入力ボックスを埋める。
# フォームを送信する。
logging.info('Signing in...')
browser.submit_selected()
print(browser.get_current_page().prettify())
# 現在のページのHTMLソースを表示する。
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
# INFOレベル以上のログを出力する。
main()
本内容を TeraPad 等で作成したら、ファイル名を適当に
sc_63pear.py
として保存します。
文字コ-ドは、UTF-8N
BOM なし
改行コ-ドは、LF
です。
保存先はホスト Wimdows OS の 共有フォルダ c:\vb_public_html にして、
ブラウザでアクセスできるようにします。
なお、
c:\vb_public_html
はゲスト OS Ubuntu のなかの
/home/yamada/public_html
とリンクしていて共有フォルダの関係にあります。
詳細は
ユ-ザ-ごとの公開ディレクトリを用意する
を読んでみてください。
ここまでで、Pear::Auth 認証 自動ログインファイルを作成する事ができました。
引き続き、本ファイルの動作確認をしていきます。