VBScript : Twitpic に画像をアップロード

  概要



VBScript から Twitter への投稿の部品は、VBS : TwitterAPIを呼び出して投稿 でそろったので、VBScript からの ファイルのアップロードをテストして完成させて以前 PHP で書いた PHP + Twitpic API v2 で画像アップ を移植しました。

JavaScript のライブラリの力を借りています。それについてもVBScript : Twitter API を呼び出して投稿する にあります

すぐテストしてみたい場合は、ソースコードに書いてあるライブラリはそのままホスティングしていますので使って下さい


関連する記事


IE専用( IE拡張 ) : TwitLink : リンクデータを基本に
Twitter へ投稿するツール

Twitlink9






  ソースコード



001.<JOB>
002.<COMMENT>
003.************************************************************
004. URLEncodeとファイルアップロードとcharset変換用
005.************************************************************
006.</COMMENT>
007.<OBJECT id="Stream" progid="ADODB.Stream" />
008.<OBJECT id="Stream2" progid="ADODB.Stream" />
009.<OBJECT id="StreamWorkBin" progid="ADODB.Stream" />
010.<OBJECT id="StreamBin" progid="ADODB.Stream" />
011.<OBJECT id="StreamUTF8" progid="ADODB.Stream" />
012.<COMMENT>
013.************************************************************
014. HTTP通信用
015.   ServerXMLHTTP でうまくいかない場合は、MSXML2.XMLHTTP
016.   を使います。それでもうまく行かない場合は、さらに
017.   IE設定のドメイン間のデータソースのアクセスを有効にします
018.************************************************************
019.</COMMENT>
020.<OBJECT id="objHTTP" progid="Msxml2.ServerXMLHTTP" />
021. 
022.<SCRIPT language="JavaScript" src="http://lightbox.on.coocan.jp/js/2.0.0-crypto-sha1.js"></SCRIPT>
023.<SCRIPT language="JavaScript" src="http://lightbox.on.coocan.jp/js/2.0.0-hmac-min.js"></SCRIPT>
024.<SCRIPT language="JavaScript">
025.// *********************************************************
026.// JavaScript メソッドのラッパー
027.// *********************************************************
028.function hash_hmac(str1,str2) {
029. 
030.    // ここで使用します
031.    return Crypto.HMAC(Crypto.SHA1, str1, str2,{ asString: true } );
032. 
033.}
034.function hash_hmac_bin(str1,str2) {
035. 
036.    // ここでは使用しません( 整数の配列が戻されます )
037.    return Crypto.HMAC(Crypto.SHA1, str1, str2,{ asBytes: true } );
038. 
039.}
040.// stringToBytes の結果を渡します
041.function bytesToBase64(data) {
042.    return Crypto.util.bytesToBase64(data);
043.}
044. 
045.function stringToBytes(data) {
046.    return Crypto.charenc.Binary.stringToBytes(data)
047.}
048. 
049.</SCRIPT>
050.<SCRIPT language=VBScript>
051. 
052.' **********************************************************
053.' twitpic への投稿データ
054.' **********************************************************
055.apikey = "TwitpicのAPIキー"
056.twitpic_url = "http://api.twitpic.com/2/upload.json"
057.twitter_url = "https://api.twitter.com/1/account/verify_credentials.json"
058. 
059.' **********************************************************
060.' 登録した自分のアプリケーションから取得するアクセス用のデータ
061.' ※ この部分を公開してはいけません
062.' **********************************************************
063.oauth_consumer_key = "Consumer key"
064.oauth_consumer_secret = "Consumer secret"
065.oauth_token = "Access Token"
066.oauth_secret = "Access Token Secret"
067. 
068.' **********************************************************
069.' ランダムな文字列
070.' **********************************************************
071.oauth_nonce = Nonce()
072. 
073.' **********************************************************
074.' Unix タイムスタンプ
075.' **********************************************************
076.oauth_timestamp = DateDiff("s", "1970/1/1 0:00:00",DateAdd("h",-9,now))
077. 
078.' **********************************************************
079.' その他設定値
080.' **********************************************************
081.oauth_signature_method = "HMAC-SHA1"
082.oauth_version = "1.0"
083. 
084.' **********************************************************
085.' シグネチャ用ベース文字列作成
086.' 厳密には、もっと URLエンコードが必要ですが、
087.' 実行しても変わらないものは省略しています
088.'
089.' 【Twitpic が使うアカウントチェック用】
090.' **********************************************************
091.base_s = "GET"
092.base_s = base_s & "&" & rfc3986_convert(URLEncode(twitter_url))
093.base_s = base_s & "&"
094. 
095.' %3D は =
096.base_s = base_s & "oauth_consumer_key" & "%3D" & oauth_consumer_key
097.' %26 は &
098.base_s = base_s & "%26"
099. 
100.base_s = base_s & "oauth_nonce" & "%3D" & oauth_nonce & "%26"
101.base_s = base_s & "oauth_signature_method" & "%3D" & oauth_signature_method & "%26"
102.base_s = base_s & "oauth_timestamp" & "%3D" & oauth_timestamp & "%26"
103.base_s = base_s & "oauth_token" & "%3D" & oauth_token & "%26"
104.base_s = base_s & "oauth_version" & "%3D" & oauth_version
105. 
106. 
107.' *********************************************************
108.' シグネチャ作成
109.' *********************************************************
110.str = hash_hmac(base_s,oauth_consumer_secret & "&" & oauth_secret)
111.oauth_signature = bytesToBase64(stringToBytes(str))
112. 
113. 
114.' *********************************************************
115.' API へ向けて送信準備
116.' *********************************************************
117.Call objHTTP.Open( "POST",twitpic_url, False )
118.' File Upload 用 HTTP ヘッダ
119.strBoundary = DateDiff("s", "1970/1/1 0:00:00",DateAdd("h",-9,now))
120.Call objHTTP.setRequestHeader("Content-Type", "multipart/form-data; boundary="&strBoundary)
121. 
122.' バイナリ変換用ストリーム
123.StreamWorkBin.Open
124.StreamWorkBin.Type = 1
125. 
126.' 最終バイナリストリーム
127.StreamBin.Open
128.StreamBin.Type = 1
129. 
130.' テキストストリーム
131.Stream.Open
132.Stream.Charset = "shift_jis"
133.StreamUTF8.Open
134.StreamUTF8.Charset = "utf-8"
135. 
136.' 開始セクション
137.Stream.WriteText "--" & strBoundary & vbLf
138.Stream.WriteText "Content-Disposition: form-data; name=""key""" & vbLf & vbLf
139.Stream.WriteText apikey & vbLf
140.Stream.WriteText "--" & strBoundary & vbLf
141.Stream.WriteText "Content-Disposition: form-data; name=""message""" & vbLf & vbLf
142.Stream.WriteText "VBScript(WSF) からアップロードしています" & vbLf
143.Stream.WriteText "--" & strBoundary & vbLf
144.Stream.WriteText "Content-Disposition: form-data; name=""media""; filename=""uploadtest.png""" & vbLf
145.Stream.WriteText "Content-Type: image/png" & vbLf
146.Stream.WriteText vbLf
147.Stream.Position = 0
148. 
149.Stream.CopyTo StreamUTF8
150.StreamUTF8.Position = 0
151. 
152.' テキストをバイナリに変換
153.StreamUTF8.CopyTo StreamWorkBin
154. 
155.' 第一セクションを書き込み
156.StreamWorkBin.Position = 0
157.StreamWorkBin.Read(3)
158.StreamBin.Write StreamWorkBin.Read(StreamWorkBin.Size-3)
159. 
160.' 画像を読み込む
161.StreamWorkBin.LoadFromFile("1252328628672351.png")
162. 
163.' 画像を書き込み
164.StreamBin.Write StreamWorkBin.Read(StreamWorkBin.Size)
165. 
166.' バイナリワークをいったん閉じる
167.StreamWorkBin.Close
168.StreamWorkBin.Open
169.StreamWorkBin.Type = 1
170. 
171.' テキストをいったん閉じる( 日本語が無いので Stream を使う )
172.Stream.Close
173.Stream.Open
174.Stream.Charset = "shift_jis"
175. 
176.' 終了セクション
177.Stream.WriteText vbLf & "--" & strBoundary & "--" & vbLf
178.Stream.Position = 0
179. 
180.' テキストをバイナリに変換
181.Stream.CopyTo StreamWorkBin
182. 
183.' 終了セクションを書き込み
184.StreamWorkBin.Position = 0
185.StreamBin.Write StreamWorkBin.Read(StreamWorkBin.Size)
186. 
187.' 送信データを取得
188.nLen = StreamBin.Size
189.StreamBin.Position = 0
190.strData = StreamBin.Read(nLen)
191. 
192.'Call StreamBin.SaveToFile( "result.dat", 2 )
193. 
194.Stream.Close
195.StreamUTF8.Close
196.StreamBin.Close
197.StreamWorkBin.Close
198. 
199.' *********************************************************
200.' 投稿データとその長さ
201.' *********************************************************
202.Call objHTTP.SetRequestHeader("Content-Length",nLen)
203. 
204.' *********************************************************
205.' Twitpic 用ヘッダ
206.' *********************************************************
207.OAuthCheck = "OAuth realm=""http://api.twitter.com/""," & _
208.rfc3986_convert(URLEncode("oauth_consumer_key")) & "=""" & rfc3986_convert(URLEncode(oauth_consumer_key)) & """," & _
209.rfc3986_convert(URLEncode("oauth_signature_method")) & "=""" & rfc3986_convert(URLEncode(oauth_signature_method)) &"""," & _
210.rfc3986_convert(URLEncode("oauth_token")) & "=""" & rfc3986_convert(URLEncode(oauth_token)) &"""," & _
211.rfc3986_convert(URLEncode("oauth_timestamp")) & "=""" & rfc3986_convert(URLEncode(oauth_timestamp)) &"""," & _
212.rfc3986_convert(URLEncode("oauth_nonce")) & "=""" & rfc3986_convert(URLEncode(oauth_nonce)) &"""," & _
213.rfc3986_convert(URLEncode("oauth_version")) & "=""" & rfc3986_convert(URLEncode(oauth_version)) &"""," & _
214.rfc3986_convert(URLEncode("oauth_signature")) & "=""" & rfc3986_convert(URLEncode(oauth_signature)) & """"
215. 
216.Call objHTTP.SetRequestHeader("X-Verify-Credentials-Authorization",OAuthCheck)
217. 
218.Call objHTTP.SetRequestHeader("X-Auth-Service-Provider",twitter_url)
219. 
220. 
221.' *********************************************************
222.' API へ向けて送信
223.' *********************************************************
224.Call objHTTP.Send(strData)
225. 
226.Wscript.Echo(objHTTP.responseText)
227. 
228. 
229.' ***********************************************************
230.' ランダムな文字列
231.' ***********************************************************
232.Function Nonce(  )
233. 
234.    Dim base_str,str,I,nLen,Random
235.    base_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
236.    base_str = base_str & "abcdefghijklmnopqrstuvwxyz0123456789"
237. 
238.    nLen = Len(base_str)
239. 
240.    str = ""
241.    For I = 1 to 32
242.        Randomize
243.        Random = 1 + Int(Rnd * nLen)
244.        str = str & Mid(base_str,Random,1)
245.    Next
246. 
247.    Nonce = str
248. 
249.End function
250. 
251.' ***********************************************************
252.' SHIFT_JIS を UTF-8 に変換して URLエンコード
253.' ※ 全ての文字をパーセントエンコーディングします
254.' ***********************************************************
255.Function URLEncode(str)
256. 
257.    Stream.Open
258.    Stream.Charset = "shift_jis"
259.    ' shift_jis で入力文字を書き込む
260.    Stream.WriteText str
261.    ' コピーの為にデータポインタを先頭にセット
262.    Stream.Position = 0
263.  
264.    Stream2.Open
265.    Stream2.Charset = "utf-8"
266.    ' shift_jis を utf-8 に変換
267.    Stream.CopyTo Stream2
268.    Stream.Close
269. 
270.    ' コピーの為にデータポインタを先頭にセット
271.    Stream2.Position = 0
272. 
273.    ' バイナリで開く
274.    StreamBin.Open
275.    StreamBin.Type = 1
276. 
277.    ' テキストをバイナリに変換
278.    Stream2.CopyTo StreamBin
279.    Stream2.Close
280. 
281.    ' 読み込みの為にデータポインタを先頭にセット
282.    StreamBin.Position = 0
283. 
284.    Buffer = ""
285.    StreamBin.Read(3)
286.    Do while not StreamBin.EOS
287.        LineBuffer = StreamBin.Read(16)
288.  
289.        For i = 1 to LenB( LineBuffer )
290.            CWork = MidB(LineBuffer,i,1)
291.            Cwork = AscB(Cwork)
292.            Cwork = Hex(Cwork)
293.            Cwork = Ucase(Cwork)
294.            if Len(Cwork) = 1 then
295.                Buffer = Buffer & "%0" & Cwork
296.            else
297.                Buffer = Buffer & "%" & Cwork
298.            end if
299.        Next
300.  
301.    Loop
302. 
303.    StreamBin.Close
304. 
305.    URLEncode = Buffer
306. 
307.End Function
308. 
309.' ***********************************************************
310.' 仕様を明確にする為に単純変換
311.' ***********************************************************
312.Function rfc3986_convert(str)
313. 
314.    Dim strResult,I,strWork
315. 
316.    strResult = str
317. 
318.    strResult = Replace(strResult,"%2D", "-")
319.    strResult = Replace(strResult,"%2E", ".")
320. 
321.    ' 0~9
322.    For I = &H30 to &H39
323.        strWork = Hex(I)
324.        strWork = "%" & Ucase(strWork)
325.        strResult = Replace(strResult,strWork, Chr(I))
326.    Next
327. 
328.    ' A~Z
329.    For I = &H41 to &H5A
330.        strWork = Hex(I)
331.        strWork = "%" & Ucase(strWork)
332.        strResult = Replace(strResult,strWork, Chr(I))
333.    Next
334. 
335.    strResult = Replace(strResult,"%5F", "_")
336. 
337.    ' a~z
338.    For I = &H61 to &H7A
339.        strWork = Hex(I)
340.        strWork = "%" & Ucase(strWork)
341.        strResult = Replace(strResult,strWork, Chr(I))
342.    Next
343. 
344.    strResult = Replace(strResult,"%7E", "~")
345.     
346.    rfc3986_convert = strResult
347. 
348.End Function
349. 
350.</SCRIPT>
351.</JOB>













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





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

SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