【ConoHa WING】記事投稿のpythonスクリプトをスケジューラで自動実行

ConoHa WING

ヤマモトです。こんばんは。

ソフトバンクの優勝が決まるのか、はたまたオリックスが優勝するのか。
気になって眠れない日々を過ごす今日この頃。

今回は、最近目下取り組んでいる、pythonでのWordPress自動投稿編のうち、
ついに完結編であるレンタルサーバーでスクリプトを仕掛けてみた件について報告しようと思う。

何をやろうとしているのかは以下記事からどうぞ。

やりたいことまとめ

記事投稿のpythonスクリプトについて

ジャンプのwebページから連載一覧を取ってきて、記事のベースを作るスクリプト自体は過去に紹介しているのでここでは割愛。詳しくは以下記事を参照。

ジャンプ感想記事の自動投稿スクリプト

ここでは、上記スクリプトのアップデート箇所を簡単にご紹介。

次回発売日の取得の処理を追加

こちらも過去記事で紹介済みだが、ジャンプの発売日になったら自動でタスクを実行するように、以下の仕組みを導入した話。

  1. ジャンプの次回発売日の情報を取得する。
  2. 取得した発売日を次回タスクの実行日として、at コマンドでタスクを設定する。
  3. 次回発売日にタスクが実行。1の処理がなされて、以降繰り返し。

コード自体は以下を追記している。詳しくは後述の記事をご参照あれ。

ポイントは年越しの部分だった。

# 次回発売日の取得
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
詳しくはこちら

タスク設定の処理を追加

プログラム自身を次号発売日に自動で動かすため、次号発売日を atコマンドで渡してタスクスケジューラに登録する処理を追加した。ある意味本記事のタイトルでもあり、このスクリプトのである。

at コマンドも色々あってなぜかレンタルサーバーのConoHa WINGの環境だと -f オプションが使えなかったので、仕方なく echo コマンドで渡す処理に変更した。

# 次回タスク実行の設定
set_Day = f"01: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)

このあたりの変更も過去記事で(大変だった記録とともに)まとめている。

大変だった時の記録。

ジャンプ表紙画像の保存 & 自動削除の処理を追加

自分のPCであればあまり気にしないが、リソースが限られているレンタルサーバー環境だと、画像を保存し続けるのは容量的にもったいない。

ということで、画像を保存した後に自動で削除する処理も追加した。

削除はOSの rm コマンドを使うが、pythonからは at と同様に subprocess で渡す。

### 画像のリンクを取得するまでは省略 ###

# 保存する際のパス、ファイルネームを定義。
file_path = "/home/C3XXXXXX/pictures/%s" % re.search(r'_mainImg_hyoushi_.*_.*.jpg', str(imgs[0])).group()
## パス指定で「~」は使えないので注意。(原因不明)

# 画像の保存
r = requests.get(img_link)

with open(file_path,'wb') as file:
    file.write(r.content)

## 途中省略 ##

# 保存した画像の削除 (スクリプトの一番最後)
command_rm = f'rm {file_path}'
subprocess.call(command_rm,shell=True)

保存時のパス指定に ~/pictures/XXXX みたいな ~ を使ったパス指定ができなかったのはなぜなのだろう。。。まあ絶対パスで書けば良いだけなので深くは考えない。

タグの自動設定の処理を追加

これはWordPressの投稿内容についての処理。

WordPressではカテゴリと同様に記事にタグを設定することができる。タグは主に「週刊少年ジャンプ」とジャンプの連載作品名をいくつか設定するのだが、これも自動化したいと考えた。

・・・しかし、REST APIでタグを設定する際は既存で登録済みのタグのIDを指定する必要があり、自動化する場合には以下の課題がある。

  • 登録済みの連載作品名のタグのIDがわからない。
  • 新規連載など、新規でタグを登録する場合はIDがわからない。

しゃーねー。毎回登録するか、、、とあきらめていたところに、救世主のように以下記事が見つかった。

処理の内容は記事のタイトル通りなわけだが、うってつけなやつがあった (笑)

ということで早速実装。

# タグの番号取得関数
# 未登録の場合は番号作成後に、その番号を返す。
def wp_tag_add(tagname):
    r = ""
    post = {
        'name': tagname,
    }
    res = requests.post(
        blog_url + "wp-json/wp/v2/tags/",
        json=post,
        auth=(api_user, api_password),
        )
    data = json.loads(res.text)
    if 'code' in data:
        if data['code'] == "term_exists":
            r = data['data']['term_id']
    else:
        r = data['id']
    return r


# タグの番号取得
# 先頭から4つの作品をタグとして登録
tag_lsit = list(map(lambda x: wp_tag_add(x),jump_list[0:4]))
tag_lsit.append(64)

やっていることとしては、ジャンプの連載作品一覧の上位4作品のタグを自動追加するのだが、もし作品名のタグが登録されていない場合は、新規のタグを作成してそのIDを返して登録するというもの。

ちなみに、上位四作品としているのは取得する連載一覧の順番が巻頭、センターカラーの順に並んでいて、上位四作品がカラーに該当するから。

レンタルサーバーにスクリプトを仕込む

今回のスクリプトは、一度実行したらタスクスケジューラに次回以降のジョブが設定されるため、初回の実行をしさえすればあとは永久的にジャンプ発売日になったらジョブが実行される。

ということで、早速作ったスクリプト Post_Jump_review.py をレンタルサーバー上に持って行って、初回実行してみる。ジョブとして登録するためのシェルスクリプト (Post_Jump_review.sh) も作成して、早速レンタルサーバーで初回実行をする。

[cXXXXX@XXXXX ~]$ ~/python/Post_Jump_review.sh
job 10 at Mon Oct  3 01:00:00 2022
# 無事登録完了!!

おしおーし。エラーも無く実行できたぞ。

ちなみに、表紙画像は ~/pictures/ 配下に一時保存する仕様だが、ちゃんと想定通り表紙画像は削除されている。


はい。ということでお疲れさまでした。

・・・え? 結果は??

と思ったかもしれないが、そうです。結果は次回ジャンプの発売日の10/3にならないとわかんないっすww

まあ試しにレンタルサーバー上で何度か発売日を仮想日付にして、下書き投稿のテストをやってみたんだけど、ちゃんと成功してたので大丈夫だろう。

10/3が楽しみっすね。
もっと言うと、ちゃんと月曜以外とか、なんなら年越しもできるのか不安はあるんだが、まあそんときはそんときでエラー調査して修正していきましょう。



コメント

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