【ConoHa WING】python実行環境を整えてみた。

at

ヤマモトです。

先日に引き続きジャンプ自動化を頑張っているのだが、今回は掲題の通りレンタルサーバーの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 が動くか試してみる。

atコマンドの戦闘ログ

スクリプトの用意

これまた先日紹介した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の出番か~」なんて思ったのも懐かしい(笑)

細かくデバッグして、エラー箇所と原因を突き止めて、それを回避するように対策を考えてコーディングする。

エンジニアっぽいことしてるじゃん、俺←



コメント

タイトルとURLをコピーしました