#!/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")
Python 2.7 using Requests (and urllib3)
#!/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")
Python 2.7 using httplib
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)