SQLの窓

2015年05月18日

コマンドプロンプトから Windows PHP を使って POST 投稿する

PHP のインターネットアクセスは、FTP や API や、もろもろ細かい全ての設定の可能な cURL 関数を使用するのが通常です。

この処理は、一般の WEB フォームで使用する事はできません。一般の WEB フォームでは入力者を特定する為のいろいろな内部処理があるのでこのような単純な処理では扱えませんが、自分の管理するシステム内で http を経由してデータを受け渡しするのであれば、これで十分運用できます。あとは、ログとして結果をメールでどこかに送っておけばいいと思います。

localhostに 以下のアプリを登録して確認しました。

PHP による『超簡易掲示板』 / アプリケーションからの POST 検証用

PHP は、http://jp.php.net/downloads.php から Windows バイナリの最新バージョンをダウンロードしてコマンドプロンプトのカレントディレクトリに解凍し、そのフォルダ名を php としています( c:\php )。

php.ini は、php.ini-development の -development を省いてリネームして使用します。
( development は『開発』という意味です )

php.ini の 
extension_dir = "ext"
extension=php_curl.dll
extension=php_mbstring.dll

は手作業で設定して、以下のバッチファイルを起動します。
@echo off
setlocal
set path=c:\php;%PATH%

php test.php "アップロードする\n文 字 列\nの指定"

endlocal


Windows のコマンドプロンプトは SHIFT_JIS なので、インターネット側のキャラクタセットに合わせて変換する必要があります。PHP の内部コードは UTF-8 で設定するのが無難ですが、EUC-JP でも構いません( SHIFT_JIS は内部コードとして使用できない )

このサンプルでは、http でアクセスしていますが、https にアクセスする場合は、以下の二行を13行目に追加して下さい

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
※ FALSE を設定すると、cURL はサーバー証明書の検証を行いません。
※ cURL 7.10 以降、デフォルト値は TRUE なので、false に明示的に設定する必要があります。

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
※ CURLOPT_SSL_VERIFYHOST は、デフォルトで 2 です。
※ 1 は、cURL 7.28.1 以降では使えなくなりました。

test.php の内容
<?php

$url = "http://localhost/basic/log/log.php";

mb_language( "ja" );
mb_internal_encoding("UTF-8");

$data["text"] = str_replace( "\\n", "\n", $argv[1] );
$data["text"] = mb_convert_encoding( $data["text"], "UTF-8", "CP932" );
$data["send"] = "送信";
// ▼ 連想配列を URL エンコードされたクエリ文字列に変換します
$post_data = http_build_query( $data );

$curl = curl_init();

// ▼ 接続の試行を待ち続ける秒数。0 だと永遠に待ちます。
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
// ▼ TRUE を設定すると、ヘッダの内容も出力します(通常は必要無いので)。
curl_setopt($curl, CURLOPT_HEADER, false);
// ▼ 結果を直接出力しないで、引数として戻します
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// ▼ PHP 5.1.3 以降では、CURLOPT_BINARYTRANSFER は効果ありません。
curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);

curl_setopt($curl, CURLOPT_URL, $url );
// ▼ TRUE を設定すると、HTTP POST を行います。
// POST は、 application/x-www-form-urlencoded 形式で 行われます。
// これは一般的な HTML のフォームと同じ形式です。
// CURLOPT_POSTFIELDS で文字列をセットする場合は、自動的に
// application/x-www-form-urlencoded になります
curl_setopt($curl, CURLOPT_POST, true);
// 連想配列を渡すと、データを multipart/form-data でエンコードするので注意
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data );

$result = curl_exec($curl);
curl_close($curl);

?>

test.php には引数が渡せるので、ごく自然にスクリプトとして利用する事ができます

関連する記事

Windows 標準の CDO.Message で簡単にバッチ処理からメールを送る
役に立つコマンドプロンプト



