Risolto Programma per l'invio dei SMS Python

mrcamarium

Utente Silver
7 Gennaio 2022
107
24
6
56
Dopo tanto tempo ho lasciato Delphi e ho cominciato d usare Python che trovo davvero un ottimo linguaggio di programmazione, adesso ho cominciato a lavorare su un codice che è in grado di inviare un SmS Anonimo:
Python:
import requests, os, sys, time
print("Version 0.1")
print("Codice by - Mr. Camarium")
print("Youtube - mrcamarium")
time.sleep(2)
def menu() :
    print("\033[91m1.\033[0m \033[92mInvia SmS Anonimo\033[0m")
    print("\033[91m2.\033[0m \033[92mVerifica Lo Stato Di Un SmS\033[0m")
def control() :
    ctrl = input("Effettua La Scelta: ")
    if ctrl == "1" :
        sms()
    elif ctrl == "2" :
        status()
    else :
        print("\033[91mInvalid number\033[0m")
def sms() :
   phone_no = input("Inserisci Numero Di Telefono: ")
   msg = input("Messaggio Da Inviare (Max 160 Caratteri): ")

   resp = requests.post('https://textbelt.com/text',{
    'phone' : '+39' + phone_no,
    'message' : msg ,
    'key' : 'textbelt'
   })
   print(resp.text)
  
if '"success" : true' in resp.text :
       print('Messaggio consegnato!')
   if '"success" : false' in resp.text :
       print("Messaggio Non Inviato!!! Riprova!!")

def status() :
  textID = input("Enter textID of sms : ")
  os.system(f"curl https://textbelt.com/status/{textID}")
menu()
control()
input() #Con questo comando finale si evita che si chiuda il terminale.
Il codice è molto semplice e funziona ma vorrei migliorarlo. Mi dovrebbe restituire un msg di avviso quando invio un messaggio invece mi da questo:
{"success":false,"error":"Test texts are temporarily disabled.","quotaRemaining":0}
 
L'invio fallisce perché come scritto nella risposta json i messaggi di test sono stati disabilitati dal fornitore, probabilmente per i vari script che abusavano di questo servizio. Al posto di key: textbelt andrebbe messa l'API key che ottieni previo pagamento.
 
  • Mi piace
Reazioni: sparky1246
L'invio fallisce perché come scritto nella risposta json i messaggi di test sono stati disabilitati dal fornitore, probabilmente per i vari script che abusavano di questo servizio. Al posto di key: textbelt andrebbe messa l'API key che ottieni previo pagamento.
Grazie della risposta, ma il problema non è il fatto che non invia il messaggio, il problema è che volevo personalizzare il msg di risposta, cioè più che avere questo:
{"success":false,"error":"Test texts are temporarily disabled.","quotaRemaining":0}
Avrei voluto ottenere questo:
  • Il messaggio è stato inviato con successo (vero/falso).
  • l'importo del credito rimanente sulla tua chiave è 145
  • errore: una stringa che descrive il problema. Presente solo quando success=false.
 
Devi importare la libreria json, con questa puoi accedere ai valori tramite chiave (in questo caso success, error e quotaRemaining). Successivamente puoi stampare i messaggi che vuoi in base ai vari valori. if jsonData['success'] : ... print("Errore: " + jsonData['error']) ...
 
Grazie aggiungerò questa modifica. nel fra tempo stavo migliorando il codice:
Python:
# Importo le librerie
import requests, colorama, os, sys, time
from colorama import Fore #BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE
from colorama import Style #DIM, NORMAL, BRIGHT, RESET_ALL
# Segue programma
print(Fore.BLUE + Style.BRIGHT + "Version 0.2" + Style.RESET_ALL)
print(Fore.BLUE + Style.DIM + "Codice by - Mr. Camarium" + Style.RESET_ALL)
print(Fore.BLUE + Style.DIM + "Youtube - mrcamarium" + Style.RESET_ALL)
time.sleep(2)
def menu() :
    print(Fore.YELLOW + "1. Invia SmS Anonimo" + Style.RESET_ALL)
    print(Fore.YELLOW + "2. Verifica Lo Stato Di Un SmS" + Style.RESET_ALL)
def control() :
    ctrl = input("Effettua La Scelta: ")
    if ctrl == "1" :
        sms()
    elif ctrl == "2" :
        status()
    else :
        print("Scelta Errata")
def sms() :
   phone_no = input("Inserisci Numero Di Telefono con prefisso internazionale +: ")
   msg = input("Messaggio Da Inviare (Max 160 Caratteri): ")

   resp = requests.post('https://textbelt.com/text',{
    'phone' : phone_no,
    'message' : msg ,
    'key' : 'textbelt' #Un msg gratis al giorno.
    #'key' : 'inserisci api' #Da utilizare con l'api.
   })
   print(Fore.GREEN + Style.BRIGHT + resp.text)

   if '"success" : true' in resp.text :
       print('Messaggio consegnato!')
   if '"success" : false' in resp.text :
       print("Messaggio Non Inviato!!! Riprova!!")

def status() :
  textID = input("Enter textID of sms : ")
  os.system(f"curl https://textbelt.com/status/{textID}")
menu()
control()
exit = input("Vuoi continuare? S/N: ")
    if  exit == "S":
        sms()
    else:
        print("**ARRIVEDERCI!**")
time.sleep(4)
adesso dopo l'invio del sms devo far ripartire il programma ho aggiunto la domanda per poi usare if ma mi da errore di sintesi.
 
Ultima modifica:
Un po alla volta sta prendendo sempre più forma il mio programma.
Python:
[# Importo le librerie
import requests, colorama, os, sys, time, json
from colorama import Fore #BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE
from colorama import Style #DIM, NORMAL, BRIGHT, RESET_ALL
# Info
print(Fore.BLUE + Style.BRIGHT + "Version 0.2" + Style.RESET_ALL)
print(Fore.BLUE + Style.DIM + "Codice by - Mr. Camarium" + Style.RESET_ALL)
print(Fore.BLUE + Style.DIM + "Youtube - mrcamarium" + Style.RESET_ALL)
# Pausa
time.sleep(2)
# Menu
def menu() :
    print(Fore.YELLOW + "1. Invia SmS Anonimo (1 Gratis)" + Style.RESET_ALL)
    print(Fore.YELLOW + "2. Invia SmS Anonimo (A pagamento)" + Style.RESET_ALL)
    print(Fore.YELLOW + "3. Verifica Lo Stato Di Un SmS" + Style.RESET_ALL)
# Controlli per il menu
def control() :
    ctrl = input("Effettua La Scelta: ")
    if ctrl == "1" :
        smsA()
    elif ctrl == "2" :
        smsB()
    elif ctrl == "3" :
        status()
    else :
        print("Scelta Errata")
# Inserimento dati per l'invio del sms gratis
def smsA() :
   phone_no = input("Inserisci Numero Di Telefono con prefisso internazionale +: ")
   msg = input("Messaggio Da Inviare (Max 160 Caratteri): ")
# Invio SMS gratis
   resp = requests.post('https://textbelt.com/text',{
    'phone' : phone_no,
    'message' : msg ,
    'key' : 'textbelt' #Un msg gratis al giorno.
    #'key' : 'inserisci api' #Da utilizare con l'api.
   })
   print(Fore.GREEN + Style.BRIGHT + resp.text + Style.RESET_ALL)
# Inserimento dati per l'invio del sms a pagamento
def smsB() :
   phone_no = input("Inserisci Numero Di Telefono con prefisso internazionale +: ")
   msg = input("Messaggio Da Inviare (Max 160 Caratteri): ")
# Invio SMS gratis
   resp = requests.post('https://textbelt.com/text',{
    'phone' : phone_no,
    'message' : msg ,
    'key' : 'api' #Inserisci APi dal sito textbelt.com
   })
   print(Fore.GREEN + Style.BRIGHT + resp.text + Style.RESET_ALL)  
# Richiesta di verifica del SMS inviato
def status() :
  textID = input("Inserisci l'ID testo dell'sms: ")
  os.system(f"curl https://textbelt.com/status/{textID}")
#Fine
menu()
control()
Il programma funziona benino lo sto testando per verificare se ci sono errori
 
Ultima modifica:
Grazie aggiungerò questa modifica. nel fra tempo stavo migliorando il codice:
Python:
# Importo le librerie
import requests, colorama, os, sys, time
from colorama import Fore #BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE
from colorama import Style #DIM, NORMAL, BRIGHT, RESET_ALL
# Segue programma
print(Fore.BLUE + Style.BRIGHT + "Version 0.2" + Style.RESET_ALL)
print(Fore.BLUE + Style.DIM + "Codice by - Mr. Camarium" + Style.RESET_ALL)
print(Fore.BLUE + Style.DIM + "Youtube - mrcamarium" + Style.RESET_ALL)
time.sleep(2)
def menu() :
    print(Fore.YELLOW + "1. Invia SmS Anonimo" + Style.RESET_ALL)
    print(Fore.YELLOW + "2. Verifica Lo Stato Di Un SmS" + Style.RESET_ALL)
def control() :
    ctrl = input("Effettua La Scelta: ")
    if ctrl == "1" :
        sms()
    elif ctrl == "2" :
        status()
    else :
        print("Scelta Errata")
def sms() :
   phone_no = input("Inserisci Numero Di Telefono con prefisso internazionale +: ")
   msg = input("Messaggio Da Inviare (Max 160 Caratteri): ")

   resp = requests.post('https://textbelt.com/text',{
    'phone' : phone_no,
    'message' : msg ,
    'key' : 'textbelt' #Un msg gratis al giorno.
    #'key' : 'inserisci api' #Da utilizare con l'api.
   })
   print(Fore.GREEN + Style.BRIGHT + resp.text)

   if '"success" : true' in resp.text :
       print('Messaggio consegnato!')
   if '"success" : false' in resp.text :
       print("Messaggio Non Inviato!!! Riprova!!")

def status() :
  textID = input("Enter textID of sms : ")
  os.system(f"curl https://textbelt.com/status/{textID}")
menu()
control()
exit = input("Vuoi continuare? S/N: ")
    if  exit == "S":
        sms()
    else:
        print("**ARRIVEDERCI!**")
time.sleep(4)
adesso dopo l'invio del sms devo far ripartire il programma ho aggiunto la domanda per poi usare if ma mi da errore di sintesi.
Ti restituisce errore di sintassi perché hai sbagliato l'indentazione dell'if, che è errata dopo la dichiarazione della variabile "exit": l'if dovrebbe essere allineato con la riga precedente.
Messaggio unito automaticamente:

Un po alla volta sta prendendo sempre più forma il mio programma.
Python:
[# Importo le librerie
import requests, colorama, os, sys, time, json
from colorama import Fore #BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE
from colorama import Style #DIM, NORMAL, BRIGHT, RESET_ALL
# Info
print(Fore.BLUE + Style.BRIGHT + "Version 0.2" + Style.RESET_ALL)
print(Fore.BLUE + Style.DIM + "Codice by - Mr. Camarium" + Style.RESET_ALL)
print(Fore.BLUE + Style.DIM + "Youtube - mrcamarium" + Style.RESET_ALL)
# Pausa
time.sleep(2)
# Menu
def menu() :
    print(Fore.YELLOW + "1. Invia SmS Anonimo (1 Gratis)" + Style.RESET_ALL)
    print(Fore.YELLOW + "2. Invia SmS Anonimo (A pagamento)" + Style.RESET_ALL)
    print(Fore.YELLOW + "3. Verifica Lo Stato Di Un SmS" + Style.RESET_ALL)
# Controlli per il menu
def control() :
    ctrl = input("Effettua La Scelta: ")
    if ctrl == "1" :
        smsA()
    elif ctrl == "2" :
        smsB()
    elif ctrl == "3" :
        status()
    else :
        print("Scelta Errata")
# Inserimento dati per l'invio del sms gratis
def smsA() :
   phone_no = input("Inserisci Numero Di Telefono con prefisso internazionale +: ")
   msg = input("Messaggio Da Inviare (Max 160 Caratteri): ")
# Invio SMS gratis
   resp = requests.post('https://textbelt.com/text',{
    'phone' : phone_no,
    'message' : msg ,
    'key' : 'textbelt' #Un msg gratis al giorno.
    #'key' : 'inserisci api' #Da utilizare con l'api.
   })
   print(Fore.GREEN + Style.BRIGHT + resp.text + Style.RESET_ALL)
# Inserimento dati per l'invio del sms a pagamento
def smsB() :
   phone_no = input("Inserisci Numero Di Telefono con prefisso internazionale +: ")
   msg = input("Messaggio Da Inviare (Max 160 Caratteri): ")
# Invio SMS gratis
   resp = requests.post('https://textbelt.com/text',{
    'phone' : phone_no,
    'message' : msg ,
    'key' : 'api' #Inserisci APi dal sito textbelt.com
   })
   print(Fore.GREEN + Style.BRIGHT + resp.text + Style.RESET_ALL)
# Richiesta di verifica del SMS inviato
def status() :
  textID = input("Inserisci l'ID testo dell'sms: ")
  os.system(f"curl https://textbelt.com/status/{textID}")
#Fine
menu()
control()
Il programma funziona benino lo sto testando per verificare se ci sono errori
Dove hai commentato "#fine" quello sarebbe proprio l'inizio del programma (se escludiamo le 3 stampe iniziali), ossia il main. Tutto il resto, che precede, sono definizioni di funzioni. Il programma, scritto in questo modo, viene eseguito solo una volta. Se vuoi eseguirlo in loop, fino a quando lo desidera l'utente, ti tocca effettuare delle modifiche. 😉
 
Ti restituisce errore di sintassi perché hai sbagliato l'indentazione dell'if, che è errata dopo la dichiarazione della variabile "exit": l'if dovrebbe essere allineato con la riga precedente.
Messaggio unito automaticamente:


Dove hai commentato "#fine" quello sarebbe proprio l'inizio del programma (se escludiamo le 3 stampe iniziali), ossia il main. Tutto il resto, che precede, sono definizioni di funzioni. Il programma, scritto in questo modo, viene eseguito solo una volta. Se vuoi eseguirlo in loop, fino a quando lo desidera l'utente, ti tocca effettuare delle modifiche. 😉
Me ne sono accorto che il programma comincia da sotto, ma essendo abituato con delphi ho scritto #fine alla fine del listato.
Messaggio unito automaticamente:

Comunque posto il codice funzionante.
Python:
# Importo le librerie
import requests, colorama, os, sys, time, json
from colorama import Fore #BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE
from colorama import Style #DIM, NORMAL, BRIGHT, RESET_ALL
# Info
print(Fore.BLUE + Style.BRIGHT + "Version 1.0" + Style.RESET_ALL)
print(Fore.BLUE + Style.DIM + "Codice by - Mr. Camarium" + Style.RESET_ALL)
print(Fore.BLUE + Style.DIM + "Youtube - mrcamarium" + Style.RESET_ALL)
# Pausa
time.sleep(2)
# Menu
def menu() :
    print(Fore.YELLOW + "1. Invia SmS Anonimo (1 Gratis)" + Style.RESET_ALL)
    print(Fore.YELLOW + "2. Invia SmS Anonimo (A pagamento)" + Style.RESET_ALL)
    print(Fore.YELLOW + "3. Verifica Lo Stato Di Un SmS" + Style.RESET_ALL)
    print(Fore.YELLOW + "4. Exit" + Style.RESET_ALL)
# Controlli per il menu
def control() :
    ctrl = input("Effettua La Scelta: ")
    if ctrl == "1" :
        smsA()
    elif ctrl == "2" :
        smsB()
    elif ctrl == "3" :
        status()
    elif ctrl == "4" :
        sys.exit()
    else :
        print("Scelta Errata")
# Inserimento dati per l'invio del sms gratis
def smsA() :
   phone_no = input("Inserisci Numero Di Telefono con prefisso internazionale +: ")
   msg = input("Messaggio Da Inviare (Max 160 Caratteri): ")
# Invio SMS gratis
   resp = requests.post('https://textbelt.com/text',{
    'phone' : phone_no,
    'message' : msg ,
    'key' : 'textbelt' #Un msg gratis al giorno.
    })
   print(Fore.GREEN + Style.BRIGHT + resp.text + Style.RESET_ALL)
# Inserimento dati per l'invio del sms a pagamento
def smsB() :
   phone_no = input("Inserisci Numero Di Telefono con prefisso internazionale +: ")
   msg = input("Messaggio Da Inviare (Max 160 Caratteri): ")
# Invio SMS gratis
   resp = requests.post('https://textbelt.com/text',{
    'phone' : phone_no,
    'message' : msg ,
    'key' : 'api' #Inserisci APi dal sito textbelt.com
   })
   print(Fore.GREEN + Style.BRIGHT + resp.text + Style.RESET_ALL)   
# Richiesta di verifica del SMS inviato
def status() :
  textID = input("Inserisci l'ID testo dell'sms: ")
  os.system(f"curl https://textbelt.com/status/{textID}")
#Fine
while True: #Ricomincia il programma
 menu()
 control()
Se avete suggerimenti per migliorare il codice sarei felice di accettarle.
 
Ecco qualche suggerimento:
  • non usare curl di sistema per controllare lo status, usa la stessa libreria requests che già usi
  • basta una sola funzione per l'invio degli sms con e senza API key a pagamento
  • usa JSON per interpretare il contenuto delle risposte
  • conserva il text ID dei messaggi inviati in modo da controllare lo stato in automatico senza dover reinserire i codici manualmente

Esempio:

Python:
# Importo le librerie
import requests, colorama, os, sys, time, json
from colorama import Fore #BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE
from colorama import Style #DIM, NORMAL, BRIGHT, RESET_ALL
# Info
print(Fore.BLUE + Style.BRIGHT + "Version 1.0" + Style.RESET_ALL)
print(Fore.BLUE + Style.DIM + "Codice by - Mr. Camarium" + Style.RESET_ALL)
print(Fore.BLUE + Style.DIM + "Youtube - mrcamarium" + Style.RESET_ALL)
text_ids = []
# Pausa
time.sleep(2)
# Menu
def menu() :
    print(Fore.YELLOW + "1. Invia SmS Anonimo (1 Gratis)" + Style.RESET_ALL)
    print(Fore.YELLOW + "2. Invia SmS Anonimo (A pagamento)" + Style.RESET_ALL)
    print(Fore.YELLOW + "3. Verifica Lo Stato Di Un SmS" + Style.RESET_ALL)
    print(Fore.YELLOW + "4. Exit" + Style.RESET_ALL)

# Controlli per il menu
def control() :
    ctrl = input("Effettua La Scelta: ")
    if ctrl == "1" :
        sms('textbelt')
    elif ctrl == "2" :
        api_key = input("Inserisci chiave API: ")
        sms(api_key)
    elif ctrl == "3" :
        status()
    elif ctrl == "4" :
        sys.exit()
    else :
        print("Scelta Errata")

# Inserimento dati per l'invio del sms gratis
def sms(api_key) :
   phone_no = input("Inserisci Numero Di Telefono con prefisso internazionale +: ")
   msg = input("Messaggio Da Inviare (Max 160 Caratteri): ")

   resp = requests.post('https://textbelt.com/text',{
    'phone' : phone_no,
    'message' : msg ,
    'key' : api_key
    })
   success = False
   result = "Impossibile connettersi"
   if resp.status_code == 200 :
    data = json.loads(resp.text)
    if data['success'] :
        success = True
        text_id = data['textId']
        text_ids.append(text_id)
        result = "Messaggio inviato, ID: " + str(text_id)
    else :
        result = data['error']
 
   color = Fore.GREEN if success else Fore.YELLOW
   print(color + Style.BRIGHT + result + Style.RESET_ALL)

# Richiesta di verifica del SMS inviato
def status() :
  for id in text_ids :
    resp = requests.get('https://textbelt.com/status/' + str(id))
    status = "UNKNOWN"
    if resp.status_code == 200 :
        data = json.loads(resp)
        status = data['status']

    color = ""
    if status == "DELIVERED" or status == "SENT" :
        color = Fore.GREEN
    elif status == "SENDING" or status == "UNKNOWN" :
        color = Fore.YELLOW
    else :
        color = Fore.RED
   
    print("Stato invio SMS ID " + str(id) + ": " + color + Style.BRIGHT + status + Style.RESET_ALL)

#Fine
while True: #Ricomincia il programma
  menu()
  control()
 
il codice funziona benissimo, ma devo inserire una nuova voce nel menu, la possibilità di inserire i codici in manuale quindi ho eseguito cosi il codice:
Codice:
# Richiesta di verifica del SMS inviato Manuale
def status() :
  textID = input("Inserisci l'ID testo dell'sms: ")
  stato = requests.get('https://textbelt.com/status/',{textID})
  print(Style.BRIGHT + str(stato) + Style.RESET_ALL)
Anche se non da errori mi restituisce un avviso 404, eppure il link è funzionante ho controllato più volte dove sbaglio?
 
L'errore lo commetti nella richiesta dello stato, in particolare nella concatenazione della stringa, prova così:

Python:
stato = requests.get("https://textbelt.com/status/" + textID)
 
Succede per il semplice motivo che requests ritorna un oggetto Response (nel tuo esempio variabile stato), ma quest'oggetto contiene varie informazioni, se lo stampi come fosse una stringa vedrai solo il tipo di oggetto e lo status_code, se vuoi stampare tutto il json devi usare text (nel tuo esempio stato.text), per interpretarlo ed estrarre valori fai come ho fatto nel mio esempio con json.loads
 
  • Mi piace
Reazioni: --- Ra ---
Nel fra tempo avevo fatto una ricerca e avevo visto cosa era 200 ma non è il testo che mi aspettavo. Se vai sul link https://textbelt.com/status/123456789123456789 ti da questa riga: {"success":true,"status":"UNKNOWN"} e a me interessa avere questo risultato.
Se vuoi stampare la risposta del server, utilizzando json come giustamente suggerisce Junk, puoi fare così:

Python:
def status() :
  textID = input("Inserisci l'ID testo dell'sms: ")
  richiesta = requests.get('https://textbelt.com/status/' + textID)
  risposta_server = json.loads(richiesta.text)
  print(risposta_server)
 
Ultima modifica:
Perfetto grazie!
Python:
# Richiesta di verifica del SMS inviato Manuale
def status() :
  textID = input("Inserisci l'ID testo dell'sms: ")
  stato = requests.get('https://textbelt.com/status/' + textID)
  stato_server = json.loads(stato.text)
  print(Style.BRIGHT + str(stato_server) + Style.RESET_ALL)
Messaggio unito automaticamente:

Adesso per concludere il programma devo personalizzare la risposta del server:
Python:
# Richiesta di verifica del SMS inviato Manuale
def status() :
  textID = input("Inserisci l'ID testo dell'sms: ")
  stato = requests.get('https://textbelt.com/status/' + textID)
# Info esito controllo
  success = False
  stato_server = "Sconosciuto"
  if stato.status_code == 200 :
    data = json.loads(stato.text)
    if data['success'] :
        success = True
        stato_server = "Messaggio Inviato"
    else :
        stato_server = data['error']
    color = Fore.GREEN if success else Fore.RED
    stato_server = json.loads(stato.text)
  print(color + Style.BRIGHT + str(stato_server) + Style.RESET_ALL)
Il codice viene eseguito senza errori ma il risultato non è quello sperato. In effetti leggo:
{'success': True, 'status': 'UNKNOWN'}
Invece di:
Sconosciuto
Ho usato come modello un codice già funzionante ma in questo caso non funziona.
 
  • Mi piace
Reazioni: --- Ra ---
Ok Adesso funziona
Python:
# Info esito controllo
  success = False
  stato_server = "SMS Inviato"
  if stato.status_code == 200 :
    data = json.loads(stato.text)
    if data['success'] :
        success = True
        stato_server = "Stato Sconosciuto"
    else :
        stato_server = data['error']
    color = Fore.GREEN if success else Fore.RED
    print(color + Style.BRIGHT + str(stato_server) + Style.RESET_ALL)