もしもドロップシッピングでいろいろ検証してみるブログ
Amebaでブログを始めよう!

「もしも」表記の自動修正スクリプト

1月ももう終わります。

「もしも」表記の修正はお済みでしょうか?


静的ページの多いショップさんは大変だと思います。


そこで・・・


「もしも」表記自動修正スクリプト


を作りました。


もちろん「もしも」だけでなく任意の文字列をお好きなように一括して変更できます。


【システム要件】
PHP5以上が使えるレンタルサーバ(今のメジャーなレンタルサーバは大抵使えると思います。)

【使い方】
1.下記「ダウンロード!」からzipファイルをダウンロードして解凍してください。

2.出てきた「rewrite.php」ファイルをお使いのレンタルサーバのドキュメントルートにアップしてください。

3.http://アドレス/rewrite.phpにアクセスしてください。

4.あとは画面の指示に従ってください。


※修正するファイルとファイルのあるディレクトリのパーミッションを書き換え可能に変更しておいてください。

例)ディレクトリ⇒755又は705 ファイル⇒646又は606

※文字コードの設定を間違えると文字化けするので間違わないように注意してください。(設定画面に確認の方法を書いています。)

※必ず最初にテストフォルダ、テストファイルを作って文字化けしないか?どのように置き換わるか?試して下さい。

※自己責任で実行してね

※変更が終わったらパーミッションを元に戻すのを忘れないでください。

※終わったら絶対に"rewrite.php"をサーバから削除してください!悪用されたら大変です!



ソースはこんな感じです。


rewrite.php(コピペする場合はEUC-JPで保存してください)

<?php

session_start();

if (isset($_GET['charset']) && $_GET['charset'] == "clear"){
	
	$_SESSION = array();
	session_destroy();
}

if (isset($_POST['set']) && $_POST['set'] == "設定"){
	
	$_SESSION['charset'] = $_POST['charset'];
}

$html1 = <<<HTML1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<title>もしも表記修正-文字コード設定</title>
<style type="text/css">
<!--
b {
	color : #A30003;
}
-->
</style>
</head>
<body>
<p>【もしも表記修正-文字コード設定】</p>
<p>修正するファイルの文字コードを選択してください。<br />初期値でお使いのレンタルサーバのPHP内部エンコーディングの文字コードにチェックが入っています。</p>
<p>わからなければ<a href="http://validator.w3.org/" target="_blank">ココ</a>でサイトのアドレス(http://~)を入力すれば、結果表の3行目の"Encoding"のところに表示されます</p>
<form action="{$_SERVER["PHP_SELF"]}" method="post">

HTML1;

$html2 = <<<HTML2
<input type="submit" name="set" value="設定">
</form>
</body>
</html>

HTML2;

if (!isset($_SESSION['charset'])){
	
	echo $html1;
	
	$charset = mb_internal_encoding();
	$chars = array("JIS","SJIS","EUC-JP","UTF-8"); 
	
	foreach ($chars as $char){
		
		echo "<input type=\"radio\" name=\"charset\" value=\"{$char}\" ";
		
		if ($char == $charset){
			
			echo "checked=\"checked\"";
		}
		echo ">";
		
		if ($char == "SJIS"){
			
			echo "SJIS(SHIFT_JIS)<br />\n";
		}
		else{echo "{$char}<br />\n";}
	}
	
	if (!in_array($charset,$chars)){
		
		echo  "<input type=\"radio\" name=\"charset\" value=\"{$charset}\" checked=\"checked\">{$charset}<br />\n";
	}
	
	echo $html2;
}

if (isset($_SESSION['charset'])){
	
	ini_set ("default_charset",$_SESSION['charset']);
	ini_set ("mbstring.http_input",$_SESSION['charset']);
	ini_set ("mbstring.http_output",$_SESSION['charset']);
	ini_set ("mbstring.internal_encoding",$_SESSION['charset']);

$html3 = <<<HTML3
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset={$_SESSION['charset']}">
<title>もしも表記修正</title>
</head>
<style type="text/css">
<!--
b {
	color : #A30003;
}
-->
</style>
<body>

HTML3;

$html4 = <<<HTML4
<p>【もしも表記修正-設定】</p>
<p><b>文字コードは {$_SESSION['charset']} に設定されています。</b><br />文字コードを変更する場合は<a href="{$_SERVER["PHP_SELF"]}?charset=clear"}>⇒コチラ</a></p>
<hr />
<form action="{$_SERVER["PHP_SELF"]}" method="post">
<p><strong>1.すべてのファイルに適用する場合はドキュメントルートをフルパスで、<br />
  適用するフォルダを限定する場合はそのフォルダまでのパスをフルパスで入力してください</strong></p>
<p>  大抵、お使いのレンタルサーバのユーザ専用ページで確認できます。<br />  わからない場合はレンタルサーバの運営会社に問い合わせてください<br />
<p>  <b>末尾に"/"(スラッシュ)を付けないでください。</b></p>
<p>例)ロリポップ:ホームページアドレスが「http://xxx.yyy.jp」の場合<br />  → /home/sites/lolipop.jp/users/yyy.jp-xxx/web</p>

<input type="text" name="docroot" size="50">
<hr />
<p><strong>2.ドキュメントルート以下の修正するファイルが入っていないフォルダを","(カンマ)区切りでフルパスで入力してください</strong><br />  入力しなくても動きますが、余計なファイルが誤って修正されるのを防ぐためにもできるだけ入力してください。</p>
<p>  <b>改行を入れないでください。<br />  末尾に"/"(スラッシュ)を付けないでください。</b></p>
<p>例)/home/sites/lolipop.jp/users/yyy.jp-xxx/web/image,/home/sites/lolipop.jp/users/yyy.jp-xxx/web/cgi,/home/sites/lolipop.jp/users/yyy.jp-xxx/web/conf</p>
<textarea name="exception" rows="6" cols="40"></textarea>
<hr />
<p><strong>3.置き換える文字列を入力してください</strong></p>
<p>例)もしもショップ</p>
<input type="text" name="strfrom" size="50">
<hr />
<p><strong>4.置き換え後の文字列を入力してください</strong></strong></p>
<p>例)まさかショップ</p>
<input type="text" name="strto" size="50">
<hr />
<p><strong>5.修正するファイルの拡張子を","(カンマ)区切りで入力してください</strong><br />  通常はこのままでいいと思います。</p>
<p>例)html,htm,txt,tpl,conf,ini</p>
<input type="text" name="extension" size="50" value="html,htm">
<hr />
<p><b>※文字コードは {$_SESSION['charset']} で間違いないですか?<br />
※ディレクトリとファイルのパーミッションは変更してますか?</b><br />
例)ディレクトリ⇒755又は705 ファイル⇒646又は606<br />
<b>※必ず最初にテストフォルダ、テストファイルを作って文字化けしないか?どのように置き換わるか?試して下さい。<br />
※自己責任で実行してください</b></p>
<input type="submit" name="rewrite" value="修正">
</form>
</body>
</html>

HTML4;

$html5 = <<<HTML5
<p><b>変更したファイルやディレクトリのパーミッションを必ず元に戻して下さい。</b></p>
<p><a href="{$_SERVER["PHP_SELF"]}?charset=clear"}>戻る</a></p>
</body>
</html>

