Página 1 de 3

Como utilizar Hbcurl.ch

Enviado: 18 Ago 2022 15:48
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 !

Como utilizar Hbcurl.ch

Enviado: 18 Ago 2022 16:21
por alxsts
Olá!

Código: Selecionar todos

HbMk2 SeuPrg hbcurl.hbc
Ou inclua hbcurl.hbc no teu arquivo de projeto (.Hbp)

Como utilizar Hbcurl.ch

Enviado: 18 Ago 2022 18:59
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

Como utilizar Hbcurl.ch

Enviado: 18 Ago 2022 19:56
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.

Como utilizar Hbcurl.ch

Enviado: 18 Ago 2022 20:01
por Abel
hum
nao achei nas minhas pastas o arquivo libcurl.a e nem o outro que vc postou.

pode enviar ?

Obrigado

Como utilizar Hbcurl.ch

Enviado: 18 Ago 2022 20:10
por Itamar M. Lins Jr.
Olá!
O Harbour dele é 31. ->
g:/ling/hb31/
Saudações,
Itamar M. Lins Jr.

Como utilizar Hbcurl.ch

Enviado: 19 Ago 2022 10:22
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)

Como utilizar Hbcurl.ch

Enviado: 19 Ago 2022 10:52
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.

Como utilizar Hbcurl.ch

Enviado: 19 Ago 2022 10:58
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.

Como utilizar Hbcurl.ch

Enviado: 19 Ago 2022 11:50
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.

Como utilizar Hbcurl.ch

Enviado: 27 Jan 2023 10:13
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

Como utilizar Hbcurl.ch

Enviado: 03 Fev 2023 10:59
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);
        }
    }
}

Como utilizar Hbcurl.ch

Enviado: 30 Abr 2023 17:05
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

Como utilizar Hbcurl.ch

Enviado: 30 Abr 2023 21:44
por lucimauro
Ola cleiton,
Fiz um teste aqui mais so mostra Erro na chamada da API: HTTP

Como utilizar Hbcurl.ch

Enviado: 02 Mai 2023 09:33
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