Como utilizar Hbcurl.ch

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

Como utilizar Hbcurl.ch

Mensagem por Abel »

ola pessoal,
precisava usar essa biblioteca no harbour mas nao consigo.
to tentando essa alternativa pois usando o metodo POST / SEND()
essa api da erro no windows7, talvez por algum problema de httsp/ssl

ja coloquei

#include "hbcurl.ch"
#include "hbssl.ch"

mas ao compilar aparece diversos erros:
undefined reference to 'HB_FUN_CURL_GLOBAL_INIT'
undefined reference to 'HB_FUN_CURL_EASY_INIT'
undefined referente to 'HB_FUN_CURL_BLOBAL_CLEANUP'
e outras mais....

o que tenho que fazer para conseguir compilar usando essa biblioteca ?

Código: Selecionar todos

PROCEDURE CURL()
curl_global_init()

curl   ="https://api2.megaapi.com.br/rest/sendMessage/megaapi-....................."
cbearer='Bearer MPo7viYVx6..... '
rA_TELENVIO='5511996......@s.whatsapp.net'
rA_MSGENVIO='OI ABEL, TESTE CURL'
cjson  =hb_jsonEncode( { "messageData" => { "to" => AllTrim( rA_TELENVIO ) , "text" => rA_MSGENVIO } } )

  if ! empty( hCurl := curl_easy_init() )
    
    //If there's an authorization token, you attach it to the header like this:
    curl_easy_setopt( hCurl, HB_CURLOPT_HTTPHEADER, {"Authorization: "+cbearer} )
    curl_easy_setopt( hCurl, HB_CURLOPT_HTTPHEADER, {"Content-Type: "+"application/json"} )

    //Set the URL:
    curl_easy_setopt( hCurl, HB_CURLOPT_URL, curl )  
    
    //Disabling the SSL peer verification (you can use it if you have no SSL certificate yet, but still want to test HTTPS)
    curl_easy_setopt(hCurl, HB_CURLOPT_FOLLOWLOCATION, 1)
    curl_easy_setopt(hCurl, HB_CURLOPT_SSL_VERIFYPEER, 0)

    //If you are sending a POST method request, you gotta attach your fields with this clause using
    //url-encoded pattern
    //If you are sending a GET method request, you can just delete this clause, because your parameters will be attached 
    //directly into your URL
    curl_easy_setopt( hCurl, HB_CURLOPT_POSTFIELDS, cjson)          

    //Setting the buffer
    curl_easy_setopt( hCurl, HB_CURLOPT_DL_BUFF_SETUP )
    
    //Sending the request and getting the response
    IF (nret:=curl_easy_perform( hCurl )) == 0
        uValue := curl_easy_dl_buff_get( hCurl )
    ENDIF
  ENDIF
  
  //Cleaning the curl instance
  curl_global_cleanup()   

  //I'm using hb_jsonDecode() so I can decode the responde into a JSON object
  hb_jsonDecode(uValue)  
  ALERT(UVALUE)

RETURN
Mais uma vez,
Obrigado !
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Como utilizar Hbcurl.ch

Mensagem por alxsts »

Olá!

Código: Selecionar todos

HbMk2 SeuPrg hbcurl.hbc
Ou inclua hbcurl.hbc no teu arquivo de projeto (.Hbp)
[]´s
Alexandre Santos (AlxSts)
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

Como utilizar Hbcurl.ch

Mensagem por Abel »

ola,

coloquei o hbcurl.hbc no meu projeto, ao compilar apareceu

g:/ling/hb31/comp/mingw/bin/../lib/gcc/mingw32/4.6.1-dw2/../../../../mingw32/bin/ld.exe: cannot find -llibcurl

coloquei o arquivo libcurl.dll na pasta do meu projeto mas nao adiantou.

o que pode ser ?

Obrigado,
ABEL
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Como utilizar Hbcurl.ch

Mensagem por alxsts »

Olá!

Na minha máquina está assim:
Pasta de C:\hb320\comp\mingw\lib

31/10/2018 07:28 832.636 libcurl.a
31/10/2018 07:28 51.982 libcurl.dll.a
2 arquivo(s) 884.618 bytes
Pode ser problema na configuração do teu path.
Abel escreveu:coloquei o arquivo libcurl.dll na pasta do meu projeto mas nao adiantou.
Em tempo de compilação, não vai precisar da DLL mas, creio que em tempo de execução, ela deverá estar na mesma pasta do Exe.

