定期的にあるurlにアクセスするようにCronを使ってみた。
Cronとは、定期的にコマンドやスクリプトを実行するためのプログラムです。
無料のシンクラウド for Freeの場合、設定画面が用意されているので実行する時間とコマンドを簡単に設定できます。
目的は私が作ったStreamlit Cloudのアプリがアクセスがなさすぎるとフリーズしてしまうため
フリーズしないようにCronを使って定期的にアクセスしてやろうと思いました。
しかし結果はアクセスはするものの本来の目的は達成できませんでした。
恐らくStreamlit CloudはCronなどプログラムでアクセスに対して対策されているものと思われます。
目的は達成できませんでしたが、自分が作った掲示板に定期的に書き込むことは成功したので、その件も併せて紹介します。
イチゲブログ掲示板【シンクラウド for Free】(CSV)
シンクラウド for Freeについてはこちら↓↓↓↓を参照してください。
シンクラウド for FreeのCronの使い方
サーバーパネルにログインします。
使い方は公式のCron設定に書いてあります。
下は実際に設定したものだが、毎時間25分になったらhttps://percenten-bpejpwmjycozvhy8lfdxce.streamlit.app/(Streamlitの私が作ったアプリ)にアクセスする。
Streamlitにアクセスできたが、うまくいってない
Cron結果の通知アドレスにメールアドレスを設定するとCronが実行された後、
結果がメールで送られてくる。
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 141 100 141 0 0 260 0 --:--:-- --:--:-- --:--:-- 342
100 141 100 141 0 0 260 0 --:--:-- --:--:-- --:--:-- 342
<a href="https://share.streamlit.io/-/auth/app?redirect_uri=https://percenten-bpejpwmjycozvhy8lfdxce.streamlit.app/">See Other</a>.
これはCronでアクセスしたとき実際の表示は下のようになって、
See Otherをクリックしないと本来アクセスしたいところにアクセスしたことにならないのかもしれない。
というのもこのアプリはアクセスカウンタを入れているがCronが実行されてもアクセスカウンタが増加していない。
このアクセスカウンタは同一アドレスで連続クリックしても増加しないようになっているが、
Cronによるアクセスはシンクラウド for FreeのサーバーIPからのアクセスなので
別IPからのアクセスとしてカウントアップするはずである。
Geminiに聞いた
「私のサイトのアクセスがcronによるアクセスか判断する方法は?」
Geminiの答え:
cronによるアクセスかどうかを判断するには、いくつかの方法があります。
1. リクエストヘッダーを確認する
cronジョブから実行されるスクリプトは、リクエストヘッダーにUser-Agent
フィールドを含めることが一般的です。このフィールドには、リクエスト送信元のソフトウェアに関する情報が含まれます。多くの場合、cronジョブはcurl
やwget
などのコマンドラインツールを使用して実行されるため、User-Agent
フィールドにはこれらのツールの名前とバージョンが含まれます。
User-Agent: curl/7.74.0 (x86_64-pc-linux-gnu) libcurl/7.74.0 OpenSSL/1.1.1l zlib/1.2.11
ということなのでUser-Agentが例えばcurlかどうかで判断してるかも。
目次へ
JupiterNotebookで実験
CronではなくパソコンでJupiterNotebookでプログラムを書いてアクセスしてみるとエラーになる。
プログラム
import urllib.request
with urllib.request.urlopen('https://percenten-bpejpwmjycozvhy8lfdxce.streamlit.app/') as response:
html = response.read()
print(html)
実行すると
HTTPError: HTTP Error 303: The HTTP server returned a redirect error that would lead to an infinite loop.
The last 30x error message was:
See Other
このプログラムでアクセスすると同じところにリダイレクトされ無限ループになって先に進めないようです。
恐らくこういうサイトはプログラムでアクセスされないように対策されていると思われます。
うまく回避する方法があるかもしれないが、今回はここまでにします。
目次へ
掲示板にCronから書き込んでみる
自分で作ったイチゲブログ掲示板【シンクラウド for Free】(CSV)にCronから書き込んでみました。
urlパラメータが英数のみの場合
この方法は、たまたま私が作った掲示板でうまくいっただけなので万能ではありません。
今回うまくいったコマンドはurlの後ろにurlパラメータを付けてcurlします。
urlパラメータは、掲示板の「各入力欄のname属性=書き込む内容」でOKでした。
入力欄は2つあるので&でつなげます。
curlのあとは’’で囲まないと?以降(urlパラメータ)の部分が実行されません。
実行されているかどうかはCronの実行結果が送られてくるメールの題名で判別できます。
’’付けないと題名で?から後ろが消えてました。
+は半角スペースです。
curl 'https://cf193110.cloudfree.jp/python/keijisfcsv.py?user_name=Cron+scheduled+execution&toukou=Success'
目次へ
urlパラメータが日本語の場合
urlパラメータが日本語の場合は厄介です。コマンドは以下に変わります。
ブラウザのアドレスバーから同じことを実行するときは
https://cf193110.cloudfree.jp/python/keijisfcsv.py?user_name=Cron定期実行&toukou=成功
になりますが、curlコマンドだと以下になります。参考 curl コマンド 使い方メモ
curl -w '\n' 'https://cf193110.cloudfree.jp/python/keijisfcsv.py' --data 'user_name=Cron\%E5\%AE\%9A\%E6\%9C\%9F\%E5\%AE\%9F\%E8\%A1\%8C&toukou=\%E6\%88\%90\%E5\%8A\%9F'
urlパラメータの日本語は%エンコードします。
さらに%の前には¥を付けて%をエスケープしないとうまくいきません。
日本語を%エンコードする方法
ブラウザのアドレスバーに日本語のurlパラメータ付きurlを書きます。https://cf193110.cloudfree.jp/python/keijisfcsv.py?user_name=Cron定期実行&toukou=成功
それをコピーしてメモ帳に貼り付けると日本語部分が%エンコードされます。
ポイントはブラウザのアドレスバー以外で書いたものをメモ帳に貼り付けても、日本語のまま貼りつきます。
なので必ずブラウザのアドレスバーで作るようにしてください。
まとめ
シンクラウド for Freeだと簡単にCron設定、実行できます。
パソコン立ち上げなくていいですが
定期実行する対象によっては想定したことを実行するのは難しいと思います。
そういうのはパソコンでプログラムを作って
パソコンでそのプログラムを定期実行させた方がいいと思います。
目次へ
イチゲをOFUSEで応援する(御質問でもOKです)Vプリカでのお支払いがおすすめです。
MENTAやってます(ichige)