| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package Net::Clickatell; |
|
2
|
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
7509
|
use strict; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
39
|
|
|
4
|
1
|
|
|
1
|
|
4
|
use warnings; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
31
|
|
|
5
|
|
|
|
|
|
|
#use diagnostics; |
|
6
|
|
|
|
|
|
|
|
|
7
|
1
|
|
|
1
|
|
56931
|
use LWP::UserAgent; |
|
|
1
|
|
|
|
|
69527
|
|
|
|
1
|
|
|
|
|
30
|
|
|
8
|
1
|
|
|
1
|
|
9
|
use URI::Escape qw(uri_escape); |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
68
|
|
|
9
|
1
|
|
|
1
|
|
813
|
use HTTP::Request::Common; |
|
|
1
|
|
|
|
|
2014
|
|
|
|
1
|
|
|
|
|
1671
|
|
|
10
|
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
# See the bottom of this file for the POD documentation. Search for the |
|
12
|
|
|
|
|
|
|
# string '=head'. |
|
13
|
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
# You can run this file through either pod2man or pod2html to produce pretty |
|
15
|
|
|
|
|
|
|
# documentation in manual or html file format (these utilities are part of the |
|
16
|
|
|
|
|
|
|
# Perl 5 distribution). |
|
17
|
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
# Copyright (c) 2010 Christopherus Goo. All rights reserved. |
|
19
|
|
|
|
|
|
|
# It may be used and modified freely, but I do request that this copyright |
|
20
|
|
|
|
|
|
|
# notice remain attached to the file. You may modify this module as you |
|
21
|
|
|
|
|
|
|
# wish, but if you redistribute a modified version, please attach a note |
|
22
|
|
|
|
|
|
|
# listing the modifications you have made. |
|
23
|
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
# The most recent version and complete docs are available at: |
|
25
|
|
|
|
|
|
|
# http://www.artofmobile.com/software/ |
|
26
|
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
# Clickatell is Copyright (c) 2010 Clickatell (Pty) Ltd: Bulk SMS Gateway |
|
28
|
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
#This software or the author aren't related to Clickatell in any way. |
|
30
|
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
# November 2010. Singapore. |
|
32
|
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
$Net::Clickatell::VERSION=0.5; |
|
34
|
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
=head1 NAME |
|
36
|
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
Net::Clickatell - Access to Clickatell HTTP API |
|
38
|
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
This module support the API from Clickatell's HTTP API Specification v.2.4.1. |
|
40
|
|
|
|
|
|
|
The following is all the available API and not all are supported |
|
41
|
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
Basic Commands |
|
43
|
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
http://api.clickatell.com/http/auth Yes (But session not support) |
|
45
|
|
|
|
|
|
|
http://api.clickatell.com/http/ping Yes (But session not support) |
|
46
|
|
|
|
|
|
|
http://api.clickatell.com/http/querymsg Yes |
|
47
|
|
|
|
|
|
|
http://api.clickatell.com/http/sendmsg Yes |
|
48
|
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
Additional Commands |
|
50
|
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
http://api.clickatell.com/http/delmsg No |
|
52
|
|
|
|
|
|
|
http://api.clickatell.com/http/getbalance Yes |
|
53
|
|
|
|
|
|
|
http://api.clickatell.com/http/routeCoverage.php Yes |
|
54
|
|
|
|
|
|
|
http://api.clickatell.com/mms/ind_push.php Yes |
|
55
|
|
|
|
|
|
|
http://api.clickatell.com/mms/si_push.php Yes |
|
56
|
|
|
|
|
|
|
http://api.clickatell.com/http/getmsgcharge Yes |
|
57
|
|
|
|
|
|
|
http://api.clickatell.com/http/token_pay No |
|
58
|
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
Batch Messaging |
|
60
|
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
http://api.clickatell.com/http_batch/startbatch No |
|
62
|
|
|
|
|
|
|
http://api.clickatell.com/http_batch/senditem No |
|
63
|
|
|
|
|
|
|
http://api.clickatell.com/http_batch/quicksend No |
|
64
|
|
|
|
|
|
|
http://api.clickatell.com/http_batch/endbatch No |
|
65
|
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
70
|
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
=head2 With SSL |
|
72
|
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
use Net::Clickatell; |
|
74
|
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
my $clickatell = Net::Clickatell->new( API_ID => $api_id, USERNAME =>$username, PASSWORD =>$password ); |
|
76
|
|
|
|
|
|
|
my $bal=$clickatell->getBalance; |
|
77
|
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
=head2 Without SSL |
|
79
|
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
use Net::Clickatell; |
|
81
|
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
my $clickatell = Net::Clickatell->new( UseSSL=>0, API_ID => $api_id, USERNAME =>$username, PASSWORD =>$password ); |
|
83
|
|
|
|
|
|
|
my $bal=$clickatell->getBalance; |
|
84
|
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
86
|
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
Clickatell (http://www.clickatell.com) is a commercial service that allows its users to send |
|
88
|
|
|
|
|
|
|
SMS messages to anyone in the world. This perl module allow users to send SMS, WAP push and |
|
89
|
|
|
|
|
|
|
MMS through Clickatell HTTP API. |
|
90
|
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
Please take note that neither this software nor the author are related to Clickatell in any way. |
|
92
|
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
=head1 METHODS |
|
94
|
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
=over 4 |
|
96
|
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
=cut |
|
98
|
|
|
|
|
|
|
my %status= ( |
|
99
|
|
|
|
|
|
|
"001", "Message unknown. The delivering network did not recognise the message type or content.", |
|
100
|
|
|
|
|
|
|
"002", "Message queued. The message could not be delivered and has been queued for attempted redelivery.", |
|
101
|
|
|
|
|
|
|
"003", "Delivered. Delivered to the network or gateway (delivered to the recipient).", |
|
102
|
|
|
|
|
|
|
"004", "Received by recipient. Confirmation of receipt on the handset of the recipient.", |
|
103
|
|
|
|
|
|
|
"005", "Error with message. There was an error with the message, probably caused by the content of the message itself.", |
|
104
|
|
|
|
|
|
|
"006", "User cancelled message delivery. Client cancelled the message by setting the validity period, or the message was terminated by an internal mechanism.", |
|
105
|
|
|
|
|
|
|
"007", "Error delivering message An error occurred delivering the message to the handset.", |
|
106
|
|
|
|
|
|
|
"008", " OK. Message received by gateway.", |
|
107
|
|
|
|
|
|
|
"009", "Routing error. The routing gateway or network has had an error routing the message.", |
|
108
|
|
|
|
|
|
|
"010", "Message expired. Message has expired at the network due to the handset being off, or out of reach.", |
|
109
|
|
|
|
|
|
|
"011", "Message queued for later delivery. Message has been queued at the Clickatell gateway for delivery at a later time (delayed delivery).", |
|
110
|
|
|
|
|
|
|
"012", "Out of credit. The message cannot be delivered due to a lack of funds in your account. Please re-purchase credits." |
|
111
|
|
|
|
|
|
|
); |
|
112
|
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
sub getStatusDetail { |
|
114
|
0
|
|
0
|
0
|
0
|
|
my $class = shift || undef; |
|
115
|
0
|
0
|
|
|
|
|
return undef if( !defined $class); |
|
116
|
|
|
|
|
|
|
|
|
117
|
0
|
|
|
|
|
|
my $ret = shift; |
|
118
|
|
|
|
|
|
|
|
|
119
|
0
|
|
|
|
|
|
my @allret=split ": ",$ret; |
|
120
|
0
|
|
|
|
|
|
my $sc=$allret[@allret-1]; |
|
121
|
0
|
|
|
|
|
|
$sc=~s/\D//g; |
|
122
|
0
|
|
|
|
|
|
return $class->getStatus($sc); |
|
123
|
|
|
|
|
|
|
} |
|
124
|
|
|
|
|
|
|
|
|
125
|
|
|
|
|
|
|
sub getStatus { |
|
126
|
0
|
|
0
|
0
|
0
|
|
my $class = shift || undef; |
|
127
|
0
|
0
|
|
|
|
|
return undef if( !defined $class); |
|
128
|
|
|
|
|
|
|
|
|
129
|
0
|
|
|
|
|
|
my $scode = shift; |
|
130
|
0
|
|
|
|
|
|
my $ret=$status{$scode}; |
|
131
|
0
|
0
|
|
|
|
|
return $scode,$ret if ($ret); |
|
132
|
0
|
|
|
|
|
|
return -1,"Unknown Status"; |
|
133
|
|
|
|
|
|
|
} |
|
134
|
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
sub authentication { |
|
136
|
0
|
|
0
|
0
|
0
|
|
my $class = shift || undef; |
|
137
|
0
|
0
|
|
|
|
|
return undef if( !defined $class); |
|
138
|
|
|
|
|
|
|
|
|
139
|
0
|
|
|
|
|
|
return $class->connect('http/auth'); |
|
140
|
|
|
|
|
|
|
} |
|
141
|
|
|
|
|
|
|
|
|
142
|
|
|
|
|
|
|
sub ping { |
|
143
|
0
|
|
0
|
0
|
0
|
|
my $class = shift || undef; |
|
144
|
0
|
0
|
|
|
|
|
return undef if( !defined $class); |
|
145
|
|
|
|
|
|
|
|
|
146
|
0
|
|
|
|
|
|
my ($sid)=@_; |
|
147
|
0
|
|
|
|
|
|
return $class->connect('http/ping','session_id',$sid); |
|
148
|
|
|
|
|
|
|
} |
|
149
|
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
=item new |
|
151
|
|
|
|
|
|
|
|
|
152
|
|
|
|
|
|
|
This method is used to create the Clickatell object. |
|
153
|
|
|
|
|
|
|
|
|
154
|
|
|
|
|
|
|
Usage: |
|
155
|
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
my $clickatell = Net::Clickatell->new( API_ID => $api_id, USERNAME= $user, PASSWORD =>$passwd ); |
|
157
|
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
The complete list of arguments is: |
|
159
|
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
API_ID : Unique number received from Clickatell when an account is created. |
|
161
|
|
|
|
|
|
|
UseSSL : Tell Clickatell module whether to use SSL or not (0 or 1). |
|
162
|
|
|
|
|
|
|
BaseURL : Default URL used to connect with Clickatell service. |
|
163
|
|
|
|
|
|
|
UserAgent : Name of the user agent you want to display to Clickatell service. |
|
164
|
|
|
|
|
|
|
|
|
165
|
|
|
|
|
|
|
=cut |
|
166
|
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
sub new { |
|
168
|
0
|
|
0
|
0
|
1
|
|
my $class = shift || undef; |
|
169
|
0
|
0
|
|
|
|
|
return undef if( !defined $class); |
|
170
|
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
# Get arguments |
|
172
|
0
|
|
|
|
|
|
my %args = ( UseSSL => 1, |
|
173
|
|
|
|
|
|
|
UserAgent => 'Clickatell.pm/'. $Net::Clickatell::VERSION, |
|
174
|
|
|
|
|
|
|
@_ ); |
|
175
|
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
# Check arguments |
|
177
|
0
|
0
|
|
|
|
|
if (!exists $args{API_ID}) { |
|
178
|
|
|
|
|
|
|
# There isn't an API identification number. We can't continue |
|
179
|
0
|
|
|
|
|
|
return undef; |
|
180
|
|
|
|
|
|
|
} |
|
181
|
|
|
|
|
|
|
|
|
182
|
0
|
0
|
|
|
|
|
if (!exists $args{USERNAME}) { |
|
183
|
|
|
|
|
|
|
# There isn't a USERNAME. We can't continue |
|
184
|
0
|
|
|
|
|
|
return undef; |
|
185
|
|
|
|
|
|
|
} |
|
186
|
|
|
|
|
|
|
|
|
187
|
0
|
0
|
|
|
|
|
if (!exists $args{PASSWORD}) { |
|
188
|
|
|
|
|
|
|
# There isn't a PASSWORD. We can't continue |
|
189
|
0
|
|
|
|
|
|
return undef; |
|
190
|
|
|
|
|
|
|
} |
|
191
|
|
|
|
|
|
|
|
|
192
|
0
|
0
|
|
|
|
|
if ($args{UseSSL} =~ /\D/) { |
|
193
|
|
|
|
|
|
|
# UseSSL argument wasn't valid. Set it to 1 |
|
194
|
0
|
|
|
|
|
|
$args{UseSSL} = 1; |
|
195
|
|
|
|
|
|
|
} |
|
196
|
|
|
|
|
|
|
|
|
197
|
0
|
0
|
|
|
|
|
if (!exists $args{BaseURL}) { |
|
198
|
|
|
|
|
|
|
# BaseURL argument wasn't passed. Set it to default. |
|
199
|
|
|
|
|
|
|
# Check if we have to use SSL. |
|
200
|
0
|
0
|
0
|
|
|
|
if (exists $args{UseSSL} && $args{UseSSL}==1) { |
|
201
|
0
|
|
|
|
|
|
$args{BaseURL} = 'https://api.clickatell.com/'; |
|
202
|
|
|
|
|
|
|
} else { |
|
203
|
0
|
|
|
|
|
|
$args{BaseURL} = 'http://api.clickatell.com/'; |
|
204
|
|
|
|
|
|
|
} |
|
205
|
|
|
|
|
|
|
} else { |
|
206
|
|
|
|
|
|
|
# Set BaseURL property value. |
|
207
|
|
|
|
|
|
|
# Check if we have to use SSL. |
|
208
|
0
|
0
|
0
|
|
|
|
if (exists $args{UseSSL} && $args{UseSSL}==1) { |
|
209
|
0
|
|
|
|
|
|
$args{BaseURL} = 'https://'.$args{BaseURL}; |
|
210
|
|
|
|
|
|
|
} else { |
|
211
|
0
|
|
|
|
|
|
$args{BaseURL} = 'http://'.$args{BaseURL}; |
|
212
|
|
|
|
|
|
|
} |
|
213
|
|
|
|
|
|
|
} |
|
214
|
|
|
|
|
|
|
|
|
215
|
0
|
|
|
|
|
|
return bless { BASE_URL => $args{BaseURL}, |
|
216
|
|
|
|
|
|
|
API_ID => uri_escape($args{API_ID}), |
|
217
|
|
|
|
|
|
|
USERNAME => uri_escape($args{USERNAME}), |
|
218
|
|
|
|
|
|
|
PASSWORD => uri_escape($args{PASSWORD}), |
|
219
|
|
|
|
|
|
|
USE_SSL => $args{UseSSL}, |
|
220
|
|
|
|
|
|
|
USER_AGENT => $args{UserAgent}, |
|
221
|
|
|
|
|
|
|
}, $class; |
|
222
|
|
|
|
|
|
|
} |
|
223
|
|
|
|
|
|
|
|
|
224
|
|
|
|
|
|
|
sub connect { |
|
225
|
0
|
|
0
|
0
|
0
|
|
my $class = shift || undef; |
|
226
|
0
|
0
|
|
|
|
|
return undef if( !defined $class); |
|
227
|
|
|
|
|
|
|
|
|
228
|
0
|
|
|
|
|
|
my $url= shift; |
|
229
|
0
|
|
|
|
|
|
my (@entry)=@_; |
|
230
|
|
|
|
|
|
|
|
|
231
|
0
|
|
|
|
|
|
my $ua = LWP::UserAgent->new(agent => $class->{USER_AGENT} ); |
|
232
|
|
|
|
|
|
|
|
|
233
|
0
|
|
|
|
|
|
my %tags = @entry; |
|
234
|
0
|
|
|
|
|
|
$tags{'api_id'} = $class->{API_ID}; |
|
235
|
0
|
|
|
|
|
|
$tags{'user'} = $class->{USERNAME}; |
|
236
|
0
|
|
|
|
|
|
$tags{'password'} = $class->{PASSWORD}; |
|
237
|
|
|
|
|
|
|
|
|
238
|
0
|
|
|
|
|
|
my $res = $ua->request( |
|
239
|
|
|
|
|
|
|
POST $class->{BASE_URL}.$url, |
|
240
|
|
|
|
|
|
|
Content_Type => 'application/x-www-form-urlencoded', |
|
241
|
|
|
|
|
|
|
Content => [ %tags ] |
|
242
|
|
|
|
|
|
|
); |
|
243
|
0
|
|
|
|
|
|
return $res->content; |
|
244
|
|
|
|
|
|
|
} |
|
245
|
|
|
|
|
|
|
|
|
246
|
|
|
|
|
|
|
=item getBalance |
|
247
|
|
|
|
|
|
|
|
|
248
|
|
|
|
|
|
|
This method will return the Balance of the account. |
|
249
|
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
Usage: |
|
251
|
|
|
|
|
|
|
|
|
252
|
|
|
|
|
|
|
$clickatell->getBalance; |
|
253
|
|
|
|
|
|
|
|
|
254
|
|
|
|
|
|
|
Succesful example of the return is as followed: |
|
255
|
|
|
|
|
|
|
OK: Credit: 100.3 |
|
256
|
|
|
|
|
|
|
|
|
257
|
|
|
|
|
|
|
Failed example of the return is as followed: |
|
258
|
|
|
|
|
|
|
ERR: 001, Authentication failed |
|
259
|
|
|
|
|
|
|
|
|
260
|
|
|
|
|
|
|
=cut |
|
261
|
|
|
|
|
|
|
|
|
262
|
|
|
|
|
|
|
sub getBalance { |
|
263
|
0
|
|
0
|
0
|
1
|
|
my $class = shift || undef; |
|
264
|
0
|
0
|
|
|
|
|
return undef if( !defined $class); |
|
265
|
|
|
|
|
|
|
|
|
266
|
0
|
|
|
|
|
|
my $ret= $class->connect('http/getbalance'); |
|
267
|
0
|
0
|
|
|
|
|
return "OK: $ret" unless $ret=~/^ERR: /; |
|
268
|
0
|
|
|
|
|
|
return $ret; |
|
269
|
|
|
|
|
|
|
} |
|
270
|
|
|
|
|
|
|
|
|
271
|
|
|
|
|
|
|
=item checkCoverage |
|
272
|
|
|
|
|
|
|
|
|
273
|
|
|
|
|
|
|
This method will return the Balance of the account. |
|
274
|
|
|
|
|
|
|
|
|
275
|
|
|
|
|
|
|
Usage: |
|
276
|
|
|
|
|
|
|
|
|
277
|
|
|
|
|
|
|
$clickatell->checkCoverage($msisdn); |
|
278
|
|
|
|
|
|
|
|
|
279
|
|
|
|
|
|
|
Succesful example of the return is as followed: |
|
280
|
|
|
|
|
|
|
OK: This prefix is currently supported. Messages sent to this prefix will be routed. Charge: 1 |
|
281
|
|
|
|
|
|
|
|
|
282
|
|
|
|
|
|
|
Failed example of the return is as followed: |
|
283
|
|
|
|
|
|
|
ERR: This prefix is not currently supported. Messages sent to this prefix will fail. Please contact support for assistance. |
|
284
|
|
|
|
|
|
|
|
|
285
|
|
|
|
|
|
|
=cut |
|
286
|
|
|
|
|
|
|
|
|
287
|
|
|
|
|
|
|
sub checkCoverage { |
|
288
|
0
|
|
0
|
0
|
1
|
|
my $class = shift || undef; |
|
289
|
0
|
0
|
|
|
|
|
return undef if( !defined $class); |
|
290
|
|
|
|
|
|
|
|
|
291
|
0
|
|
|
|
|
|
my ($msisdn)=@_; |
|
292
|
0
|
|
|
|
|
|
return $class->connect('utils/routeCoverage.php','msisdn',$msisdn); |
|
293
|
|
|
|
|
|
|
} |
|
294
|
|
|
|
|
|
|
|
|
295
|
|
|
|
|
|
|
=item getQuery |
|
296
|
|
|
|
|
|
|
|
|
297
|
|
|
|
|
|
|
This method will return the Message Charge Status. |
|
298
|
|
|
|
|
|
|
|
|
299
|
|
|
|
|
|
|
Usage: |
|
300
|
|
|
|
|
|
|
|
|
301
|
|
|
|
|
|
|
my ($code,$querymessage)=$clickatell->getQuery($apimsgid); |
|
302
|
|
|
|
|
|
|
|
|
303
|
|
|
|
|
|
|
This method will return 2 values in a array which is as followed: |
|
304
|
|
|
|
|
|
|
001 |
|
305
|
|
|
|
|
|
|
ID: add8f5556c0d3d54bc94a4cd8800f01b4 Status: 001, Message unknown. The delivering network did not recognise the message type or content. |
|
306
|
|
|
|
|
|
|
|
|
307
|
|
|
|
|
|
|
=cut |
|
308
|
|
|
|
|
|
|
|
|
309
|
|
|
|
|
|
|
sub getQuery { |
|
310
|
0
|
|
0
|
0
|
1
|
|
my $class = shift || undef; |
|
311
|
0
|
0
|
|
|
|
|
return undef if( !defined $class); |
|
312
|
|
|
|
|
|
|
|
|
313
|
0
|
|
|
|
|
|
my $apimsgid=shift; |
|
314
|
0
|
|
|
|
|
|
my $ret= $class->connect('http/querymsg','apimsgid',$apimsgid); |
|
315
|
0
|
|
|
|
|
|
my $code=-1; |
|
316
|
0
|
|
|
|
|
|
my $scode='Error in the return status'; |
|
317
|
0
|
0
|
|
|
|
|
($code,$scode)=$class->getStatusDetail($ret) if ($ret=~/status:/i); |
|
318
|
0
|
|
|
|
|
|
return $code, ($ret.', '.$scode); |
|
319
|
|
|
|
|
|
|
} |
|
320
|
|
|
|
|
|
|
|
|
321
|
|
|
|
|
|
|
=item getMessageCharge |
|
322
|
|
|
|
|
|
|
|
|
323
|
|
|
|
|
|
|
This method will return the Message Charge Status. |
|
324
|
|
|
|
|
|
|
|
|
325
|
|
|
|
|
|
|
Usage: |
|
326
|
|
|
|
|
|
|
|
|
327
|
|
|
|
|
|
|
my ($code,$messagecharge)=$clickatell->getMessageCharge($apimsgid); |
|
328
|
|
|
|
|
|
|
|
|
329
|
|
|
|
|
|
|
This method will return 2 values in a array which is as followed: |
|
330
|
|
|
|
|
|
|
001 |
|
331
|
|
|
|
|
|
|
apiMsgId: add8f5556c0d3d54bc94a4cd8800f01b4 charge: 0 status: 001, Message unknown. The delivering network did not recognise the message type or content. |
|
332
|
|
|
|
|
|
|
|
|
333
|
|
|
|
|
|
|
=cut |
|
334
|
|
|
|
|
|
|
|
|
335
|
|
|
|
|
|
|
sub getMessageCharge { |
|
336
|
0
|
|
0
|
0
|
1
|
|
my $class = shift || undef; |
|
337
|
0
|
0
|
|
|
|
|
return undef if( !defined $class); |
|
338
|
|
|
|
|
|
|
|
|
339
|
0
|
|
|
|
|
|
my $apimsgid=shift; |
|
340
|
0
|
|
|
|
|
|
my $ret= $class->connect('http/getmsgcharge','apimsgid',$apimsgid); |
|
341
|
0
|
|
|
|
|
|
my $code=-1; |
|
342
|
0
|
|
|
|
|
|
my $scode='Error in the return status'; |
|
343
|
0
|
0
|
|
|
|
|
($code,$scode)=$class->getStatusDetail($ret) if ($ret=~/status:/i); |
|
344
|
0
|
|
|
|
|
|
return $code, ($ret.', '.$scode); |
|
345
|
|
|
|
|
|
|
} |
|
346
|
|
|
|
|
|
|
|
|
347
|
|
|
|
|
|
|
=item sendBasicSMSMessage |
|
348
|
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
This method is used to send a text SMS Message. |
|
350
|
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
Usage: |
|
352
|
|
|
|
|
|
|
|
|
353
|
|
|
|
|
|
|
my $smsResult=$clickatell->sendBasicSMSMessage($from,$to,$msg); |
|
354
|
|
|
|
|
|
|
|
|
355
|
|
|
|
|
|
|
Succesful example of the return is as followed: |
|
356
|
|
|
|
|
|
|
OK: ID: dd8f5556c0d3d54bc94a4cd8800f01b4 |
|
357
|
|
|
|
|
|
|
|
|
358
|
|
|
|
|
|
|
Failed example of the return is as followed: |
|
359
|
|
|
|
|
|
|
ERR: 105, Invalid Destination Address |
|
360
|
|
|
|
|
|
|
|
|
361
|
|
|
|
|
|
|
=cut |
|
362
|
|
|
|
|
|
|
|
|
363
|
|
|
|
|
|
|
sub sendBasicSMSMessage { |
|
364
|
0
|
|
0
|
0
|
1
|
|
my $class = shift || undef; |
|
365
|
0
|
0
|
|
|
|
|
return undef if( !defined $class); |
|
366
|
|
|
|
|
|
|
|
|
367
|
0
|
|
|
|
|
|
my ($from,$to,$msg)=@_; |
|
368
|
0
|
|
|
|
|
|
my $ret= $class->connect('http/sendmsg',"to",$to,'from',$from,'text',$msg); |
|
369
|
0
|
0
|
|
|
|
|
return "OK: $ret" unless $ret=~/^ERR: /; |
|
370
|
0
|
|
|
|
|
|
return $ret; |
|
371
|
|
|
|
|
|
|
} |
|
372
|
|
|
|
|
|
|
|
|
373
|
|
|
|
|
|
|
=item sendAdvanceSMSMessage |
|
374
|
|
|
|
|
|
|
|
|
375
|
|
|
|
|
|
|
This method is used to send a customised SMS Message. The following are the accepted parameter format: |
|
376
|
|
|
|
|
|
|
to |
|
377
|
|
|
|
|
|
|
text |
|
378
|
|
|
|
|
|
|
from |
|
379
|
|
|
|
|
|
|
callback |
|
380
|
|
|
|
|
|
|
deliv_time |
|
381
|
|
|
|
|
|
|
concat |
|
382
|
|
|
|
|
|
|
max_credits |
|
383
|
|
|
|
|
|
|
req_feat |
|
384
|
|
|
|
|
|
|
queue |
|
385
|
|
|
|
|
|
|
escalate |
|
386
|
|
|
|
|
|
|
mo |
|
387
|
|
|
|
|
|
|
cliMsgId |
|
388
|
|
|
|
|
|
|
Unicode |
|
389
|
|
|
|
|
|
|
msg_type |
|
390
|
|
|
|
|
|
|
udh |
|
391
|
|
|
|
|
|
|
data |
|
392
|
|
|
|
|
|
|
validity |
|
393
|
|
|
|
|
|
|
binary |
|
394
|
|
|
|
|
|
|
schedule_time |
|
395
|
|
|
|
|
|
|
|
|
396
|
|
|
|
|
|
|
Usage: |
|
397
|
|
|
|
|
|
|
|
|
398
|
|
|
|
|
|
|
my $smsResult=$clickatell->sendAdvanceSMSMessage(to=>'6591234567',from=>'6591234568',text=>'testing'); |
|
399
|
|
|
|
|
|
|
|
|
400
|
|
|
|
|
|
|
Succesful example of the return is as followed: |
|
401
|
|
|
|
|
|
|
OK: ID: dd8f5556c0d3d54bc94a4cd8800f01b4 |
|
402
|
|
|
|
|
|
|
|
|
403
|
|
|
|
|
|
|
Failed example of the return is as followed: |
|
404
|
|
|
|
|
|
|
ERR: 105, Invalid Destination Address |
|
405
|
|
|
|
|
|
|
|
|
406
|
|
|
|
|
|
|
=cut |
|
407
|
|
|
|
|
|
|
|
|
408
|
|
|
|
|
|
|
sub sendAdvanceSMSMessage { |
|
409
|
0
|
|
0
|
0
|
1
|
|
my $class = shift || undef; |
|
410
|
0
|
0
|
|
|
|
|
return undef if( !defined $class); |
|
411
|
|
|
|
|
|
|
# Get arguments |
|
412
|
0
|
|
|
|
|
|
my %args = @_; |
|
413
|
|
|
|
|
|
|
|
|
414
|
|
|
|
|
|
|
# Check arguments |
|
415
|
0
|
0
|
|
|
|
|
if (!exists $args{to}) { |
|
416
|
0
|
|
|
|
|
|
return "ERR: To field not found"; |
|
417
|
|
|
|
|
|
|
} else { |
|
418
|
0
|
0
|
|
|
|
|
if (ref($args{to})) { |
|
419
|
0
|
0
|
|
|
|
|
return "ERR: To field must be arrayref" unless ref($args{to}) eq "ARRAY"; |
|
420
|
0
|
|
|
|
|
|
my $tos=$args{to}; |
|
421
|
0
|
0
|
|
|
|
|
return "ERR: To field must be contain at least 1 number" unless (@$tos); |
|
422
|
0
|
|
|
|
|
|
$args{to}=join ',',@$tos; |
|
423
|
0
|
|
|
|
|
|
print $args{to}."\n"; |
|
424
|
|
|
|
|
|
|
} |
|
425
|
|
|
|
|
|
|
} |
|
426
|
|
|
|
|
|
|
|
|
427
|
0
|
0
|
|
|
|
|
if (!exists $args{from}) { |
|
428
|
0
|
|
|
|
|
|
return "ERR: From field not found"; |
|
429
|
|
|
|
|
|
|
} |
|
430
|
|
|
|
|
|
|
|
|
431
|
0
|
0
|
0
|
|
|
|
if (!exists $args{text} && !exists $args{data}){ |
|
432
|
0
|
|
|
|
|
|
return "ERR: Text field not found"; |
|
433
|
|
|
|
|
|
|
} |
|
434
|
|
|
|
|
|
|
|
|
435
|
0
|
|
|
|
|
|
my $ret= $class->connect('http/sendmsg',%args); |
|
436
|
0
|
0
|
|
|
|
|
return "OK: $ret" unless $ret=~/^ERR: /; |
|
437
|
0
|
|
|
|
|
|
return $ret; |
|
438
|
|
|
|
|
|
|
} |
|
439
|
|
|
|
|
|
|
|
|
440
|
|
|
|
|
|
|
=item sendMMNotification |
|
441
|
|
|
|
|
|
|
|
|
442
|
|
|
|
|
|
|
This method is used to send a MMS Notification Push Message. |
|
443
|
|
|
|
|
|
|
|
|
444
|
|
|
|
|
|
|
Usage: |
|
445
|
|
|
|
|
|
|
|
|
446
|
|
|
|
|
|
|
my $mmsResult=$clickatell->sendMMNotification($from,$to,$subject,$expiry,$url); |
|
447
|
|
|
|
|
|
|
|
|
448
|
|
|
|
|
|
|
Succesful example of the return is as followed: |
|
449
|
|
|
|
|
|
|
OK: ID: dd8f5556c0d3d54bc94a4cd8800f01b4 |
|
450
|
|
|
|
|
|
|
|
|
451
|
|
|
|
|
|
|
Failed example of the return is as followed: |
|
452
|
|
|
|
|
|
|
ERR: 105, Invalid Destination Address |
|
453
|
|
|
|
|
|
|
|
|
454
|
|
|
|
|
|
|
=cut |
|
455
|
|
|
|
|
|
|
|
|
456
|
|
|
|
|
|
|
sub sendMMNotification { |
|
457
|
0
|
|
0
|
0
|
1
|
|
my $class = shift || undef; |
|
458
|
0
|
0
|
|
|
|
|
return undef if( !defined $class); |
|
459
|
|
|
|
|
|
|
|
|
460
|
0
|
|
|
|
|
|
my ($from,$to,$subject,$expiry,$url)=@_; |
|
461
|
|
|
|
|
|
|
|
|
462
|
|
|
|
|
|
|
# mms_subject: subject |
|
463
|
|
|
|
|
|
|
# mms_class: class (e.g. 80,81,82,83) |
|
464
|
|
|
|
|
|
|
# mms_expire: seconds - different to the standard expire parameter |
|
465
|
|
|
|
|
|
|
# mms_from: from text |
|
466
|
|
|
|
|
|
|
# mms_url: the url with the mms content. The URL must be urlencoded. |
|
467
|
|
|
|
|
|
|
# print "($from,$to,$subject,$expiry,$url)\n"; |
|
468
|
|
|
|
|
|
|
|
|
469
|
0
|
|
|
|
|
|
my $loc=uri_escape($url); |
|
470
|
0
|
|
|
|
|
|
my $ret= $class->connect('mms/ind_push.php',"to",$to,'from',$from,'mms_from',$from, |
|
471
|
|
|
|
|
|
|
'mms_expire',$expiry,'mms_url',$loc,'mms_class','80','mms_subject',$subject); |
|
472
|
0
|
0
|
|
|
|
|
return "OK: $ret" unless $ret=~/^ERR: /; |
|
473
|
0
|
|
|
|
|
|
return $ret; |
|
474
|
|
|
|
|
|
|
|
|
475
|
|
|
|
|
|
|
} |
|
476
|
|
|
|
|
|
|
|
|
477
|
|
|
|
|
|
|
=item sendWAPPush |
|
478
|
|
|
|
|
|
|
|
|
479
|
|
|
|
|
|
|
This method is used to send a WAP Push. Currently, only SI WAP Push message is supported. |
|
480
|
|
|
|
|
|
|
|
|
481
|
|
|
|
|
|
|
Usage: |
|
482
|
|
|
|
|
|
|
|
|
483
|
|
|
|
|
|
|
my $wapResult=$clickatell->sendWAPPush($from,$to,$msg,$url); |
|
484
|
|
|
|
|
|
|
|
|
485
|
|
|
|
|
|
|
Succesful example of the return is as followed: |
|
486
|
|
|
|
|
|
|
OK: ID: dd8f5556c0d3d54bc94a4cd8800f01b4 |
|
487
|
|
|
|
|
|
|
|
|
488
|
|
|
|
|
|
|
Failed example of the return is as followed: |
|
489
|
|
|
|
|
|
|
ERR: 105, Invalid Destination Address |
|
490
|
|
|
|
|
|
|
|
|
491
|
|
|
|
|
|
|
=cut |
|
492
|
|
|
|
|
|
|
|
|
493
|
|
|
|
|
|
|
sub sendWAPPush { |
|
494
|
0
|
|
0
|
0
|
1
|
|
my $class = shift || undef; |
|
495
|
0
|
0
|
|
|
|
|
return undef if( !defined $class); |
|
496
|
|
|
|
|
|
|
|
|
497
|
0
|
|
|
|
|
|
my ($from,$to,$message,$url)=@_; |
|
498
|
0
|
|
|
|
|
|
my $rr=$to.rand(100); |
|
499
|
0
|
|
|
|
|
|
$rr=~s/\D//g; |
|
500
|
0
|
|
|
|
|
|
return $class->sendSIWAPPush($from,$to,$rr,'delete',$message,$url); |
|
501
|
|
|
|
|
|
|
} |
|
502
|
|
|
|
|
|
|
|
|
503
|
|
|
|
|
|
|
sub sendSIWAPPush { |
|
504
|
0
|
|
0
|
0
|
0
|
|
my $class = shift || undef; |
|
505
|
0
|
0
|
|
|
|
|
return undef if( !defined $class); |
|
506
|
|
|
|
|
|
|
|
|
507
|
0
|
|
|
|
|
|
my ($from,$to,$si_id,$si_action,$message,$url)=@_; |
|
508
|
|
|
|
|
|
|
#si_id: unique id for msg - must be used with a 'delete' action |
|
509
|
|
|
|
|
|
|
#si_url: the url to be fetched (url encoded) |
|
510
|
|
|
|
|
|
|
#si_text: notification text |
|
511
|
|
|
|
|
|
|
#si_created: date in UTC |
|
512
|
|
|
|
|
|
|
#si_expires: data in UTC |
|
513
|
|
|
|
|
|
|
#si_action: one of (signal-none, signal-low, signal-medium, signal-high, delete) |
|
514
|
0
|
|
|
|
|
|
my $nowt=&getTime(0); |
|
515
|
0
|
|
|
|
|
|
my $nowx=&getTime(7); |
|
516
|
|
|
|
|
|
|
|
|
517
|
0
|
|
|
|
|
|
my $loc=uri_escape($url); |
|
518
|
0
|
|
|
|
|
|
my $ret= $class->connect('mms/si_push','si_id',$si_id,'si_action',$si_action, |
|
519
|
|
|
|
|
|
|
'si_created',$nowt,'si_expires',$nowx, |
|
520
|
|
|
|
|
|
|
'to',$to,'from',$from,'si_text',$message,'si_url',$loc); |
|
521
|
0
|
0
|
|
|
|
|
return "OK: $ret" unless $ret=~/^ERR: /; |
|
522
|
0
|
|
|
|
|
|
return $ret; |
|
523
|
|
|
|
|
|
|
} |
|
524
|
|
|
|
|
|
|
|
|
525
|
|
|
|
|
|
|
sub getTime { |
|
526
|
0
|
|
|
0
|
0
|
|
my $day=shift; |
|
527
|
0
|
0
|
|
|
|
|
$day=0 unless ($day); |
|
528
|
|
|
|
|
|
|
|
|
529
|
0
|
|
|
|
|
|
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time+($day*86400)); |
|
530
|
0
|
|
|
|
|
|
return sprintf("%04d%02d%02d%02d%02d%02d",$year+1900,$mon+1,$mday,$hour,$min,$sec); |
|
531
|
|
|
|
|
|
|
} |
|
532
|
|
|
|
|
|
|
|
|
533
|
|
|
|
|
|
|
|
|
534
|
|
|
|
|
|
|
=back 4 |
|
535
|
|
|
|
|
|
|
|
|
536
|
|
|
|
|
|
|
=head1 AUTHOR |
|
537
|
|
|
|
|
|
|
|
|
538
|
|
|
|
|
|
|
Christopherus Goo |
|
539
|
|
|
|
|
|
|
|
|
540
|
|
|
|
|
|
|
=head1 COPYRIGHT |
|
541
|
|
|
|
|
|
|
|
|
542
|
|
|
|
|
|
|
Copyright (c) 2010 Christopherus Goo. All rights reserved. |
|
543
|
|
|
|
|
|
|
This software may be used and modified freely, but I do request that this |
|
544
|
|
|
|
|
|
|
copyright notice remain attached to the file. You may modify this module |
|
545
|
|
|
|
|
|
|
as you wish, but if you redistribute a modified version, please attach a |
|
546
|
|
|
|
|
|
|
note listing the modifications you have made. |
|
547
|
|
|
|
|
|
|
|
|
548
|
|
|
|
|
|
|
Clickatell is Copyright (c) 2010 Clickatell (Pty) Ltd: Bulk SMS Gateway |
|
549
|
|
|
|
|
|
|
|
|
550
|
|
|
|
|
|
|
This software or the author aren't related to Clickatell in any way. |
|
551
|
|
|
|
|
|
|
|
|
552
|
|
|
|
|
|
|
=cut |
|
553
|
|
|
|
|
|
|
|
|
554
|
|
|
|
|
|
|
1; |
|
555
|
|
|
|
|
|
|
|
|
556
|
|
|
|
|
|
|
|