VBScript : Picasa へ画像ファイルをアップロード


  比較的簡単なプロトコルです




PHP : Zend Gdata による Picasa アップロード で実装した時は気が付かなかったのですが、 Java のサンプルがある説明ページに詳細な手順(プロトコル)が記述されていました。ここだけでは解りにくいのですが、当然認証が必要になりますので、ClientLogin documentation
参照すると、認証に関する説明があります。

サービスの種類はこちらのページにあります。

ClientLogin for installed applications で説明されていますが、ClientLogin で取得した Auth を以降の http ヘッダで Authorization: GoogleLogin auth=yourAuthValue というように設定しておけば良いわけです。アツプロードにはメタデータを同時に設定する方法と、簡単にファイルのみ送る方法が記述されていますが、簡単なほうをテストしています。

バイナリデータのポストは、Twitpic のアップロードでもっと複雑な事をしているので必要ならば参照して下さい。

関連する記事

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

  VBScript : img_upload.wsf




ユーザーid や アルバムid は、そのアルバムの右サイドにある RSS の URL を見れば解ります。画像の名前は、http ヘッダの Slug に指定します。

※ /user/ユーザーid/albumid/アルバムid という構成になっています

<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" />
<OBJECT id="objDOMDoc" progid="Msxml2.DOMDocument" />

<SCRIPT language=VBScript>
' **********************************************************
' 認証データ
' **********************************************************
strEmail = "メールアドレス"	' またはユーザーID
strPass = "パスワード"
strVersion = "winofsql-imgupload-1.01"	' 内容は自由
' *********************************************************
' アップロード用データ
' ※ アルバムの RSS リンクより取得
' ( /user/ユーザーid/albumid/アルバムid )
' *********************************************************
strUserid = "ユーザーID"
strAlbumid = "アルバムID"
strImage = "画像のパス"
strImageTitle = "VBS_UPLOAD_IMAGE.jpg"	' Filename
strImageType = "image/jpeg"


' **********************************************************
' Google 認証用 URL
' **********************************************************
target_url = "https://www.google.com/accounts/ClientLogin"

' *********************************************************
' API へ向けて送信準備
' *********************************************************
Call objHTTP.Open( "POST",target_url, False )
' POST 用 HTTP ヘッダ
Call objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")

' *********************************************************
' 認証用データとその長さ
' *********************************************************
strData = "accountType=GOOGLE"
strData = strData & "&Email=" & rfc3986_convert(URLEncode(strEmail))
strData = strData & "&Passwd=" & rfc3986_convert(URLEncode(strPass))
strData = strData & "&service=lh2"
strData = strData & "&source=" &  rfc3986_convert(URLEncode(strVersion))
Call objHTTP.SetRequestHeader("Content-Length",Len(strData))

' *********************************************************
' 認証用データの送信
' *********************************************************
Dim lResolve : lResolve = 60 * 1000
Dim lConnect : lConnect = 60 * 1000
Dim lSend : lSend = 60 * 1000
Dim lReceive : lReceive = 60 * 1000
Call objHTTP.setTimeouts(lResolve, lConnect, lSend, lReceive)
Call objHTTP.Send(strData)

' *********************************************************
' 実処理に必要な認証済みトークンの取得
' *********************************************************
strResult = objHTTP.responseText

aData = Split(strResult,vbLf)
aAuth = Split(aData(2),"=")

' Authorization:
strAuth = "GoogleLogin auth=" & aAuth(1)
Wscript.Echo("ログインの結果" & vbCrLf & vbCrLf & strAuth)


' *********************************************************
' 画像アップロード用データ
' *********************************************************
'strUserid = "ユーザーID"
'strAlbumid = "アルバムID"	' Gata テスト用
target_url = "http://picasaweb.google.com/data/feed/api/user/"
target_url = target_url & strUserid & "/albumid/" & strAlbumid

Call objHTTP.Open( "POST",target_url, False )
Call objHTTP.SetRequestHeader("Authorization", strAuth )
Call objHTTP.SetRequestHeader("Content-Type", strImageType )
Call objHTTP.SetRequestHeader("Slug", strImageTitle )

' 最終バイナリストリーム
StreamBin.Open
StreamBin.Type = 1

' 画像を読み込む
StreamBin.LoadFromFile(strImage)

nLen = StreamBin.Size	' 画像サイズ
StreamBin.Position = 0
strData = StreamBin.Read(nLen)	' バイト配列を取得
StreamBin.Close

Call objHTTP.SetRequestHeader("Content-Length",nLen)

' *********************************************************
' アップロード実行
' *********************************************************
lResolve = 60 * 1000
lConnect = 60 * 1000
lSend = 60 * 1000
lReceive = 60 * 1000
Call objHTTP.setTimeouts(lResolve, lConnect, lSend, lReceive)
Call objHTTP.Send(strData)

' *********************************************************
' 結果の XML( テキスト )
' *********************************************************
Wscript.Echo("結果の XML" & vbCrLf & vbCrLf & objHTTP.responseText)

' *********************************************************
' DOM としてロードして title 取得
' *********************************************************
objDOMDoc.async = False
objDOMDoc.loadXML(objHTTP.responseText)
If (objDOMDoc.parseError.errorCode <> 0) Then
	Wscript.Echo("XMLロードエラー")
Else
	Set objNode = objDOMDoc.getElementsByTagName("title").item(0)
	Wscript.Echo("結果のタイトル" & vbCrLf & vbCrLf & objNode.firstChild.nodeValue)
End If


' ***********************************************************
' 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]
claudebot
24/03/29 17:06:56
InfoBoard Version 1.00 : Language=Perl

1 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