VBScript に無い処理を JavaScript で補完する
Nonce (ランダムな文字列)
' ***********************************************************
' ランダムな文字列
' ***********************************************************
Function Nonce( )
Dim base_str,str,I,nLen,Random
base_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
nLen = Len(base_str)
str = ""
For I = 1 to 32
Randomize
Random = 1 + Int(Rnd * nLen)
str = str & Mid(base_str,Random,1)
Next
Nonce = str
End function
Unix タイムスタンプ
copy
DateDiff("s" , "1970/1/1 0:00:00" ,DateAdd("h" ,-9,now))
URLEncode (rfc3986)
※ 投稿コードを参照
▼ 最新のコード (2014/3/5)
<JOB>
<COMMENT>
************************************************************
URLEncode用
************************************************************
</COMMENT>
<OBJECT id="Stream" progid="ADODB.Stream" />
<OBJECT id="Stream2" progid="ADODB.Stream" />
<OBJECT id="StreamBin" progid="ADODB.Stream" />
<COMMENT>
************************************************************
HTTP通信用
************************************************************
</COMMENT>
<OBJECT id="objHTTP" progid="Msxml2.ServerXMLHTTP" />
<COMMENT>
************************************************************
HMAC-SHA1 と Base64用
************************************************************
</COMMENT>
<SCRIPT language="JavaScript" src="hmac-sha1.js"></SCRIPT>
<SCRIPT language="JavaScript" src="enc-base64-min.js"></SCRIPT>
<SCRIPT language="JavaScript">
// *********************************************************
// JavaScript メソッドのラッパー
// *********************************************************
function hash_hmac(str1,str2) {
// ここで使用します
var hash = CryptoJS.HmacSHA1(str1, str2);
return hash.toString(CryptoJS.enc.Base64);
}
</script>
<SCRIPT language=VBScript>
' **********************************************************
' POST データ
' **********************************************************
postdata = "CryptoJS.HmacSHA1(JavaScript)をVBScriptから使って投稿"
' **********************************************************
' Twitter 投稿用 API URL
' **********************************************************
twitter_url = "https://api.twitter.com/1.1/statuses/update.json"
' **********************************************************
' 登録した自分のアプリケーションから取得するアクセス用のデータ
' ※ この部分を公開してはいけません
' **********************************************************
oauth_consumer_key = "Consumer key"
oauth_consumer_secret = "Consumer secret"
oauth_token = "Access Token"
oauth_secret = "Access Token Secret"
' **********************************************************
' ランダムな文字列
' **********************************************************
oauth_nonce = Nonce()
' **********************************************************
' Unix タイムスタンプ
' **********************************************************
oauth_timestamp = DateDiff("s", "1970/1/1 0:00:00",DateAdd("h",-9,now))
' **********************************************************
' その他設定値
' **********************************************************
oauth_signature_method = "HMAC-SHA1"
oauth_version = "1.0"
' **********************************************************
' シグネチャ用ベース文字列作成
' 厳密には、もっと URLエンコードが必要ですが、
' 実行しても変わらないものは省略しています
' **********************************************************
base_s = "POST"
base_s = base_s & "&" & rfc3986_convert(URLEncode(twitter_url))
base_s = base_s & "&"
' %3D は =
base_s = base_s & "oauth_consumer_key" & "%3D" & oauth_consumer_key
' %26 は &
base_s = base_s & "%26"
base_s = base_s & "oauth_nonce" & "%3D" & oauth_nonce & "%26"
base_s = base_s & "oauth_signature_method" & "%3D" & oauth_signature_method & "%26"
base_s = base_s & "oauth_timestamp" & "%3D" & oauth_timestamp & "%26"
base_s = base_s & "oauth_token" & "%3D" & oauth_token & "%26"
base_s = base_s & "oauth_version" & "%3D" & oauth_version & "%26"
base_s = base_s & "status" & "%3D" & _
rfc3986_convert(URLEncode(rfc3986_convert(URLEncode(postdata))))
' *********************************************************
' シグネチャ作成
' *********************************************************
oauth_signature = hash_hmac(base_s,oauth_consumer_secret & "&" & oauth_secret)
' *********************************************************
' API へ向けて送信準備
' *********************************************************
Call objHTTP.Open( "POST",twitter_url, False )
' POST 用 HTTP ヘッダ
Call objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
' 以下は、MSXML2.XMLHTTP では必要です
'Call objHTTP.setRequestHeader("Expect", "")
' *********************************************************
' API 用 HTTP ヘッダ
' 厳密には、もっと URLエンコードが必要ですが、
' 実行しても変わらないものは省略しています
' *********************************************************
headerAuth = "OAuth realm=""/statuses/update.json""," & _
"oauth_consumer_key="""&oauth_consumer_key&"""," & _
"oauth_token="""&oauth_token&"""," & _
"oauth_nonce="""&oauth_nonce&"""," & _
"oauth_timestamp="""&oauth_timestamp&"""," & _
"oauth_signature_method="""&oauth_signature_method&"""," & _
"oauth_version="""&oauth_version&"""," & _
"oauth_signature="""&rfc3986_convert(URLEncode(oauth_signature))&""""
Call objHTTP.setRequestHeader("Authorization", headerAuth)
' *********************************************************
' 投稿データとその長さ
' *********************************************************
strData = "status=" & rfc3986_convert(URLEncode(postdata))
Call objHTTP.SetRequestHeader("Content-Length",Len(strData))
' *********************************************************
' API へ向けて送信
' *********************************************************
Call objHTTP.Send(strData)
Wscript.Echo(objHTTP.responseText)
' ***********************************************************
' ランダムな文字列
' ***********************************************************
Function Nonce( )
Dim base_str,str,I,nLen,Random
base_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
base_str = base_str & "abcdefghijklmnopqrstuvwxyz0123456789"
nLen = Len(base_str)
str = ""
For I = 1 to 32
Randomize
Random = 1 + Int(Rnd * nLen)
str = str & Mid(base_str,Random,1)
Next
Nonce = str
End function
' ***********************************************************
' 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 = ""
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
' ***********************************************************
' 仕様を明確にする為に単純変換
' ***********************************************************
Function rfc3986_convert(str)
Dim strResult,I,strWork
strResult = str
strResult = Replace(strResult,"%2D", "-")
strResult = Replace(strResult,"%2E", ".")
' 0〜9
For I = &H30 to &H39
strWork = Hex(I)
strWork = "%" & Ucase(strWork)
strResult = Replace(strResult,strWork, Chr(I))
Next
' A〜Z
For I = &H41 to &H5A
strWork = Hex(I)
strWork = "%" & Ucase(strWork)
strResult = Replace(strResult,strWork, Chr(I))
Next
strResult = Replace(strResult,"%5F", "_")
' a〜z
For I = &H61 to &H7A
strWork = Hex(I)
strWork = "%" & Ucase(strWork)
strResult = Replace(strResult,strWork, Chr(I))
Next
strResult = Replace(strResult,"%7E", "~")
rfc3986_convert = strResult
End Function
</SCRIPT>
</JOB>
▼ 古いコード (2011/7/10)
copy
<JOB>
<COMMENT>
************************************************************
URLEncode用
************************************************************
</COMMENT>
<OBJECT id="Stream" progid="ADODB.Stream" />
<OBJECT id="Stream2" progid="ADODB.Stream" />
<OBJECT id="StreamBin" progid="ADODB.Stream" />
<COMMENT>
************************************************************
HTTP通信用
************************************************************
</COMMENT>
<OBJECT id="objHTTP" progid="Msxml2.ServerXMLHTTP" />
<COMMENT>
************************************************************
HMAC-SHA1 と Base64用
************************************************************
</COMMENT>
<SCRIPT language="JavaScript" src="2.0.0-crypto-sha1.js" ></SCRIPT>
<SCRIPT language="JavaScript" src="2.0.0-hmac-min.js" ></SCRIPT>
<SCRIPT language="JavaScript" >
// *********************************************************
// JavaScript メソッドのラッパー
// *********************************************************
function hash_hmac(str1,str2) {
// ここで使用します
return Crypto.HMAC(Crypto.SHA1, str1, str2,{ asString: true } );
}
function hash_hmac_bin(str1,str2) {
// ここでは使用しません( 整数の配列が戻されます )
return Crypto.HMAC(Crypto.SHA1, str1, str2,{ asBytes: true } );
}
// stringToBytes の結果を渡します
function bytesToBase64(data) {
return Crypto.util.bytesToBase64(data);
}
function stringToBytes(data) {
return Crypto.charenc.Binary.stringToBytes(data)
}
</script>
<SCRIPT language=VBScript>
' **********************************************************
' POST データ
' **********************************************************
postdata = "VBSCript+TwitterAPI : アクセストークンを取得するのに必要な情報は"
postdata = postdata & " consumer_key と consumer_secret です。"
postdata = postdata & "取得後、API を呼べるようになります"
' **********************************************************
' Twitter 投稿用 API URL
' **********************************************************
twitter_url = "https://api.twitter.com/1/statuses/update.json"
' **********************************************************
' 登録した自分のアプリケーションから取得するアクセス用のデータ
' ※ この部分を公開してはいけません
' **********************************************************
oauth_consumer_key = "Consumer key"
oauth_consumer_secret = "Consumer secret"
oauth_token = "Access Token"
oauth_secret = "Access Token Secret"
' **********************************************************
' ランダムな文字列
' **********************************************************
oauth_nonce = Nonce()
' **********************************************************
' Unix タイムスタンプ
' **********************************************************
oauth_timestamp = DateDiff("s" , "1970/1/1 0:00:00" ,DateAdd("h" ,-9,now))
' **********************************************************
' その他設定値
' **********************************************************
oauth_signature_method = "HMAC-SHA1"
oauth_version = "1.0"
' **********************************************************
' シグネチャ用ベース文字列作成
' 厳密には、もっと URLエンコードが必要ですが、
' 実行しても変わらないものは省略しています
' **********************************************************
base_s = "POST"
base_s = base_s & "&" & rfc3986_convert(URLEncode(twitter_url))
base_s = base_s & "&"
' %3D は =
base_s = base_s & "oauth_consumer_key" & "%3D" & oauth_consumer_key
' %26 は &
base_s = base_s & "%26"
base_s = base_s & "oauth_nonce" & "%3D" & oauth_nonce & "%26"
base_s = base_s & "oauth_signature_method" & "%3D" & oauth_signature_method & "%26"
base_s = base_s & "oauth_timestamp" & "%3D" & oauth_timestamp & "%26"
base_s = base_s & "oauth_token" & "%3D" & oauth_token & "%26"
base_s = base_s & "oauth_version" & "%3D" & oauth_version & "%26"
base_s = base_s & "status" & "%3D" & _
rfc3986_convert(URLEncode(rfc3986_convert(URLEncode(postdata))))
' *********************************************************
' シグネチャ作成
' *********************************************************
str = hash_hmac(base_s,oauth_consumer_secret & "&" & oauth_secret)
oauth_signature = bytesToBase64(stringToBytes(str))
' *********************************************************
' API へ向けて送信準備
' *********************************************************
Call objHTTP.Open( "POST" ,twitter_url, False )
' POST 用 HTTP ヘッダ
Call objHTTP.setRequestHeader("Content-Type" , "application/x-www-form-urlencoded" )
' 以下は、MSXML2.XMLHTTP では必要です
'Call objHTTP.setRequestHeader("Expect" , "" )
' *********************************************************
' API 用 HTTP ヘッダ
' 厳密には、もっと URLエンコードが必要ですが、
' 実行しても変わらないものは省略しています
' *********************************************************
headerAuth = "OAuth realm=" "/statuses/update.json" "," & _
"oauth_consumer_key=" "" &oauth_consumer_key&"" "," & _
"oauth_token=" "" &oauth_token&"" "," & _
"oauth_nonce=" "" &oauth_nonce&"" "," & _
"oauth_timestamp=" "" &oauth_timestamp&"" "," & _
"oauth_signature_method=" "" &oauth_signature_method&"" "," & _
"oauth_version=" "" &oauth_version&"" "," & _
"oauth_signature=" "" &rfc3986_convert(URLEncode(oauth_signature))&"" ""
Call objHTTP.setRequestHeader("Authorization" , headerAuth)
' *********************************************************
' 投稿データとその長さ
' *********************************************************
strData = "status=" & rfc3986_convert(URLEncode(postdata))
Call objHTTP.SetRequestHeader("Content-Length" ,Len(strData))
' *********************************************************
' API へ向けて送信
' *********************************************************
Call objHTTP.Send(strData)
Wscript.Echo(objHTTP.responseText)
' ***********************************************************
' ランダムな文字列
' ***********************************************************
Function Nonce( )
Dim base_str,str,I,nLen,Random
base_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
base_str = base_str & "abcdefghijklmnopqrstuvwxyz0123456789"
nLen = Len(base_str)
str = ""
For I = 1 to 32
Randomize
Random = 1 + Int(Rnd * nLen)
str = str & Mid(base_str,Random,1)
Next
Nonce = str
End function
' ***********************************************************
' 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 = ""
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
' ***********************************************************
' 仕様を明確にする為に単純変換
' ***********************************************************
Function rfc3986_convert(str)
Dim strResult,I,strWork
strResult = str
strResult = Replace(strResult,"%2D" , "-" )
strResult = Replace(strResult,"%2E" , "." )
' 0〜9
For I = &H30 to &H39
strWork = Hex(I)
strWork = "%" & Ucase(strWork)
strResult = Replace(strResult,strWork, Chr(I))
Next
' A〜Z
For I = &H41 to &H5A
strWork = Hex(I)
strWork = "%" & Ucase(strWork)
strResult = Replace(strResult,strWork, Chr(I))
Next
strResult = Replace(strResult,"%5F" , "_" )
' a〜z
For I = &H61 to &H7A
strWork = Hex(I)
strWork = "%" & Ucase(strWork)
strResult = Replace(strResult,strWork, Chr(I))
Next
strResult = Replace(strResult,"%7E" , "~" )
rfc3986_convert = strResult
End Function
</SCRIPT>
</JOB>