Nunca usei esta lib. Vi em algum lugar que, se precisar usar ela com SSL, tem que compilar o Harbour com SSL habilitado.
[]´s
Alexandre Santos (AlxSts)
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

Como utilizar Hbcurl.ch

Mensagem por Abel »

hum
nao achei nas minhas pastas o arquivo libcurl.a e nem o outro que vc postou.

pode enviar ?

Obrigado
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Como utilizar Hbcurl.ch

Mensagem por Itamar M. Lins Jr. »

Olá!
O Harbour dele é 31. ->
g:/ling/hb31/
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
carlaoonline
Usuário Nível 3
Usuário Nível 3
Mensagens: 190
Registrado em: 24 Ago 2014 22:38
Localização: Porto Alegre-RS

Como utilizar Hbcurl.ch

Mensagem por carlaoonline »

Bom dia!
Abel escreveu:coloquei o arquivo libcurl.dll
Só lembrando: A MingW usa libs com extensão ".a" , para usar libs com extensão ".lib" use o BCC (ou outro). Um não reconhece a lib do outro para compilação.
Abel escreveu:nao achei nas minhas pastas o arquivo libcurl.a
Talvez a lib que precisa não foi gerada ainda.
Na pasta C:\hmg.3.5 ou HMG.3.4.4 (para quem tem o HMG instalado) existe o BuildLib32.bat que cria a lib com a extensão ".a" pelo fonte dele.

Uma vez também estava com problemas de cannot find mesmo colocando a lib certa na pasta LIB, porém existem mais que uma pasta LIB, então talvez não esteja na pasta LIB certa (a pasta que o compilador procura), em último caso faça uma cópia em cada pasta LIB pra testar se é isso.
alxsts escreveu:Em tempo de compilação, não vai precisar da DLL mas, creio que em tempo de execução, ela deverá estar na mesma pasta do Exe.
Normalmente (e até com certa lógica) as libs usadas na compilação não são mais necessárias após criar o executável, porém algumas aplicações após compiladas fazem referência (precisam) de libs externa (que nesse caso pode ser de QUALQUER extensão, independente do compilador que gerou o executável.) , estas sim precisam estar na mesma pasta do executável (ou no caminho que foi programado no código)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Como utilizar Hbcurl.ch

Mensagem por Itamar M. Lins Jr. »

Olá!
Moço, ele usa GCC mesmo, leiam as linhas...

Código: Selecionar todos

g:/ling/hb31/comp/mingw/bin/../lib/gcc/mingw32/4.6.1-dw2/../../../../mingw32/bin/ld.exe: cannot find -llibcurl
Eu uso CURL e não preciso de DLL.

HB 32 e GCC 10.3.

Saudações,
Itamar M. Lins Jr.
Anexos
curl-7.76.0-win32-mingw.rar
(3.76 MiB) Baixado 890 vezes
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Como utilizar Hbcurl.ch

Mensagem por Itamar M. Lins Jr. »

Olá!
Harbour 32 compilado com GCC 10.3 Ultima atualização no GIT,
Tem as libs para acesso ao MySQL, PGSQL, odbc, SSL... e outras que não lembro.

Saudações,
Itamar M. Lins Jr.
Anexos
hb32.rar
(31.01 MiB) Baixado 637 vezes
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
carlaoonline
Usuário Nível 3
Usuário Nível 3
Mensagens: 190
Registrado em: 24 Ago 2014 22:38
Localização: Porto Alegre-RS

Como utilizar Hbcurl.ch

Mensagem por carlaoonline »

opa...
Itamar M. Lins Jr. escreveu:Moço, ele usa GCC mesmo, leiam as linhas...
Sim, eu havia visto que ele usa MingW por essa linha,

mas passei rápido pela mensagem e fiz confusão ao ler
Abel escreveu:coloquei o arquivo libcurl.dll
pensei ter lido libcurl.LIB, e nesse caso sim, minha resposta seria mais coerente e útil.
Avatar do usuário
depaula.jau
Usuário Nível 2
Usuário Nível 2
Mensagens: 98
Registrado em: 15 Mai 2007 17:07
Localização: JAU

Como utilizar Hbcurl.ch

Mensagem por depaula.jau »

Olá ! Bom dia

Será que algum dos colegas poderia me ajudar nesse problema ?
O projeto é semelhante ao do colega acima

-d '{ \"messaging_product\": \"whatsapp\", \"to\": \"551499151....\", \"type\": \"template\", \"template\": { \"name\": \"hello_world\", \"language\": { \"code\": \"en_US\" } } }']

