burstsms 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +5 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/LICENCE +20 -0
- data/README.md +128 -0
- data/Rakefile +6 -0
- data/burstsms.gemspec +27 -0
- data/lib/burstsms.rb +37 -0
- data/lib/burstsms/api.rb +78 -0
- data/lib/burstsms/lists_add.rb +30 -0
- data/lib/burstsms/lists_add_recipient.rb +34 -0
- data/lib/burstsms/lists_delete.rb +28 -0
- data/lib/burstsms/lists_delete_recipient.rb +29 -0
- data/lib/burstsms/lists_get.rb +38 -0
- data/lib/burstsms/lists_get_recipients.rb +42 -0
- data/lib/burstsms/lists_get_unsubscribed.rb +42 -0
- data/lib/burstsms/message_responses.rb +41 -0
- data/lib/burstsms/messages_add.rb +39 -0
- data/lib/burstsms/messages_get.rb +44 -0
- data/lib/burstsms/messages_multiple.rb +32 -0
- data/lib/burstsms/version.rb +3 -0
- data/spec/burst_sms_spec.rb +171 -0
- data/spec/contact_lists_spec.rb +188 -0
- data/spec/fixtures/api_requests/lists_add.txt +10 -0
- data/spec/fixtures/api_requests/lists_add_recipient.txt +13 -0
- data/spec/fixtures/api_requests/lists_delete.txt +10 -0
- data/spec/fixtures/api_requests/lists_delete_recipient.txt +11 -0
- data/spec/fixtures/api_requests/lists_get.txt +11 -0
- data/spec/fixtures/api_requests/lists_get_recipients.txt +12 -0
- data/spec/fixtures/api_requests/lists_get_unsubscribed.txt +12 -0
- data/spec/fixtures/api_requests/message_responses.txt +12 -0
- data/spec/fixtures/api_requests/messages_add.txt +12 -0
- data/spec/fixtures/api_requests/messages_get.txt +11 -0
- data/spec/fixtures/api_requests/messages_multiple.txt +12 -0
- data/spec/fixtures/api_responses/generic_failure.txt +7 -0
- data/spec/fixtures/api_responses/lists_add_recipient_success.txt +11 -0
- data/spec/fixtures/api_responses/lists_add_success.txt +12 -0
- data/spec/fixtures/api_responses/lists_delete_recipient_success.txt +8 -0
- data/spec/fixtures/api_responses/lists_delete_success.txt +8 -0
- data/spec/fixtures/api_responses/lists_get_recipients_success.txt +33 -0
- data/spec/fixtures/api_responses/lists_get_success.txt +19 -0
- data/spec/fixtures/api_responses/lists_get_unsubscribed_success.txt +33 -0
- data/spec/fixtures/api_responses/message_responses_success.txt +16 -0
- data/spec/fixtures/api_responses/messages_add_success.txt +17 -0
- data/spec/fixtures/api_responses/messages_get_success.txt +53 -0
- data/spec/fixtures/api_responses/send_message_success.txt +14 -0
- data/spec/spec_helper.rb +36 -0
- metadata +173 -0
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENCE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2012 Made in Data Pty Ltd and David Barlow
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
Software), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
# Burst Sms [](http://travis-ci.org/madeindata/Burst-Sms)
|
2
|
+
|
3
|
+
Rubygem for the Burst SMS API. Sends SMS to Australian mobiles
|
4
|
+
For use with a [burstsms.com.au](http://burstsms.com.au) account.
|
5
|
+
|
6
|
+
Installation
|
7
|
+
------------
|
8
|
+
|
9
|
+
gem install 'burstsms'
|
10
|
+
|
11
|
+
or add the following line to Gemfile:
|
12
|
+
|
13
|
+
gem 'burstsms'
|
14
|
+
|
15
|
+
and run `bundle` from your shell.
|
16
|
+
|
17
|
+
Usage
|
18
|
+
-----
|
19
|
+
**Create an authenticated instance**
|
20
|
+
|
21
|
+
@burstsms = BurstSms::API.new('api_key', 'secret')
|
22
|
+
|
23
|
+
**Responses**
|
24
|
+
Responses from the API are converted into ruby objects with attributes you can access.
|
25
|
+
|
26
|
+
Available attributes for each method are listed in their description below.
|
27
|
+
|
28
|
+
Every method will return a `error` attribute if something goes wrong
|
29
|
+
|
30
|
+
|
31
|
+
**Send a SMS** - [messages.multiple](http://burstsms.com/api-documentation/messages.multiple)
|
32
|
+
|
33
|
+
@burstsms.send_message('caller_id', 'recipients', 'message')
|
34
|
+
|
35
|
+
Response attributes :result :total_recipients :total_recipients_queued :message_id :contact_list_addition
|
36
|
+
|
37
|
+
`caller_id` Can be a Number upto 15 digits or a alpha-numeric string upto 11 characters.
|
38
|
+
`recipient/s` A single mobile number or an array of mobile numbers for multiple recipients.
|
39
|
+
`message` String containing sms message to send.
|
40
|
+
optional:
|
41
|
+
`sendtime` Set specific time to send message.
|
42
|
+
`contact_list` Add recipients to an existing contact list in your account.
|
43
|
+
|
44
|
+
*__NOTE:__The gem handles conversion of mobile numbers to the format required by the API. Also duplicate and invalid numbers will be deleted from the array.*
|
45
|
+
__example__: you can pass in an array of numbers like `['+61 414 899 766', '0403 855 555', '0403-855-445']` and it will be converted to `['61414899766', '61403855555', '61403855445']`
|
46
|
+
|
47
|
+
------
|
48
|
+
|
49
|
+
Additional Methods
|
50
|
+
------------------
|
51
|
+
|
52
|
+
**Send a SMS to an existing list** - [messages.add](http://burstsms.com/api-documentation/messages.add)
|
53
|
+
|
54
|
+
@burstsms.add_message('caller_id', 'list_id', 'message')
|
55
|
+
|
56
|
+
#returns :total :time :result :message_id :list_id :message :cost :balance :charge_error
|
57
|
+
|
58
|
+
**Retrieve history of sent messages** - [messages.get](http://burstsms.com/api-documentation/messages.get)
|
59
|
+
|
60
|
+
@burstsms.get_messages() #takes optional arguments offset and limit(default is 50)
|
61
|
+
|
62
|
+
#returns :total :time :messages
|
63
|
+
#messages return :id :list_id :mobile_from :message :datetime_send :datetime_actioned :recipient_count :status :schedule
|
64
|
+
|
65
|
+
**Retrieve responses from a message** - [messages.responses](http://burstsms.com/api-documentation/messages.responses)
|
66
|
+
|
67
|
+
@burstsms.message_responses('message_id') #takes optional arguments offset and limit(default is 50)
|
68
|
+
|
69
|
+
#returns :total :time :replies
|
70
|
+
#replies return :firstname :lastname :mobile :message :datetime_entry_orig
|
71
|
+
|
72
|
+
**Retrieve Contact Lists** - [contact-lists.get](http://burstsms.com/api-documentation/contact-lists.get)
|
73
|
+
|
74
|
+
@burstsms.get_lists() #takes optional arguments offset and limit(default is 50)
|
75
|
+
|
76
|
+
#returns :total :time :lists
|
77
|
+
#lists return :id :name :recipient_count
|
78
|
+
|
79
|
+
**Add Contact List** - [contact-lists.add](http://burstsms.com/api-documentation/contact-lists.add)
|
80
|
+
|
81
|
+
@burstsms.add_list('name of new list')
|
82
|
+
|
83
|
+
#returns :total :time :name :list_id :recipient_count
|
84
|
+
|
85
|
+
**Delete Contact List** - [contact-lists.delete](http://burstsms.com/api-documentation/contact-lists.delete)
|
86
|
+
|
87
|
+
@burstsms.delete_list('list_id')
|
88
|
+
|
89
|
+
#returns :total :time :response
|
90
|
+
|
91
|
+
**Retrieve Contact List Recipients** - [contact-lists.get-recipients](http://burstsms.com/api-documentation/contact-lists.get-recipients)
|
92
|
+
|
93
|
+
@burstsms.get_list_recipients('list_id') #takes optional arguments offset and limit(default is 50)
|
94
|
+
|
95
|
+
#returns :total :time :recipients
|
96
|
+
#recipients return :firstname :lastname :mobile :datetime_entry :dest_country :bounce_count
|
97
|
+
|
98
|
+
**Retrieve Contact List Unsubscribed** - [contact-lists.get-unsubscribed](http://burstsms.com/api-documentation/contact-lists.get-unsubscribed)
|
99
|
+
|
100
|
+
@burstsms.get_list_unsubscribed('list_id') #takes optional arguments offset and limit(default is 50)
|
101
|
+
|
102
|
+
#returns :total :time :recipients
|
103
|
+
#recipients return :firstname :lastname :mobile :datetime_entry :dest_country :bounce_count
|
104
|
+
|
105
|
+
**Add Contact List Recipient** - [contact-lists.add-recipient](http://burstsms.com/api-documentation/contact-lists.add-recipient)
|
106
|
+
|
107
|
+
@burstsms.add_list_recipient("list_id", "mobile_number", :firstname => 'Bob', :lastname => 'Smith') #name fields optional
|
108
|
+
|
109
|
+
#returns :total :time :result :list_id
|
110
|
+
#refer to Burst Sms docs for possible result values
|
111
|
+
|
112
|
+
**Delete Contact List Recipient** - [contact-lists.delete-recipient](http://burstsms.com/api-documentation/contact-lists.delete-recipient)
|
113
|
+
|
114
|
+
@burstsms.delete_list_recipient("list_id", "mobile_number")
|
115
|
+
|
116
|
+
#returns :total :time :result
|
117
|
+
#refer to Burst Sms docs for possible result values
|
118
|
+
|
119
|
+
------
|
120
|
+
**TODO**
|
121
|
+
|
122
|
+
- Complete 'contact-lists.add-multiple-recipients'
|
123
|
+
- Add reseller API functions.
|
124
|
+
|
125
|
+
Licence
|
126
|
+
-------
|
127
|
+
|
128
|
+
Copyright © 2012 *Made in Data Pty Ltd* and *David Barlow* [@madeindata](http://twitter.com/madeindata). Refer to terms in LICENCE file.
|
data/Rakefile
ADDED
data/burstsms.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "burstsms/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "burstsms"
|
7
|
+
s.version = BurstSms::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["David Barlow"]
|
10
|
+
s.email = ["david@madeindata.com"]
|
11
|
+
s.homepage = "https://github.com/madeindata/Burst-Sms"
|
12
|
+
s.summary = %q{Ruby Interface for the Burst SMS gateway}
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
|
19
|
+
|
20
|
+
s.add_dependency "unhappymapper"
|
21
|
+
s.add_dependency "httparty"
|
22
|
+
|
23
|
+
s.add_development_dependency "rspec", "~> 2.6"
|
24
|
+
s.add_development_dependency "webmock", "~> 1.7.10"
|
25
|
+
s.add_development_dependency 'rake'
|
26
|
+
|
27
|
+
end
|
data/lib/burstsms.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'happymapper'
|
3
|
+
require 'httparty'
|
4
|
+
|
5
|
+
|
6
|
+
module BurstSms
|
7
|
+
|
8
|
+
class ParamBuilder
|
9
|
+
include HappyMapper
|
10
|
+
tag 'params'
|
11
|
+
def initialize(parameters={})
|
12
|
+
parameters.each do |property,value|
|
13
|
+
self.class.element property, String unless respond_to?("#{property}=")
|
14
|
+
send("#{property}=",value) if respond_to?("#{property}=")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
require 'burstsms/messages_multiple'
|
23
|
+
require 'burstsms/messages_get'
|
24
|
+
require 'burstsms/messages_add'
|
25
|
+
require 'burstsms/message_responses'
|
26
|
+
require 'burstsms/lists_get'
|
27
|
+
require 'burstsms/lists_add'
|
28
|
+
require 'burstsms/lists_delete'
|
29
|
+
require 'burstsms/lists_get_recipients'
|
30
|
+
require 'burstsms/lists_get_unsubscribed'
|
31
|
+
require 'burstsms/lists_add_recipient'
|
32
|
+
require 'burstsms/lists_delete_recipient'
|
33
|
+
|
34
|
+
|
35
|
+
require 'burstsms/api'
|
36
|
+
|
37
|
+
|
data/lib/burstsms/api.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'happymapper'
|
2
|
+
|
3
|
+
module BurstSms
|
4
|
+
API_URL = "https://burstsms.com/api"
|
5
|
+
API_VERSION = 0.3
|
6
|
+
|
7
|
+
class API
|
8
|
+
include HappyMapper
|
9
|
+
|
10
|
+
include MessagesMultiple
|
11
|
+
include MessagesGet
|
12
|
+
include MessagesAdd
|
13
|
+
include MessageResponses
|
14
|
+
|
15
|
+
include ListsGet
|
16
|
+
include ListsAdd
|
17
|
+
include ListsDelete
|
18
|
+
include ListsGetRecipients
|
19
|
+
include ListsGetUnsubscribed
|
20
|
+
include ListsAddRecipient
|
21
|
+
include ListsDeleteRecipient
|
22
|
+
|
23
|
+
tag 'request'
|
24
|
+
|
25
|
+
element :version, Float
|
26
|
+
element :key, String
|
27
|
+
element :secret, String
|
28
|
+
element :api_method, String, :tag => 'method_'
|
29
|
+
|
30
|
+
has_one :params, String
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
def initialize(api_key, api_secret)
|
35
|
+
self.key = api_key
|
36
|
+
self.secret = api_secret
|
37
|
+
self.version = BurstSms::API_VERSION
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def sanitize_numbers(recipients)
|
45
|
+
Array(recipients).map{|n| n.gsub(/[^0-9]/i, '').gsub(/\A(04)|\A(4)/, '614')}.delete_if{|n| n.length != 11 || !n.start_with?('614')}.uniq.join(',')
|
46
|
+
end
|
47
|
+
|
48
|
+
def encode_msg(message)
|
49
|
+
URI.escape( message, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
|
50
|
+
end
|
51
|
+
|
52
|
+
def check_valid_sender(from)
|
53
|
+
sender = from.gsub(/[^0-9a-z_\s]/i, '')
|
54
|
+
if sender =~ /\D/
|
55
|
+
raise "Sender ID is too Long" if sender.length > 11
|
56
|
+
else
|
57
|
+
raise "Sender Number is too Long" if sender.length > 15
|
58
|
+
end
|
59
|
+
return sender
|
60
|
+
end
|
61
|
+
|
62
|
+
def build_request(api_call, parameters={})
|
63
|
+
self.params = ParamBuilder.new(parameters)
|
64
|
+
self.api_method = api_call
|
65
|
+
self.to_xml()
|
66
|
+
end
|
67
|
+
|
68
|
+
def post_to_api(request_xml)
|
69
|
+
#XML request has to be wrapped as a 'request' param in body
|
70
|
+
response = HTTParty.post( BurstSms::API_URL, :body => "request=#{request_xml}" )
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'happymapper'
|
2
|
+
|
3
|
+
module BurstSms
|
4
|
+
module ListsAdd
|
5
|
+
|
6
|
+
def add_list(name)
|
7
|
+
response = post_to_api(add_list_body(name))
|
8
|
+
Response.parse(response.body)
|
9
|
+
end
|
10
|
+
|
11
|
+
def add_list_body(name)
|
12
|
+
build_request("contact-lists.add", :name => name)
|
13
|
+
end
|
14
|
+
|
15
|
+
class Response
|
16
|
+
include HappyMapper
|
17
|
+
tag 'xml'
|
18
|
+
|
19
|
+
element :total, String
|
20
|
+
element :time, Time
|
21
|
+
element :timestamp, String
|
22
|
+
element :error, String
|
23
|
+
|
24
|
+
element :name, String, :xpath => "data/name"
|
25
|
+
element :recipient_count, String, :xpath => "data/recipient_count"
|
26
|
+
element :list_id, String, :xpath => "data/id"
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'happymapper'
|
2
|
+
|
3
|
+
module BurstSms
|
4
|
+
module ListsAddRecipient
|
5
|
+
|
6
|
+
def add_list_recipient(list_id, mobile, options={})
|
7
|
+
response = post_to_api(add_list_recipient_body(list_id, mobile, options))
|
8
|
+
Response.parse(response.body)
|
9
|
+
end
|
10
|
+
|
11
|
+
def add_list_recipient_body(list_id, mobile, options={})
|
12
|
+
build_request("contact-lists.add-recipient", :list_id => list_id,
|
13
|
+
:mobile => mobile,
|
14
|
+
:firstname => (options.has_key?(:firstname) ? options[:firstname] : nil),
|
15
|
+
:lastname => (options.has_key?(:lastname) ? options[:lastname] : nil),
|
16
|
+
:mobile_dest_country => (options.has_key?(:mobile_dest_country) ? options[:mobile_dest_country] : nil)
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
class Response
|
21
|
+
include HappyMapper
|
22
|
+
tag 'xml'
|
23
|
+
|
24
|
+
element :total, String
|
25
|
+
element :time, Time
|
26
|
+
element :timestamp, String
|
27
|
+
element :error, String
|
28
|
+
|
29
|
+
element :result, String, :xpath => "data/result"
|
30
|
+
element :list_id, String, :xpath => "data/list_id"
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'happymapper'
|
2
|
+
|
3
|
+
module BurstSms
|
4
|
+
module ListsDelete
|
5
|
+
|
6
|
+
def delete_list(id)
|
7
|
+
@response = post_to_api(delete_list_body(id))
|
8
|
+
Response.parse(@response.body)
|
9
|
+
end
|
10
|
+
|
11
|
+
def delete_list_body(id)
|
12
|
+
build_request("contact-lists.delete", :id => id)
|
13
|
+
end
|
14
|
+
|
15
|
+
class Response
|
16
|
+
include HappyMapper
|
17
|
+
tag 'xml'
|
18
|
+
|
19
|
+
element :error, String
|
20
|
+
element :total, String
|
21
|
+
element :time, String
|
22
|
+
element :timestamp, String
|
23
|
+
element :response, String
|
24
|
+
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'happymapper'
|
2
|
+
|
3
|
+
module BurstSms
|
4
|
+
module ListsDeleteRecipient
|
5
|
+
|
6
|
+
def delete_list_recipient(list_id, mobile)
|
7
|
+
@response = post_to_api(delete_list_recipient_body(list_id, mobile))
|
8
|
+
Response.parse(@response.body)
|
9
|
+
end
|
10
|
+
|
11
|
+
def delete_list_recipient_body(list_id, mobile)
|
12
|
+
build_request("contact-lists.delete-recipient", :list_id => list_id,
|
13
|
+
:mobile => mobile)
|
14
|
+
end
|
15
|
+
|
16
|
+
class Response
|
17
|
+
include HappyMapper
|
18
|
+
tag 'xml'
|
19
|
+
|
20
|
+
element :error, String
|
21
|
+
element :total, String
|
22
|
+
element :time, String
|
23
|
+
element :timestamp, String
|
24
|
+
element :result, String
|
25
|
+
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|