ロリポップ!ライトプランでpyPDFを動かしてみた!
ロリポップのライトプラン、SSHの代わりにシェルスクリプト+cron
ロリポップのライトプランは、2023年8月現在、3年契約の条件で月220円。
SSHは使えないので、Pythonが使えないのではないかと思いましたが、
- シェルスクリプトを書いてアップロード
- ファイルのパーミッション(属性)を700に
- cron設定で実行時刻を数分後くらいに指定し、結果をメールに送る設定
で、実行できることが分かりました。以下の書式で、シェルスクリプトとメールを書き出します。
シェルスクリプト
メール(Cron Daemon)
ROOTのPath確認
pwd.sh (ファイル名は任意。UPして、パーミッションを700にして、cronで実行)
#!/bin/sh
pwd
pwd.shというテキストファイル(UTF-8で保存)をサーバー上にUPして、ロリポップのユーザー専用ページにログインして、
[サーバーの管理・設定]-[cron設定]
と、辿ります。
cronの設定名は、自分で分かりやすいものを。
日付・時刻は、今日の日付の今から数分後を指定。
実行ファイルパス欄は、.htaccessで飛ばすような設定をしている場合、飛ばす前のURLを指定します。
もっと簡単に言うと、ロリポップ!FTPの画面でそのシェルファイルを開いた状態で、http://の次のスラッシュより右側の文字列を実行ファイルパス欄に入力すると良いと思います。
(Cron Daemon)からのメール本文
/home/users/{番号}/{ユーザー名}
PIP導入
pip_get.sh (ファイル名は任意。UPして、パーミッション(属性)を700にして、cronで実行)
#!/bin/sh
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
/usr/local/bin/python3.7 get-pip.py --user
/usr/local/bin/python3.7 -m pip install --upgrade pip
% 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 2518k 100 2518k 0 0 13.3M 0 --:--:-- --:--:-- --:--:-- 13.4M
Collecting pip
Downloading pip-23.1.2-py3-none-any.whl (2.1 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 69.9 MB/s eta 0:00:00
Collecting wheel
Downloading wheel-0.40.0-py3-none-any.whl (64 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 64.5/64.5 kB 13.7 MB/s eta 0:00:00
Installing collected packages: wheel, pip
WARNING: The script wheel is installed in '/home/users/{番号}/{ユーザー名}/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
WARNING: The scripts pip, pip3 and pip3.7 are installed in '/home/users/{番号}/{ユーザー名}/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed pip-23.1.2 wheel-0.40.0
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: pip in ./.local/lib/python3.7/site-packages (23.1.2)
Pathを通す
bash_profile.sh (ファイル名は任意。UPして、パーミッションを700にして、cronで実行)
#!/bin/sh
echo 'PATH=$PATH:/home/users/{番号}/{ユーザー名}/.local/bin'> .bash_profile
bottleをインストール
bottle_install.sh (ファイル名は任意。UPして、パーミッションを700にして、cronで実行)
#!/bin/sh
# pipを使う前に、.bash_profileを有効化
source ~/.bash_profile
# pipのアップデート
/usr/local/bin/python3.7 -m pip install --upgrade pip
#(この後で、pipのコマンドを書く)
pip install bottle
Defaulting to user installation because normal site-packages is not writeable
Collecting bottle
Downloading bottle-0.12.25-py3-none-any.whl (90 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 90.2/90.2 kB 12.9 MB/s eta 0:00:00
Installing collected packages: bottle
Successfully installed bottle-0.12.25
.pyで Hello world!
hello2.py (サーバーにUPして、パーミッションを700にして、直接URLを開く)
#!/usr/local/bin/python3
out = lambda msg: print(msg, end="\r\n")
# ヘッダの出力
out("Content-Type: text/html; charset=utf-8\n")
# HTMLの出力
out("<br><h1>こんにちは、世界!</h1>")
bottleを使って、Hello world
bottle_test1.cgi (サーバーにUPして、パーミッションを700にして、直接URLを開く)
#!/usr/local/bin/python3
from bottle import route, run
@route('/')
def hello():
return "<br><h2>こんにちは世界!</h2>"
if __name__ == '__main__':
run(server='cgi')
pyPDFのインストール
pyPDF_install.sh (ファイル名は任意。UPして、パーミッションを700にして、cronで実行)
#!/bin/sh
# pipを使う前に、.bash_profileを有効化
source ~/.bash_profile
# pipのアップデート
/usr/local/bin/python3.7 -m pip install --upgrade pip
#(この後で、pipのコマンドを書く)
pip install pyPDF
Defaulting to user installation because normal site-packages is not writeable
Collecting pypdf
Downloading pypdf-3.11.1-py3-none-any.whl (257 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 257.8/257.8 kB 24.2 MB/s eta 0:00:00
Requirement already satisfied: typing_extensions>=3.10.0.0 in ./.local/lib/python3.7/site-packages (from pypdf) (4.6.3)
Installing collected packages: pypdf
Successfully installed pypdf-3.11.1
pypdfは使えるらしい!
エラーが出なかったコード(cgiを呼び出す度に、sample.pdfの1ページ目を抜いて後ろに繋いでいくスクリプト)
bottle_pyPDF.cgi 〔cgi本体〕 sample.pdf 〔cgiの実行結果〕
#!/usr/local/bin/python3
# bottleとpyPDFのシンプルなコード
# bottleのインポート
from bottle import route, run
#pyPDFのインポート
import pypdf
from pypdf import PdfReader
########################################
@route('/')
def index():
# mergerをセットする
merger = pypdf.PdfMerger()
# 2ページ目から10ページ目を読み込む
merger.append('sample.pdf', pages=(1,10))
# 1ページ目を後ろに繋ぐ
merger.append('sample.pdf', pages=(0,1))
# サンプルPDFに書き出す
merger.write('sample.pdf')
# サンプルPDFへのリンクを画面に書き出す
return "<p><a href='sample.pdf' target='_blank'>sample.pdf</a></p>"
# メイン
if __name__ == '__main__':
run(server='cgi')
bottleとpyPDFを組み合わせて、PDFのページ組換えのサーバーサイドアプリを作ってみました。
pyPDFでページをマージしたりする対象のファイルは、サーバー上にあるPDFになるらしく、そうすると、PDFをアップロードしていただいて、サーバー側で加工した後、ダウンロードする、という3段階のアプリになります。
ところが、調べてみると、PDFにはウイルスを仕込むことが可能だとのこと。不特定多数のPDFをサーバーにアップロードする仕組みにするには、セキュリティをかなり強化しなければならない様です。
それで、もともとあるサンプルファイルを選択して、自由入力のコマンドでページ組換えを行って、ダウンロードする形に変えて、サンプルを公開しています。
SSHが使えない分、シェルスクリプトを書いて、アップロードして、cronで実行というゆっくりなペースになりますが、ロリポップのライトプランで、Pythonが動き、bottleとpyPDFを動かせることが確認できました。
参考にさせていただいたサイト
●【ブログでプログラミング】ロリポップライトプランでpipのライブラリを使う方法
https://youmy-lvup.com/pip-programing-184.html
●ラズパイ4BでPythonのBottleによる簡易Webサーバー実験(備忘録)
https://www.mgo-tec.com/blog-entry-raspi4-python-bottle1.html#title02-01
●PythonのWebフレームワーク Bottleをロリポップサーバ(ロリポプラン)で動かしてみる
https://qiita.com/yamao2253/items/e518048b9bbfe58ffa52
参考にさせていただいた書籍
https://www.amazon.co.jp/dp/B01MQU38Y0/