管理系の操作を自動化する方法

基幹系で管理している在庫情報をEC-CUBEに反映させたい場合、いろんな手段があると思います。手法として考えられるのは①WEBサービス、②DB直結、③ファイルで連携といった感じでしょうか。
理想的には①がよいと思います。EC-CUBE側にWEBサービスを立てて基幹系側から利用すれば、いろんなことが思い通りになりそうです。ただし、これには基幹系にも結構な改造が入りますね。
思い通りになるという意味では②のDBを直接共有してしまうような方法もありますが、そのための環境を準備する必要があります。また、基幹系とEC-CUBEの依存度が高くなりますし、問題があったときの切り分けも難しくなるので、やりたくないと思うケースが多いと思います。
③はいちばん簡単な解決策であることが多いと思います。そもそもEC-CUBEには汎用的なファイルアップロード機能があります。基幹系の通常機能で出力できるCSVなどをアップロードして後でサーバ側でバッチ処理で動く在庫反映プログラムを書いておけば、比較的簡単に実装できそうですね。
それでしばしば③のような方法を用いることになると思うのですが、そのとき話題になるのが、毎日のファイル連携を手動でやるのは面倒だし、操作ミスの元なので、なんとか自動化できないか、ということです。
そこで、前置きが長くなっちゃいましたが、EC-CUBEの管理系にログインしてファイルのアップロードやダウンロードを行うというルーチンワークを自動化する方法について書いてみようと思います。
ActivePerlのインストール
簡単に言えば、そういうルーチンワークを自動化できるマクロみたいなものがあればよいわけです。そのマクロとして多少は馴染みのあるPerlを利用してみたいと思います。
まず、Windows環境でPerlを実行するためにActivePerlを入手します。
http://www.activestate.com/activeperl/
ダウンロードしたWindows用のインストーラ「ActivePerl-*.msi」でインストールすれば環境変数等もセットしてくれています。なお、作ったスクリプトをEXE化したりもできますので、お客様のところにはActivePerlのインストールをしなくてもいけます。
Perlを書く
それから以下のようなスクリプトを書きます。
fileupload_to_eccube.pl

use strict;
use warnings;
use WWW::Mechanize;
use Data::Dumper;
$Data::Dumper::Indent = 1;

# ##############################################################################
# アプリケーション設定
# (環境に合わせて変更して下さい)
# ##############################################################################
my %conf =
(
# アップロードするファイルのフルパス
'upload_file' => 'C:\hoge\data.txt',

# ■ログファイル関連
'LOG' =>
{
# ログ出力ディレクトリ(最後に\は付けない事)
'dir' => 'C:\hoge\log',

# ログファイル名のプリフィックス
'file_prefix' => 'log',
},

# ■BASIC認証
'BASIC-AUTH' =>
{
# 領域(BASIC認証の画面に表示される)
'realm' => 'Please enter your ID and password',

# BASIC認証のユーザーID
'user' => 'hoge_user',

# BASIC認証のパスワード
'passwd' => 'hogehoge',
},

# ■EC-CUBE関連
'EC-CUBE' =>
{
# ログインID
'user' => 'ec-cube-admin',

# ログインパスワード
'passwd' => 'hogehoge',

# ログイン成功時(メニュー画面)のHTMLに含まれる文字列
'login_success_message' => 'WELCOME',

# アップロードが成功した場合のHTMLに含まれる文字列
'upload_success_message' => '\[Upload S\]',
},

# ■URL
'URL' =>
{
# EC-CUBEログイン画面のURL
'login' => 'https://www.hoge.com/hoge/shop/admin/',

# EC-CUBEアップロード画面のURL
'upload' => 'https://www.hoge.com/hoge/shop/admin/contents/file_manager.php',
},
);

# ##############################################################################
# 汎用関数
# ##############################################################################

# *****************************
# メッセージを出力します
# *****************************
sub message
{
# print @_;
# print "\n";
&writeLog(@_);
}

# *****************************
# メッセージを出力し、処理を終了します
# *****************************
sub abort
{
&message('PROCESS ABORT !!!!!');
&message(@_);
exit 8;
}

