VBScript : Twitter API を呼び出して投稿する


  VBScript に無い処理を JavaScript で補完する




2014/3/5

JavaScript のライブラリがかなり変わっていて、コード自体も違っていますが、何も内容を変更せずにそのまま使えました。JavaScript 部分を入れ替えて、Twitter API もバージョンを 1.1 に変更しただけで投稿は成功しています。

crypto-js

※ hmac-sha1.js と enc-base64-min.js で動作します。

2011/07/10

Msxml2.ServerXMLHTTP に変更しました。MSXML2.XMLHTTP でも動くのですが、基本的にMSXML2.XMLHTTP は、IE の設定に左右されるので、Msxml2.ServerXMLHTTP が正解です( 昔はバグがあったので使いませんでしたが、最近は大丈夫です )

ほんの少し変更が必要ですが、誰でも可能な程度です。crypto-js - Project Hosting on Google Code から、HMAC-SHA1 用の 2.0.0-crypto-sha1.js と 2.0.0-hmac-min.js をダウンロードします。変更するのは、2.0.0-crypto-sha1.js です。

これによって同時に Base64 の処理も可能になりました。

以下のファイルを直接ダウンロードして使いました。
crypto-js.googlecode.com/files/2.0.0-crypto-sha1.js
crypto-js.googlecode.com/files/2.0.0-hmac-min.js

2.0.0-crypto-sha1.js をテキストエディタで開いて、window.Crypto を Crypto に変更します。その後、先頭に以下のコードを付加すると使用できるようになります。

var Crypto;

Crypto

関連する記事









  OAuth 用に作成した処理




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 タイムスタンプ

  

DateDiff("s", "1970/1/1 0:00:00",DateAdd("h",-9,now))
  


URLEncode (rfc3986)

※ 投稿コードを参照




  投稿コード : Twitter.wsf

関連する記事

PHP + Twitter API : 資格情報の確認と アプリケーションに割り当てられた My Access Token
※ 4つの固定トークンを取得する方法です


▼ 最新のコード (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)
  

<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>
  




yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[sh_web]
CCBot/2.0 (http://commoncrawl.org/faq/)
17/08/21 22:42:49
InfoBoard Version 1.00 : Language=Perl

BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube