por fladimir » 29 Mar 2020 14:09
Passando para compartilhar uma API Whatsapp q conheci através do fórum do ACBr.
Sem custo mensal nem limite de mensagens... [url=https://documenter.getpostman.com/view/4545782/SWTHbveC?version=latest#intro]segue link da documentação[/url]
Vc vincula o Whats do cliente na API e ele usa, logicamente respeitando as regras do Whats para SPAM etc, e consegue enviar arquivos etc.
Fiz uns videos e compartilhei um exemplo de como integrar (mas em outra linguagem) porém como é via GET e POST da pra fazer tranquilo em Harbour/Fivewin.
Só uma observação, se vc trabalha puramente com CONSOLE terá q ver como fazer pq um dos requisitos é obter o QRCode e carregar isso pro usuario do teu sistema vincular o Whats dele (igual Whatsweb)
Não comprei a API ainda, mas tenho conhecidos q usam, ela esta ativa a 3 anos. No link abaixo vc encontra os vídeos, informações e o contato do criador da mesma (telefone dele) e tb manual de utilização.
Ele liberou um ENDPOINT e Token pra uso e esta funcionando aki nos testes
[b]O bacana é q vc pode comprar a API e usar na tua carteira de clientes. [/b]
A API estava com promoção até este final de semana, achei ela no fórum do ACBr a promoção era até dia 13/03 ai conversei com o Hendell criador e falei q não tinha conhecimento da mesma onde o mesmo estendeu a promoção até este final de semana.
[url=https://wxdev.com.br/forum/index.php?/forum/20-dicas-e-truques/]Link da postagem em q fiz em outro fórum com os vídeos demonstrando e o contato do criador da API[/url]
Fiz uma classe pra Harbour pra testes e funcionou bem tb... só tem a questão do QRCode q vc tem usar alguma lib grafica pra carregar e mostrar isso pro cliente.
Vou compartilhar a classe (agradecimentos ao Oliveira q usa a API e cedeu um trecho de código q permitiu a criação da classe a partir do trecho, logicamente q alterado e ajustado a minha realidade)
[code]********************************************************************************
FUNCTION EXEMPLO_API_WHATS()
LOCAL oWhats := TWhatsappAPI_WTS():New()
oWhats:Situacao()
oWhats:NivelBateria()
oWhats:NrConectado()
oWhats:EnviarMsg('5567992354872', 'Teste *mensagem*')
oWhats:EnviarMsg('5567992354872', NIL, 'd:\documento.pdf') ; Inkey(2) // PAUSAR UNS 2 SEGUNDOS ENTRE UMA MENSAGEM E OUTRA
oWhats:EnviarMsg('5567992354872', NIL, 'd:\imagem.png') ; Inkey(2)
oWhats:End()
Quit()
********************************************************************************
#DEFINE httpGet 1
#DEFINE httpPost 2
********************************************************************************
CLASS TWhatsappAPI_WTS
DATA sToken INIT 'O TOKEN Q VC ADQUIRIR OU PEDE PRO HENDELL PRA TESTES'
DATA sEndPoint INIT 'URL DO ENDPOINT Q ELE FORNECE PRA TESTES QDO VC TIVER O SEU SERA O SEU URL, VC NAO USA ESTRUTURA DELE E SIM A SUA'
DATA sRet INIT ''
DATA hHash INIT hb_Hash()
DATA nMetodo INIT 0 // 1 GET 2 POST
METHOD ComunicaAPI()
METHOD Situacao()
METHOD Obter_QRCode()
METHOD NrConectado()
METHOD NivelBateria()
METHOD EnviarMsg()
METHOD MostraRetorno() INLINE PTAlert( 'Codigo..:;'+ PADC( hb_cStr(::hHash['codigo'],70) ) +';' +;
'Mensagem:;'+ PADC( UPPER(ALLTRIM(hb_UTF8ToStr(hb_cStr(::hHash['mensagem'])))),70) +';' +;
'Retorno.:;'+ PADC( hb_cStr(::hHash['retorno'],70) ), aOk, vcroxo)
// METHOD WhatsAPI_SetarWebhook() // PRA LER O RETORNO DAS MENSAGENS, ESSA PARTE NAO FIZ AINDA.
Method End() INLINE Self := Nil
ENDCLASS
*******************************************************************************
METHOD Situacao() Class TWhatsappAPI_WTS
Mensag("Consultando situacao da API...")
::ComunicaAPI("/whatsapp/situacao", httpGet)
If 'false' $ ::hHash['retorno']
MsgInfo( "Nao conectado. Obtenha QRCode", 'Atenção' )
Else
MsgInfo( "Whatsapp ja esta conectado.", 'Atenção' )
EndIf
Return
*******************************************************************************
METHOD NivelBateria() Class TWhatsappAPI_WTS
Mensag("Consultando nivel bateria")
::ComunicaAPI("/whatsapp/bateria", httpGet)
::MostraRetorno()
*******************************************************************************
METHOD NrConectado() Class TWhatsappAPI_WTS
Mensag("Consultando Nr Conectado API...")
::ComunicaAPI("/whatsapp/meunumero", httpGet)
::MostraRetorno()
Return
********************************************************************************
METHOD EnviarMsg(sContato, sMsg, sFilename) Class TWhatsappAPI_WTS
LOCAL sURL
DEFAULT sMsg TO ''
DEFAULT sFilename TO ''
IF EMPTY(sFilename) .AND. EMPTY(sMsg)
Alert('falta parametro')
RETURN
ENDIF
IF EMPTY(sFilename)
Mensag("Enviando mensagem de texto...")
sURL := "/whatsapp/msg"
ELSE
Mensag("Enviando arquivo...")
sURL := "/whatsapp/arquivo"
ENDIF
::ComunicaAPI(sURL, httpPost, sContato, sMsg, sFilename)
::MostraRetorno()
********************************************************************************
Procedure Obter_QRCode() Class TWhatsappAPI_WTS
Mensag("Obtendo QRCode...")
::ComunicaAPIWhats('/whatsapp/qrcode', httpGet)
// ATENۂO O RETORNO AKI RETORNADO O QRCODE EM Q VC TEM Q CARREGAR UM OBJETO GRAFICO ATRAVES DE UMA LIB GRAFICA FIVEWIN, XAILER, MINIGUI, HWGUI ETC
// If 'obtido com sucesso' $ ::hHash['mensagem']
// AKI CARREGA O OBJETO GRAFICO NA LIB Q VC USAR ::hHash['retorno'], { 20,20,-20,-20 }, "QR-CODE"
// Else
// MsgInfo( "O Whatsapp esta reiniciando. Favor repetir a operação.", 'Atenção' )
// EndIf
Return
*------------------------------------------------------------------------------*
METHOD ComunicaAPI(sURL, nMetodo, sContato, sMsg, sFilename) Class TWhatsappAPI_WTS
LOCAL cMetodo, oWeb, sContent := ''
TRY
oWeb := CreateObject( 'MSXML2.ServerXMLHTTP.6.0' )
CATCH
oWeb := CreateObject( 'MSXML2.XMLHTTP' )
END
IF EMPTY(sContato) .AND. nMetodo = httpPost
Alert("Falta telefone")
RETURN NIL
END
sURL := ::sEndPoint + sURL
cMetodo := IIF( nMetodo == httpGet, 'GET', 'POST')
oWeb:Open( cMetodo, sUrl, .F.) // True = pra vir o ResponseBody
oWeb:SetRequestHeader( 'token', ::sToken )
IF nMetodo = httpPost
oWeb:setRequestHeader( "contato", sContato )
IF .NOT. EMPTY(sFilename)
oWeb:setRequestHeader( "filename", SUBSTR(ALLTRIM( CharRem( "[<(-)>]*&@:", sFileName ) ),2))
oWeb:setRequestHeader( "caption", SUBSTR(ALLTRIM( CharRem( "[<(-)>]*&@:", sFileName ) ),2))
sContent = hb_MemoRead(sFileName)
sContent = hb_base64encode(sContent)
sContent = hb_StrToUTF8(sContent)
sContent = ALLTRIM( CharRem( CRLF, sContent ) )
ELSE
IF .NOT. EMPTY(sMsg)
sContent = sMsg
ENDIF
END
oWeb:setRequestHeader( "Content-Type", "text/plain; charset=UTF-8" )
END
TRY
IF EMPTY(sContent)
oWeb:Send( )
ELSE
oWeb:Send( sContent )
ENDIF
::sRet := oWeb:ResponseBody()
hb_jsondecode( ::sRet, @::hHash )
CATCH ; END
RETURN NIL
[/code]
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:
“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”.
Até 2017 Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL
Novos Projetos:
Desktop Visual Windev Desktop
Celular Android/iOS Windev Mobile
WEB Windev Web
Sejamos gratos a Deus.