#!/usr/bin/perl use warnings ; use strict ; # # Script per il download automatico # ed il rename coerente delle E-qsl # dal sito www.eqsl.cc # # NOTE: # - Esportare solo i QSO che hanno una conferma mediante eqsl # - Verificare che esista il file della CARD prima di scaricare # - la card è rinominata nel formato CALL_YYYYMMDD_BAND_MODE.jpg # - Scaricare MAX 1 card ogni 15 secondi, altrimenti il processo # viene bloccato dai gestori del server # # ------------------------------------------------------------ # ------------------------------------------------------------ my $Quante_qsl = $ARGV[0] ; if (!$Quante_qsl) { $Quante_qsl = 15 ; } # Alcuni parametri del programma: my $File_log = './estratto_qso_confermati_eqsl.csv' ; my $Path_eqsl = '/home/user/perl_script/eqsl-cards' ; my $Utente = 'ik7xja' ; my $Pass = 'password' ; # ------------------------------------------------------------ # --------- Niente da modificare al di sotto di qua: --------- undef my @Lista_qso_confermati ; undef my %QSL_scaricate ; my ($Err, $Descerrore) = (0, '') ; # Carico in memoria le E-qsl già salvate: &Trova_scaricate() ; ($Err, $Descerrore) = &carica_qso($File_log, $Quante_qsl) ; my $Da_scaricare = @Lista_qso_confermati ; if ($Da_scaricare) { my $Confermati = $Quante_qsl - $Da_scaricare ; foreach my $L(@Lista_qso_confermati) { $Confermati++ ; my ($callsign, $Anno, $Mese, $Giorno, $Ora, $Min, $band, $mode, $Card_name, $dxcc_ref, $cont) = split /;/, $L ; print " $Confermati --> QSO $callsign del $Giorno/$Mese/$Anno in $band $mode:\n" ; # verifico se esiste il path if (-e "$Path_eqsl/$cont/$dxcc_ref") { print " --> Il path $Path_eqsl/$cont/$dxcc_ref ESISTE\n" ; } else { print " --> Il path $Path_eqsl/$cont/$dxcc_ref NON ESISTE: lo creo\n" ; my $Comando = qq{mkdir -p $Path_eqsl/$cont/$dxcc_ref} ; my $r = qx{$Comando} ; } # Compongo il comando per e-qsl: my $Comando = qq{curl -s -d Username='$Utente' -d Password='$Pass' -d CallsignFrom='$callsign' -d QSOBand='$band' -d QSOMode='$mode' -d QSOYear='$Anno' -d QSOMonth='$Mese' -d QSODay='$Giorno' -d QSOHour='$Ora' -d QSOMinute='$Min' https://www.eqsl.cc/qslcard/GeteQSL.cfm} ; # print "$Comando\n" ; my $Res = qx{$Comando} ; my @Righe = split /\n/, $Res ; foreach my $R(@Righe) { $R =~ s/^ +// ; if ($R =~ /^.+img src=\"([a-z0-9\-\_\/\.]+)\".+$/i) { my $Image = $1 ; my $Url_image = 'https://www.eqsl.cc' . $Image ; my $Wget_command = qq{wget -q $Url_image -O $Path_eqsl/$cont/$dxcc_ref/$Card_name} ; # print "--> $Wget_command\n" ; my $Result = qx{$Wget_command} ; if (-e "$Path_eqsl/$cont/$dxcc_ref/$Card_name") { print " Scaricata $Image salvata come $Card_name\n" ; } else { print " ERRORE impossibile salvare $Image come $Card_name\n" ; } last ; } elsif ($R =~ /ERROR: (.+)$/i) { my $Errore = $1 ; if (!(-e "$Path_eqsl/ERROR")) { my $Comando = qq{mkdir -p $Path_eqsl/ERROR} ; my $r = qx{$Comando} ; } my $Comando = qq{echo "$Errore" > $Path_eqsl/ERROR/$Card_name} ; my $r = qx{$Comando} ; last ; } } print " ...Mi fermo per 15 secondi... Control+C per interrompere ...\n\n" ; sleep(15) ; } } else { print "Gia` confermati i $Quante_qsl QSO richiesti... mi fermo...\n" ; } exit ; # ------------------------------------------------------------ # ------------------------------------------------------------ sub carica_qso { # Carico in LISTA solo i QSO confermati di cui # non ho ancora scaricato la cartolina e-qsl. my ($File_csv, $Quante) = @_ ; my ($Err, $Descerrore) = (0, '') ; my $Righe_totali = 0 ; if (-e $File_csv) { open(IN, "< $File_csv") || ($Err = 1); if ($Err) { $Descerrore = 'Impossibile leggere il file NOT001GS.CSV' ; } else { while () { $Righe_totali++ ; $_ =~ s/\r//g ; $_ =~ s/\n//g ; $_ =~ s/"//g ; $_ =~ tr/[\x0D,\x20-\x7E]//dc ; # Tracciato: # callsign;qso_date;time_on;freq;band;mode;country;dxcc_ref;cont; # DL8AWK;20201022;12:16;10.115;30M;CW;"Federal Republic of Germany";DL;EU; if ($_ =~ /^callsign/) { next ; } my ($callsign, $qso_date, $time_on, $freq, $band, $mode, $country, $dxcc_ref, $cont) = split /;/, $_ ; my $Card_name = join('_', $callsign, $qso_date, $band, "$mode.jpg") ; $Card_name =~ s/\//\-/g ; if (!defined($QSL_scaricate{$Card_name})) { if ($dxcc_ref =~ /\(/) { $dxcc_ref = (split /\(/, $dxcc_ref)[0] ; } my ($Anno, $Mese, $Giorno) = unpack("A4 A2 A2", $qso_date) ; my ($Ora, $Min) = split /\:/, $time_on ; my $Rec = join(';', $callsign, $Anno, $Mese, $Giorno, $Ora, $Min, $band, $mode, $Card_name, $dxcc_ref, $cont) ; push(@Lista_qso_confermati, $Rec) ; } last if ($Righe_totali > $Quante) ; } close(IN) ; } } else { ($Err, $Descerrore) = (1, 'File di log non trovato') ; } return ($Err, $Descerrore) ; } # ------------------------------------------------------------ # ------------------------------------------------------------ sub Trova_scaricate { my $Comando = qq{find $Path_eqsl -name "*.jpg" -exec basename \{\} \\\;} ; my $Res = qx{$Comando} ; my @Righe = split /\n/, $Res ; foreach my $R(@Righe) { $QSL_scaricate{$R} = 1 ; } } # ------------------------------------------------------------ # ----------------------------------------------------- Fine -