Como colocar esses parametros numa variavel JSON e como SETAR isso no Rquest ?

Melhores detalhes no anexo

Obriagado.

* Harbour + Minigui + Mysql
Anexos
wa.png
diegopego
Usuário Nível 1
Usuário Nível 1
Mensagens: 3
Registrado em: 29 Jul 2016 14:48
Localização: TEOFILO OTONI

Como utilizar Hbcurl.ch

Mensagem por diegopego »

é usando o hb_jsonencode mesmo, assim como está no comentário.
"-d" significa os dados que você precisa mandar.
veja este código em javascript. se ele não resolver, eu vou ter tempo à noite para te ajudar:

Código: Selecionar todos

// https://gist.github.com/benjamine/962875
function processSend(attempts) {

    var xmlhttp = new ActiveXObject("MSXML2.ServerXMLHTTP");

    var data = '{"prefixText":"iron","count":5,"contextKey":"Nw,ct,en"}';
    var svcurl = "http://localhost/website/services/itemtablewebsvc.asmx";
    var svcmethod = "GetAutoCompleteItems";

    xmlhttp.open("POST", svcurl + "/" + svcmethod, false);

    xmlhttp.setRequestHeader("Content-Type", "application/json; charset=utf-8");

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
            dataReceived(xmlhttp);
        }
    };

    xmlhttp.setTimeouts(5000, 60000, 10000, 10000);
    try {
        xmlhttp.send(data);
    } catch (err) {
        WScript.Echo("Error:" + err.description + "\n");
        if (!attempts || attempts < 5) {
            WScript.Echo("Retry " + ((attempts || 0) + 1) + "...");
            processSend((attempts || 0) + 1);
        } else {
            WScript.Echo("Too many attemtps.");
        }
    }

}

function dataReceived(xmlhttp) {
    var response;
    if (xmlhttp.responseXML.parseError.errorCode != 0) {
        response = xmlhttp.responseText & " " & xmlhttp.responseXML.parseError.reason;
        WScript.Echo("Response: " + response);
    } else {
        // response = xmlhttp.responseXML.getElementsByTagName("string")(0).childNodes(0).text;
        // response = xmlhttp.responseXML;
        response = xmlhttp.responseText;
        WScript.Echo("Response:\n" + response + "\n");
        var data = eval("(" + xmlhttp.responseText + ")");
        WScript.Echo("Data:");
        for (var i = 0; i < data.d.length; i++) {
            WScript.Echo(i + ":" + eval("(" + data.d[i] + ")").First);
        }
    }
}
cleitonLC
Usuário Nível 1
Usuário Nível 1
Mensagens: 44
Registrado em: 17 Ago 2021 14:38
Localização: Cariacica/ES

Como utilizar Hbcurl.ch

Mensagem por cleitonLC »

Boas aos amigos que a algum tempo tiveram problemas com uso da hbcurl, recentemente tive que implementar um esquema que permitisse o envio de mensagens no whatsapp web usando harbour, como as apis são somente as não oficiais tive que fazer uma bem básica usando javascript com a lib https://wwebjs.dev/,
pois bem... fiz isso e a partir daí comecei a trabalhar em um código harbour e para que fosse possível o envio eu teria que entender como a curl lib foi implementada para harbour, quebrei a cabeça e consegui, mesmo não tendo muita intimidade com harbour, quero deixar aqui a base para que talvez ajude outros com dúvida semelhante...

Código: Selecionar todos

REQUEST HB_CODEPAGE_PTISO, HB_CODEPAGE_UTF8EX
#require "hbcurl"
#require "hbtip"
#include "inkey.ch"
#include "fileio.ch"

PROCEDURE Main()
   Local cUrlBase := "http://0.0.0.0:3333/api/v1/"
   Local cSession := Space( 15 )
   Local cNumber := Space( 15 )
   Local cText := Space( 50 )
   Local cCaption := Space ( 50 )
   Local cFilePath := Space( 50 )
   Local nChoice := 0
   Local cPayload, cResult, oResult, cJson := {=>}

   hb_cdpSelect( "PTISO" )
   cls
   @ 1,10 SAY "Informe a sessão usada: " GET cSession
   @ 2,10 SAY "Digite o Número do whatsapp: " GET cNumber
   @ 3,10 SAY "Escolha o tipo de mensagem (1 - Texto, 2 - Arquivo, 3 - Upload): " GET nChoice
   read

   IF nChoice == 1
      @ 4,10 SAY "Digite a mensagem: " GET cText
      read
      cUrl := cUrlBase + "sendtext"
      cJson := { "session" => rtrim( cSession ), "number" => rtrim( cNumber ), "text" => rtrim( hb_StrToUTF8( cText ) ) }
      cPayload := hb_jsonEncode( cJson )
      cResult := SendMessage( cUrl, cPayload )
   ELSEIF nChoice == 2
      @ 4,10 SAY "Digite o caminho completo do arquivo a ser enviado: " GET cFilePath
      @ 5,10 SAY "Digite o assunto referente o arquivo a ser enviado: " GET cCaption
      read
      cUrl := cUrlBase + "sendfile"
      cJson := { "session" => rtrim( cSession ), "number" => rtrim( cNumber ), "path" => rtrim( cFilePath ), "caption" => rtrim( hb_StrToUTF8( cCaption ) )}
      cPayload := hb_jsonEncode( cJson )
      cResult := SendMessage( cUrl, cPayload)
   ELSEIF nChoice == 3
      @ 6,10 SAY "Digite o caminho completo do arquivo a ser enviado: " GET cFilePath
      @ 7,10 SAY "Digite o assunto referente o arquivo a ser enviado: " GET cCaption
      read
      cUrl := cUrlBase + "upload"
      cJson := { "session" => rtrim( cSession ), "number" => rtrim( cNumber ), "file" => rtrim( cFilePath ), "caption" => rtrim( hb_StrToUTF8( cCaption ) )}
      cPayload := hb_jsonEncode( cJson )
      cResult := SendMessageUpload( cUrl, cPayload)
   ELSE
      ? "Opção inválida!"
      RETURN
   ENDIF
   IF ! Empty( cResult )
      oResult := hb_jsonDecode( cResult )
      IF ! Empty( oResult )
         ? "Mensagem enviada com sucesso!"
         ? "RESULT: ", oResult["response"]["_data"]["id"]["remote"]["user"]
      ELSE
         ? "Erro ao enviar mensagem: ", oResult["success"]
      ENDIF
   ELSE
      ? "Erro ao acessar API!"
   ENDIF

Return


FUNCTION SendMessage(cLink, cPayload)
   Local curl, cErr, http_code := 0, cResponse
   curl_global_init()
   IF ! Empty( curl := curl_easy_init() )
      curl_easy_reset( curl )
      curl_easy_setopt( curl, HB_CURLOPT_USERAGENT, 'Mozilla/5.0 (MSIE; Windows 10)' )
      curl_easy_setopt( curl, HB_CURLOPT_CONNECTTIMEOUT, 0 )
      curl_easy_setopt( curl, HB_CURLOPT_TIMEOUT, 5 )
      curl_easy_setopt( curl, HB_CURLOPT_HTTPHEADER, {"Content-Type: application/json"} )
      curl_easy_setopt( curl, HB_CURLOPT_POST, .T. )
      curl_easy_setopt( curl, HB_CURLOPT_POSTFIELDS, cPayload )
      curl_easy_setopt( curl, HB_CURLOPT_URL, cLink)
      curl_easy_setopt( curl, HB_CURLOPT_VERBOSE, .F. )
      curl_easy_setopt( curl, HB_CURLOPT_DL_BUFF_SETUP )
      curl_easy_perform( curl )
      http_code := curl_easy_getinfo( curl, HB_CURLINFO_RESPONSE_CODE )
      IF http_code == 200
         cResponse := curl_easy_dl_buff_get( curl )
         RETURN cResponse
      ELSE
         alert( "Erro na chamada da API: HTTP ", http_code )
      ENDIF
   ENDIF
   curl_global_cleanup()

Return ""


