ifree-sms 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +7 -0
- data/{LICENSE → MIT-LICENSE} +0 -0
- data/README.rdoc +7 -9
- data/Rakefile +0 -20
- data/lib/generators/ifree_sms/templates/config/ifree_sms.rb +2 -0
- data/lib/ifree_sms.rb +54 -22
- data/lib/ifree_sms/config.rb +3 -1
- data/lib/ifree_sms/response.rb +10 -0
- data/lib/ifree_sms/smsdirect_api.rb +95 -0
- data/lib/ifree_sms/version.rb +1 -1
- metadata +30 -30
data/Gemfile
ADDED
data/{LICENSE → MIT-LICENSE}
RENAMED
File without changes
|
data/README.rdoc
CHANGED
@@ -34,22 +34,20 @@ Initialize IfreeSms and set its configurations.
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
Send sms
|
37
|
+
Send sms message to user (asynchronous)
|
38
38
|
|
39
|
-
* phone format => 380971606179
|
40
|
-
* text length => 160 Latin or 70 Unicode
|
41
|
-
*
|
39
|
+
* phone - format => 380971606179
|
40
|
+
* text - length => 160 Latin or 70 Unicode (encoding utf-8)
|
41
|
+
* from - sender title, max length: 11
|
42
42
|
|
43
|
-
IfreeSms.
|
43
|
+
smsdirect = IfreeSms::SMSDirectAPI.new(login, password)
|
44
|
+
|
45
|
+
smsdirect.submit_message(phone, text, from)
|
44
46
|
|
45
47
|
or
|
46
48
|
|
47
49
|
IfreeSms::Message.first.send_answer("some text")
|
48
50
|
|
49
|
-
If you want to send sms to custom user, don't put sms_id (Paid action)
|
50
|
-
|
51
|
-
IfreeSms.send_sms(phone, text)
|
52
|
-
|
53
51
|
== Dependences
|
54
52
|
|
55
53
|
* {curb}[https://github.com/taf2/curb]
|
data/Rakefile
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
require 'rake'
|
3
3
|
require 'rake/testtask'
|
4
4
|
require 'rake/rdoctask'
|
5
|
-
require File.join(File.dirname(__FILE__), 'lib', 'ifree_sms', 'version')
|
6
5
|
|
7
6
|
desc 'Default: run unit tests.'
|
8
7
|
task :default => :test
|
@@ -23,22 +22,3 @@ Rake::RDocTask.new(:rdoc) do |rdoc|
|
|
23
22
|
rdoc.rdoc_files.include('README')
|
24
23
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
25
24
|
end
|
26
|
-
|
27
|
-
begin
|
28
|
-
require 'jeweler'
|
29
|
-
Jeweler::Tasks.new do |s|
|
30
|
-
s.name = "ifree-sms"
|
31
|
-
s.version = IfreeSms::VERSION.dup
|
32
|
-
s.summary = "The IfreeSms gem for i-free sms provider"
|
33
|
-
s.description = "The IfreeSms gem for i-free sms provider"
|
34
|
-
s.email = "superp1987@gmail.com"
|
35
|
-
s.homepage = "https://github.com/superp/ifree-sms"
|
36
|
-
s.authors = ["Igor Galeta", "Pavlo Galeta"]
|
37
|
-
s.files = FileList["[A-Z]*", "{app,lib}/**/*"] - ["Gemfile"]
|
38
|
-
#s.extra_rdoc_files = FileList["[A-Z]*"]
|
39
|
-
end
|
40
|
-
|
41
|
-
Jeweler::GemcutterTasks.new
|
42
|
-
rescue LoadError
|
43
|
-
puts "Jeweler not available. Install it with: gem install jeweler"
|
44
|
-
end
|
data/lib/ifree_sms.rb
CHANGED
@@ -8,45 +8,77 @@ module IfreeSms
|
|
8
8
|
autoload :Manager, 'ifree_sms/manager'
|
9
9
|
autoload :Config, 'ifree_sms/config'
|
10
10
|
autoload :Callbacks, 'ifree_sms/callbacks'
|
11
|
+
autoload :Response, 'ifree_sms/response'
|
12
|
+
autoload :SMSDirectAPIMethods, 'ifree_sms/smsdirect_api'
|
11
13
|
|
12
14
|
mattr_accessor :config
|
13
15
|
@@config = Config.new
|
14
16
|
|
17
|
+
class API
|
18
|
+
# initialize with an access token
|
19
|
+
def initialize(login = nil, pass = nil)
|
20
|
+
@login = login || IfreeSms.config.login
|
21
|
+
@pass = pass || IfreeSms.config.password
|
22
|
+
end
|
23
|
+
attr_reader :access_token
|
24
|
+
|
25
|
+
def api(path, args = {}, verb = "get", options = {}, &error_checking_block)
|
26
|
+
# Fetches the given path in the Graph API.
|
27
|
+
args["login"] = @login
|
28
|
+
args["pass"] = @pass
|
29
|
+
|
30
|
+
# add a leading /
|
31
|
+
path = "/#{path}" unless path =~ /^(\/|http|https|ftp)/
|
32
|
+
|
33
|
+
# make the request via the provided service
|
34
|
+
result = IfreeSms.make_request(path, args, verb, options)
|
35
|
+
|
36
|
+
# Check for any 500 errors before parsing the body
|
37
|
+
# since we're not guaranteed that the body is valid JSON
|
38
|
+
# in the case of a server error
|
39
|
+
raise APIError.new({"type"=>"HTTP #{result.status.to_s}", "message"=>"Response body: #{result.body}"}) if result.status >= 500
|
40
|
+
|
41
|
+
body = result.body
|
42
|
+
yield body if error_checking_block
|
43
|
+
|
44
|
+
# if we want a component other than the body (e.g. redirect header for images), return that
|
45
|
+
options[:http_component] ? result.send(options[:http_component]) : body
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class APIError < StandardError
|
50
|
+
attr_accessor :sms_error_type
|
51
|
+
def initialize(details = {})
|
52
|
+
self.sms_error_type = details["type"]
|
53
|
+
super("#{sms_error_type}: #{details["message"]}")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# APIs
|
58
|
+
|
59
|
+
class SMSDirectAPI < API
|
60
|
+
include SMSDirectAPIMethods
|
61
|
+
end
|
62
|
+
|
63
|
+
# Class methods
|
64
|
+
|
15
65
|
def self.setup(&block)
|
16
66
|
yield config
|
17
67
|
end
|
18
68
|
|
19
69
|
def self.log(message)
|
20
70
|
if IfreeSms.config.debug
|
21
|
-
Rails.logger.info("[
|
71
|
+
Rails.logger.info("[Ifree #{Time.now.strftime('%d.%m.%Y %H:%M')}] #{message}")
|
22
72
|
end
|
23
73
|
end
|
24
74
|
|
25
75
|
def self.table_name_prefix
|
26
76
|
'ifree_sms_'
|
27
77
|
end
|
28
|
-
|
29
|
-
# Send sms message
|
30
|
-
# Sample request:
|
31
|
-
# http://srv1.com.ua/mcdonalds/second.php?smsId=noID&phone=380971606179&serviceNumber=3533&smsText=test-message&md5key=f920c72547012ece62861938b7731415&now=20110527160613
|
32
|
-
#
|
33
|
-
def self.send_sms(phone, text, sms_id='noID')
|
34
|
-
now = Time.now.utc.strftime("%Y%m%d%H%M%S")
|
35
|
-
|
36
|
-
params = {}
|
37
|
-
params[:smsId] = sms_id
|
38
|
-
params[:phone] = phone
|
39
|
-
params[:serviceNumber] = config.service_number
|
40
|
-
params[:smsText] = Base64.encode64(text)
|
41
|
-
params[:now] = now
|
42
|
-
params[:md5key] = calc_digest(config.service_number, params[:smsText], now)
|
43
|
-
|
44
|
-
get(params)
|
45
|
-
end
|
46
78
|
|
47
|
-
def self.
|
79
|
+
def self.make_request(path, params, verb, options = {})
|
48
80
|
query = Rack::Utils.build_query(params)
|
49
|
-
url = [
|
81
|
+
url = [path, query].join('?')
|
50
82
|
|
51
83
|
log("request: #{url}")
|
52
84
|
|
@@ -55,7 +87,7 @@ module IfreeSms
|
|
55
87
|
|
56
88
|
log("response: #{http.body_str}")
|
57
89
|
|
58
|
-
http.body_str
|
90
|
+
Response.new(http.response_code, http.body_str, http.headers)
|
59
91
|
end
|
60
92
|
|
61
93
|
def self.calc_digest(number, text, now)
|
data/lib/ifree_sms/config.rb
CHANGED
@@ -25,7 +25,7 @@ module IfreeSms
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
hash_accessor :routes, :secret_key, :service_number, :project_name, :debug
|
28
|
+
hash_accessor :routes, :secret_key, :service_number, :project_name, :login, :password, :debug
|
29
29
|
|
30
30
|
def initialize(other={})
|
31
31
|
merge!(other)
|
@@ -33,6 +33,8 @@ module IfreeSms
|
|
33
33
|
self[:secret_key] ||= "some_very_secret_key_given_ifree"
|
34
34
|
self[:service_number] ||= "some_service_number"
|
35
35
|
self[:project_name] ||= "project_name"
|
36
|
+
self[:login] ||= "demo"
|
37
|
+
self[:password] ||= "demo"
|
36
38
|
self[:debug] ||= false
|
37
39
|
end
|
38
40
|
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module IfreeSms
|
2
|
+
module SMSDirectAPIMethods
|
3
|
+
SMSDIRECT_SERVER = "https://www.smsdirect.ru"
|
4
|
+
|
5
|
+
# Send SMS message
|
6
|
+
# Sample request:
|
7
|
+
# GET /submit_message?login=demo&pass=demo&from=test&to=380503332211&text=smsdirect_submit_sm
|
8
|
+
#
|
9
|
+
def submit_message(phone, text, from = 'test')
|
10
|
+
call("submit_message", {:from => from, :to => phone, :text => text})
|
11
|
+
end
|
12
|
+
|
13
|
+
# Получение статуса сообщения
|
14
|
+
# Параметры запроса:
|
15
|
+
# mid - ID сообщения полученный с помощью вызова submit_message
|
16
|
+
#
|
17
|
+
def status_message(message_id)
|
18
|
+
call("status_message", {:mid => message_id})
|
19
|
+
end
|
20
|
+
|
21
|
+
# Создание/обновление базы абонентов
|
22
|
+
# Параметры запроса:
|
23
|
+
# id - ID базы (может быть пустым при создании новой базы);
|
24
|
+
# lname - название базы (может быть пустым);
|
25
|
+
# qfile - список записей разделенных переводом строк, со следующими полями (поля разделяются знаком ;):
|
26
|
+
# msisdn;name;secondname;lastname;city;date;sex
|
27
|
+
# поле msisdn - номер телефона абонента;
|
28
|
+
# поля name;secondname;lastname;city;sex - текстовые, по указанным именам их можно использовать в п.8 в поле mess, для подстановки значений (при указании поля pattern = 1);
|
29
|
+
# поле date - дата в формате ДД-ММ-ГГГГ;
|
30
|
+
#
|
31
|
+
def submit_db(uid, qfile, name = '')
|
32
|
+
call("submit_db", {:id => uid, :qfile => qfile, :lname => name})
|
33
|
+
end
|
34
|
+
|
35
|
+
# Удаление записей из базы абонентов
|
36
|
+
# Параметры запроса:
|
37
|
+
# id - ID базы;
|
38
|
+
# msisdn - список номеров телефонов подлежащих удалению, разделенные запятой (,).
|
39
|
+
#
|
40
|
+
def edit_db(uid, phones)
|
41
|
+
call('edit_db', {:id => uid, :msisdn => phones.join(',')})
|
42
|
+
end
|
43
|
+
|
44
|
+
# Получение статуса базы
|
45
|
+
# Параметры запроса:
|
46
|
+
# id - ID базы;
|
47
|
+
#
|
48
|
+
def status_db(uid)
|
49
|
+
call('status_db', {:id => uid})
|
50
|
+
end
|
51
|
+
|
52
|
+
# Получение списка созданных баз
|
53
|
+
#
|
54
|
+
def get_db
|
55
|
+
call("get_db")
|
56
|
+
end
|
57
|
+
|
58
|
+
# Удаление базы
|
59
|
+
# Параметры запроса:
|
60
|
+
# id - ID базы подлежащей удалению;
|
61
|
+
#
|
62
|
+
def delete_db(uid)
|
63
|
+
call("delete_db", {:id => uid})
|
64
|
+
end
|
65
|
+
|
66
|
+
# Отправка смс-рассылки по созданной базе пользователей
|
67
|
+
# Параметры запроса:
|
68
|
+
# typelist – тип данных (значения: 1 - база, 2 - список телефонов)
|
69
|
+
# list - ID базы\выборки;
|
70
|
+
# msisdn - список телефонов через запятую “,”
|
71
|
+
# mess - текст сообщения, в случае если параметр pattern=1, название полей для последующей подстановки,
|
72
|
+
# необходимо использовать в виде %ИМЯ ПОЛЯ%. Например, подстановка поля name будет выглядеть следующим образом:
|
73
|
+
# «Уважаемый %name% поздравляем Вас с днём рождения.»;
|
74
|
+
# isurl - признак wap-push (значения: 0 - отправлять как обычное сообщение, 1 - отправлять сообщения как push);
|
75
|
+
# wappushheader - заголовок wap-push (в случае если тип isurl = 1);
|
76
|
+
# max_mess - максимальное количество сообщений в день, оставить пустым, если не ограничено;
|
77
|
+
# max_mess_per_hour - максимальное количество сообщений в час, оставить пустым, если не ограничено;
|
78
|
+
def submit_dispatch(params = {})
|
79
|
+
call('submit_dispatch', params)
|
80
|
+
end
|
81
|
+
|
82
|
+
protected
|
83
|
+
|
84
|
+
def call(method_name, args = {}, options = {}, verb = "get")
|
85
|
+
options = options.merge!(:smsdirect_api => true)
|
86
|
+
|
87
|
+
api("#{SMSDIRECT_SERVER}/#{method_name}", args, verb, options) do |response|
|
88
|
+
# check for REST API-specific errors
|
89
|
+
if response.is_a?(Hash) && response["error_code"]
|
90
|
+
raise APIError.new("type" => response["error_code"], "message" => response["error_msg"])
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
data/lib/ifree_sms/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ifree-sms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Igor Galeta
|
@@ -16,11 +16,12 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-
|
19
|
+
date: 2011-09-16 00:00:00 +03:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
23
|
-
|
23
|
+
name: curb
|
24
|
+
prerelease: false
|
24
25
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
26
|
none: false
|
26
27
|
requirements:
|
@@ -32,27 +33,25 @@ dependencies:
|
|
32
33
|
- 7
|
33
34
|
- 15
|
34
35
|
version: 0.7.15
|
35
|
-
|
36
|
+
type: :runtime
|
36
37
|
version_requirements: *id001
|
37
|
-
prerelease: false
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
|
-
|
39
|
+
name: nokogiri
|
40
|
+
prerelease: false
|
40
41
|
requirement: &id002 !ruby/object:Gem::Requirement
|
41
42
|
none: false
|
42
43
|
requirements:
|
43
|
-
- -
|
44
|
+
- - ">="
|
44
45
|
- !ruby/object:Gem::Version
|
45
|
-
hash:
|
46
|
+
hash: 3
|
46
47
|
segments:
|
47
|
-
-
|
48
|
-
|
49
|
-
|
50
|
-
version: 1.4.4
|
51
|
-
name: nokogiri
|
48
|
+
- 0
|
49
|
+
version: "0"
|
50
|
+
type: :runtime
|
52
51
|
version_requirements: *id002
|
53
|
-
prerelease: false
|
54
52
|
- !ruby/object:Gem::Dependency
|
55
|
-
|
53
|
+
name: activemodel
|
54
|
+
prerelease: false
|
56
55
|
requirement: &id003 !ruby/object:Gem::Requirement
|
57
56
|
none: false
|
58
57
|
requirements:
|
@@ -62,9 +61,8 @@ dependencies:
|
|
62
61
|
segments:
|
63
62
|
- 0
|
64
63
|
version: "0"
|
65
|
-
|
64
|
+
type: :runtime
|
66
65
|
version_requirements: *id003
|
67
|
-
prerelease: false
|
68
66
|
description: The IfreeSms gem for i-free sms provider
|
69
67
|
email: superp1987@gmail.com
|
70
68
|
executables: []
|
@@ -72,25 +70,27 @@ executables: []
|
|
72
70
|
extensions: []
|
73
71
|
|
74
72
|
extra_rdoc_files:
|
75
|
-
- LICENSE
|
76
73
|
- README.rdoc
|
77
74
|
files:
|
78
|
-
- LICENSE
|
79
|
-
- README.rdoc
|
80
|
-
- Rakefile
|
81
75
|
- app/models/ifree_sms/message.rb
|
76
|
+
- lib/ifree_sms.rb
|
82
77
|
- lib/generators/ifree_sms/USAGE
|
83
|
-
- lib/generators/ifree_sms/install_generator.rb
|
84
|
-
- lib/generators/ifree_sms/templates/config/ifree_sms.rb
|
85
78
|
- lib/generators/ifree_sms/templates/migrate/create_messages.rb
|
79
|
+
- lib/generators/ifree_sms/templates/config/ifree_sms.rb
|
80
|
+
- lib/generators/ifree_sms/install_generator.rb
|
86
81
|
- lib/ifree-sms.rb
|
87
|
-
- lib/ifree_sms.rb
|
88
|
-
- lib/ifree_sms/callbacks.rb
|
89
|
-
- lib/ifree_sms/config.rb
|
82
|
+
- lib/ifree_sms/smsdirect_api.rb
|
90
83
|
- lib/ifree_sms/engine.rb
|
91
|
-
- lib/ifree_sms/manager.rb
|
92
84
|
- lib/ifree_sms/smsing.rb
|
85
|
+
- lib/ifree_sms/config.rb
|
86
|
+
- lib/ifree_sms/response.rb
|
87
|
+
- lib/ifree_sms/callbacks.rb
|
93
88
|
- lib/ifree_sms/version.rb
|
89
|
+
- lib/ifree_sms/manager.rb
|
90
|
+
- MIT-LICENSE
|
91
|
+
- Rakefile
|
92
|
+
- Gemfile
|
93
|
+
- README.rdoc
|
94
94
|
has_rdoc: true
|
95
95
|
homepage: https://github.com/superp/ifree-sms
|
96
96
|
licenses: []
|
@@ -120,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
120
|
version: "0"
|
121
121
|
requirements: []
|
122
122
|
|
123
|
-
rubyforge_project:
|
123
|
+
rubyforge_project: ifree-sms
|
124
124
|
rubygems_version: 1.6.2
|
125
125
|
signing_key:
|
126
126
|
specification_version: 3
|