SQLの窓

2018年02月18日


VBscript(または JScript) で簡単にバイナリファイルをアップロードする

PHP 側も単純ですが、PHP のマニュアルに書いている場所は、少し見付けづらいかもしれません。

内容は PUT メソッドで始まっていますが、VBScript からは POST で問題ありません。実際の内容は、Apache 上で PUT メソッドを PHP でサポートするお話なので、重要なのは PHP での記述方法です。

put.php ( utf-8n )
<?PHP
header( "Content-Type: text/html; charset=utf-8" );

$id = uniqid();

$fp = fopen( "php://input", "rb" );
$wfp = fopen( "data/{$id}_upload.dat", "wb" );

while( $ret = fread( $fp, 4096 ) ) {

	fwrite( $wfp, $ret );

}

fclose($wfp);
fclose($fp);


?>
データが保存されました

この URL に対して、VBScript のコマンドは POST であろうが、PUT であろうがどちらでもかまいません。

open Method (ServerXMLHTTP/IServerXMLHTTPRequest)
' *************************************
' サーバーオブジェクトを使用しています
' *************************************
Set objHTTP = Wscript.CreateObject("Msxml2.ServerXMLHTTP")
lResolve = 60 * 1000
lConnect = 60 * 1000
lSend = 60 * 1000
lReceive = 60 * 1000

' Stream オブジェクト の作成
Set Stream = CreateObject("ADODB.Stream")
' Stream のオープン
Stream.Open
' Stream タイプの指定
Stream.Type = 1		' StreamTypeEnum の adTypeBinary
' 既存ファイルの内容を Stream に読み込む
Stream.LoadFromFile "target.png"

' ▼ ご自分の環境に書き換えてください。
Call objHTTP.Open("POST","https://yourdomain/test/put.php",False)

nLen = Stream.Size
data = Stream.Read(nLen)

Call objHTTP.SetRequestHeader("Content-Length",nLen)
Call objHTTP.SetTimeouts(lResolve, lConnect, lSend, lReceive)
Call objHTTP.Send(data)

Wscript.Echo objHTTP.responseText
 
' Stream を閉じる
Stream.Close

setRequestHeader Method 
setTimeouts Method
send Method 

Stream オブジェクト

※ Microsoft は VB を真剣にやめたいみたいですね

なので、以下には JScript で書いたソースコードです。JScript では、大文字、小文字が区別されるので、いろいろ注意する必要があります。

upload.js
// *************************************
// サーバーオブジェクトを使用しています
// *************************************
objHTTP = new ActiveXObject("Msxml2.ServerXMLHTTP")
lResolve = 60 * 1000
lConnect = 60 * 1000
lSend = 60 * 1000
lReceive = 60 * 1000

// *************************************
// バイナリファイル
// *************************************
Stream = new ActiveXObject("ADODB.Stream")
upload_file = "winofsql.png"

// *************************************
// アップロード先
// localhost(AN HTTPD)でテストできます
// *************************************
upload_url = "http://yourdomain/put/put.php"

// *************************************
// 準備
// *************************************
objHTTP.open( "POST",upload_url, false )

// *************************************
// バイナリデータ取得
// *************************************
Stream.Open()
Stream.Type = 1
Stream.LoadFromFile(upload_file)
nLen = Stream.Size
data = Stream.Read(nLen)

// *************************************
// 送信
// *************************************
objHTTP.setRequestHeader("Content-Length",nLen)
objHTTP.setTimeouts(lResolve, lConnect, lSend, lReceive)
objHTTP.send(data)

WScript.Echo(objHTTP.responseText)

// Stream を閉じる
Stream.Close

ActiveXObject オブジェクト


関連する記事


posted by lightbox at 2018-02-18 16:29 | VBS + インターネット | このブログの読者になる | 更新情報をチェックする

2017年08月13日


VBScript : Windows標準のオブジェクト(CDO.Message)とGMail(Yahoo!メール) を使ってメール送信

Windows7,Windows8,Windows10
(いずれも64ビット) で動作しました。

※ Gmail の場合、安全性の低いアプリの許可を『有効』にする必要があります

▼ 有効にしないと以下のメッセージ
メッセージを SMTP サーバーに送信できませんでした。転送エラー コードは 0x80040217 です。サーバーからの応答は次のとおりです。not available
メールサービスとしては、Gmail と Yahoo メールが使用可能でした。有料メールでは nifty メールで動作を確認しています。( Hotmail は CDO では使用できず、一般的に TLS の 587 で使用できます ) コマンドプロンプトから、以下のようにしてテストしています cscript mail.vbs 最近 では、ssl を使わないとメール送信できませんので、smtpusessl が true になっています。 mail.vbs
' ***********************************************************
' 使用するパラメータ
' ***********************************************************
strFrom = "わたしです <ユーザ名@gmail.com>"
'strFrom = "わたしです <ユーザ名@yahoo.co.jp>"

strTo = "あなたです <宛先>"

strServer = "smtp.gmail.com"
'strServer = "smtp.mail.yahoo.co.jp"

nPort = 465
strUser = "ユーザ名"
strPass = "パスワード"