Function SendMessageUpload(cLink, cPayload)
    Local curl, cErr, http_code := 0, cResponse, aHeaders, curlErr, boundary
    cFormBody = BoundaryMake(cPayload, boundary := '----' + hb_StrToHex ( hb_TtoC( hb_DateTime(), 'YYYYMMDDhhmmssfff' ) ) )
    curl_global_init()
    IF ! Empty( curl := curl_easy_init() )
        curl_easy_reset( curl )
        aHeaders := {"Content-Length: " + Str(Len(cFormBody)), "Content-Type: " + "multipart/form-data; boundary=" + boundary}
        curl_easy_setopt( curl, HB_CURLOPT_USERAGENT, 'Mozilla/5.0 (MSIE; Windows 10)' )
        curl_easy_setopt( curl, HB_CURLOPT_HTTPHEADER, aHeaders)
        curl_easy_setopt( curl, HB_CURLOPT_FOLLOWLOCATION, .T. )
        curl_easy_setopt( curl, HB_CURLOPT_SSL_VERIFYPEER, .F. )
        curl_easy_setopt( curl, HB_CURLOPT_DL_BUFF_SETUP )
        curl_easy_setopt( curl, HB_CURLOPT_POST, .T. )
        curl_easy_setopt( curl, HB_CURLOPT_URL, cLink )
        curl_easy_setopt( curl, HB_CURLOPT_POSTFIELDSIZE, LEN( cFormBody ) )
        curl_easy_setopt( curl, HB_CURLOPT_POSTFIELDS, cFormBody )
        curlErr := curl_easy_perform( curl )
        IF !EMPTY( curlErr )
            cReturn := "!ERROR!" + curl_easy_strerror(curlErr)
        ELSE
            cReturn := curl_easy_dl_buff_get( curl )
        ENDIF
   ENDIF
   curl_global_cleanup()

Return cReturn


Function BoundaryMake(cPayload, boundary)
    Local cContentType := ""
    Local CRLF := chr(13) + chr(10)
    Local cData := hb_jsonDecode( cPayload )
    Local cPlikFile := hb_FNameNameExt ( cData["file"] )
    Local cFormBody := '--' + boundary + CRLF
    cFormBody+='Content-Disposition: form-data; name="session"'+ CRLF
    cFormBody+='Content-Type: text/plain' + CRLF + CRLF
    cFormBody+=Alltrim ( cData["session"] ) + CRLF
    cFormBody+='--' + boundary + CRLF
    cFormBody+='Content-Disposition: form-data; name="caption"' + CRLF
    cFormBody+='Content-Type: text/plain' + CRLF + CRLF
    cFormBody+=Alltrim ( cData["caption"] ) + CRLF
    cFormBody+='--' + boundary + CRLF
    cFormBody+='Content-Disposition: form-data; name="number"' + CRLF
    cFormBody+='Content-Type: text/plain' + CRLF + CRLF
    cFormBody+=Alltrim ( cData["number"] ) + CRLF
    cFormBody+='--' + boundary + CRLF
    cFormBody+='Content-Disposition: form-data; name="file"; filename="' + cPlikFile + '"' + CRLF
    cContentType := tip_FileMimeType( cData["file"] )
    cFormBody+='Content-Type: ' + cContentType + CRLF + CRLF
    cFormBody+=FILESTR( cData["file"] ) + CRLF
    cFormBody+='--' + boundary + '--' + CRLF

Return cFormBody
lucimauro
Usuário Nível 3
Usuário Nível 3
Mensagens: 465
Registrado em: 21 Set 2004 21:02
Localização: Sobral-CE

Como utilizar Hbcurl.ch

Mensagem por lucimauro »

Ola cleiton,
Fiz um teste aqui mais so mostra Erro na chamada da API: HTTP
cleitonLC
Usuário Nível 1
Usuário Nível 1
Mensagens: 44
Registrado em: 17 Ago 2021 14:38
Localização: Cariacica/ES

Como utilizar Hbcurl.ch

Mensagem por cleitonLC »

lucimauro escreveu:Ola cleiton,
Fiz um teste aqui mais so mostra Erro na chamada da API: HTTP
Boas, ah sim...então esse link é apenas um exemplo, na verdade é da tal api que fiz em node, aí está rodando em localhost...
Caso queira testar com essa api de fato basta instalar o docker e usar a imagem que criei a partir dessa api https://hub.docker.com/r/cleitonlc/whatsserver
Instale o docker dê um:

Código: Selecionar todos

docker pull cleitonlc/whatsserver
e após instalar tudo execute o comando:

Código: Selecionar todos

docker run -v ~:/usr/src/app/.profiles -p 3333:3333 --name whats_server cleitonlc/whatsserver
Após isso será necessário abrir o link em um navegador e criar uma sessão, bastando apenas digitar um nome qualquer para salvar a sessão, o campo key não precisa, dê enter e será gerado um qrcode na tela, leia o qrcode com a câmera do telefone usando o whatsapp normalmente e aguarde a confirmação de autenticação, por fim vc poderá usar normalmente o código do programinha harbour, lembrando sempre que a sessão que criou sempre deve ser passada para que o sistema encontre o client de envio correto, também vale lembrar que o número de telefone sempre começa com 55 + DD + Número Ex: 5527995772291
Responder