Skip to main content

Python

Python 2.7, httplibPython 2.7, Requests/httplib3Python 2.7, httplib (advanced)

 #!/usr/bin/python # -*- coding: utf-8 -*- 
import sys
import urllib
import httplib

ENDPOINT = "get.spiricom.spirius.com:55001"
PATH = "/cgi-bin/sendsms?"
USER = "Username"
PASS = "Password"

def send_sms(sender, recipient, message):
try:
params = {
'User': USER,
'Pass': PASS,
'To': recipient,
'From': sender,
'Msg': message,
'CharSet': 'utf-8'
}
query_args = urllib.urlencode(params)
conn = httplib.HTTPSConnection(ENDPOINT)
conn.request("GET", PATH + query_args)
r = conn.getresponse()
return "%d %s" % (r.status, r.reason)
except Exception, e:
sys.stderr.write(str(e))
return ""

print send_sms("+46123456789", "+46123456789", "Hello world")

This example uses the third party library Requests, which makes sending HTTP requests easier.

 #!/usr/bin/python # -*- coding: utf-8 -*- 
import sys
import requests

URL = 'https://get.spiricom.spirius.com:55001/cgi-bin/sendsms'
USER = 'Username'
PASS = 'Password'

def send_sms(sender, recipient, message):
try:
_params = {
'User' : USER,
'Pass' : PASS,
'From' : sender,
'To' : recipient,
'Msg' : message,
'CharSet': 'utf-8'
}
response = requests.get(URL, params=_params, timeout=10)
return response.text
except Exception, e:
sys.stderr.write(str(e))
return ""

print send_sms("+46123456789", "+46123456789", "Hello world")

Demonstrates how to handle rate-limit (http status code 409) and unresponsive endpoints.

 #!/usr/bin/python # -*- coding: utf-8 -*- 
import urllib
import httplib
import unittest
import logging from contextlib
import closing

USERNAME = "Username"
PASSWORD = "Password"
CONNECTION_TIMEOUT = 10 # seconds SMS_PROVIDERS = ["get1.spiricom.spirius.com", "get2.spiricom.spirius.com"]

def _do_send_sms_request(conn, request):
""" Send request to HTTP GET API. Retry if provider tell us we are sending faster than we have agreed. """
for attempt in xrange(3):
conn.request("GET", request)
result = conn.getresponse()
if result.status != httplib.CONFLICT:
logging.warning("INFO: Request sent. Response: %s, %s, %s" % (result.status, result.reason, result.read()))
return result.status
else: # Provider told us we are sending too fast. Wait then retry.
time.sleep(1.5)

def send_sms(username, password, ext_id, from_type, from_number, to_number, sms_text):
""" Iterate over all available sms providers and attempt to setup a HTTP connection. When a connection is established, send request. If _do_send_sms_request() raises an exception (or connection times out), use next provider """
from_number_enc = from_number.encode('iso-8859-1', 'ignore')
sms_text_enc = sms_text.encode('utf-8', 'ignore')
for endpoint in SMS_PROVIDERS:
try:
with closing(httplib.HTTPSConnection("%s:55001" % endpoint, timeout=CONNECTION_TIMEOUT)) as conn:
params = {
'User': username,
'Pass': password,
'To': to_number,
'From': from_number_enc,
'FromType': from_type,
'Msg': sms_text_enc,
'CharSet': 'utf-8'
}
if len(ext_id) > 0:
params['ExtId'] = "List: " + ext_id
request = "/cgi-bin/sendsms?%s" % urllib.urlencode(params)
if _do_send_sms_request(conn, request) == httplib.ACCEPTED:
logging.warning("SMS was accepted")
else:
logging.warning("SMS was NOT accepted")
# Request was successfully sent, so we are done for now
return 1
except Exception, e:
logging.warning("WARNING: Failed to send request, connection problem: %s" % str(e))
pass # retry using next endpoint in list
return 0

class UnitTests(unittest.TestCase):
def test_send_sms(self):
result = send_sms( username=USERNAME, password=PASSWORD, ext_id="", from_type="I", from_number="+46123456789", to_number="+46123456789", sms_text="Test SMS")
self.assertTrue(result)