HTML5;

	$html3 = mb_convert_encoding($html3,$_SESSION['charset'],"EUC-JP");
	$html4 = mb_convert_encoding($html4,$_SESSION['charset'],"EUC-JP");
	$html5 = mb_convert_encoding($html5,$_SESSION['charset'],"EUC-JP");
	
	echo $html3;
	
	if (isset($_POST['rewrite'])){
		
		$docRoot	= $_POST['docroot'];
		$exception	= explode(",",$_POST['exception']);
		$strFrom	= $_POST['strfrom'];
		$strTo		= $_POST['strto'];
		$extension	= explode(",",$_POST['extension']);
		
		function MoshimoReplace($docRoot){
			
			if (!in_array($docRoot,$GLOBALS['exception'])){
				
				$dir = scandir($docRoot);
				
				foreach ($dir as $file){
					
					set_time_limit(30);
					
					if ($file != "." && $file != ".."){
						
						$filePath = "{$docRoot}/{$file}";
						
						if (is_dir($filePath)){
							
							MoshimoReplace($filePath);
						}
						elseif (in_array(pathinfo($filePath,PATHINFO_EXTENSION),$GLOBALS['extension'])){
							
							$str = file_get_contents($filePath);
							$str = str_replace($GLOBALS['strFrom'],$GLOBALS['strTo'],$str);
							
							if(file_put_contents($filePath,$str)){
								
								echo "<p>{$filePath} : OK</p>\n";
							}
						}
					}
				}
				ob_flush();
				flush();
			}
		}
		
		MoshimoReplace($docRoot);
		
		echo $html5;
	}
	else{
		
		echo $html4;
	}
}
?>

私のお店

「入荷お知らせメール」スクリプト

少し前に、ショップページに「入荷お知らせメール」の機能を付けました。

利用者、いまのところナシ・・・(泣)

まあ、アクセスが少ないから・・・(泣)

G様にも嫌われてるみたいだし・・・(泣)


お客さんにとっても、ショップにとっても良い機能だと思うんだけどなぁ~


もしもAPIには登録しません。しょぼいので。

でも、興味のある人がいれば使ってやってください。


システム要件:PHP5以上、MySQL5以上、できればcronが使えた方が便利

MySQLにテーブル"rMail"を作ってください。
カラムは↓こんなかんじで
Statusは0=未送信、1=送信済み、9=送信失敗になります。デフォルトはもちろん0で。

rMailId(int primarykey auto_increment) MailAddress(varchar(50)) ArticleId(int) regDate(datetime) Status(tinyint(1))

訂正しました
商品マスタテーブルは作ってない方も多いと思うので、なくてもできるようにしました。

まずはMySQLにメールアドレスと商品IDを登録する関数です。

reg.php

<?php
//メールアドレスと商品IDを受け取ってrMailRegistに渡して下さい。
//既に登録されていれば"duplicate"を返します。
//メールアドレスの形式が間違っていたりスペースだけだと"mistake"をかえします。
//メールアドレスの入力がないと"noinput"を返します。
//登録が成功すれば"succeed"を返します。

function rMailRegist($mailaddress="",$id){
	
	if ($mailaddress != ""){
		
		$mailaddress = trim($mailaddress);
		$mailaddress = trim($mailaddress," ");
		$mailaddress = htmlspecialchars($mailaddress);
		
		if (is_mail($mailaddress)){//is_mailはメールアドレスのチェックです。下記参照
			
			if ($con = mysql_connect("ホスト名","ユーザID","パスワード")){
				
				if (!mysql_select_db("データベース名", $con)){
					
					die ("Select Database Failed");
				}
			}
			else{
				
				die ("Connect Database Failed");
			}
			
			$sql = "select rMailId from rMail where MailAddress = '{$mailaddress}' and ArticleId = '{$articleid}'";
			$result = mysql_query($sql,$con);
			
			if (mysql_num_rows($result) != 0){
				
				return "duplicate";
			}
			
			else{
				
				$today = date("Y-m-d H:i:s");
				$sql = "insert into rMail values(null,'{$mailaddress}','{$id}','{$today}','0')";
				mysql_query($sql,$con);
				
				return "succeed";
			}
			
			mysql_close($con);
		}
		
		else{
			
			 return "mistake";
		}
	}
	
	else{
		
		return "noinput";
	}
}

//メールアドレスを正規表現でチェックする関数です
//50文字の制限をつけています
function is_mail($mailaddress){
	
	if (preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $mailaddress) && strlen($mailaddress) <= 50){
		
	    return TRUE;
	}
	else{
		
		return FALSE;
	}
}
?>

次はお知らせメールのテンプレートです

rMailTemp.php

<?php
//BODYからBODYの間は自由に編集してください
//()で括ってあるところはお店独自の名前やアドレスになります。
// {$ }の部分は自動で入力されます

