ヤマモトです。
先日に引き続きジャンプ自動化を頑張っているのだが、今回は掲題の通りレンタルサーバーのConoHa WINGでpython環境を整えて、実際にプログラムを走らせてみた、という話。
ちなみに、先に話すとエラーに躓いて諦めそうになりました。。。
あっさり書いているけど、そんな苦労に満ちあふれた話。
状況の確認とセットアップ
sshは先日試したが、今回はWSLから入って作業する。
yamamoto@my-windows-pc:~$ ssh -i /PATH/TO/XXXXXX.pem c3XXXXX@XXXXX.conoha.ne.jp -p XXXXXX
[cXXXXX@XXXXX ~]$
とりあえずレンタルサーバーにアクセス。
pythonのバージョン確認
先日、レンタルサーバーにpythonが入っていることは確認した気がするが、改めて。
# pythonの場所を確認
[cXXXXX@XXXXX ~]$ which python
/usr/local/bin/python
# pythonを起動してバージョンを確認
[cXXXXX@XXXXX ~]$ python
Python 3.6.15 (default, Jan 14 2022, 12:16:54)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
pythonのバージョンは3.6.15でしたね。
3系統だったらまあ問題なく動くっしょ。
必要モジュールのインストール
ジャンプ自動実行には以下3つのモジュールが必要なので、インストールする。
- requests
- BeautifulSoup
- python-crontab
レンタルサーバーでAnacondaを展開するのもイマイチなので、ここはpipでインストールすることにする。
[cXXXXX@XXXXX ~]$ pip install requests
[cXXXXX@XXXXX ~]$ pip install beautifulsoup4
[cXXXXX@XXXXX ~]$ pip install python-crontab
あっさりインストールできちゃう。
pythonを実行してみる
先日実行した at
コマンドと組み合わせて使う Jump_next_day.py
が動くか試してみる。
スクリプトの用意
これまた先日紹介したConoHa WINGのファイルサーバー機能でブラウザからスクリプトをアップロードできそうだったが、大した量でも無いのでコピペでスクリプトを作成していく。
#!/usr/bin/env python
# coding: utf-8
import os
import re
import datetime
import subprocess
# webスクレイピング用のモジュール
import requests
from bs4 import BeautifulSoup
# ジャンプのサイトからHTMLを取ってくる。
# URLは今週号のページ
url = 'https://www.shonenjump.com/j/weeklyshonenjump/'
res = requests.get(url,timeout=3)
# 文字コードを推定して適宜変換する関数を使用。
res.encoding = res.apparent_encoding
# html.parserに渡してHTMLの解析を行う。
soup = BeautifulSoup(res.text, "html.parser")
# 次回発売日の取得
jump_next = soup.find_all(name="p",text=re.compile(".*発売予定"))[0]
jump_next_Day = re.search(r'[0-9]+月[0-9]+日',str(jump_next)).group()
# 現在日付を取得
dt_now = datetime.datetime.now()
dt_now_Year = dt_now.strftime('%Y年')
# 日付型に変更
T_jump_next_Day = datetime.datetime.strptime(f'{dt_now_Year}{jump_next_Day}','%Y年%m月%d日')
# 生成した日付が未来日付であることを確認。
if T_jump_next_Day <= dt_now:
#過去日付の場合は年越しを考慮して年数を1年足す。
New_jump_next_Day = datetime.datetime(T_jump_next_Day.year + 1, T_jump_next_Day.month, T_jump_next_Day.day)
else:
New_jump_next_Day = T_jump_next_Day
print(New_jump_next_Day.strftime('次回発売日: %Y年%m月%d日 %a'))
# at コマンドでスケジュールを設定
set_Day = f"00:00 {str(New_jump_next_Day.strftime('%d.%m.%Y'))}"
command = ['at', f'{set_Day}', '-f', '~/pyhton/Jump_next_day.sh']
subprocess.call(command)
#!/bin/sh
PYTHONIOENCODING=utf-8 python ~/python/Jump_next_day.py >> ~/python/Jump_next_day.txt
ちなみに、 Jump_next_day.sh
の冒頭に記載されている PYTHONIOENCODING=utf-8
は日本語を対応させるためのお呪い。
ConoHa WING のOSはCloudLinuxなのだが、encodeの情報が設定されていないので、日本語を出力しようとすると文字化けしてエラーになってしまう。
実はSSHログイン時も執拗に注意される。
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = "C.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
直したいんだけど、ConoHa WINGってroot権限使えなくて、localectl
も使えないから変更できない。。。ので、こんなお呪いが必要。(解決方法知っている人いたら教えてちょ)
スクリプトの実行
用意もできたので早速実行してみる。
[cXXXXX@XXXXX ~]$ PYTHONIOENCODING=utf-8 python ~/python/Jump_next_day.py
You are not authorized to run this command
・・・ん?? なんか失敗した。
成功していれば、次回発売日にタスクスケジュールが設定されるはずなのだが、at -l
で確認してもタスクがスケジュールされていない様子。
なんか怪しい雰囲気。。。
(このあと、めちゃくちゃ原因調査した。。。)
エラー原因の調査と対応
at
コマンドでジョブが設定できるかを試してみる。
[cXXXXX@XXXXX ~]$ at 00:00 03.10.2022 -f ~/python/Jump_next_day.sh
You are not authorized to run this command
え、もしかして at
コマンドが権限的に使えない??
[cXXXXX@XXXXX ~]$ at 00:00 03.10.2022
at> ~/python/Jump_next_day.sh
at> <EOT>
job 3 at Mon Oct 3 00:00:00 2022
あれ、、、普通に登録できるじゃん。。。
シェルスクリプトが登録できているので、ということは -f
オプションが悪さしてそう。
う~ん。どうしますかね(笑)
対話型ではジョブの登録ができるので、頑張って渡す??
とかとか悩んでいたところ、以下の記事を発見。
なんと、echo
と組み合わせてコマンドを渡すことが出きるっぽい。おお。
じゃあ subprocess
で渡すときに echo
から at
にパイプするようにやってみますか。
# at コマンドでスケジュールを設定
set_Day = f"00:00 {str(New_jump_next_Day.strftime('%d.%m.%Y'))}"
command = f'echo ~/python/Jump_next_day.sh | at {set_Day}'
subprocess.call(command,shell=True) # パイプできるように`shell`オプションをTrueにする。
これで実行してみる。
[cXXXXX@XXXXX ~]$ PYTHONIOENCODING=utf-8 python ~/python/Jump_next_day.py
job 10 at Mon Oct 3 00:00:00 2022
無事成功!!!
ということでお疲れさまでした。
本日はここまで。疲れたーーーーー
記事としてはあっさりまとまっているが、実は数日悩んでいたww
まあ無事成功して何よりっす。
最初、エラー出た時はroot権限無いせいだと思って、「あ~ ConoHa VPSの出番か~」なんて思ったのも懐かしい(笑)
細かくデバッグして、エラー箇所と原因を突き止めて、それを回避するように対策を考えてコーディングする。
エンジニアっぽいことしてるじゃん、俺←
コメント