Jump to content
Fivewin Brasil

sygecom

Membros
  • Posts

    814
  • Joined

  • Last visited

  • Days Won

    15

Everything posted by sygecom

  1. Eu sei que muda isso no MY.INI / MY.CNF que fica dentro da instalação do Mysql, mas não lembro o parâmetro. Entre tanto olha a dica do chatgpt: No MySQL, você pode ajustar o parâmetro wait_timeout para controlar o tempo que uma conexão ociosa pode permanecer aberta antes de ser fechada pelo servidor. Este parâmetro especifica o número de segundos de inatividade após os quais uma conexão será fechada automaticamente. Para definir um valor para wait_timeout, você pode executar uma consulta SQL como esta: SET GLOBAL wait_timeout = 300; -- Define o tempo limite de espera para 300 segundos (5 minutos) Isso definirá o tempo limite de espera globalmente para todas as conexões no servidor. Você também pode definir isso no arquivo de configuração do MySQL (por exemplo, my.cnf ou my.ini) para que ele persista entre reinicializações do servidor. Lembre-se de que ajustar esse valor pode afetar o comportamento do seu aplicativo, especialmente se você tiver conexões de longa duração. Certifique-se de ajustá-lo de acordo com as necessidades do seu sistema.
  2. Qual gerenciador de banco de dados está usando ? MYSQL, POSTGRESQL OU .....?
  3. Eu procuraria outras resposta. 1-O que fazer depois que aposentar e, claro que deve valer a pena a ocupação mental e física( fazer o que gosta ) 2-Como se manter $$$ depois que aposentar. Se tivermos essas duas respostas bem definida, o restante já está resolvido.
  4. Eu uso xharbour 1.2.3 Geralmente eu transformo o JSON em HASH e depois procuro no Hash hHash := Hash() cJSON:='{'+; '"message": "Segue documento para assinatura.",'+; '"skip_email": "0",'+; '"workflow": "1"'+; '}' hb_jsondecode( cJSON, @hHash ) // aqui transforma o JSON em HASH IF HHasKey( hHash, 'workflow' ) ? 'EXISTE' ELSE ? 'NÃO EXISTE' ENDIF
  5. Alguem tem a versão 64bits do Bcc 7.70?
  6. sygecom

    ref api

    Visualmente parece que seu JSON está faltando virgulas, tente gerar o JSON e valida nesse site: https://jsonlint.com/ cTexto := '{ ' cTexto += '"id_client": ' + pCpf +"," cTexto += '"id_company": ' + pCnpj+"," cTexto += '"Id_employee": ' + pNome+"," cTexto += '"File": ' + pArquivo cTexto += ' }'
  7. sygecom

    SQLRDD

    Bom dia pessoal. Pra quem não viu ainda, mas todos os fontes do xharbour.com está liberado Open source. Inclusive o SQLRDD https://github.com/ronpinkas/xharbour/tree/main/xHarbourBuilder/xHarbour-SQLRDD
  8. Bom dia Alê, Lembro de você em um evento do Fivewin que aconteceu em Minas, acho que no SESC, foi top aquele evento, por aqui tudo corrido e por ai ? tudo bem ? Segue abaixo o exemplo, como eu disse não está 100% mas da para partir dai para fazer algo bem legal. FUNCTION MyManualReport( cTXT2FR3 ) /* Recebe por parâmetro o arquivo .txt ou .prn para mostrar na tela do fastreport exemplo: c:\syg_temp\relatorio.txt */ local oFrPrn IF !FILE(cTXT2FR3) ShowMsg("Erro ao localizar o arquivo para impressão " +cTXT2FR3 ) RETURN(.F.) ENDIF oFrPrn := frReportManager():new() //oFrPrn:LoadLangRes(PEGA_ARQUIVO_SAGI(1,.T.)) // aqui é o icone da tela oFrPrn:PreviewOptions:SetShowCaptions(.T.) oFrPrn:SetIcon(1001) oFrPrn:SetTitle("Visualizador de Relatórios do Sistema.") oFrPrn:StartManualBuild( { || MyManualReport2(oFrPrn,cTXT2FR3) }, FR_LANDSCAPE, , FR_PIXELS ) oFrPrn:PrepareReport() oFrPrn:ShowPreparedReport() oFrPrn:Clear() oFrPrn:DestroyFR() // detona com o fastreporte e a dll da memoria. oFrPrn:=nil RETURN(.t.) FUNCTION MyManualReport2(oFrPrn,cTXT2FR3) /* Exemplo de uso sem arquivo .FR3 */ local tmp_Name:='', cText_ARQ:='', nLINES:=0, nA:=0, nINIT_LINE:=0, cIMPTEXT:='' //local cLOGO:=ARQUIVOLOGOMARCA() // pega o logotipo do cliente para mostrar no relatorio local cLOGO:='' oFrPrn:SetDefaultFontProperty( "Name", "Arial" ) oFrPrn:SetDefaultFontProperty( "Size", 10 ) IF !EMPTY(cLOGO) oFrPrn:PictureAt( cLOGO , 30, 200, 150, 150 ) nINIT_LINE:=300 ENDIF cText_ARQ := memoread( cTXT2FR3 ) // carrega o TXT nLINES := mlcount( cText_ARQ, 250 ) // total de linhas FOR nA := 1 to nLINES cLINE := MEMOLINE( cText_ARQ, 250, nA, 1, .F., .T. ) IF Left(AllTrim( cLine ), 1 ) == Chr( 15 ) .or. Left( AllTrim(cLine), 1 ) == Chr( 18 ) loop ENDIF If Left(AllTrim(cLine),1)==Chr(12) //SALTO DA PAGINA LOOP //oFrPrn:NewPage() ENDIF IF AT('[',cLine)>0 .OR. AT(']',cLine)>0 cLine:=Stuff(cLine, AT('[',cLine),1,'-') cLine:=Stuff(cLine, AT(']',cLine),1,'-') ENDIF IF !EMPTY(ALLTRIM(cLINE)) //oFrPrn:MemoAt(cLINE, 100, (nA*100)+nINIT_LINE, 350, 50 ) nINIT_LINE:=0 cIMPTEXT:=cIMPTEXT+cLINE+CR_LF //MemoAt(cStr, nLeft, nTop, nWidth, nHeight) ENDIF NEXT oFrPrn:MemoAt(cIMPTEXT, 10, 350, 1500, 1500 ) * tmp_Name := oFrPrn:MemoAt( "Some memo with bottom frame ...", 30, 30, 300, 50 ) * oFrPrn:SetManualObjProperty( tmp_Name + ".Frame", "Typ", "[ftBottom]" ) // oFrPrn:LineAt( 30, 200, 100, 100 ) // oFrPrn:MemoAt( "<-- It's a some line ...", 200, 250, 350, 50 ) // oFrPrn:NewPage() // oFrPrn:MemoAt( "It's a second page..................", 30, 30, 100, 1000 ) RETURN(.T.)
  9. @alex2002 Tenho um exemplo que não está 100% que lê relatórios em TXT para gerar em FASTREPORT, se isso ajuda posso postar aqui.
  10. É um projeto open source https://github.com/blueedgetechno/win11React
  11. Rochina, Acho que os dois últimos post antes do seu são SPAM, mas o ultimo rendeu umas risadas aqui....kkkkkk
  12. @edutraini Se quiser fazer um teste com o sistema abaixo, nele consegue conecta em varias balanças: https://sagierp.com.br/devel/uteis/balancas/balanca-06-10-2020.zip Posso compartilhar o fonte dele, é bem simples. Veja se da certo.
  13. Realmente tem um custo. Se o volume for grande seria bom ir direto para o PRO, que tem IP DEDICADO, isso ajuda muito para definir regras de PROXY nos clientes.
  14. O melhor no meu ponto de vista é partir para algo profissional. Como o SendGrd, que você usa as API deles para envio do e-mail https://sendgrid.com/pricing/
  15. não fico on-line no skype, uso ele raramente. chama no whatsapp: 51-99191-3474
  16. com webhook consegue receber sim as mensagens, no meu caso eu já tinha as api prontas, então foi mais fácil de integrar isso.
  17. FUNCTION WIN32_64BITS if ISWOW64() ShowMsg( "Windows 64 bits" ) else ShowMsg( "Windows 32 bits" ) endif return nil #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); LPFN_ISWOW64PROCESS fnIsWow64Process; HB_FUNC( ISWOW64 ) { BOOL bIsWow64 = FALSE; fnIsWow64Process = ( LPFN_ISWOW64PROCESS ) GetProcAddress( GetModuleHandle( TEXT( "kernel32" ) ), "IsWow64Process" ); if( fnIsWow64Process ) bIsWow64 = ! fnIsWow64Process( GetCurrentProcess(), &bIsWow64 ); hb_retl( bIsWow64 ); } #pragma ENDDUMP
  18. @Marca Acredito que precisa avaliar isso, que citou, crie boas ideias/soluções no seu software que justifique o cliente investir, na integração da MEGA tem um WEBHOOK, que você consegue deixar o cara inclusive falando no chat do sistema como se tivesse no whatsapp. Ainda acho que vale a pena
  19. Sobre jogar os DBF, veja esse app de exemplo abaixo que consegue fazer isso para você. http://www.pctoledo.com.br/forum/filebase.php?d=1&id=158&searchword=sql&what=s&page=1 Sobre MARIADB vs MYSQL, eu ficaria com MARIADB por causa da licença de uso do MYSQL, até onde eu sei, pode ser usado desde que o projeto seja de código aberto. Sobre SQLRDD, fuja dele o quanto antes, vai ficar preso no xHarbour e, isso é um tiro no pé, o Harbour está mais evoluído.
  20. Tenho usado cada vez mais a MEGA API , está muito boa, nunca tivemos problemas e, tem bastante recurso
  21. Comece a usar o Amazon AppStream 2.0 | Virtualização não persistente
  22. Isso está no meio do sistema e e, posso postar aqui, mas não sei se vai ajudar ou atrapalhar, mas segue em anexo para ver se ajuda. Nota: o colega João Alpande que desenvolveu tudo. #include "hwgui_sagi.ch" ********************** #DEFINE httpGet 1 #DEFINE httpPost 2 ********************** /* MEGAAPI API WHATSAPP Manual: https://documenter.getpostman.com/view/7432615/Tzedh4uW#intro Acesso do painel: https://megaapi-painel.com.br/sec_Login/ */ CLASS TWhatsapp_MegaAPI DATA cToken INIT GET_PARAMETRO('SYG_TOKEN_WHATSAPP',.T.) DATA cEndPoint INIT GET_PARAMETRO('SYG_URL_WHATSAPP',.T.) DATA cRet INIT '' DATA hHash INIT Hash() DATA cValue_qrcode INIT '' DATA cFile_qrcode INIT '' METHOD New(nIDUSER) CONSTRUCTOR METHOD PegaConfAPI(lMsg,nNr_Enviou) METHOD ComunicaAPI(oObj,cUrl, nMetodo, cContato, cMsg, cFilename,cTipo_Arq,cNomeArq) METHOD Status(oObj) METHOD OBTER_QRCODE(oObj) METHOD VerSeContatotemWhats(oObj) METHOD Reiniciar(oObj) METHOD Desconectar(oObj) METHOD EnviarMsg(oObj,cContato, cMsg, cFilename,lLink,lMsg,cNomeArq) Method End() INLINE Self := Nil EndClass ************************************** METHOD New(nIDUSER) CLASS TWhatsapp_MegaAPI ************************************** LOCAL aSQL:={} nIDUSER:=IF(nIDUSER=Nil,_pnIDUSER(),nIDUSER) ::cRet := '' ::hHash := Hash() ::cToken := GET_PARAMETRO('SYG_TOKEN_WHATSAPP',.T.) ::cEndPoint := GET_PARAMETRO('SYG_URL_WHATSAPP',.T.) aSQL:=ES("select usa_api_whatsapp, "+; " syg_url_whatsapp, "+; " syg_token_whatsapp, "+; " syg_numero_whatsapp "+; "from sagi_whatsapp_usuario "+; "where id_usuario="+CS(nIDUSER)+ " limit 1 ") IF LEN(aSQL) > 0 IF ALLTRIM(aSQL[1,1]) <> 'DESABILITADO' ::cEndPoint:= aSQL[1,2] ::cToken := aSQL[1,3] ENDIF ENDIF return self *********************************************************** METHOD PegaConfAPI(lMsg,nNr_Enviou) CLASS TWhatsapp_MegaAPI *********************************************************** LOCAL aSQL:={}, lRET:=.F., lSemAPI:=.F. lMsg:=IF(lMsg=Nil,.T.,lMsg) nNr_Enviou:=IF(nNr_Enviou=Nil,'',nNr_Enviou) aSQL:=ES("select usa_api_whatsapp, "+; " syg_url_whatsapp, "+; " syg_token_whatsapp, "+; " syg_numero_whatsapp "+; "from sagi_whatsapp_usuario "+; "where id_usuario="+CS(_pnIDUSER())+ " limit 1 ") IF LEN(aSQL) > 0 IF ALLTRIM(aSQL[1,1]) <> 'DESABILITADO' .AND. ALLTRIM(aSQL[1,2])<>'' .AND. ALLTRIM(aSQL[1,3])<>'' lRET:=.T. nNr_Enviou:=aSQL[1,4] ENDIF IF ALLTRIM(aSQL[1,1]) = 'DESABILITADO' IF !EMPTY(GET_PARAMETRO('SYG_TOKEN_WHATSAPP',.T.)) .AND. !EMPTY(GET_PARAMETRO('SYG_URL_WHATSAPP',.T.)) lRET:=.T. ENDIF ENDIF ELSE IF !EMPTY(GET_PARAMETRO('SYG_TOKEN_WHATSAPP',.T.)) .AND. !EMPTY(GET_PARAMETRO('SYG_URL_WHATSAPP',.T.)) lRET:=.T. ENDIF ENDIF IF !lRET .AND. lMsg ShowMsg("Favor preencher os parâmetros do sistema ou no Usuário com o token e endereço URL para uso do WhatsApp, "+ HB_OsNewLine()+; "caso ainda não tenha contratado o serviço, favor entrar em contato com a Sygecom.") ENDIF Return(lRET) **************************************** METHOD Status(oObj) Class TWhatsapp_MegaAPI **************************************** LOCAL lRET:=.T., cFileQRCode:='', lQrCode:=.F., lConectado:=.F. IF !::PegaConfAPI() RETURN(.T.) ENDIF ::ComunicaAPI(oObj,"/status", httpGet) IF VALTYPE(::hHash) != 'H' RETURN(.T.) ENDIF IF HHasKey( ::hHash, 'accountStatus' ) IF ::hHash['accountStatus'] = .F. lRET:=.F. IF ALLTRIM(::hHash['state']) = 'disconnected' .OR. ALLTRIM(::hHash['state']) = 'connecting' lQrCode:=.T. ENDIF ELSE IF ALLTRIM(::hHash['state']) = 'connected' .OR. ALLTRIM(::hHash['state']) = 'connecting' lConectado:=.T. ENDIF ENDIF IF lConectado cFileQRCode:=PEGA_ARQUIVO_SAGI(1075,.T.) ENDIF IF lQrCode cFileQRCode:=PEGA_ARQUIVO_SAGI(1076,.T.) ENDIF ::cFile_qrcode :=cFileQRCode IF oObj <> Nil oObj:oBitmap1:Hide() IF lConectado .OR. lQrCode oObj:oBitmap1:nStretch:= 0 oObj:oBitmap1:ReplaceBitmap( cFileQRCode , .F. ) ENDIF oObj:oBitmap1:REFRESH() oObj:oBitmap1:SHOW() ENDIF ENDIF Return(lRET) ******************************************************** METHOD OBTER_QRCODE(oObj) Class TWhatsapp_MegaAPI ******************************************************** LOCAL cFileQRCode:='', lRET:=.T. , cQrCodeBase64:='' IF !::PegaConfAPI() RETURN(.T.) ENDIF oObj:oRetorno:SETTEXT("Obtendo QRCode...") oObj:oRetorno:REFRESH() IF ::ComunicaAPI(oObj,'/qrcode', httpGet)=.F. lRET:=.F. ENDIF IF lRET IF 'connected' = ALLTRIM(::hHash['state']) oObj:oRetorno:SETTEXT("Já existe um celular conectado à API. Use Desconectar para sair") oObj:oRetorno:REFRESH() lRET:=.F. ELSEIF 'disconnected'= ALLTRIM(::hHash['state']) cQrCodeBase64:= STRTRAN(::hHash['qrCode'], "data:image/png;base64,") cFileQRCode:= SYG_GERAFILE()+".png" MemoWrit( cFileQRCode , SYG_BASE64DECODE(cQrCodeBase64), .F. ) ::cFile_qrcode :=cFileQRCode ELSE oObj:oRetorno:SETTEXT("Erro ao gerar QR CODE") oObj:oRetorno:REFRESH() lRET:=.F. ENDIF ENDIF Return(lRET) ******************************************************************* METHOD EnviarMsg(oObj,cContato, cMsg, cFilename,lLink,lMsg,cNomeArq) Class TWhatsapp_MegaAPI ******************************************************************* LOCAL cUrl, lRET:=.T., nNr_Enviou:='' LOCAL cRetErro:='',cTipoArq:='' , cExtensao:='' DEFAULT cMsg TO '' DEFAULT cFilename TO '' IF !::PegaConfAPI(lMsg,@nNr_Enviou) RETURN(.T.) ENDIF nNr_Enviou:=IF( ALLTRIM(nNr_Enviou)='' , GET_PARAMETRO('SYG_NUMERO_WHATSAPP',.T.) ,nNr_Enviou) lLink:=IF(lLink=Nil,.F.,lLink) lMsg :=IF(lMsg =Nil,.T.,lMsg ) cNomeArq:=IF(cNomeArq =Nil,'',cNomeArq ) IF EMPTY(cFilename) .AND. EMPTY(cMsg) IF lMsg showmsg('Digite Mensagem ou selecione arquivo para enviar.') ENDIF RETURN(.F.) ENDIF IF EMPTY(cFilename) IF lMsg sygDialogo("Enviando mensagem de texto...") ENDIF cUrl := "/sendmessage" ELSE cExtensao:= UPPER(Subs(cFilename,RAT(".",cFilename)+1)) IF cExtensao= 'PDF' cTipoArq:='PDF' ELSEIF cExtensao='MP3' cTipoArq:='AUDIO' ELSEIF cExtensao='MP4' cTipoArq:='VIDEO' ELSEIF cExtensao='PNG' .OR. cExtensao='BMP' .OR. cExtensao='JPG' .OR. cExtensao='JPEG' cTipoArq:='IMAGEM' ELSE cTipoArq:='LINK' ENDIF IF lMsg sygDialogo("Enviando arquivo...") ENDIF cUrl := IF(lLInk ,"/sendfile", "/sendfilebase64") ENDIF IF ::ComunicaAPI(oObj,cUrl, httpPost, cContato, cMsg, cFilename,cTipoArq,cNomeArq,@cRetErro) = .F. lRET:=.F. IF lMsg Showmsg_Edit("Não Enviou a Mensagem."+hb_osnewline()+ALLTRIM(cRetErro) ) ENDIF ELSE IF oObj = Nil // se não é na tela de teste dos parâmetros IF !EMPTY(cFilename) cMsg:='Enviou arquivo ' + cMsg ENDIF cMsg:= STRTRAN( cMsg , '\n' ,' ') SYG_BEGINTRANSACTION() ES( " insert into sagi_log_whatsapp( nr_enviou, nr_recebeu, mensagem, data, hora, usuario, empresa) " + ; " values ( " + CS( nNr_Enviou) + "," + ; CS( cContato) + "," + ; CS( cMsg ) + "," + ; CS( My_Date() ) + "," + ; CS( Time() ) + "," + ; CS( _Usuario() ) + "," + ; CS( _Filial() ) + ")" ) SYG_ENDTRANSACTION() ENDIF ENDIF IF lMsg sygDialogo() ENDIF Return(lRET) ******************************************** METHOD VerSeContatotemWhats(oObj) Class TWhatsapp_MegaAPI ******************************************** LOCAL cContato:='',cMsg:='',cFilename:='', lRET:=.T. IF !::PegaConfAPI() RETURN(.T.) ENDIF WITH OBJECT oObj cContato:= ALLTRIM(:oTel:VARGET()) cMsg:= ALLTRIM(:oTexto:VARGET()) cFilename:= ALLTRIM(:oArq:VARGET()) END IF ::ComunicaAPI(oObj, "/checknumber", httpPost, '55'+cContato,cMsg,cFilename) = .F. lRET:=.F. ENDIF Return(.t.) ***************************************** METHOD Reiniciar(oObj) Class TWhatsapp_MegaAPI ***************************************** LOCAL lRET:=.T. IF !::PegaConfAPI() RETURN(.T.) ENDIF IF ::ComunicaAPI(oObj,"/takeover", httpGet ) = .F. lRET:=.F. ENDIF IF lRET oObj:oRetorno:SETTEXT("Desconectado") oObj:oRetorno:REFRESH() oOBJ:oBitmap1:Hide() oOBJ:oBitmap1:nStretch:= 0 oOBJ:oBitmap1:ReplaceBitmap( PEGA_ARQUIVO_SAGI(1076,.T.) , .F. ) oOBJ:oBitmap1:REFRESH() oOBJ:oBitmap1:SHOW() ENDIF Return(.t.) ******************************************* METHOD Desconectar(oObj) Class TWhatsapp_MegaAPI ******************************************* LOCAL lRET:=.T. IF !::PegaConfAPI() RETURN(.T.) ENDIF IF !::ComunicaAPI(oObj,"/logout", httpGet) lRET:=.F. ENDIF IF lRET oObj:oRetorno:SETTEXT("Desconectado") oObj:oRetorno:REFRESH() oOBJ:oBitmap1:Hide() oOBJ:oBitmap1:nStretch:= 0 oOBJ:oBitmap1:ReplaceBitmap( PEGA_ARQUIVO_SAGI(1076,.T.) , .F. ) oOBJ:oBitmap1:REFRESH() oOBJ:oBitmap1:SHOW() ENDIF Return(lRET) *********************************************************************************************************************** METHOD ComunicaAPI(oObj,cUrl, nMetodo, cContato, cMsg, cFilename, cTipo_Arq,cNomeArq,cRetErro) Class TWhatsapp_MegaAPI ************************************************************************************************************************ LOCAL cMetodo, oWeb, sContent := '', lRET:=.T., cRETLINK:='' , cJSON:='', cRetorno:='' LOCAL cExtensao:='' , lVerSeTemWhats:=.F. , lQrCode:=.F. IF !::PegaConfAPI() RETURN(.T.) ENDIF cRetErro:=IF(cRetErro=Nil,'',cRetErro) cNomeArq:=IF(cNomeArq=Nil,'',cNomeArq) cTipo_Arq:=IF(cTipo_Arq=Nil,'PDF',cTipo_Arq) IF oObj<> NIl cTipo_Arq:=ALLTRIM(oObj:oTipo_Arq:VARGET()) ENDIF TRY oWeb := xhb_CreateObject("MSXML2.ServerXMLHTTP.6.0") CATCH // NAO FAZ NADA END if oWeb=nil ShowMsg('Erro ao tentar realizar a consulta, favor verificar se as DLL usada para NFe está registradas') RETURN(.F.) endif IF EMPTY(cContato) .AND. nMetodo = httpPost showmsg("Falta telefone de destino") RETURN(.F.) ENDif IF !EMPTY(GET_CONFIG_INI('Proxy','url','')) oWeb:SetProxy( 2, GET_CONFIG_INI('Proxy','url','')+":"+ALLTRIM(STR(GET_CONFIG_INI('Proxy','porta',0)))) IF !EMPTY(GET_CONFIG_INI('Proxy','user','')) oWeb:setProxyCredentials(GET_CONFIG_INI('Proxy','url','')+"\\"+GET_CONFIG_INI('Proxy','user',''), GET_CONFIG_INI('Proxy','pass','')) ENDIF ENDIF IF cUrl = "/checknumber" lVerSeTemWhats:=.T. ENDIF IF ALLTRIM(cUrl) = '/qrcode' lQrCode:=.T. ENDIF cUrl := ALLTRIM(::cEndPoint) + ALLTRIM(cUrl) +"?token=" + ALLTRIM(::cToken) cMetodo := IIF( nMetodo == httpGet, 'GET', 'POST') IF _SemSenha()='N' showmsg_edit(cUrl) ENDIF TRY //https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms760403(v%3Dvs.85) oWeb:setTimeouts(1000*60, 1000*60, 0, 0) // PARAMETRO ZERO É INFINITO oWeb:Open( cMetodo, cUrl, .F.) // True = pra vir o ResponseBody CATCH ShowMSG('ERRO : Não conseguiu abrir o Web Service :'+Ole2TxtError() ) RETURN(.F.) END IF nMetodo = httpPost oWeb:setRequestHeader( "Content-Type", "application/json" ) IF lVerSeTemWhats cJSON:='{'+; '"phone": "' +ALLTRIM(cContato)+'"'+; '}' ELSE IF !EMPTY(cFilename) IF cTipo_Arq <> 'LINK' sContent := MemoRead(cFilename) sContent := SYG_BASE64ENCODE(sContent) sContent := Syg_Limpa( ALLTRIM( sContent ) ) ENDIF cJSON:='{'+; '"phone": "' +ALLTRIM(cContato)+'",' cExtensao:= STRTRAN( LOWER(Subs(cFilename,RAT(".",cFilename)+1)), 'jpg' ,'jpeg') IF !EMPTY(cNomeArq) cNomeArq:= ALLTRIM(cNomeArq)+'.' ELSE cNomeArq:= 'arquivo.' ENDIF cNomeArq+= cExtensao IF cTipo_Arq = 'PDF' cJSON+= '"body": "' +'data:application/pdf;base64,'+ALLTRIM(sContent)+'",' ELSEIF cTipo_Arq = 'IMAGEM' cJSON+= '"body": "' +'data:image/'+cExtensao+';base64,'+ALLTRIM(sContent)+'",' ELSEIF cTipo_Arq = 'AUDIO' cJSON+= '"body": "' +'data:audio/mpeg;base64,'+ALLTRIM(sContent)+'",' ELSEIF cTipo_Arq = 'VIDEO' cJSON+= '"body": "' +'data:video/mp4;base64,'+ALLTRIM(sContent)+'",' ELSEIF cTipo_Arq = 'LINK' cJSON+= '"body": "' +ALLTRIM(cFilename)+'",' ENDIF cJSON+= '"filename":"'+ ALLTRIM(cNomeArq) +'",'+; '"caption":"' +ALLTRIM(cMsg)+'"'+; '}' ELSE IF !EMPTY(cMsg) cJSON:='{'+; '"phone": "' +ALLTRIM(cContato)+'",'+; '"body": "' +ALLTRIM(cMsg)+'"'+; '}' ENDIF ENDIF ENDIF ENDIF TRY IF EMPTY(cJSON) oWeb:Send() ELSE oWeb:Send( cJSON ) ENDIF CATCH lRET:=.F. END IF _SemSenha()='N' .AND. !EMPTY(cJSON) showmsg_edit('JSON: ' + cJSON) ENDIF IF lRET DO WHILE oWeb:readyState <> 4 millisec(500) ENDDO cRETLINK := oWeb:responseText ENDIF IF _SemSenha()='N' showmsg_edit('RESPOSTA: ' + cRETLINK) ENDIF IF !EMPTY(cRETLINK) ::cRet := cRETLINK hb_jsondecode( ::cRet, @::hHash ) IF VALTYPE(::hHash) != 'H' cRetorno:='Algo deu errado, verifique Endereço/token da API' IF oObj<>Nil oObj:oRetorno:SETTEXT(cRetorno) oObj:oRetorno:REFRESH() ENDIF RETURN(.F.) ENDIF IF len(::hHash)<0 cRetorno:='Algo deu errado, verifique Endereço/token da API ou retorno vazio, tente novamente' IF oObj<>Nil oObj:oRetorno:SETTEXT(cRetorno) oObj:oRetorno:REFRESH() ENDIF RETURN(.F.) ENDIF IF HHasKey( ::hHash, 'error' ) cRetorno:="ERRO: "+ALLTRIM(::hHash['error']) cRetErro:="ERRO: "+ALLTRIM(::hHash['error']) lRET:=.F. ENDIF IF !lQrCode IF HHasKey( ::hHash, 'accountStatus' ) IF ::hHash['accountStatus'] lRET:=.T. ELSE lRET:=.F. cRetErro:="ERRO: "+IF(HHasKey( ::hHash, 'message' ) , ALLTRIM(::hHash['message']),'') ENDIF ENDIF ENDIF IF lRET cRetorno:= IF(HHasKey( ::hHash, 'state' ) , ALLTRIM(::hHash['state']),'') + ' ' +; IF(HHasKey( ::hHash, 'message' ) , ALLTRIM(::hHash['message']),'') ENDIF ELSE RETURN(.F.) ENDIF IF oObj<>Nil oObj:oRetorno:SETTEXT(cRetorno) oObj:oRetorno:REFRESH() ELSE // showmsg_edit(cRetorno) ENDIF oWeb:=NIL RETURN(lRET)
  23. Na Amazon, tem vários recursos voltado a segurança. Você pode inclusive gerar um link com acesso a mult-fator de acesso, vale a pena estudar muito os recursos da Amazon. Proteção de dados noAWSStorage Gateway - AWS Storage Gateway (amazon.com)
×
×
  • Create New...