posted by at 2015-05-18 13:24 | 役に立つWindows | このブログの読者になる | 更新情報をチェックする

2013年01月07日

Basp21 を使ってバッチ処理からメールを送る

Basp21 は古くからある動作のかなり信用できるメール処理アプリケーションで、インストール後、利用可能なプログラミング言語から呼び出します。一番簡単なのは、VBScript ですが、他にもいろいろあります。

ダウンロードは こちら からできますが、私は最新では無くいつも『BASP21-2003-0211.exe (1.44MB)』を使用しています。実際問題これで特に問題は出ないので、それより新しいのは特殊な事情の方のみが使うものです。

それと、これは重要なのですが、このアプリケーションは 32ビットOS 用なので、64ビット環境でそのまま使えない事がほとんどです。この場合ですと、cscript は、%systemroot%\syswow64\cscript と書き換える必要があります。ある程度知識のある方ならば、以下のドキュメントも参考になると思います。
( Windows8 で動作を確認しました / syswow64 の cscript )

64 ビット バージョンの Windows でシステム レジストリを表示する方法

▼ バッチファイル
------------------------------------------------------------
@echo off
cscript basp_mail.vbs "題 名" "本 文に\n送る\n内 容"
------------------------------------------------------------

basp_mail.vbs
strUser = "ユーザID"
strPass = "パスワード"

Set Basp21 = CreateObject( "Basp21" )

strServer = "SMTPサーバーアドレス"
nPort = 587

SMTPServer = strServer & ":" & nPort
MailTo = "あなたです <xxxxxxxx@xxxxx.com>"
' CC
MailTo = MailTo & vbTab & "cc" & vbTab & "アカウント1 <xxxxxx@xxxxxx.jp>"
' BCC
MailTo = MailTo & vbTab & "bcc" & vbTab & "YAHOOアカウント <xxxxxxxx@yahoo.co.jp>"

MailFrom = "私です <xxxx@xxxxxxx.ne.jp>"
MailFrom = MailFrom & vbTab & strUser & ":" & strPass

strSubject = Wscript.Arguments(0)
strTextbody = Replace( Wscript.Arguments(1), "\n", vbCrLf )


ErrMessage = Basp21.SendMail( _
	SMTPServer, _
	MailTo, _
	MailFrom, _
	strSubject, _
	strTextbody, _
	"" _
)

if ErrMessage <> "" then
	Wscript.Echo ErrMessage
else
	Wscript.Echo "メール送信が終了しました。"
end if

今回のテストで、SMTPサーバーは『さくらインターネット』のものを使用したのですが、GMail に何故か届かなかったです。

関連する記事

Windows 標準の CDO.Message で簡単にバッチ処理からメールを送る



タグ:VBScript Basp21
posted by at 2013-01-07 19:31 | 役に立つWindows | このブログの読者になる | 更新情報をチェックする

コマンドプロンプトから VBScript を使って POST 投稿する

コマンドプロンプトから Windows PHP を使って POST 投稿する』では、PHP を使いました。PHP のほうが関数等整理されてドキュメントも揃っているから扱いやすく、応用もしやすいです。
( Google Chrome 拡張 : PHP Docs )

VBScript は Windows 標準ですが、込み入った処理は全て自作する必要があるので、通常あまり利用されません。ここでは、特に SHIFT_JIS を UTF-8 に変換する必要があるので(さらにパーセントエンコーディングも必要)、以下のコードをそのまま使う必要があります。
Set objHTTP = Wscript.CreateObject("MSXML2.XMLHTTP")
Set Stream1 = Wscript.CreateObject("ADODB.Stream")
Set Stream2 = Wscript.CreateObject("ADODB.Stream")
Set StreamBin = Wscript.CreateObject("ADODB.Stream")

strTargetUrl = "http://winofsql.sakura.ne.jp/lightbox/work/web/log.php"

strData = Replace( Wscript.Arguments(0), "\n", vbCrLf )
strData = "send=ok&text=" & EUC_URLEncode(strData)

' False は非同期
Call objHTTP.Open("POST",strTargetUrl,False)
' 標準 POST 用
Call objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
' 仕様
Call objHTTP.SetRequestHeader("Content-Length",Len(strData))
' 送信
Call objHTTP.Send(strData)

' ***********************************************************
' SHIFT_JIS を UTF-8 に変換して URLエンコード
' ***********************************************************
Function EUC_URLEncode(str)

	Dim Buffer,LineBuffer,i,CWork

	Stream1.Open
	Stream1.Charset = "shift_jis"
	' shift_jis で入力文字を書き込む
	Stream1.WriteText str
	' コピーの為にデータポインタを先頭にセット
	Stream1.Position = 0
 
	Stream2.Open
	Stream2.Charset = "utf-8"
	' shift_jis を euc-jp に変換
	Stream1.CopyTo Stream2
	Stream1.Close

	' コピーの為にデータポインタを先頭にセット
	Stream2.Position = 0

	' バイナリで開く
	StreamBin.Open
 	StreamBin.Type = 1

	' テキストをバイナリに変換
	Stream2.CopyTo StreamBin
	Stream2.Close

	' 読み込みの為にデータポインタを先頭にセット
	StreamBin.Position = 0

	Buffer = ""
	StreamBin.Read(3)
	Do while not StreamBin.EOS
		LineBuffer = StreamBin.Read(16)
 
		For i = 1 to LenB( LineBuffer )
			CWork = MidB(LineBuffer,i,1)
			Cwork = AscB(Cwork)
			Cwork = Hex(Cwork)
			Cwork = Ucase(Cwork)
			if Len(Cwork) = 1 then
				Buffer = Buffer & "%0" & Cwork
			else
				Buffer = Buffer & "%" & Cwork
			end if
		Next
 
	Loop

	StreamBin.Close

	EUC_URLEncode = Buffer

End Function

このコードは、もともとは Twitter 投稿の為に作成したものですが、実際に日次のバッチ処理として運用しています。

更新された情報があった場合、夜間にインターネット上のサーバーの DB を更新する為の通信処理として使っています。

バッチファイル
@echo off
setlocal
set path=.\php;%PATH%
set myurl=http://xxxxx.sakura.ne.jp/lightbox/..../text.log

REM VBScript で投稿
cscript test.vbs "アップ ロードする\n文 字 列\nの指定"

REM 5秒間待機
timeout 5 /nobreak

REM 投稿後のログを PHP でダウンロード
php -r copy('%myurl%','text.log');

endlocal

このテストでは、バッチファイルで投稿後、ログを直接 PHP で取得しています。このコードでは、MSXML2.XMLHTTP というクライアント用のオブジェクトを使っているので、この投稿処理をループ内で使って連続処理を行う事もできます(サーバー用のオブジェクトである ServerXMLHTTP では連続処理はできません)。この何年かで、これらのオブジェクトは Microsoft によってこっそり更新されたりして振る舞いがいろいろ変ったりしていますが、ケースバイケースでどちらかを使わないと動かない場合があります。しかし、たいていにおいて クライアント側のオブドェクトで動作すると思います。

関連する記事

コマンドプロンプトから VBScript を使って POST 投稿する
PHP による『超簡易掲示板』 / アブリケーションからの POST 検証用
Windows 標準の CDO.Message で簡単にバッチ処理からメールを送る



タグ:VBScript
posted by at 2013-01-07 14:30 | 役に立つWindows | このブログの読者になる | 更新情報をチェックする

2013年01月05日

役に立つコマンドプロンプト

コマンドプロンプトを開く

1) ファイル名を指定して実行をメニューから選択できる場合
『cmd』 を実行


2) ファイル名を指定して実行をメニューから選択できない場合
CTRL+SHIFT+ESC でタスクマネージャを起動して、『ファイルメニュー』から『新しいタスクの実行』を選んで『cmd』 を実行




その他)
エクスプロラーの適当のフォルダを SHIFT キーを押してから右クリックして『コマンドウィンドウをここで開く』を選択




Windows のテンポラリフォルダへ移動

『cd %TEMP%』を実行

その場所で エクスプローラを開きたいのであれば、『explorer %TEMP%』を実行
( エクスプローラのコマンドライン オプション )

1) 適当なファイルを作成
C:\Users\lightbox\AppData\Local\Temp>type con > test.txt
12345
^Z

『type con > test.txt 』を実行すると、入力待ちになるので、適当になにか入力して最後に CTRL+Z を入力すると、適当に入力した内容の最後に改行が付加されたファイルになります。
( バイナリエディタ Stirling )

2) ファイルの存在を確認
dir とすると test.txt は一覧に表示されるはずです。

3) ファイルを隠しファイルにする
『ATTRIB +H test.txt』とすると、dir では表示されなくなります。エクスプローラから表示できる場合は、プロパティの表示で以下のようになります。



この状態でも、dir で表示するには、『dir /a』とします。

※ ファイルだけを表示
dir /a-d

※ フォルダだけを表示
dir /ad

4) 全てのファイル名をクリップボードにコピーする
『dir /a-d /b | clip』を実行します。

※ 『clip < test.txt』とすると、test.txt の内容がクリップボードにコピーされます。
( type test.txt | clip でも同じです )


環境変数の設定

rundll32.exe sysdm.cpl,EditEnvironmentVariables』を実行すると、ダイアログが表示されます(ユーザ毎とシステムにそれぞれ設定可能です)。
コマンドプロンプトで重要なのは、PATH 環境変数ですが、ディレクトリとディレクトリの間に ;(セミコロン) を記述するようになっているのが特徴です。また、多くのディレクトリが設定されている場合、一見して解りづらいのでバッチファイルでディレクトリ毎に表示する事が可能です。
@echo off
cmd /c echo Set ws=WScript.CreateObject("WScript.Shell"):Set wv=ws.Environment("SYSTEM"):pt=wv("PATH"):ad=Split(pt,";"):For I=0 To Ubound(ad):Wscript.echo ws.ExpandEnvironmentStrings(ad(I)):Next>%temp%\_.vbs&cscript.exe /NOLOGO %temp%\_.vbs
cmd /c echo Set ws=WScript.CreateObject("WScript.Shell"):Set wv=ws.Environment("USER"):pt=wv("PATH"):ad=Split(pt,";"):For I=0 To Ubound(ad):Wscript.echo ws.ExpandEnvironmentStrings(ad(I)):Next>%temp%\_.vbs&cscript.exe /NOLOGO %temp%\_.vbs
※ setx コマンドでも環境変数を設定する事ができます。
( ですが、管理しづらいと思うのでしないほうがいいと思います )


操作環境

1) prompt $G
デフォルトではカレントディレクトリが表示されるので、入力の邪魔になる事が多い。よって、この実行で > だけになる。現在のディレクトリが知りたい場合は cd と入力すれば良い。

2) title %CD%
一目で現在のディレクトリを確認できるようにしたい場合は、作業ディレクトリを変えるたびに実行する必要があるけれど( 実際問題ほとんど無い )、このように実行しておくとコマンドプロンプトウインドウのタイトルに表示される。

3) F7
あまり使い勝手は良く無いが、入力したコマンドの履歴をリストで表示・選択できる



関連する記事

コマンドプロンプトの規定値の設定とカスタマイズ
Windows 標準の CDO.Message で簡単にバッチ処理からメールを送る
コマンドプロンプトから Windows PHP を使って POST 投稿する

WSH : VBScript と JavaScript で Twitter に投稿する


posted by at 2013-01-05 20:08 | 役に立つWindows | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します


Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX