こんにちは、はるです。
WordPressに自動ログインしたいんだけどどうやるの?
こんな悩みを解決していきます。
結論、MechanicalSoupを使っていきます。
コピペOKですので、実際に動かして使ってみてください!
動作環境
- さくらのVPS – CentOS8
- python 3.8.3
- pip 21.0.1 from /usr/local/lib/python3.8/site-packages/pip (python 3.8)
PythonでWordPressに自動ログインする方法
流れは以下のとおりです。
- 作業環境を作る
- ファイルを作る
- MechanicalSoupのインポート
- ログインページを開く
- ログインフォームを埋める
- フォームの送信
- ログインできたか確認
- main()を呼び出す
- 全体のソースコード
順番に解説していきます。
環境設定が終わっている方は、「MechanicalSoupのインポート」からどうぞ。
VPSを使わずにローカル環境でもできると思います。ですが、今回は「自動化」を想定しているので、プログラムをずっと動かしていられるVPSを選びました。
作業環境を作る
私と同じ環境にするのであればまず、さくらのVPSのCentOS8を借ります。
さくらのVPS
CentOS8はサポート期間が2021/12/31までなので、それよりも長くVPSを使いたいのであれば、CentOS7でも良いと思います。
スペックは2Gプランです。クレカ決済なら毎回2週間のお試し期間がついてくるので、初めての人にオススメです。
2週間経つと本登録となり、料金が発生します。それまでに解約すれば無料で使えます。
- ゾーン 石狩第1ゾーン
- メモリ 2 GB
- ストレージ SSD 200 GB
- CPU 3コア
CentOSの立ち上げ
さくらのVPSコントロールパネルを開いて、今回借りたサーバーを選びます。
緑ボタンの起動を押したあと、白ボタンのコンソールから「シリアルコンソール」を押して、CentOSを立ち上げます。
シリアルコンソールにすると、コピーアンドペーストができるようになるので便利です。
初回はユーザー名とパスワードを聞かれると思います。
- ユーザー名:root
- パスワード:登録したメールアドレスに送られているものか、申込みをしたときに決めたもの
パスワードは打ち込んでいても表示されませんが、ちゃんと入力されているので、打ち終わったらEnterを押します。
pythonのインストール
つぎに、pythonをインストールします。
sudo dnf install python38 -y
CentOS8からyumではなく、dnfに変わったのでご注意ください。
バージョン確認
python3 -V
または
python3 --version
python 3.8.3
pip3 -V
または
pip3 --version
pip 21.0.1 from /usr/local/lib/python3.8/site-packages/pip (python 3.8)
このままでは、python3 〇〇.py と実行する必要があります。
面倒なので、python 〇〇.pyでも実行できるように、少し修正していきます。
python3からpythonにする
alternatives --config python
このあと選択画面になるので、3 と入力。(python38 を選択するため)
確認しましょう。python3のときと同じになればOKです。
python -V
または
python --version
python 3.8.3
同様に、pipの方も直します。
pip3からpipにする
update-alternatives --install /usr/bin/pip pip /usr/bin/pip3.8 1
update-alternatives --install /usr/bin/pip pip /usr/bin/pip3.8 1
確認します。pip3のときと同じになればOKです。
pip -V
または
pip --version
pip 21.0.1 from /usr/local/lib/python3.8/site-packages/pip (python 3.8)
終わったら、mechanicalsoupをインストールしていきます。
pip install MechanicalSoup
お疲れさまです!
続いて、プログラムを作っていきましょう。
ファイルを作る
ファイルの場所はどこでも大丈夫です。
viというテキストエディタを使って、pythonファイルの新規作成をしていきます。
vi test1.py
vi には「入力モード」と「コマンドモード」があります。
i を押すと、入力モードに、
esc を押すと、コマンドコードになります。
i を押して、プログラムを書いていきましょう。(左下にINSERTと出てきたら切り替わっている状態です)
保存するときは、コマンドモードに切り替えてから「:wq」と打つと、保存してファイルを閉じます。
保存せずに閉じたいときは、コマンドモードに切り替えてから「:q!」です。
MechanicalSoupのインポート
mechanicalsoupをインポートします。
今回は「time」「logging」も使います。
- time → 時間をおく(サーバーに負荷をかけないため)
- logging → 処理の進み具合を確認する
import mechanicalsoup
import time
import logging
ログインページを開く
browser = mechanicalsoup.StatefulBrowser()で、ブラウザオブジェクトを作ります。
browser.open()で指定したサイトのURLを開きます。
ここで、WordPressのユーザー名とパスワードを変数に入れておきます。
def main():
##########
#mainの処理
##########
browser = mechanicalsoup.StatefulBrowser()
logging.info("Let's Go...")
username = "hogehoge" #あなたのユーザー名を入れてください
password = "passpass" #あなたのパスワードを入れてください
#ログインページを開く
browser.open("https://c-sushiringblog.com/wp-admin/")
time.sleep(1)
#続く
ログインフォームを埋める
browser.select_form()でhtmlからformを取得します。
WordPressでは()の中に何も入れなくても動きましたが、他のサイトではformについているidやclass名を入れないと動きませんでした。
逆に、入れても動かないサイトもあり、対策が必要な部分です。
browser.select_form()
browser["log"] = username
browser["pwd"] = password
#続く
browser[“〇〇”]のところは、対象のname属性の値を書きます。
今回WordPressのログイン画面(ユーザー名とパスワードを入れるフォーム)のhtmlは以下のとおりです。
<form name="loginform" id="loginform" action="https://c-sushiringblog.com/wp-login.php" method="post">
省略
<input type="text" name="log" id="user_login" aria-describedby="login_error" class="input" value="" size="20" autocapitalize="off">
省略
<input type="password" name="pwd" id="user_pass" aria-describedby="login_error" class="input password-input" value="" size="20">
省略
</form>
毎回WordPressを使うときは、上記のinputタグにユーザー名とパスワードを入れてログインしています。
なので、「test1.py」には、以下のように書きます。
- name=”log” → browser[“log”]
- name=”pwd” → browser[“pwd”]
そして、それぞれに「ログインページを開く」で代入したユーザー名とパスワードを入れます。
フォームの送信
browser.submit_selected()で、フォームの送信します。
(ログインボタンをクリックする動きです。)
logging.info("Signing in...")
browser.submit_selected()
time.sleep(1)
#続く
ログインできたか確認
for文のループ処理にしないと、テキスト以外の情報も取ってきてしまいます。
[<h1>ダッシュボード</h1>, <h1 id="link-modal-title">リンクの挿入/編集</h1>]
なので、for文でテキストのみを取得します。
テキストが取得できたということは、ログインページを通過した証明になります。
top = browser.get_current_page().select('h1')
print(top) #[ダッシュボード, リンクの挿入/編集]
#print(top.text)はエラーになります。
for wp in browser.get_current_page().select('.welcome-panel-content h2'):
print(wp.text)
#################
#mainの処理おわり
#################
main()を呼び出す
さいごに、main()を呼び出します。
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
main()
完成です。
お疲れさまでした!
全体のソースコード
import mechanicalsoup
import time
import logging
def main():
##########
#mainの処理
##########
browser = mechanicalsoup.StatefulBrowser()
logging.info("Let's Go...")
username = "hogehoge" #あなたのユーザー名を入れてください
password = "passpass" #あなたのパスワードを入れてください
#ログインページを開く
browser.open("https://c-sushiringblog.com/wp-admin/")
time.sleep(1)
browser.select_form()
browser["log"] = username
browser["pwd"] = password
logging.info("Signing in...")
browser.submit_selected()
time.sleep(1)
top = browser.get_current_page().select('h1')
print(top) #[ダッシュボード, リンクの挿入/編集]
#print(top.text)はエラーになります。
for wp in browser.get_current_page().select('.welcome-panel-content h2'):
print(wp.text)
#################
#mainの処理おわり
#################
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
main()
WordPress以外にも応用可能です
ここまでご覧いただきありがとうございます。
対象のURLやログインフォームのhtml取得内容を変えれば、他のサイトにも応用できます。
ただ、利用規約によってスクレイピングが禁止しているサイトもあるので、気をつけるようにしましょう。
また、mechanicalsoup以外にもseleniumやPyppeteerを使って自動操作することもできます。
mechanicalsoupでできなかったサイトでも、seleniumを使えばできるかもしれません。
さらに、サイトから取得してきた値(スクレイピングしてきた値)をLINEに通知することもできます。詳しい解説はこちらの記事もどうぞ。
自動化して楽しい時間を増やしましょう!ご覧いただきありがとうございました。
参考
コメント