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

関連する記事

 PHP+VBS : デスクトップ/Twitterへのアクセス準備
 PHP : TwitterAPI : Access Token取得
 PHP : TwitterAPI : 資格情報の確認
 PHP + Twitpic API v2 で画像アップロード
 VBScript : Twitpic に画像をアップロード
 VBScript : Picasa へ画像ファイルをアップロード
 VBScript : ココログマイフォトに画像アップロード
 PHP : bit.ly を使用した専用短縮URLサービス作成
 PHP : Google ドキュメントのセルのAPI更新
 PHP+Zend : Picasa APIアップロード
 PHP : cURL でFTPESダウンロード
 PHP : CodeIgniter+TwitterAPI投稿
 VBScript : Twitter API を呼び出して投稿する
 VBScript でバッチ twitter 投稿
 VBScript でバッチ mixi ボイス投稿
 Python3.1 : mixi ボイスへ投稿
 VBScript : Seesaaの禁止ワード一括登録
 VBScript : Seesaaブログのエクスポート
 VBScript : XML-RPC で Seesaa に投稿
 VBScript : 手書きブログAPIで画像ダウンロード
 Ruby+Mechanize : Twitter 投稿
 Ruby+Mechanize : Seesaa最新情報更新
 Ruby+Mechanize : Seesaaアクセス解析情報




  OAuth 用に作成した処理



Nonce (ランダムな文字列)