' ***********************************************************
' オブジェクト
' ***********************************************************
Set Cdo = WScript.CreateObject("CDO.Message")

' ***********************************************************
' 自分のアドレスと宛先
' ***********************************************************
Cdo.From = strFrom
Cdo.To = strTo

' ***********************************************************
' 件名と本文
' ***********************************************************
Cdo.Subject	= "件名の文字列 / " & Now()
Cdo.Textbody = "テキスト本文" & vbCrLf & "改行は vbCrLf"

' ***********************************************************
' CC BCC HTMLメール( CC BCC はどちらか片方  )
' ※ 両方指定すると CC
' ***********************************************************
Cdo.Cc = "ユーザ名@yahoo.co.jp,ユーザ名@hotmail.co.jp"
'Cdo.Bcc = "ユーザ名@yahoo.co.jp,ユーザ名@hotmail.co.jp"
Cdo.Htmlbody = "<img src=""http://winofsql.jp/image/winofsql.png"">"

' ***********************************************************
' ファイル添付あり
' ***********************************************************
Cdo.AddAttachment( "C:\Users\lightbox\Desktop\画像\_img.jpg" )
Cdo.AddAttachment( "C:\Users\lightbox\Downloads\del.gif" )

' ***********************************************************
' 設定
' ***********************************************************
Cdo.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
Cdo.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strServer
Cdo.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = nPort
Cdo.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = true

Cdo.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
Cdo.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/sendusername") = strUser
Cdo.Configuration.Fields.Item _ 
 ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = strPass

' ***********************************************************
' 設定の反映
' ***********************************************************
Cdo.Configuration.Fields.Update

' ***********************************************************
' 送信
' ***********************************************************
on error resume next
Cdo.Send
if Err.Number <> 0 then
	strMessage = Err.Description
else
	strMessage = "送信が完了しました"
end if
on error goto 0

Wscript.Echo strMessage

関連する記事

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

変更履歴
2013-01-09 : 初回投稿
2013-07-27 : Yahoo メールと Nifty メールでテスト
2014-02-28 : 添付ファイル、cc、bcc、HTML メール を追加


posted by lightbox at 2017-08-13 23:19 | VBS + インターネット | このブログの読者になる | 更新情報をチェックする

2015年02月06日


VBScript で Seesaaブログへ禁止ワード一括登録( アップロード )

2015-02-06 更新

Google Chrome で拡張子 .vbs が悪者扱いされるので、.wsf に変更して内容も更新しました。再度動作確認も行いました

2013/01/19 更新

Seesaa の最新仕様にあわせて更新しました。
パッケージにデフォルトの『禁止WORD.txt』を同梱しました
実行は、コマンドラインより実行するようにしたので、readme.txt をご覧ください

▼ readme.txt の内容
禁止WORD.txt は、ファイル名を変更せずに使って下さい。内容はいままで運用で使ったものをセットしていますが、適宜変更または追加して下さい。内容は酷い内容なので、ご注意ください。

コマンドプロンプトを開き、今開いているファイル(readme.txt)があるフォルダがカレントになるようにします。

Windows VISTA 以降なら、エクスプローラで、SHIFT キーを押しながらこのフォルダ右クリックして『コマンドウインドウをここで開く』を実行します

以下をコマンドラインから実行します

cscript ignore_words.wsf メールアドレス パスワード ブログID

ブログの ID は、自分のブログ一覧を表示して、ブログタイトルのリンクを取り出すと以下のようになります。

(例)
http://blog.seesaa.jp/cms/home/switch?blog_id=2868467&goto=/cms/article/regist/input

blog_id=2868467 とありますが、2868467 の部分を使用します。
処理としては、ブラウザの代りに処理させるので、実際のやりとりを HTML のコードをページ毎に読んで基本処理部分を構築しています。実際の送信処理で送られる内容は、F12 の開発者ツールで比較的簡単に確認できます。 VBScript では、扱うデータが SHIFT_JIS なので、ADODB.Stream を使って UTF-8 に変換した上で% エンコーディングを行っています。
<JOB>
<SCRIPT language="VBScript">
' ***********************************************************
' サーバーオブジェクトを使用しています
' ***********************************************************
Set objHTTP = Wscript.CreateObject("Msxml2.ServerXMLHTTP")
lResolve = 60 * 1000
lConnect = 60 * 1000
lSend = 60 * 1000
lReceive = 60 * 1000

' ***********************************************************
' キャラクタセット変換用
' ***********************************************************
Set Stream = Wscript.CreateObject("ADODB.Stream")
Set Stream2 = Wscript.CreateObject("ADODB.Stream")
' ***********************************************************
' URLエンコード用
' ***********************************************************
Set StreamBin = Wscript.CreateObject("ADODB.Stream")
' ***********************************************************
' POST データ読み込み用
' ***********************************************************
Set Fs = CreateObject( "Scripting.FileSystemObject" )
' ***********************************************************
' 正規表現用
' ***********************************************************
Set regEx = New RegExp

Wscript.Echo "開始します。しばらくお待ち下さい"

' ログインページの取得
Call objHTTP.Open("GET","https://ssl.seesaa.jp/auth",False)
Call objHTTP.setTimeouts(lResolve, lConnect, lSend, lReceive)
Call objHTTP.Send()

' ページ全体
strPage = objHTTP.responseText

' 投稿用のキーを取得
regEx.IgnoreCase = True
regEx.Global = True
regEx.Pattern = "authpost""><input value=""([^""]+)"""
Set Matches = regEx.Execute( strPage )
For Each Match in Matches
	strPostKey = Match.SubMatches(0)
	Exit For
Next
'Wscript.Echo strPostKey

' ***********************************************************
' コマンドラインからの固有の情報の取得
' ***********************************************************
' Seesaa のログインユーザ( メールアドレス )
emailData = Wscript.Arguments(0)
' Seesaa のログインパスワード
passData = Wscript.Arguments(1)
' 登録したいブログの ID を指定します
blogData = Wscript.Arguments(2)

' ***********************************************************
' (1) : POST
' ***********************************************************
' ログイン URL
Call objHTTP.Open("POST","https://ssl.seesaa.jp/auth",False)
' POST 用ヘッダ
Call objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
strData = ""
strData = strData & "aXt=" & strPostKey
strData = strData & "&email=" & emailData
strData = strData & "&password=" & passData
strData = strData & "&return_to=http%3A%2F%2Fblog.seesaa.jp%2F"
Call objHTTP.SetRequestHeader("Content-Length",Len(strData))
Call objHTTP.Send(strData)
'strHeaders = objHTTP.getAllResponseHeaders()
'Wscript.Echo strHeaders

' ***********************************************************
' (2) : GET
' ***********************************************************
' 対象ブログ URL
Call objHTTP.Open("GET","http://blog.seesaa.jp/cms/home/switch?blog_id="&blogData&"&goto=/cms/article/regist/input" , False)
Call objHTTP.setTimeouts(lResolve, lConnect, lSend, lReceive)
Call objHTTP.Send()

' 以下デバッグ用
'Set OutObj = Fs.OpenTextFile( "log.txt", 2, True )
'OutObj.Write objHTTP.responseText
'OutObj.Close

' ***********************************************************
' (3) : GET
' ***********************************************************
' 投稿ページ
Call objHTTP.Open("GET","http://blog.seesaa.jp/cms/ignore_words/regist/input" , False)
Call objHTTP.setTimeouts(lResolve, lConnect, lSend, lReceive)
Call objHTTP.Send()

' 投稿用のキーを取得
strPage = objHTTP.responseText
regEx.Pattern = "method=""POST""><input value=""([^""]+)"""
Set Matches = regEx.Execute( strPage )
For Each Match in Matches
	strPostKey = Match.SubMatches(0)
	Exit For
Next

Wscript.Sleep(2000) ' 2秒間の間を置く

' ***********************************************************
' (3) : POST
' ***********************************************************
Set InObj = Fs.OpenTextFile( "禁止WORD.txt", 1 )

nCnt = 0
strData = "aXt=" & strPostKey
Do While not InObj.AtEndOfStream
	Buffer = InObj.ReadLine
	nCnt = nCnt + 1

	if strData <> "" then
		strData = strData & "&"
	end if

	strData = strData & "ignore_words=" & URLEncode( Buffer )

	if nCnt = 5 then
		' 5ワード毎に POST
		Call objHTTP.Open("POST","http://blog.seesaa.jp/cms/ignore_words/regist/input",False)
		Call objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
		Call objHTTP.SetRequestHeader("Content-Length",Len(strData))
		Call objHTTP.Send(strData)
		nCnt = 0
		strData = "aXt=" & strPostKey
		Wscript.Sleep(2000) ' 2秒間の間を置く
	end if
Loop

if nCnt <> 0 then
	Call objHTTP.Open("POST","http://blog.seesaa.jp/cms/ignore_words/regist/input",False)
	Call objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
	Call objHTTP.SetRequestHeader("Content-Length",Len(strData))
	Call objHTTP.Send(strData)
end if

InObj.Close

Wscript.Echo "終了しました"

' ***********************************************************
' SHIFT_JIS を UTF-8 に変換して URLエンコード
' ※ 全ての文字をパーセントエンコーディングします
' ***********************************************************
Function URLEncode(str)

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

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

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

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

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

	Buffer = ""
	' BOMを取り去る
	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

	URLEncode = Buffer

End Function
</SCRIPT>
</JOB>




▼ 初回投稿時の実際の経緯
承認制にしているにも関わらず、週末にいきなりたくさんやってきます。ここ最近急に増えて来ていちいち削除するのが面倒になってきたので、VBScript で一括で禁止ワードをアップロードできるようにしました。

ワードは少しづつ追加していったものですが、26個ほどでピタリと止まっているので。

そのワードも公開したいところですが、とても出せるようなものでは無いので、ロ口工エの組み合わせで4つできる事だけは報告しておきます。( 同梱しています )


関連する記事

Seesaa ブログのエクスポートを呼び出して全てをバックアップするスクリプト



タグ:トラブル
posted by lightbox at 2015-02-06 22:49 | VBS + インターネット | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

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

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

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

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


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

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

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

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

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

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり