FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour Reading QRCodes
Posts: 990
Joined: Thu Nov 17, 2005 05:49 PM
Reading QRCodes
Posted: Wed May 17, 2023 07:30 PM

Hello again Fiwinners;

Can anyone here read QR Codes?

This squared dot matrix dots and squares can store a lot of information. Given a QR code storing text, can we read it with fw or harbour? Is anyone here reading QR Codes?

Thank you.

Posts: 6983
Joined: Fri Oct 07, 2005 07:07 PM
Re: Reading QRCodes
Posted: Wed May 17, 2023 08:17 PM
Posts: 6983
Joined: Fri Oct 07, 2005 07:07 PM
Re: Reading QRCodes
Posted: Wed May 17, 2023 08:23 PM
Dear Reinaldo,

By the way, I found a great plugin for ChatGPT.
It creates a button that allows you to select a file and upload it as a knowledge base.
It uses async to read the file as text and split it into chunks of size 15,000, which are then sent.

Here is a video demonstrating how it works: https://www.youtube.com/watch?v=iR99LO28nzM

You can download the Chrome plugin, called "ChatGPT File Uploader," from this link: https://tinyurl.com/5n7rjhar

Best regards,
Otto
Posts: 38
Joined: Thu Aug 04, 2022 12:45 PM
Re: Reading QRCodes
Posted: Thu May 18, 2023 11:06 AM

Reinaldo, sorry for off-topic, some time ago you share in this forum an class to twillio, to send sms, whatsapp, you still using this class? do you make updates to this? can you share?

best regards

Posts: 990
Joined: Thu Nov 17, 2005 05:49 PM
Re: Reading QRCodes
Posted: Thu May 18, 2023 11:55 AM
Yes, sure.

I wrote methods to send texts and make phone calls but not to send via WhatsApp although it wouldn't be too hard to add. Keep in mind you will need a web hook set up to catch any incoming texts.

Here is that class:
Code (fw): Select all Collapse
#define ACCOUNT_SID  "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" //assigned by Twilio
#define AUTH_TOKEN   "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" //assigned by Twilio
#define TEL_FROM     "xxxxxxxxxxx"   //Your Twilio number


#INCLUDE "hbClass.ch"
#include "hbcurl.ch"

CLASS TTwilioSMS

   DATA hCurl 
   DATA httpcode
   DATA cLogFile        INIT "Twilio.log"
   DATA cResponse 
   DATA cDestinationNum 
   DATA cSMSText 
   DATA cSMSStatusCallBackURL    INIT ''  //Webhook address where to receive SMS status updates

   DATA cUrl            INIT "https://api.twilio.com/2010-04-01/Accounts/" + ACCOUNT_SID + "/Messages.json"
   DATA cVoiceUrl       INIT "https://api.twilio.com/2010-04-01/Accounts/" + ACCOUNT_SID + "/Calls.json"
   DATA cSayVoice       INIT '<Say voice="alice" language="es-MX">'
   DATA cCallSubject    INIT 'Recorded Message'

   DATA nError          INIT 0 
   DATA nMaxLogSize     INIT 32768

   DATA cDateStart, cDateEnd
   DATA cvoiceMail, cReplyEmail
   DATA lDebug          INIT .F. 

   METHOD New()
   METHOD End() 
   METHOD Send() 
   METHOD Reset() 

   METHOD MakePhoneCall() 
      
   METHOD GetMessagesLog() 

ENDCLASS 


//------------------------------------------------------------------------------------------------
METHOD New() CLASS TTwilioSMS

   ::hCurl := curl_easy_init()

RETURN Self 


//------------------------------------------------------------------------------------------------
METHOD Send() CLASS TTwilioSMS
   Local cPostFields
   Local httpcode

   curl_easy_setopt( ::hCurl, HB_CURLOPT_POST, 1 )
   curl_easy_setopt( ::hCurl, HB_CURLOPT_URL, ::cUrl )
   curl_easy_setopt( ::hCurl, HB_CURLOPT_USERPWD, ACCOUNT_SID + ':' + AUTH_TOKEN )
   curl_easy_setopt( ::hCurl, HB_CURLOPT_DL_BUFF_SETUP )
   curl_easy_setopt( ::hCurl, HB_CURLOPT_SSL_VERIFYPEER, .F. )

   cPostFields := 'To='    + ::cDestinationNum + ; 
                  '&From=' + TEL_FROM +;
                  '&Body=' + curl_easy_escape( ::hCurl, AllTrim( ::cSMSText ) )

   IF !Empty( ::cSMSStatusCallBackURL )
      cPostFields += "&statusCallback="+ ::cSMSStatusCallBackURL
   ENDIF 

   If ::lDebug 
      LogData( ::cLogFile, { cPostFields }, ::nMaxLogSize )
   endif 


   curl_easy_setopt( ::hcurl, HB_CURLOPT_POSTFIELDS, cPostFields )
   ::nError := curl_easy_perform( ::hCurl )
   curl_easy_getinfo( ::hCurl, HB_CURLINFO_RESPONSE_CODE, @httpcode )

   ::httpcode := httpcode

   IF ::nError == HB_CURLE_OK

      ::cResponse = curl_easy_dl_buff_get( ::hCurl )
      IF ::lDebug 
         LogData( ::cLogFile, ::cResponse, ::nMaxLogSize )
      ENDIF 
   Else 

      LogData( ::cLogFile, { "Twilio error sending SMS.  Details below:" },      ::nMaxLogSize )
      LogData( ::cLogFile, { "To", ::cDestinationNum, "SMS Text:", ::cSMSText }, ::nMaxLogSize )
      LogData( ::cLogFile, { "Error Num:", ::nError, "Httpcode:", ::httpcode }, ::nMaxLogSize )
      LogData( ::cLogFile, { "Response:", ::cResponse }, ::nMaxLogSize )
      LogData( ::cLogFile, curl_easy_strerror( ::nError ), ::nMaxLogSize )

   ENDIF 

return NIL             

//------------------------------------------------------------------------------------------------
METHOD Reset() CLASS TTwilioSMS
      
   curl_easy_reset( ::hCurl )
   ::nError := HB_CURLE_OK 

return NIL 



//------------------------------------------------------------------------------------------------
METHOD End() CLASS TTwilioSMS

   curl_easy_cleanup( ::hCurl )
   ::hCurl := Nil  
   hb_gcAll( .t. )

return NIL 


//------------------------------------------------------------------------------------------------
//must define ::cDateStart and ::cDateEnd before calling this method.
METHOD GetMessagesLog() CLASS TTwilioSMS
   Local cparms := '?DateSent%3E=' + ::cDateStart + "&DateSent%3C=" + ::cDateEnd + "&PageSize=600" 
   Local httpcode 

   curl_easy_setopt( ::hCurl, HB_CURLOPT_HTTPGET, 1 )
   curl_easy_setopt( ::hCurl, HB_CURLOPT_URL, ::cUrl + cParms )

   curl_easy_setopt( ::hCurl, HB_CURLOPT_USERPWD, ACCOUNT_SID + ':' + AUTH_TOKEN )
   curl_easy_setopt( ::hCurl, HB_CURLOPT_DL_BUFF_SETUP )
   curl_easy_setopt( ::hCurl, HB_CURLOPT_SSL_VERIFYPEER, .F. )

   ::nError := curl_easy_perform( ::hCurl )

   curl_easy_getinfo( ::hCurl, HB_CURLINFO_RESPONSE_CODE, @httpcode )

   ::httpcode := httpcode

   IF ::nError = HB_CURLE_OK

      ::cResponse = curl_easy_dl_buff_get( ::hCurl )
      ::cResponse := StrTran( ::cResponse, Chr(10), "" )

   Else 

      LogData( ::cLogFile, { "Twilio error sending SMS.  Details below:" },      ::nMaxLogSize )
      LogData( ::cLogFile, { "To", ::cDestinationNum, "SMS Text:", ::cSMSText }, ::nMaxLogSize )
      LogData( ::cLogFile, { "Error Num:", ::nError, "Httpcode:", ::httpcode }, ::nMaxLogSize )
      LogData( ::cLogFile, curl_easy_strerror( ::nError ), ::nMaxLogSize )

   ENDIF 

   //MemoWrit( "Twilio.log", ::cResponse )

RETURN NIL 

//------------------------------------------------------------------------------------------------
/*sample makeing a call using url to fetch parameters
https://www.twilio.com/docs/voice/api/call-resource

EXCLAMATION_MARK='!'
curl -X POST https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Calls.json \
--data-urlencode "Twiml=<Response><Say>Ahoy there$EXCLAMATION_MARK</Say></Response>" \
--data-urlencode "To=+15558675310" \
--data-urlencode "From=+15552223214" \
-u $TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN
*/
//Twilml sample parameter "Twiml=<Response><Say>Ahoy there$EXCLAMATION_MARK</Say></Response>"


METHOD MakePhoneCall() CLASS TTwilioSMS
   Local cPostFields
   Local httpcode

   curl_easy_setopt( ::hCurl, HB_CURLOPT_POST, 1 )
   curl_easy_setopt( ::hCurl, HB_CURLOPT_URL, ::cVoiceUrl )
   curl_easy_setopt( ::hCurl, HB_CURLOPT_USERPWD, ACCOUNT_SID + ':' + AUTH_TOKEN )
   curl_easy_setopt( ::hCurl, HB_CURLOPT_DL_BUFF_SETUP )
   curl_easy_setopt( ::hCurl, HB_CURLOPT_SSL_VERIFYPEER, .F. )

   cPostFields := 'To='    + ::cDestinationNum + ; // Line[ 3 ] +;
                  '&From=' + TEL_FROM +;
                  '&CallReason=' + ::cCallSubject +;
                  '&Twiml=' + ::cSayVoice + ::cVoiceMail + '</Say>' +;
                  '&CallerId='   + ::cReplyEmail


   curl_easy_setopt( ::hcurl, HB_CURLOPT_POSTFIELDS, cPostFields )
   ::nError := curl_easy_perform( ::hCurl )
   curl_easy_getinfo( ::hCurl, HB_CURLINFO_RESPONSE_CODE, @httpcode )

   ::httpcode := httpcode

   IF ::nError = HB_CURLE_OK

      ::cResponse = curl_easy_dl_buff_get( ::hCurl )

   Else 

      LogData( ::cLogFile, { "Twilio error making voice call.  Details below:" },      ::nMaxLogSize )
      LogData( ::cLogFile, { "To", ::cDestinationNum, "Message:", ::cVoiceMail }, ::nMaxLogSize )
      LogData( ::cLogFile, { "Error Num:", ::nError, "Httpcode:", ::httpcode }, ::nMaxLogSize )
      LogData( ::cLogFile, curl_easy_strerror( ::nError ), ::nMaxLogSize )

   ENDIF 

RETURN NIL
Posts: 1091
Joined: Thu Nov 17, 2005 11:08 AM
Re: Reading QRCodes
Posted: Thu May 18, 2023 01:16 PM
Otto wrote:Dear Reinaldo,

have you senn this:
https://forums.fivetechsupport.com/viewtopic.php?f=3&t=41320&p=247534&hilit=ZBarImg&sid=713f358b47cdd5ad8fb5dee0ef707169#p247534

Best regards,
Otto
zbarimg is fantastic!
Marco Boschi
info@marcoboschi.it
Posts: 1091
Joined: Thu Nov 17, 2005 11:08 AM
Re: Reading QRCodes
Posted: Thu May 18, 2023 01:29 PM
Reinaldo
Code (fw): Select all Collapse
c:\Program Files (x86)\ZBar\bin\zbarimg QRCODE.JPG  > TEXT.TXT
fast, accurate, never misses a beat

I loaded 2000 qr codes in my application so the name of the jpg and text in a short time

Thank to Antonio!
Marco Boschi
info@marcoboschi.it
Posts: 6983
Joined: Fri Oct 07, 2005 07:07 PM
Re: Reading QRCodes
Posted: Tue May 23, 2023 11:54 AM

Marco,

>zbarimg is fantastic!

can you show an example how to use?

Thank you and best regards,

Otto

Posts: 1091
Joined: Thu Nov 17, 2005 11:08 AM
Re: Reading QRCodes
Posted: Tue May 23, 2023 01:22 PM
Otto,
I create a BAT file and launch it (using __RUN)
Code (fw): Select all Collapse
cComando := '"c:\Program Files (x86)\ZBar\bin\zbarimg" ' + '"' + cFileJpg + '"' + + " > " + '"' + cFileTxt + '"'
cComando := cComando + crlf + "EXIT" + crlf

MEMOWRIT( "do_scan.bat" , cComando )

__RUN ( "START /MIN do_scan.bat" )
Then I read the content from file cFiletxt
Code (fw): Select all Collapse
IF FILE( cFileTxt )
   cLettura := MemoRead( cFileTxt )
ENDIF
Dear Otto zbarimg scan and decode image that I pass in command line
this is my last do_scan.bat

"c:\Program Files (x86)\ZBar\bin\zbarimg" "P:\Misuratori Fiscali\QR CODE\99MEY0xxxxx.jpg" > "P:\Misuratori Fiscali\QR CODE\TXT_LINK\99MEY0xxxxx.TXT"
EXIT

In command line after the name of file thad I have to decode I insert > and the name of file TXT to create containng the results of scan. Then I read this txt
Marco Boschi
info@marcoboschi.it

Continue the discussion