01.' ***********************************************************
02.' ランダムな文字列
03.' ***********************************************************
04.Function Nonce(  )
05. 
06.    Dim base_str,str,I,nLen,Random
07.    base_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
08. 
09. 
10.    nLen = Len(base_str)
11. 
12.    str = ""
13.    For I = 1 to 32
14.        Randomize
15.        Random = 1 + Int(Rnd * nLen)
16.        str = str & Mid(base_str,Random,1)
17.    Next
18. 
19.    Nonce = str
20. 
21.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)
001.<JOB>
002.<COMMENT>
003.************************************************************
004. URLEncode用
005.************************************************************
006.</COMMENT>
007.<OBJECT id="Stream" progid="ADODB.Stream" />
008.<OBJECT id="Stream2" progid="ADODB.Stream" />
009.<OBJECT id="StreamBin" progid="ADODB.Stream" />
010.<COMMENT>
011.************************************************************
012. HTTP通信用
013.************************************************************
014.</COMMENT>
015.<OBJECT id="objHTTP" progid="Msxml2.ServerXMLHTTP" />
016.<COMMENT>
017.************************************************************
018. HMAC-SHA1 と Base64用
019.************************************************************
020.</COMMENT>
021.<SCRIPT language="JavaScript" src="hmac-sha1.js"></SCRIPT>
022.<SCRIPT language="JavaScript" src="enc-base64-min.js"></SCRIPT>
023.<SCRIPT language="JavaScript">
024.// *********************************************************
025.// JavaScript メソッドのラッパー
026.// *********************************************************
027.function hash_hmac(str1,str2) {
028. 
029.    // ここで使用します
030.    var hash = CryptoJS.HmacSHA1(str1, str2);
031.    return hash.toString(CryptoJS.enc.Base64);
032. 
033.}
034.</script>
035. 
036.<SCRIPT language=VBScript>
037.' **********************************************************
038.' POST データ
039.' **********************************************************
040.postdata = "CryptoJS.HmacSHA1(JavaScript)をVBScriptから使って投稿"
041. 
042.' **********************************************************
043.' Twitter 投稿用 API URL
044.' **********************************************************
045.twitter_url = "https://api.twitter.com/1.1/statuses/update.json"
046. 
047.' **********************************************************
048.' 登録した自分のアプリケーションから取得するアクセス用のデータ
049.' ※ この部分を公開してはいけません
050.' **********************************************************
051.oauth_consumer_key = "Consumer key"
052.oauth_consumer_secret = "Consumer secret"
053.oauth_token = "Access Token"
054.oauth_secret = "Access Token Secret"
055. 
056.' **********************************************************
057.' ランダムな文字列
058.' **********************************************************
059.oauth_nonce = Nonce()
060. 
061.' **********************************************************
062.' Unix タイムスタンプ
063.' **********************************************************
064.oauth_timestamp = DateDiff("s", "1970/1/1 0:00:00",DateAdd("h",-9,now))
065. 
066.' **********************************************************
067.' その他設定値
068.' **********************************************************
069.oauth_signature_method = "HMAC-SHA1"
070.oauth_version = "1.0"
071. 
072.' **********************************************************
073.' シグネチャ用ベース文字列作成
074.' 厳密には、もっと URLエンコードが必要ですが、
075.' 実行しても変わらないものは省略しています
076.' **********************************************************
077.base_s = "POST"
078.base_s = base_s & "&" & rfc3986_convert(URLEncode(twitter_url))
079.base_s = base_s & "&"
080. 
081.' %3D は =
082.base_s = base_s & "oauth_consumer_key" & "%3D" & oauth_consumer_key
083.' %26 は &
084.base_s = base_s & "%26"
085. 
086.base_s = base_s & "oauth_nonce" & "%3D" & oauth_nonce & "%26"
087.base_s = base_s & "oauth_signature_method" & "%3D" & oauth_signature_method & "%26"
088.base_s = base_s & "oauth_timestamp" & "%3D" & oauth_timestamp & "%26"
089.base_s = base_s & "oauth_token" & "%3D" & oauth_token & "%26"
090.base_s = base_s & "oauth_version" & "%3D" & oauth_version & "%26"
091. 
092.base_s = base_s & "status" & "%3D" & _
093.    rfc3986_convert(URLEncode(rfc3986_convert(URLEncode(postdata))))
094. 
095. 
096.' *********************************************************
097.' シグネチャ作成
098.' *********************************************************
099.oauth_signature = hash_hmac(base_s,oauth_consumer_secret & "&" & oauth_secret)
100. 
101.' *********************************************************
102.' API へ向けて送信準備
103.' *********************************************************
104.Call objHTTP.Open( "POST",twitter_url, False )
105.' POST 用 HTTP ヘッダ
106.Call objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
107.' 以下は、MSXML2.XMLHTTP では必要です
108.'Call objHTTP.setRequestHeader("Expect", "")
109. 
110.' *********************************************************
111.' API 用 HTTP ヘッダ
112.' 厳密には、もっと URLエンコードが必要ですが、
113.' 実行しても変わらないものは省略しています
114.' *********************************************************
115.headerAuth = "OAuth realm=""/statuses/update.json""," & _
116."oauth_consumer_key="""&oauth_consumer_key&"""," & _
117."oauth_token="""&oauth_token&"""," & _
118."oauth_nonce="""&oauth_nonce&"""," & _
119."oauth_timestamp="""&oauth_timestamp&"""," & _
120."oauth_signature_method="""&oauth_signature_method&"""," & _
121."oauth_version="""&oauth_version&"""," & _
122."oauth_signature="""&rfc3986_convert(URLEncode(oauth_signature))&""""
123. 
124.Call objHTTP.setRequestHeader("Authorization", headerAuth)
125. 
126.' *********************************************************
127.' 投稿データとその長さ
128.' *********************************************************
129.strData = "status=" & rfc3986_convert(URLEncode(postdata))
130.Call objHTTP.SetRequestHeader("Content-Length",Len(strData))
131. 
132.' *********************************************************
133.' API へ向けて送信
134.' *********************************************************
135.Call objHTTP.Send(strData)
136. 
137.Wscript.Echo(objHTTP.responseText)
138. 
139. 
140.' ***********************************************************
141.' ランダムな文字列
142.' ***********************************************************
143.Function Nonce(  )
144. 
145.    Dim base_str,str,I,nLen,Random
146.    base_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
147.    base_str = base_str & "abcdefghijklmnopqrstuvwxyz0123456789"
148. 
149.    nLen = Len(base_str)
150. 
151.    str = ""
152.    For I = 1 to 32
153.        Randomize
154.        Random = 1 + Int(Rnd * nLen)
155.        str = str & Mid(base_str,Random,1)
156.    Next
157. 
158.    Nonce = str
159. 
160.End function
161. 
162.' ***********************************************************
163.' SHIFT_JIS を UTF-8 に変換して URLエンコード
164.' ※ 全ての文字をパーセントエンコーディングします
165.' ***********************************************************
166.Function URLEncode(str)
167. 
168.    Stream.Open
169.    Stream.Charset = "shift_jis"
170.    ' shift_jis で入力文字を書き込む
171.    Stream.WriteText str
172.    ' コピーの為にデータポインタを先頭にセット
173.    Stream.Position = 0
174.  
175.    Stream2.Open
176.    Stream2.Charset = "utf-8"
177.    ' shift_jis を utf-8 に変換
178.    Stream.CopyTo Stream2
179.    Stream.Close
180. 
181.    ' コピーの為にデータポインタを先頭にセット
182.    Stream2.Position = 0
183. 
184.    ' バイナリで開く
185.    StreamBin.Open
186.    StreamBin.Type = 1
187. 
188.    ' テキストをバイナリに変換
189.    Stream2.CopyTo StreamBin
190.    Stream2.Close
191. 
192.    ' 読み込みの為にデータポインタを先頭にセット
193.    StreamBin.Position = 0
194. 
195.    Buffer = ""
196.    StreamBin.Read(3)
197.    Do while not StreamBin.EOS
198.        LineBuffer = StreamBin.Read(16)
199.  
200.        For i = 1 to LenB( LineBuffer )
201.            CWork = MidB(LineBuffer,i,1)
202.            Cwork = AscB(Cwork)
203.            Cwork = Hex(Cwork)
204.            Cwork = Ucase(Cwork)
205.            if Len(Cwork) = 1 then
206.                Buffer = Buffer & "%0" & Cwork
207.            else
208.                Buffer = Buffer & "%" & Cwork
209.            end if
210.        Next
211.  
212.    Loop
213. 
214.    StreamBin.Close
215. 
216.    URLEncode = Buffer
217. 
218.End Function
219. 
220.' ***********************************************************
221.' 仕様を明確にする為に単純変換
222.' ***********************************************************
223.Function rfc3986_convert(str)
224. 
225.    Dim strResult,I,strWork
226. 
227.    strResult = str
228. 
229.    strResult = Replace(strResult,"%2D", "-")
230.    strResult = Replace(strResult,"%2E", ".")
231. 
232.    ' 0~9
233.    For I = &H30 to &H39
234.        strWork = Hex(I)
235.        strWork = "%" & Ucase(strWork)
236.        strResult = Replace(strResult,strWork, Chr(I))
237.    Next
238. 
239.    ' A~Z
240.    For I = &H41 to &H5A
241.        strWork = Hex(I)
242.        strWork = "%" & Ucase(strWork)
243.        strResult = Replace(strResult,strWork, Chr(I))
244.    Next
245. 
246.    strResult = Replace(strResult,"%5F", "_")
247. 
248.    ' a~z
249.    For I = &H61 to &H7A
250.        strWork = Hex(I)
251.        strWork = "%" & Ucase(strWork)
252.        strResult = Replace(strResult,strWork, Chr(I))
253.    Next
254. 
255.    strResult = Replace(strResult,"%7E", "~")
256.     
257.    rfc3986_convert = strResult
258. 
259.End Function
260.</SCRIPT>
261.</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>
  













   SQLの窓    create:2010/05/30  update:2018/02/18   管理者用(要ログイン)





フリーフォントWEBサービス

SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