# *****************************
# ログファイルを出力します
# *****************************
sub writeLog
{
my (@messages) = @_;

my @date = localtime();
my $string = sprintf(
"%04d/%02d/%02d %02d:%02d:%02d [%05d] ",
$date[5] + 1900, $date[4] + 1, $date[3], $date[2], $date[1], $date[0], $$
);

foreach my $str (@messages) {
$string .= $str . "\n";
}

my $tmp = $conf{'LOG'}->{'dir'} . '\\' . $conf{'LOG'}->{'file_prefix'};

# 1年毎にファイルを分ける
my $file_name = sprintf("%s_%04d", $tmp, $date[5] + 1900);

# 1日毎にファイルを分けたい場合
# $file_name .= sprintf("_%02d%02d", $date[4] + 1, $date[3]);

if (!open(FP_LOG, ">>$file_name")) {
print "Error: open($file_name) - $!\n";
return;
}
flock(FP_LOG, 2);
print FP_LOG $string;
close(FP_LOG);
}

# ##############################################################################
# 処理
# ##############################################################################

# *****************************
# BASIC認証用情報をセットします
# *****************************
sub set_basic_authenticate
{
my ($mech) = @_;

my $u = URI->new( $conf{'URL'}->{'login'} );
&message('[Basic Authenticate]Domain:Port=' . $u->host_port);

$mech->credentials(
$u->host_port,
$conf{'BASIC-AUTH'}->{'realm'},
$conf{'BASIC-AUTH'}->{'user'},
$conf{'BASIC-AUTH'}->{'passwd'}
);
}

# *****************************
# ログインします
# *****************************
sub login
{
my $fname = 'login';
my ($mech) = @_;

# ログインページ取得
{
my $response = $mech->get( $conf{'URL'}->{'login'} );
&abort("[$fname] line:" . __LINE__ . "\n" . Dumper($response)) unless ($mech->success);
}

# ログイン情報送信
{
my $response = $mech->submit_form(
form_name=>'form1',
fields => {
login_id => $conf{'EC-CUBE'}->{'user'},
password => $conf{'EC-CUBE'}->{'passwd'},
},
);

&abort("[$fname] line:" . __LINE__ . "\n" . Dumper($response)) unless ($mech->success);
}

# ログイン情報送信後の画面のメッセージをチェック
my $result_html = $mech->content();
if( $result_html =~ $conf{'EC-CUBE'}->{'login_success_message'} ){
&message('EC-CUBE login success!');
}else{
&abort("[$fname] line:" . __LINE__ . "\n" . "EC-CUBE login failed...\n" . $result_html);
}
}

# *****************************
#ファイルをアップロードします
# *****************************
sub upload
{
my $fname = 'upload';
my ($mech) = @_;

# アップロード用のページを取得
{
my $response = $mech->get( $conf{'URL'}->{'upload'} );

&abort("[$fname] line:" . __LINE__ . "\n" . Dumper($response)) unless ($mech->success);
}

# ファイルを送信
{
my $response = $mech->submit_form(
form_name=>'form1',
fields => {
r_c_file => $conf{'upload_file'},
mode => 'r_c',
},
);

&abort("[$fname] line:" . __LINE__ . "\n" . Dumper($response)) unless ($mech->success);
}

# ファイル送信後の画面のメッセージをチェック
my $result_html = $mech->content();
if( $result_html =~ $conf{'EC-CUBE'}->{'upload_success_message'} ){
&message('file upload success!');
}else{
&abort("[$fname] line:" . __LINE__ . "\n" . "file upload failed...\n" . $result_html);
}
}

# *****************************
# メインの処理です
# *****************************
sub main
{
# Webブラウザオブジェクトを作成
my $mech = WWW::Mechanize->new();

# BASIC認証情報をセット
&set_basic_authenticate($mech);

# EC-CUBEにログイン
&login($mech);

# ファイルをアップロード
&upload($mech);
}

# メイン処理を呼び出す
&main();


この例はファイル管理画面でファイルをアップロードするという操作です。アップロード後に何かのPHPをキックする、もしくはcronでアップロードしたファイルを処理するようにするといった処理を作れば一連の処理が自動化できます。ダウンロードにも応用はできると思います。
(3)タスクスケジューラに仕込む
まずは.batファイルを作ります。以下のような感じです。
auto_upload.bat
@echo off

REM EC-CUBE顧客入力ファイルアップロードモジュールを
REM 起動するためのバッチファイルです
echo EC-CUBE顧客入力ファイルアップロードモジュールを実行しています...
REM 環境に合わせて、モジュールのフルパスを記述して下さい
perl C:\hoge\perl\fileupload_to_eccube.pl

このバッチファイルをコントロールパネル→タスク→スケジュールされたタスクの追加でセットしておきます。基幹系からのデータ出力も自動的に行えるようにしておけば、基幹系→EC-CUBEの連携をPC経由で自動化できます。コストをかけずに連携したい場合には参考にしてみてください。plファイルの中にパスワードを平文で書いちゃってますので、仕込むPCのセキュリティには十分ご注意ください。