$rmail_body = <<< BODY
■□■━━━━━━━━━━━━━━━━━━━━□■□

♪♪入荷お知らせメール♪♪

(お店の名前)
{$articleData["Name"]}
(http://お店のアドレス)

■□■━━━━━━━━━━━━━━━━━━━━□■□


{$address} 様

ご登録いただいておりました商品が入荷しましたのでご連絡申し上げます。

☆★☆商品ページはコチラ☆★☆
(http://商品ページのアドレス もしもの商品IDを使う場合は{$id}としてください。)

【商品名】
 {$articleData["Name"]}
  
【販売価格】
 {$price}円(税込)
  
【送料】
 {$shipping}//通常は525円と表示されます、送料無料または8,000円以上の商品は送料無料!と表示されます。
  
【発送目安】
 {$dod}

☆★☆商品ページはコチラ☆★☆
(http://商品ページのアドレス もしもの商品IDを使う場合は{$id}としてください。)


◆「入荷お知らせメール」の登録は予約ではございません。
 ご購入をご希望の場合は商品ページからご購入ください。

◆「価格」「送料」「発送目安」は「入荷お知らせメール」登録時と異なる場合がございますのでご了承ください。

◆【現品限り】の商品、希少商品、人気商品につきましては、入荷後すぐに完売となる場合もございます。
 「入荷お知らせメール」をお受け取り後でも、「在庫なし」となってしまう場合もございますのでご了承ください。

今後とも(お店の名前)をよろしくお願い致します。

■□■━━━━━━━━━━━━━━━━━━━━━━━━━━━□■□

(お店の名前)
(http://お店のアドレス)

【サイト内の情報、表記、その他サイトに関するお問合わせ】
(お店のメールアドレス)

【商品の品質、決済、商品配送、お客様対応など、
お買物についてのお問合せ】
☆サポートデスク
https://secure.moshimo.com/mp/www/inquiry/shopping?shop_id=(ショップID)

■□■━━━━━━━━━━━━━━━━━━━━━━━━━━━□■□

BODY;
?>

最後に、お知らせメールを配信するスクリプトです。
cronで実行させると手間いらずです。

sendRmail.php

<?php
if ($con = mysql_connect("ホスト名","ユーザID","パスワード")){
	
	if (!mysql_select_db("データベース名", $con)){
		
		die ("Select Database Failed");
	}
}
else{
	
	die ("Connect Database Failed");
}

$sql = "select rMailId,MailAddress,ArticleId from rMail where Status = '0'";
$result = mysql_query($sql,$con);
$num_rows = mysql_num_rows($result);

if ($num_rows != 0){
	
	//メール基本設定
	//下2か所の"UTF-8"の部分はご利用のサーバのPHPの設定によって異なります。
	//内部エンコーディングに使用されている文字コードに変えてください。やっぱりEUC-JPが多いのかな?
	mb_language("japanese");
	mb_internal_encoding("UTF-8");
	//「差出人」の欄に表示される部分です
	$from = mb_encode_mimeheader(mb_convert_encoding("お店の名前","JIS","UTF-8"))."<お店のメールアドレス>";
	//「件名」の欄に表示される部分です。
	$subject = "入荷お知らせメール(お店の名前)";
	
	$articleid = array();
	$dataset = array();
	while ($articleDatas = mysql_fetch_array($result)){
		
		$articleid[] = $articleDatas['ArticleId'];
		$dataset[$articleDatas['rMailId']] = array($articleDatas['MailAddress'] => $articleDatas['ArticleId']);
	}
	
	$articleid = array_unique($articleid);
	
	foreach ($articleid as $id){
		
		$articleData = GetArticle($id);//GetArticleはもしもAPIから商品のデータを取得する関数です。下記参照。
		
		if ($articleData != "out" && $articleData["StockStatus"] > 0){
			
			//商品別設定
			if ($articleData["IsFreeShipping"] == "1"){
				
				$shipping = "送料無料!";
			}
			else{
				
				$shipping = "525円";
			}
			
			if ($articleData["PreorderPeriod"] != "" && $articleData["PreorderPeriod"] != null && $articleData["PreorderPeriod"] != "0"){
				
				$dod = "予約販売:{$articleData["PreorderPeriod"]}発送予定";
			}
			else{
				
				$dod = "{$articleData["DodFrom"]}~{$articleData["DodTo"]}営業日程度";
			}
			
			$price = number_format($articleData["ShopPrice"],0,".",",");
			
			foreach ($dataset as $rMailId => $checkedId){
				
				foreach ($checkedId as $address => $sendId){
					
					if ($sendId == $id){
					
						//ここでお知らせメールのテンプレートを読み込みます。//
						require ("rMailTemp.php");
						//////////////////////////////////////////////////////
						$body = $rmail_body;
						
						if (mb_send_mail($address,$subject,$body,"From:".$from)){
							
							//メール送信に成功したらrMailテーブルの'Status'を'1(送信済み)'にします。
							$upSql = "update rMail set Status = '1' where rMailId = '{$rMailId}'";
						}
						else{
							
							//メール送信に失敗したらrMailテーブルの'Status'を'9(失敗)'にします。
							$upSql = "update rMail set Status = '9' where rMailId = '{$rMailId}'";
						}
						
						mysql_query($upSql,$con);
					}
				}
			}
		}
	}
}

mysql_close($con);


//もしもAPIのでーた取得用関数
//「もしもAPI認証コード」のところは取得されている認証コードを入れてください。
//もしもの商品IDを渡すと"Name","IsFreeShipping","DodFrom","DodTo","PreorderPeriod","ShopPrice","StockStatus"
//をキーにしてそれぞれの値を配列で返します。
//取扱終了になっている場合は文字列"out"を返します。
function GetArticle($articleid){
	
	//もしもAPI認証コード
	$moshimoAuthCode = "もしもAPI認証コード";
	
	//削除する制御コード
	$controlCode = array(	"\x00", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08", "\x09",
							"\x0a", "\x0b", "\x0c", "\x0d", "\x0e", "\x0f", 
							"\x10", "\x11", "\x12", "\x13", "\x14", "\x15", "\x16", "\x17", "\x18", "\x19",
							"\x1a", "\x1b", "\x1c", "\x1d", "\x1e", "\x1f"
						);
	$URL = "http://api.moshimo.com/article/search?authorization_code={$moshimoAuthCode}&article_id={$articleid}";
	$s = @file_get_contents($URL);
	$s = @str_replace($controlCode, '', $s);
	$xml = @new SimpleXMLElement($s);
	$found = $xml->xpath('/ArticleSearch/Found');
	$found = $found[0];
	
	
	if ($found != "0"){
		
		$value = $xml->xpath('/ArticleSearch/Articles/Article/Name');
		$value = $value[0];
		settype($value,"string");
		$article["Name"] = $value;
		
		$value = $xml->xpath('/ArticleSearch/Articles/Article/IsFreeShipping');
		$value = $value[0];
		settype($value,"string");
		$article["IsFreeShipping"] = $value;
		
		$value = $xml->xpath('/ArticleSearch/Articles/Article/DodFrom');
		$value = $value[0];
		settype($value,"string");
		$article["DodFrom"] = $value;
		
		$value = $xml->xpath('/ArticleSearch/Articles/Article/DodTo');
		$value = $value[0];
		settype($value,"string");
		$article["DodTo"] = $value;
		
		$value = $xml->xpath('/ArticleSearch/Articles/Article/PreorderPeriod');
		$value = $value[0];
		settype($value,"string");
		$article["PreorderPeriod"] = $value;
		
		$value = $xml->xpath('/ArticleSearch/Articles/Article/ShopPrice');
		$value = $value[0];
		settype($value,"string");
		$article["ShopPrice"] = $value;
		
		$value = $xml->xpath('/ArticleSearch/Articles/Article/StockStatus');
		$value = $value[0];
		settype($value,"string");
		$article["StockStatus"] = $value;
		
		return $article;
	}
	
	elseif ($found == "0"){
		
		return "out";
	}
}
?>

以上でーす。

不具合があったら教えてくださいな。



こんな感じで使ってます↓

「素材あり」の商品の素材をまとめてサーバに保存

「素材あり」の商品の素材は、zipでもしものサイトにおいてあります。

まとめてサーバに移して解凍しようと思ったら・・・レンタルサーバのPHPの設定ではhttps通信がザポートされていないためボツ・・・


しょうがないので、販売ページのHTMLから素材のURLを抜いてサーバ側で保存することにしました。


もしもAPIではHasMaterialの指定ができないので、MySQLサーバにデータを移しています。


シンプルなスクリプトですが、30分くらいはかかるので、念のため夜中に実行しました(ドキドキ・・・)

$msql = new MySQL(); //MySQL関連のクラスです

$category = array("01","02","03","04","05","06","07","08","09","10");
$baseImgURL = "http://www.moshimo.com/images";

//もしもの商品ページのHTML内で"/pr_page/商品コード/画像ファイル"にマッチする正規表現です
//"spacer.gif"とかは不要なので除外するパターンにします
$pattern = "/pr_page\/[0-9]+\/[A-Za-z0-9_\-]+(\.gif|\.jpg|\.jpeg|\.png|\.GIF|\.JPG|\.JPEG|\.PNG)/";
$exPattern = "/pr_page\/[0-9]+\/spacer(\.gif|\.jpg|\.jpeg|\.png|\.GIF|\.JPG|\.JPEG|\.PNG)/";
//

foreach ($category as $pccode){

	$spImgFolder = "ドキュメントルート/image/special/{$pccode}";
	
	if (!is_dir($spImgFolder)){
		
		mkdir ($spImgFolder); 
	}
	
	$msql->m_sql = "select ArticleId from 商品マスタテーブル where ParentCategoryCode = '{$pccode}' and HasMaterial = '1'";
	$msql->query($msql->m_sql);
	
	while ($rows = $msql->fetch_array()){
		
		set_time_limit(60); //画像取得に時間がかかるかもしれないので念のため・・・
		
		$dir = "{$spImgFolder}/{$rows["ArticleId"]}";
		
		if (is_dir($dir)){
			
			unlinkRecursive($dir,TRUE); //フォルダ内全削除の関数 下記参照
		}
		mkdir($dir);
		
		$pageURL = "http://www.moshimo.com/article/ショップID/{$rows["ArticleId"]}";
		$str = @file_get_contents($pageURL);
		
		if (preg_match_all($pattern,$str,$match)){
		
			$i = 0;
			foreach ($match[0] as $imgFile){
			
				if (preg_match($exPattern,$imgFile)){
					
					continue;
				}
				else{
					
					$imgURL = "{$baseImgURL}/{$imgFile}";
					$extension = pathinfo($imgURL,PATHINFO_EXTENSION);
					$filename = $dir."/".$i.".".$extension;
					$img_str = @file_get_contents($imgURL);
					
					@file_put_contents($filename,$img_str);
					
					$i ++;
				}
			}
		}
	}
}

/* -- フォルダ内全削除用($deleteRootToo=TRUEで親フォルダも削除) -- */

function unlinkRecursive($dir, $deleteRootToo){ 

	if (!$dh = @opendir($dir)) { 
		
		return; 
	} 
	
	while (false !== ($obj = readdir($dh))){ 
		
		if ($obj == '.' || $obj == '..'){
			
			continue;
		} 
		
		if (!@unlink($dir. '/' . $obj)){
			
			unlinkRecursive($dir.'/'.$obj, true);
		}
	}
	
	closedir($dh); 
	
	if ($deleteRootToo) { 
		
		@rmdir($dir);
	}
	
	return;
}

unlinkRecursive
引用:PHP Manual-Jon Hassall


次は素材ありの商品ページを生成しよう

もしもドロップシッピングやってマス

はじめまして。もしやまです。


もしもDSを利用したサイト作りのあれやこれや書いていきます。