Pessoal caso alguém queira fazer o backup no dropBox, eu consegui fazendo assim com estas funções abaixo:
Código: Selecionar todos
********************************************************************************
FUNCTION DropBox_UpLoad( cFile )
********************************************************************************
LOCAL cUrl := "https://content.dropboxapi.com/2/files/upload"
LOCAL cBuffer, nBytes, aBlocks, cFilePath := ''
LOCAL cPath, cFileName, cExtension, cAno := '', cMes := ''
if !InternetOK() //Verifica se tem internet
MsgInfo('Sem conexão com a internet','Atenção')
Return .T.
endif
if empty(Dropbox_AccessToken)
Return .T.
endif
if !File(cFile)
Return .F.
endif
Atualiza_MsgProc('Aguarde, processando o upload')
cAno := strzero(year(Date()),4)
cMes := strzero(Month(Date()),2)
DropBox_Creat_Folder( cAno ) //Cria uma pasta dentro do DropBox
DropBox_Creat_Folder( cAno + '/' + cMes ) //Cria uma sub-pasta dentro do DropBox
HB_FNameSplit( cFile, @cPath, @cFileName, @cExtension ) //Pega o nome do arquivo e a extensão
cFilePath := cAno + '/' + cMes + '/' + cFileName + cExtension + '.base64' //Cria um nome para o arquivo zipado
nTamanhoBk := FileSize(cFile) //Retorna o tamanho do arquivo que irá subir
aRetorno := DropBox_Get_SPace() //Retorna o espaço no DropBox
if nTamanhoBk > aRetorno[3] //Compara o tamanho do Arquivo com o espaço liberado no DropBox
AbrePadrao('https://www.dropbox.com') //Abre o site do DropBox com o navegador padrão
MsgInfo("Espaço insuficiente no Dropbox"+LF+;
"Por favor, apague alguns arquivos para liberar espaço.","Atenção")
aRetorno := DropBox_Get_SPace() //Retorna o espaço no DropBox
if nTamanhoBk > aRetorno[3] //Verifica novamente se o espaço liberado é suficiente
Msginfo('upload do arquivo falhou,espaço insuficiente.','Atenção')
Return .f.
endif
endif
TRY
oServer:=CreateObject( "MSXML2.ServerXMLHTTP" )
oServer:open("POST", cUrl, .F.)
oServer:setRequestHeader("Authorization" , "Bearer " + Dropbox_AccessToken )
oServer:setRequestHeader("User-Agent" , 'api-explorer-client' )
oServer:setRequestHeader("Content-Type" , 'application/octet-stream' )
oServer:setRequestHeader("Dropbox-API-Arg" , '{"path":"/'+cFilePath+'","mode":{".tag":"add"},"autorename":true,"mute":true,"strict_conflict":true}' )
CATCH
MsgInfo("Houve falha na internet!!",'Atenção')
MsgProcFim()
Return .t.
END
//Daqui para baixo faz a leitura do arquivo que será zipado com Base64
nFileHandle := FOpen( cFile )
nFileSize := 0
IF FError() <> 0
Return .F.
ENDIF
nFileSize := FSeek( nFileHandle, 0, FS_END )
cStream := Space( nFileSize )
FSeek( nFileHandle, 0, FS_SET )
FRead( nFileHandle, @cStream, nFileSize )
FClose( nFileHandle )
oServer:send( HB_Base64Encode( cStream, len(cStream) ) ) //Envia o arquivo para o DropBox
if oServer:Status == 200 //Status de retorno, 200 OK
Msginfo('Upload do arquivo enviado com sucesso.','Atenção')
else
if oServer:Status == 401 .or. oServer:Status == 400
Msginfo('Token expirado, favor renovar o Token no site do DropBox','Atenção')
cAccessToken := ""
if empty(Dropbox_AppKey)
AbrePadrao('https://www.dropbox.com/developers/apps/') //Abre o navegador padrão para o usuario gerar o token de acesso
else
AbrePadrao('https://www.dropbox.com/developers/apps/info/'+alltrim(Dropbox_AppKey))
endif
MsgGet("Informar Access Token","Access Token", "@x", "X", @cAccessToken ) //Informa aqui o token gerado no site para continuar
if !empty(cAccessToken)
//Grava o token de acesso no banco de dados
oSql:StartTransaction()
oSql:EXECUTE( "update param_integra set dropbox_token='"+cAccessToken+" ' ")
oSql:Commit()
Dropbox_AccessToken := cAccessToken
DropBox_UpLoad( cFile ) //Envia o arquivo para o DropBox
endif
else
cError := Http_Error_Descricao(oServer:Status) //Pesquisa a descrição do status retornado
Msginfo('Falha no envio do arquivo' + LF +;
'Código do retorno: ' + alltrim(str(oServer:Status)) + if(empty(cError),'',' - '+cError),'UpLoad')
endif
Return .F.
endif
RETURN .T.
********************************************************************************
Function DropBox_Download( cFile,cCaminho )
********************************************************************************
*cFile = Nome do arquivo que será baixado do DropBox
*cCaminho = Pasta dentro o DropBox onde o arquivo foi gravado
********************************************************************************
Local cUrl := 'https://content.dropboxapi.com/2/files/download'
LOCAL cPath, cFileName, cExtension
if !InternetOK() //Verifica sem tem internet
MsgInfo('Sem conexão com a internet','Atenção')
Return .T.
endif
if empty(Dropbox_AccessToken)
Return .T.
endif
Atualiza_MsgProc('Aguarde, processando o Download')
HB_FNameSplit( cFile, @cPath, @cFileName, @cExtension ) //Pega o nome do arquivo e a extensão
cFilePath := cFileName + cExtension + '.base64' //Nome do arquivo no DropBox que subiu zipado
if !empty(cCaminho)
cCaminho := cCaminho+'/'
endif
TRY
oServer:=CreateObject( "MSXML2.ServerXMLHTTP" )
oServer:open("POST", cUrl, .F.)
oServer:setRequestHeader("User-Agent" , "api-explorer-client" )
oServer:setRequestHeader("Authorization" , "Bearer " + Dropbox_AccessToken )
oServer:setRequestHeader("Dropbox-API-Arg" , '{"path":"/'+cCaminho+ cFilePath + '"}' )
oServer:send() //Envia a solicitação
CATCH
MsgInfo("Houve falha na internet!!",'Atenção')
MsgProcFim()
Return .t.
END
MemoWrit( cFile, HB_Base64Decode( oServer:ResponseText ), .F. ) //Grava o arquivo retornado na pasta
MsgProcFim()
if oServer:Status != 200 //Status de retorno do site
if oServer:Status == 401
Msginfo('Token expirado, favor renovar o Token no site do DropBox','Atenção')
AbrePadrao('https://www.dropbox.com/developers/apps/')
else
cError := Http_Error_Descricao(oServer:Status) //Pesquisa a descrição do status retornado
Msginfo('Falha no download do arquivo' + LF +;
'Código do retorno: ' + alltrim(str(oServer:Status)) + if(empty(cError),'',' - '+cError),'Download')
Return .F.
endif
elseif oServer:Status == 200
Msginfo('Download do arquivo com sucesso.' ,'Download')
endif
Enddialog() //Fecha a janela
Return .T.
********************************************************************************
Function DropBox_List_Folder( cPasta,oBrowse1 ) //Lista as pastas que existe no DropBox
********************************************************************************
Local cUrl := 'https://api.dropboxapi.com/2/files/list_folder', cRetorno := '',;
cPath, cFileName, cExtension, aRetorno := {}, aDados := {}
Local cAccessToken := space(200)
Default cPasta := '' //Pasta dentro do DropBox, caso for vazia ele listará a pasta principal
if !InternetOK() //Verifica se tem internet
MsgInfo('Sem conexão com a internet','Atenção')
Return .T.
endif
if empty(Dropbox_AccessToken)
Return .f.
endif
Atualiza_MsgProc('Aguarde, buscando a lista de arquivos')
cBody := '{ "path": "' + if(empty(cPasta),'','/'+cPasta) + '" }'
TRY
oServer:=CreateObject( "MSXML2.ServerXMLHTTP" )
oServer:open("POST", cUrl, .F.)
oServer:setRequestHeader("User-Agent" , "api-explorer-client" )
oServer:setRequestHeader("Authorization" , "Bearer " + Dropbox_AccessToken )
oServer:setRequestHeader("Content-Type" , 'application/json' )
oServer:send( cBody )
CATCH
MsgInfo("Houve falha na internet!!",'Atenção')
MsgProcFim()
Return .t.
END
MsgProcFim()
if oServer:Status == 200
oBrowse1:aArray := {}
oBrowse1:Refresh()
hb_jsondecode(oServer:ResponseBody, @aRetorno) //Cria json de retorno
For X := 1 to len(aRetorno['entries']) //Lista as pastas
if right(aRetorno['entries'][X]['name'],7) == '.base64' //Aqui lista os arquivos que foram enviado com Base64
aadd(oBrowse1:aArray , {substr(aRetorno['entries'][X]['name'],1,at('.base64',aRetorno['entries'][X]['name'])-1),;
dtoc(stod(charrem('-',left(aRetorno['entries'][X]['client_modified'],10))))+substr(aRetorno['entries'][X]['client_modified'],11),;
aRetorno['entries'][X]['size'],cPasta})
else
aadd(oBrowse1:aArray , {aRetorno['entries'][X]['name'],; //Aqui lista as pastas
'',;
0,cPasta})
endif
Next
else
if oServer:Status == 401
Msginfo('Token expirado, favor renovar o Token no site do DropBox','Atenção')
if empty(Dropbox_AppKey)
AbrePadrao('https://www.dropbox.com/developers/apps/')
else
AbrePadrao('https://www.dropbox.com/developers/apps/info/'+alltrim(Dropbox_AppKey))
endif
MsgGet("Informar Access Token","Access Token", "@x", "X", @cAccessToken )
if !empty(cAccessToken)
oSql:StartTransaction()
oSql:EXECUTE( "update param_integra set dropbox_token='"+cAccessToken+" ' ")
oSql:Commit()
Dropbox_AccessToken := cAccessToken
endif
else
cError := Http_Error_Descricao(oServer:Status) //Pesquisa a descrição do status retornado
if oServer:Status == 409
Msginfo('Falha ao listar a pasta' + LF +;
'Nenhum arquivo encontrado'+ LF +;
'Código do retorno: ' + alltrim(str(oServer:Status)) + if(empty(cError),'',' - '+cError),'List Folder')
else
Msginfo('Falha ao listar a pasta' + LF +;
'Código do retorno: ' + alltrim(str(oServer:Status)) + if(empty(cError),'',' - '+cError),'List Folder')
endif
endif
Return .f.
endif
Return .t.
********************************************************************************
Function Seleciona_Arquivo()
********************************************************************************
LOCAL oDlg, oShape[2], oLbTitulo, oLbRodape, oButtonex[3], oBrowse1, cRetorno := ''
LOCAL oCombo[2],vCombo[2],oLabel[2],aDados := {} ,aAno := {},aMes := {}
for x:= 2023 to YEAR(Date())
aadd(aAno,alltrim(str(x)))
next
AADD(aMes, 'Janeiro' )
AADD(aMes, 'Fevereiro')
AADD(aMes, 'Março' )
AADD(aMes, 'Abril' )
AADD(aMes, 'Maio' )
AADD(aMes, 'Junho' )
AADD(aMes, 'Julho' )
AADD(aMes, 'Agosto' )
AADD(aMes, 'Setembro' )
AADD(aMes, 'Outubro' )
AADD(aMes, 'Novembro' )
AADD(aMes, 'Dezembro' )
vCombo[1] := ascan(aAno,alltrim(str( YEAR(Date() ))))
vCombo[2] := Month( Date() )
INIT DIALOG oDlg TITLE "" ICON oIcon AT 0, 0 SIZE 819,526 CLIPPER NOEXIT ;
STYLE WS_POPUP+WS_CAPTION+WS_SYSMENU+DS_CENTER
@ -3,-3 SHAPE oShape[1] SIZE 841,75 ;
BACKCOLOR nCorFundo ;
CURVATURE 0 BORDERSTYLE 0 FILLSTYLE 10
@ 5,10 SAY oLbTitulo CAPTION "Lista dos Arquivos" /*+ if(empty(cPasta),'',' da pasta ' + cPasta) */ SIZE 707,53 ;
STYLE DT_VCENTER+DT_SINGLELINE;
COLOR nCorLetra BACKCOLOR nCorFundo ;
FONT HFont():Add( 'Arial',0,-35,400,,,)
@ 22,81 SAY oLabel[1] CAPTION "Ano" SIZE 29,22
@ 52,80 GET COMBOBOX oCombo[1] VAR vCombo[1] ;
ITEMS aAno ;
SIZE 110,24
@ 173,81 SAY oLabel[2] CAPTION "Mês" SIZE 31,21
@ 205,79 GET COMBOBOX oCombo[2] VAR vCombo[2] ;
ITEMS aMes ;
SIZE 110,24
@ 324,74 BUTTONEX oButtonex[3] CAPTION "Pesquisar" SIZE 89,32 ;
STYLE BS_CENTER +WS_TABSTOP ;
ON CLICK {|| DropBox_List_Folder(aAno[vCombo[1]]+'/'+strzero(vCombo[2],2) ,@oBrowse1 ),oBrowse1:Refresh() }
@ 6,120 BROWSE oBrowse1 ARRAY SIZE 806,266 STYLE WS_TABSTOP
oBrowse1:aArray := aDados
oBrowse1:bColorSel := nCorFundo
oBrowse1:AddColumn( HColumn():New('Arquivo', ColumnArBlock() ,'C',50, 0 ,.F.,1,0,'@!',,,,,,,,,))
oBrowse1:AddColumn( HColumn():New('Data' , ColumnArBlock() ,'C',20, 0 ,.F.,1,1,'@!',,,,,,,,,))
oBrowse1:AddColumn( HColumn():New('Tamanho', ColumnArBlock() ,'N',10, 0 ,.F.,1,1,'9999999999',,,,,,,,,))
@ -3,455 SHAPE oShape[2] SIZE 841,75 ;
BACKCOLOR nCorFundo ;
CURVATURE 0 BORDERSTYLE 0 FILLSTYLE 10
@ 5,466 SAY oLbRodape CAPTION "Selecione um arquivo" SIZE 583,53 ;
STYLE DT_VCENTER+DT_SINGLELINE;
COLOR nCorLetra BACKCOLOR nCorFundo ;
FONT HFont():Add( 'Arial',0,-24,400,,,)
@ 605,473 BUTTONEX oButtonex[1] CAPTION "&Seleciona" SIZE 98,32 ;
STYLE BS_CENTER +WS_TABSTOP ;
ON CLICK {|| if(len(oBrowse1:aArray) <= 0,.t. , DropBox_Download(alltrim(oBrowse1:aArray[oBrowse1:nCurrent][1]),oBrowse1:aArray[oBrowse1:nCurrent][4])) }
@ 708,473 BUTTONEX oButtonex[2] CAPTION "C&ancela" SIZE 98,32 ;
STYLE BS_CENTER +WS_TABSTOP ;
ON CLICK {|| Enddialog() }
ACTIVATE DIALOG oDlg
Return cRetorno
********************************************************************************
Function DropBox_Creat_Folder( cPasta ) //Cria pastas no DropBox
********************************************************************************
Local cUrl := 'https://api.dropboxapi.com/2/files/create_folder_v2'
if !InternetOK()
MsgInfo('Sem conexão com a internet','Atenção')
Return .T.
endif
if empty( Dropbox_AccessToken ) .or.;
empty( cPasta )
Return .T.
endif
Atualiza_MsgProc('Aguarde, Criando a pasta no DropBox')
cPath := '{ "path": "/' + alltrim(cPasta) + '" }'
TRY
oServer:=CreateObject( "MSXML2.ServerXMLHTTP" )
oServer:open("POST", cUrl, .F.)
oServer:setRequestHeader("User-Agent" , "Datarey" )
oServer:setRequestHeader("Authorization" , "Bearer " + Dropbox_AccessToken )
oServer:setRequestHeader("Content-Type" , 'application/json' )
oServer:send(cPath)
CATCH
MsgInfo("Houve falha na internet!!",'Atenção')
MsgProcFim()
Return .t.
END
MsgProcFim()
if oServer:Status == 200
//Msginfo('Pasta criada com sucesso','Atenção')
else
//cError := Http_Error_Descricao(oServer:Status) //Pesquisa a descrição do status retornado
//Msginfo('Falha na consulta' + LF +;
// 'Código do retorno: ' + alltrim(str(oServer:Status)) + if(empty(cError),'',' - '+cError),'Atenção')
//Return .F.
endif
Return .T.
********************************************************************************
Function DropBox_Get_SPace() //Retorna a Capacidade de armazenamento e espaço ocupado
********************************************************************************
Local cUrl := 'https://api.dropboxapi.com/2/users/get_space_usage',;
aRetorno[3]
aRetorno[1] := 0 //Capacidade total de armazenamento
aRetorno[2] := 0 //Espaço já utilizado
aRetorno[3] := 0 //Espaço ainda Disponivel
if !InternetOK()
MsgInfo('Sem conexão com a internet','Atenção')
Return aRetorno
endif
if empty( Dropbox_AccessToken )
Return aRetorno
endif
Atualiza_MsgProc('Aguarde, Consultando a capacidade no DropBox')
TRY
oServer:=CreateObject( "MSXML2.ServerXMLHTTP" )
oServer:open("POST", cUrl, .F.)
oServer:setRequestHeader("User-Agent" , "Datarey" )
oServer:setRequestHeader("Authorization" , "Bearer " + Dropbox_AccessToken )
oServer:setRequestHeader("Content-Type" , 'application/json' )
oServer:send('null')
CATCH
MsgInfo("Houve falha na internet!!",'Atenção')
MsgProcFim()
Return aRetorno
END
MsgProcFim()
if oServer:Status == 200
aRetorno_cons := {}
hb_jsondecode(oServer:ResponseBody, @aRetorno_cons)
aRetorno[1] := aRetorno_cons['allocation']['allocated']
aRetorno[2] := aRetorno_cons['used']
aRetorno[3] := aRetorno[1] - aRetorno[2]
else
if oServer:Status == 401
Msginfo('Token expirado, favor renovar o Token no site do DropBox','Atenção')
cAccessToken := ""
if empty(Dropbox_AppKey)
AbrePadrao('https://www.dropbox.com/developers/apps/')
else
AbrePadrao('https://www.dropbox.com/developers/apps/info/'+alltrim(Dropbox_AppKey))
endif
MsgGet("Informar Access Token","Access Token", "@x", "X", @cAccessToken )
if !empty(cAccessToken)
oSql:StartTransaction()
oSql:EXECUTE( "update param_integra set dropbox_token='"+cAccessToken+" ' ")
oSql:Commit()
Dropbox_AccessToken := cAccessToken
endif
else
cError := Http_Error_Descricao(oServer:Status) //Pesquisa a descrição do status retornado
Msginfo('Falha na consulta da capacidade' + LF +;
'Código do retorno: ' + alltrim(str(oServer:Status)) + if(empty(cError),'',' - '+cError),'Get_Space')
endif
Return aRetorno
endif
Return aRetorno
********************************************************************************
Function DropBox_Get_Current_Account() //Lista os dados da conta logada
********************************************************************************
Local cUrl := 'https://api.dropboxapi.com/2/users/get_current_account',;
cNome := '', cEmail := ''
if !InternetOK()
MsgInfo('Sem conexão com a internet','Atenção')
Return .T.
endif
if empty( Dropbox_AccessToken )
Return .T.
endif
Atualiza_MsgProc('Aguarde, Consultando a capacidade no DropBox')
TRY
oServer:=CreateObject( "MSXML2.ServerXMLHTTP" )
oServer:open("POST", cUrl, .F.)
oServer:setRequestHeader("User-Agent" , "Datarey" )
oServer:setRequestHeader("Authorization" , "Bearer " + Dropbox_AccessToken )
oServer:setRequestHeader("Content-Type" , 'application/json' )
oServer:send('null')
CATCH
MsgInfo("Houve falha na internet!!",'Atenção')
MsgProcFim()
Return .t.
END
MsgProcFim()
if oServer:Status == 200
aRetorno_cons := {}
hb_jsondecode(oServer:ResponseBody, @aRetorno_cons)
cName := aRetorno_cons['name']['display_name']
cEmail := aRetorno_cons['email']
Msginfo('Nome: ' + cName + LF +;
'E-mail: ' + cEmail,'Atenção')
else
if oServer:Status == 401
Msginfo('Token expirado, favor renovar o Token no site do DropBox','Atenção')
AbrePadrao('https://www.dropbox.com/developers/apps/')
else
cError := Http_Error_Descricao(oServer:Status) //Pesquisa a descrição do status retornado
Msginfo('Falha na consulta do usuário logado' + LF +;
'Código do retorno: ' + alltrim(str(oServer:Status)) + if(empty(cError),'',' - '+cError),'Atenção')
endif
Return .F.
endif
Return .T.