Web制作の仕事に携わっていると夜中に更新時間を指定されることがあります。CMSで管理できるサイトなら何の問題ないですが、静的なHTMLや画像ファイルを手動で更新しなければならない時はどうすればいいのでしょうか?夜遅くまで残業しますか?

いやいや、Pythonを使って楽をしましょう(笑)というわけで、今日はPythonでFTPをさせる方法を扱いたいと思います。もちろん、サイトにファイル更新の仕組みを作って解決することもできますが、Pythonでファイル転送のコードを書いて持っていると、FTP情報とファイル名のリストを更新するだけで幾つものサイトに使えるので便利ですよ。

スポンサーリンク




目次

  1. PythonでFTPするための基本的なコード
  2. 更新後にメールを送信するようコードを改造してみる
  3. cronの設定について
  4. まとめ

1.PythonでFTPするための基本的なコード

PythonでFTPさせるコードはとても簡単です。まずはコードを見てもらった方が早いので、早速サンプルコードを示したいと思います。

# -*- coding: utf-8 -*-
from ftplib import FTP
import time
import datetime

# FTP接続
ftp = FTP(
	'_____ホスト名 or IPアドレス_____',
	'_____FTP ID_____',
	passwd='_____FTP パスワード_____'
)

# ローカルパス
local_path = '_____ローカル パス_____'

# サーバーパス
server_path = '_____サーバー パス_____'

# アップロードするファイルリスト
file_list = [
	'index.html',
	'/img/photo.jpg'
]

# アップロード開始
for item in file_list:

	# タイムスタンプ生成
	dt_now = datetime.datetime.now()
	ts = dt_now.strftime('%Y/%m/%d %H:%M:%S')

	with open(local_path + item, 'rb') as f:
		# バイナリアップロード
		if '.jpg' in item or '.png' in item or '.gif' in item:
			ftp.storbinary('STOR ' + server_path + item, f)
		# テキストアップロード
		else:
			ftp.storlines('STOR ' + server_path + item, f)

	# ステータス表示
	print(ts + ' ' + server_path + item + ' をアップロードしました。')

	# 遅延処理
	time.sleep(1)

とりあえず、これだけでファイル転送できてしまいます。

8〜10行目のFTPの設定はレンタルサーバーの設定をそのまま入力します。14行目のローカルパスですが、コマンド叩いて動かす場合は相対パスでOKですが、cronで動かすにはフルパスで入力する必要があるので注意してください。

21〜22行目はアップロードするファイルリストです。必要に応じて設定してください。

34行目でitemの拡張子を見ているのは、テキストとバイナリで記述を少し変えないといけないからです。「.jpg」、「.png」、「.gif」以外にバイナリファイルがある場合は、ここの記述を変えてください。

44行目にある遅延(サンプルでは1秒)のための記述ですが、念のため遅延させているだけなので、基本的には不要だと思います。なお、この記述はコールバックを受け取るような記述にはなっていません。

2.更新後にメールを送信するようコードを改造してみる

先ほどのコードで、とりあえずアップロードできるはずですが、作業後に報告がないと心配ということもあるかもしれません。それで、先ほどのコードを少し改造して、アップロード作業後にメールを送信するように改造してみたいと思います。メールの報告があれば、ファイルがアップされた後、安心して晩酌ができますね(笑)

# -*- coding: utf-8 -*-
from ftplib import FTP
import time
import datetime
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

# FTP接続
ftp = FTP(
	'_____ホスト名 or IPアドレス_____',
	'_____FTP ID_____',
	passwd='_____FTP パスワード_____'
)

# ローカルパス
local_path = '_____ローカル パス_____'

# サーバーパス
server_path = '_____サーバー パス_____'

# アップロードするファイルリスト
file_list = [
	'index.html',
	'/img/photo.jpg'
]

# お知らせメール送信設定
smtp_server = '_____smtpサーバー_____'
smtp_port = 587
smtp_id = '_____アカウント名_____'
smtp_pw = '_____パスワード_____'
mail_from = '_____送信元アドレス_____'
mail_to = '_____送信先アドレス_____'

# お知らせメール送信
def sendToInfoMail(subject, massage):

	# 文字コード設定
	charset = 'ISO-2022-JP'

	mail = MIMEText(massage.encode(charset), 'plain', charset)
	mail['Subject'] = Header(subject, charset)
	mail['From'] = mail_from
	mail['To'] = mail_to
	mail['Date'] = formatdate(localtime=True)

	smtp = smtplib.SMTP(smtp_server, smtp_port)
	smtp.login(smtp_id, smtp_pw)
	smtp.sendmail(mail_from, mail_to, mail.as_string())
	smtp.close()

# お知らせメール送信内容
subject = u'自動アップロードの作業報告'
massage = u'次のファイルをアップロードしました。\n'
massage += u'----------------------------------------\n'

# アップロード開始
for item in file_list:

	# タイムスタンプ生成
	dt_now = datetime.datetime.now()
	ts = dt_now.strftime('%Y/%m/%d %H:%M:%S')

	with open(local_path + item, 'rb') as f:
		# バイナリアップロード
		if '.jpg' in item or '.png' in item or '.gif' in item:
			ftp.storbinary('STOR ' + server_path + item, f)
		# テキストアップロード
		else:
			ftp.storlines('STOR ' + server_path + item, f)

	# ステータス表示
	print(ts + ' ' + server_path + item + ' をアップロードしました。')

	# お知らせメール送信内容
	massage += ts + u' ' + server_path + item + u' をアップロードしました。\n'

	# 遅延処理
	time.sleep(1)

massage += u'----------------------------------------\n'
sendToInfoMail(subject, massage)

こちらのコードでは、メールを送信するためのSMTPの設定が増えていますので、30〜35行目まではメールサーバーの設定を記述してください。

3.cronの設定について

最後にcronの設定についてです。楽をするためcronで更新したい時間にこのコードが動くように設定しましょう。

$ crontab -e

vimで入力していきます。「i」キー押下後、下記の記述を参考に記述してみてください。※ちなみに下記はMacの場合の記述例です。

0 0 * * * /usr/local/bin/python /Users/※あなたのアカウント/※フォルダ/upload.py 2>>/Users/※あなたのアカウント/※フォルダ/error.log

cronで実行する場合は、パスを全てフルパスにする必要があるのでその点は注意してください。コード内のパスも全てフルパスにする必要があります。

またこのcron設定では、冒頭が「0 0 * * *」ですので、0時0分にコードが実行されます。例えば、2時30分に更新したい場合は、「30 2 * * *」となります。cronは他にも記述方法がありますので、詳細はググってみてください。

記述が終わったら「ZZ」で保存。下記コマンドで設定を確かめてみてください。

$ crontab -l

4.まとめ

今回はPythonでFTPを使いファイルをアップロードする方法を扱いました。基本的な記述はシンプルなので、たったこれだけでファイル転送できるのか!と思うかもしれません。Pythonはシンプルにコードが書けるのでいいですね。ちなみに、今回はFTPについて扱いましたが、最近はセキュリティー上の問題からSFTPが増えていますよね。SFTPによるファイル転送については、また別の機会に記事にしようかと思っています。