前回はSkyDrive APIを利用してドラッグ&ドロップしたファイルをSkyDrive上のフォルダーにアップするVBScriptを紹介しましたが、今回は逆にSkyDrive上のフォルダーからファイルをダウンロードするVBScriptを紹介します。
※ MicrosoftアカウントとAPIの利用に必要なクライアント IDの取得方法は前回の記事をご参照ください。
Option Explicit Dim IE Dim FlgIeQuit Dim ParamGet Dim AccessToken Dim AuthenticationToken Dim ExpiresIn Dim DateExpires '--------------------------------------------------------------------- '※ 要変更 '--------------------------------------------------------------------- Const FOLDER_NAME = "サンプルフォルダー" 'クライアント ID Const CLIENT_ID = "****************" 'リダイレクト ドメイン(API設定で自分でドメインを指定した場合のみ変更) Const REDIRECT_URL = "https://oauth.live.com/desktop" '--------------------------------------------------------------------- Init '初期化 DownloadSkyDriveFile MsgBox "処理が終了しました。", 64 + 4096 Private Sub Init() '各変数初期化 FlgIeQuit = 0 ParamGet = "" AccessToken = "" AuthenticationToken = "" ExpiresIn = "" DateExpires = "" End Sub Private Sub DownloadSkyDriveFile() 'SkyDriveFileからファイルをダウンロード Dim filePath Dim filesInfo Dim idFolder Dim v, vv Dim i If (DateExpires <> "") And (Now() < DateExpires) Then Else AuthenticateSkyDrive '認証 End If If AccessToken = "" Then MsgBox "アクセストークンの取得に失敗しました。", 16 + 4096 Exit Sub End If 'フォルダーの確認 idFolder = GetSkyDriveFolderId(AccessToken, FOLDER_NAME) If (idFolder = "NoFolder") Or (idFolder = "Err") Or Len(idFolder) < 1 Then MsgBox "SkyDriveフォルダーが見つかりませんでした。", 16 + 4096 Exit Sub End If 'ファイルの確認 filesInfo = GetFilesInfo(AccessToken, idFolder) If (filesInfo = "NoFile") Or (filesInfo = "Err") Or Len(filesInfo) < 1 Then MsgBox "ファイルが見つかりませんでした。", 16 + 4096 Exit Sub End If filePath = CreateObject("WScript.Shell").SpecialFolders("Desktop") & ChrW(92) 'ファイルの保存先:デスクトップ v = Split(filesInfo, vbCrLf) For i = LBound(v) To UBound(v) vv = Split(v(i), ";") DownloadFile filePath & vv(0), vv(1) Next End Sub Private Sub AuthenticateSkyDrive() 'SkyDrive認証 Dim url Dim scope Dim timeLimit Set IE = Nothing '初期化 scope = "wl.skydrive_update wl.offline_access" url = "http://oauth.live.com/authorize?locale=ja&display=page&client_id=" & EncodeURL(CLIENT_ID) & "&scope=" & EncodeURL(scope) & "&response_type=token&redirect_uri=" & EncodeURL(REDIRECT_URL) Set IE = WScript.CreateObject("InternetExplorer.Application", "IE_") On Error Resume Next With IE .Visible = True .Toolbar = False .AddressBar = False .MenuBar = False .Top = 50 .Left = 200 .Width = 400 .Height = 500 .Navigate url 'While .Busy Or .readyState <> 4 ' WScript.Sleep 100 'Wend timeLimit = DateAdd("s", 60, Now()) 'ループの制限時間:60秒 Do WScript.Sleep 100 If FlgIeQuit = 1 Then Exit Do If Now() > timeLimit Then Exit Do '制限時間を過ぎたらループを抜ける Loop While ParamGet = "" If FlgIeQuit = 0 Then .Quit End With If Err.Number <> 0 Then MsgBox "エラーが発生しました。" & vbCrLf & "内容:" & Err.Description, 16 + 4096 Exit Sub End If On Error GoTo 0 If ParamGet = "" Then MsgBox "ユーザー認証に失敗しました。", 16 + 4096 Exit Sub End If GetToken ParamGet End Sub Private Sub GetToken(ByVal param) '各トークン取得 Dim v, vv Dim i param = Replace(param, REDIRECT_URL & "#", "") v = Split(param, "&") For i = LBound(v) To UBound(v) vv = Split(v(i), "=") Select Case LCase(Trim(vv(0))) Case "access_token": AccessToken = vv(1) Case "expires_in": ExpiresIn = vv(1): DateExpires = DateAdd("s", CDbl(ExpiresIn), Now()) 'アクセストークンの有効時間設定 Case "authentication_token": AuthenticationToken = vv(1) End Select Next End Sub Private Sub DownloadFile(ByVal filePath, ByVal url) 'ファイルダウンロード Dim dat Const adTypeBinary = 1 On Error Resume Next With CreateObject("Scripting.FileSystemObject") If .FileExists(filePath) Then .DeleteFile filePath End With With CreateObject("MSXML2.XMLHTTP") .Open "GET", url, False .send If .Status = 200 Then dat = .responseBody With CreateObject("ADODB.Stream") .Type = adTypeBinary .Open .Write dat .SaveToFile filePath .Close End With Else MsgBox "ファイル保存処理が失敗しました。", 16 + 4096 Exit Sub End If End With If Err.Number <> 0 Then Err.Clear: MsgBox "ファイル保存処理が失敗しました。", 16 + 4096: Exit Sub On Error GoTo 0 End Sub Private Function GetSkyDriveFolderId(ByVal code, ByVal fn) 'SkyDriveのフォルダーID取得 'フォルダーなし:NoFolder, フォルダーあり:id, エラー:Err Dim ret Dim js Dim scr Dim d Dim elm js = "": ret = "NoFolder" '初期化 On Error Resume Next With CreateObject("MSXML2.XMLHTTP") .Open "GET", "https://apis.live.net/v5.0/me/skydrive/files", False .setRequestHeader "Authorization", "Bearer " & code .send If .Status = 200 Then js = .responseText End With If Len(js) > 0 Then js = Replace(js, vbCr, "") js = Replace(js, vbLf, "") js = Replace(js, vbCrLf, "") js = "(" & js & ")" Set d = CreateObject("htmlfile") Set elm = d.createElement("span") elm.setAttribute "id", "result" d.appendChild elm scr = "var objects= eval('" & js & "').data;" scr = scr & "for(var i in objects){" scr = scr & " if(objects[i].type=='folder' && objects[i].name=='" & fn & "'){" scr = scr & " document.getElementById('result').innerText=objects[i].id;" scr = scr & " }" scr = scr & "}" d.parentWindow.execScript scr If Len(elm.innerText) > 0 Then ret = elm.innerText End If If Err.Number <> 0 Then Err.Clear: ret = "Err" On Error GoTo 0 GetSkyDriveFolderId = ret End Function Private Function GetFilesInfo(ByVal code, ByVal id) 'SkyDriveのファイル情報(ファイル名,URL)取得 'ファイルなし:NoFile, ファイルあり:ファイル名;URL, エラー:Err Dim ret Dim js Dim scr Dim d Dim elm js = "": ret = "NoFile" '初期化 On Error Resume Next With CreateObject("MSXML2.XMLHTTP") .Open "GET", "https://apis.live.net/v5.0/" & id & "/files/", False .setRequestHeader "Authorization", "Bearer " & code .send If .Status = 200 Then js = .responseText End With If Len(js) > 0 Then js = Replace(js, vbCr, "") js = Replace(js, vbLf, "") js = Replace(js, vbCrLf, "") js = "(" & js & ")" Set d = CreateObject("htmlfile") Set elm = d.createElement("span") elm.setAttribute "id", "result" d.appendChild elm scr = "var objects= eval('" & js & "').data;" scr = scr & "var j=0;" scr = scr & "for(var i in objects){" scr = scr & " if(objects[i].type=='file'){" scr = scr & " if(j==0){" scr = scr & " document.getElementById('result').innerText=objects[i].name+"";""+objects[i].source;" scr = scr & " }else{" scr = scr & " document.getElementById('result').innerText=document.getElementById('result').innerText+""\n""+objects[i].name+"";""+objects[i].source;" scr = scr & " }" scr = scr & " j++;" scr = scr & " }" scr = scr & "}" d.parentWindow.execScript scr If Len(elm.innerText) > 0 Then ret = elm.innerText End If If Err.Number <> 0 Then Err.Clear: ret = "Err" On Error GoTo 0 GetFilesInfo = ret End Function Private Function EncodeURL(ByVal sWord) Dim d Dim elm sWord = Replace(sWord, "\", "\\") sWord = Replace(sWord, "'", "\'") Set d = CreateObject("htmlfile") Set elm = d.createElement("span") elm.setAttribute "id", "result" d.appendChild elm d.parentWindow.execScript "document.getElementById('result').innerText=encodeURIComponent('" & sWord & "');" EncodeURL = elm.innerText End Function Public Sub IE_DocumentComplete(ByVal pDisp, url) If InStr(url, REDIRECT_URL & "#access_token=") Then ParamGet = url End Sub Public Sub IE_OnQuit() FlgIeQuit = 1 End Sub
上記スクリプトを実行すると、”FOLDER_NAME“で指定したSkyDriveフォルダー内のファイルをデスクトップにダウンロードします。
この記事へのコメントはありません。