terasms 1.0.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.
- checksums.yaml +7 -0
- data/README.md +23 -0
- data/lib/terasms.rb +174 -0
- data/lib/terasms/http_client/base.rb +42 -0
- metadata +45 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 26b7495307de0b909a483c6f1739cf624913dd544254fd547f68d74cbac3d192
|
4
|
+
data.tar.gz: 2057616cc214fa59be511a74e28402fbc2de2ca5181f85baf96bdf7210cca08b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 976ed8292ae3cfa1de361b5aae2a3e63946a951271e4acfe60fa48a90ba79bc80449af94183db1e1c1e496cfc6cc88c7a714bfea2355a37ccd81a15ef9f40ecf
|
7
|
+
data.tar.gz: bf36315b1a295bab2f7b1e4e2ebac03266106ea1c3905e3f2cc5271b73661d04cdbc4e306c6c56fcf129f47bf85d53b32d78ebf78205eb4084ae3304816a5da2
|
data/README.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
## Terasms
|
2
|
+
|
3
|
+
### Description
|
4
|
+
Sending messages via Terasms
|
5
|
+
|
6
|
+
### Usage:
|
7
|
+
```ruby
|
8
|
+
require 'terasms'
|
9
|
+
|
10
|
+
Terasms.configure do |config|
|
11
|
+
config.url = "https://auth.terasms.ru/outbox/send"
|
12
|
+
config.login = "Your_user_name"
|
13
|
+
config.password = "Passwd"
|
14
|
+
config.sign = "your_token"
|
15
|
+
config.sender = "Sender"
|
16
|
+
config.type = "sms"
|
17
|
+
end
|
18
|
+
|
19
|
+
api = Terasms::Sms.new
|
20
|
+
result = api.send({target: "+77501112233", message: "Привет Мир! Тест рассылки смс"})
|
21
|
+
```
|
22
|
+
### License
|
23
|
+
MIT License. Copyright 2019 isheninp@gmail.com
|
data/lib/terasms.rb
ADDED
@@ -0,0 +1,174 @@
|
|
1
|
+
# https://terasms.ru/documentation/api/http
|
2
|
+
|
3
|
+
=begin
|
4
|
+
login строка обязательный параметр
|
5
|
+
Логин на Платформе TERASMS
|
6
|
+
|
7
|
+
sign строка Подпись запроса. Процедура формирования подписи описана в разделе Авторизация при использовании HTTP API.
|
8
|
+
password строка Пароль партнёра на Платформе TERASMS. Может использоваться вместо параметра sign, однако использование подписи является рекомендуемым способом авторизации
|
9
|
+
|
10
|
+
target строка обязательный параметр
|
11
|
+
Для всех сообщений кроме e-mail — номер абонента в международном формате.
|
12
|
+
Если необходимо отправить одно и то же сообщение нескольким абонентам, то номера абонентов можно задать через запятую.
|
13
|
+
Пример: 79161111111
|
14
|
+
Для самостоятельных e-mail сообщений — почтовый адрес получателя. Также допускается указывать несколько получателей через запятую/точку с запятой.
|
15
|
+
Пример: mailbox@domain.com
|
16
|
+
Для e-mail сообщений в составе «Каскада» — пара номер_телефона-почтовый_адрес, разделенные между собой двоеточием.
|
17
|
+
В этом случае пара сохраняется в нашей системе и в дальнейшем можно указывать только номер телефона. Почтовый адрес, при необходимости, будет взят по этому номеру.
|
18
|
+
Управление сохраненными связками также доступно по API и описано в разделе Отправка сообщений E-mail.
|
19
|
+
Пример: 79161111111:mailbox@domain.com
|
20
|
+
|
21
|
+
sender строка обязательный параметр
|
22
|
+
Имя отправителя, зарегистрированное для вас на Платформе TERASMS. Имя отправителя, содержащее в себе латинские буквы (в любом регистре), может содержать от 2 до 11 символов, цифровое имя отправителя — от 2 до 15 символов.
|
23
|
+
|
24
|
+
message строка обязательный параметр
|
25
|
+
Текст сообщения. Текст 1 сообщения составляет 160 символов для латиницы и 70 символов для кириллицы. Сообщение, содержащее большее кол-во символов, разбивается на несколько сегментов и доставляется одним сообщением. Сообщение, состоящее более чем из 160 для латиницы или из 70 символов для кириллицы, разбивается на сегменты. Каждый сегмент составляет 153 для латиницы и 67 символов для кириллицы. По умолчанию сообщение может состоять максимум из 10 сегментов.
|
26
|
+
|
27
|
+
email_message массив необязательный параметр
|
28
|
+
Используется только при передаче в формате JSON.
|
29
|
+
Предназначен для передачи параметров при отправке e-mail сообщений, как самостоятельных, так и в составе «Каскада».
|
30
|
+
Поля массива:
|
31
|
+
template_id — идентификатор предварительно загруженного шаблона
|
32
|
+
from — почтовый адрес отправителя письма
|
33
|
+
title — тема письма
|
34
|
+
placeholders — массив подстановок, используемых в указанном шаблоне
|
35
|
+
Если не указан и передается e-mail сообщение, то:
|
36
|
+
адрес отправителя будет взят из настроек в Личном кабинете или, при его отсутствии, подставлен общий системный адрес;
|
37
|
+
тема письма будет взята из настроек в Личном кабинете или, при ее отсутствии, подставлено значение параметра sender;
|
38
|
+
шаблон текста письма — будет использован шаблон по умолчанию, настроенный в Личном кабинете. При его отсутствии будет отправлен просто текст, без использования шаблона.
|
39
|
+
Более подробное описание находится в разделе Отправка сообщений E-mail.
|
40
|
+
|
41
|
+
cp 1251 необязательный параметр
|
42
|
+
По умолчанию предполагается, что текст SMS передается в кодировке utf-8. Если ваш текст в кодировке cp1251 (Windows-1251), нужно добавить параметр cp=1251.
|
43
|
+
|
44
|
+
mass_push 1 или 0 необязательный параметр
|
45
|
+
Если необходимо отправить разный текст сообщения каждому абоненту, необходимо добавить параметр mass_push=1, поле message оставить пустым, а в поле target передать номера абонентов и тексты сообщений. В этом случае номер телефона и сообщение разделяются одним пробелом, а символ для разделения сообщений можно задать с помощью параметра delimiter.
|
46
|
+
|
47
|
+
delimiter символ необязательный параметр
|
48
|
+
Символ для разделения сообщений в поле target. По умолчанию принимается символ перевода на новую строку \n.
|
49
|
+
|
50
|
+
flash 1 или 0 необязательный параметр
|
51
|
+
Для отправки сообщений в формате flash.
|
52
|
+
|
53
|
+
relative_time число необязательный параметр
|
54
|
+
Время в секундах, в течение которого предпринимаются попытки доставить сообщение. Если параметр не задан, по умолчанию от 24 до 72 часов в зависимости от оператора.
|
55
|
+
|
56
|
+
relative_time_read число необязательный параметр
|
57
|
+
Время в секундах, в течение которого ожидается отчет о просмотре/прочтении сообщения, где это применимо (мессенджеры Viber, Telegram и т.п.).
|
58
|
+
|
59
|
+
date_schedule строка необязательный параметр
|
60
|
+
Дата и время отложенной отправки сообщения, задается в формате Y-m-d H:i:s. Если задан параметр timezone=1, то платформа сама определит часовой пояс абонента и скорректирует время отправки с учетом этих данных. Время отложенной отправки не должно превышать 30 дней от текущего времени. Если timezone не задан, отправка производится в по московскому времени (GMT +3).
|
61
|
+
timezone 1 необязательный параметр
|
62
|
+
Указывает учитывать ли часовой пояс абонента при отложенной отправке. Для определения часового пояса абонента номер должен принадлежать российским сотовым операторам, в противном случае планирование идет по московскому времени (GMT +3).
|
63
|
+
|
64
|
+
time_from дата и время в формате Y-m-d H:i:s (пример 2017-06-01 17:30:00) необязательный параметр (требует time_to)
|
65
|
+
Вместе с time_to задает временное окно для отправки смс абоненту с учетом часового пояса. Номер должен принадлежать российским сотовым операторам, если не удалось определить часовой пояс абонента сообщение отправляется сразу
|
66
|
+
В случае неверного формата даты возвращается код ошибки -130.
|
67
|
+
Если указанное время в регионе абонента еще не наступило, дата отправки откладывается на дату старта (time_from)
|
68
|
+
Если временное окно в регионе абонента уже прошло, но мы попадаем в рамки по времени на текущюю дату, то смс уходит сразу. Если смс не попадает в рамки и время прошло, переносим на дату старта на следующие сутки Если смс не попадает в рамки и время не наступило, оставляем текущую дату в регионе и время старта из time_from.
|
69
|
+
|
70
|
+
time_to дата и время в формате Y-m-d H:i:s (пример 2017-06-01 20:30:30) необязательный параметр (требует time_from)
|
71
|
+
Вместе с time_from задает временное окно для отправки смс абоненту с учетом часового пояса.
|
72
|
+
schedule_id ID рассылки, созданной с помощью метода add_delivery необязательный параметр
|
73
|
+
Позволяет указать ID именованной рассылки для группировки сообщений. Подробнее об именованных рассылках можно прочитать в описании HTTP API.
|
74
|
+
type
|
75
|
+
=end
|
76
|
+
|
77
|
+
require 'rubygems'
|
78
|
+
require 'ostruct'
|
79
|
+
require 'terasms/http_client/base'
|
80
|
+
require 'json'
|
81
|
+
|
82
|
+
module Terasms
|
83
|
+
|
84
|
+
def self.config
|
85
|
+
@config ||= OpenStruct.new
|
86
|
+
end
|
87
|
+
|
88
|
+
# url, login, password, sign
|
89
|
+
def self.configure
|
90
|
+
yield(config)
|
91
|
+
end
|
92
|
+
|
93
|
+
class Sms < HttpClient
|
94
|
+
|
95
|
+
ERRORS = {
|
96
|
+
-1 => 'Неверный логин или пароль',
|
97
|
+
-20 => 'Пустой текст сообщения',
|
98
|
+
-30 => 'Пустой номер абонента',
|
99
|
+
-40 => 'Неправильно задан номер абонента',
|
100
|
+
-45 => 'Превышено количество номеров',
|
101
|
+
-50 => 'Неправильно задано имя отправителя',
|
102
|
+
-60 => 'Рассылка по данному направлению недоступна',
|
103
|
+
-70 => 'Недостаточно средств на счете',
|
104
|
+
-80 => 'Не установлена стоимость рассылки по данному направлению',
|
105
|
+
-90 => 'Рассылка запрещена',
|
106
|
+
-100 => 'Не указаны необходимые параметры',
|
107
|
+
-110 => 'Номер в черном списке',
|
108
|
+
-120 => 'Некорректно задано время отложенной отправки',
|
109
|
+
-130 => 'Некорректно задано временное окно отправки',
|
110
|
+
-140 => 'Передан некорректный ID рассылки',
|
111
|
+
-160 => 'Превышен дневной лимит рассылки (Вы можете установить максимальную сумму ежедневной рассылки после согласования с Вашим менеджером)',
|
112
|
+
}
|
113
|
+
|
114
|
+
def error code
|
115
|
+
ERRORS[code]
|
116
|
+
end
|
117
|
+
|
118
|
+
def main_status result
|
119
|
+
result["result"]["status"] rescue 'undefined'
|
120
|
+
end
|
121
|
+
|
122
|
+
def message_status result
|
123
|
+
result["result"]["message_infos"].last["status"] rescue 'undefined'
|
124
|
+
end
|
125
|
+
|
126
|
+
def message_id result
|
127
|
+
result["result"]["message_infos"].last["id"] rescue 'undefined'
|
128
|
+
end
|
129
|
+
|
130
|
+
# target, sender, message,
|
131
|
+
# cp, mass_push, delimiter, flash, relative_time, relative_time_read, date_schedule, timezone, time_from, time_to, schedule_id, type
|
132
|
+
def send params
|
133
|
+
result = submit Terasms.config.url, {}, 'POST', 'json', Terasms.config.to_h.tap{|hs| hs.delete(:url)}.merge(params).to_json
|
134
|
+
if main_status(result) < 0
|
135
|
+
result.merge!({"info"=> error(main_status(result)), "status"=>"error"})
|
136
|
+
else
|
137
|
+
if message_status(result) < 0
|
138
|
+
result.merge!({"info"=> error(message_status(result)), "status"=>"error"})
|
139
|
+
else
|
140
|
+
result.merge!({"id"=> message_id(result)})
|
141
|
+
end
|
142
|
+
end
|
143
|
+
result
|
144
|
+
end
|
145
|
+
|
146
|
+
def balance
|
147
|
+
result = submit Terasms.config.balance_url, {}, 'POST', 'json', Terasms.config.to_h.slice(:login, :password).to_json
|
148
|
+
result.merge!({"info"=> error(main_status(result)), "status"=>"error"}) if main_status(result) < 0
|
149
|
+
result
|
150
|
+
end
|
151
|
+
|
152
|
+
def statuses array_of_id
|
153
|
+
submit(Terasms.config.status_url, {}, 'POST', 'json', Terasms.config.to_h.slice(:login, :password, :sign).merge({'message_ids': array_of_id}).to_json)
|
154
|
+
end
|
155
|
+
|
156
|
+
def status_ id
|
157
|
+
begin
|
158
|
+
{"result"=> "success"}.merge(statuses([id])["result"]["statuses"].last.slice("status", "status_desc"))
|
159
|
+
rescue => error
|
160
|
+
{"result"=> "error", "info" => error.to_s}
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def status id
|
165
|
+
begin
|
166
|
+
raise 'wrong message id' if statuses([id])["result"]["statuses"] == []
|
167
|
+
{"result"=> "success"}.merge(statuses([id])["result"]["statuses"].last.slice("status", "status_desc"))
|
168
|
+
rescue => error
|
169
|
+
{"result"=> "error", "info" => error.to_s}
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'uri'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Terasms
|
6
|
+
class HttpClient
|
7
|
+
def submit url, params, method = 'GET', type = 'text', body =''
|
8
|
+
begin
|
9
|
+
uri = URI.parse(url)
|
10
|
+
uri.query = URI.encode_www_form(params)
|
11
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
12
|
+
http.use_ssl = true
|
13
|
+
http.read_timeout = 10
|
14
|
+
headers = case type
|
15
|
+
when 'json'
|
16
|
+
{'Content-Type' => 'application/json'}
|
17
|
+
when 'text'
|
18
|
+
{'Content-Type' => 'text/html'}
|
19
|
+
else
|
20
|
+
raise 'unknown type'
|
21
|
+
end
|
22
|
+
response = case method
|
23
|
+
when 'GET'
|
24
|
+
http.get(uri.request_uri, headers)
|
25
|
+
when 'POST'
|
26
|
+
http.post(uri.request_uri, body, headers)
|
27
|
+
else
|
28
|
+
raise 'unknown protocol'
|
29
|
+
end
|
30
|
+
result = case type
|
31
|
+
when 'json'
|
32
|
+
JSON.parse(response.body)
|
33
|
+
when 'text'
|
34
|
+
response.body
|
35
|
+
end
|
36
|
+
{"status"=> "success", "result" => result}
|
37
|
+
rescue => error
|
38
|
+
{"status"=> "error", "info" => error.to_s}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
metadata
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: terasms
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Pavel Ishenin
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-10-22 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: 'Terasms http rest api '
|
14
|
+
email: isheninp@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- README.md
|
20
|
+
- lib/terasms.rb
|
21
|
+
- lib/terasms/http_client/base.rb
|
22
|
+
homepage: https://github.com/isheninp/terasms
|
23
|
+
licenses:
|
24
|
+
- MIT
|
25
|
+
metadata: {}
|
26
|
+
post_install_message:
|
27
|
+
rdoc_options: []
|
28
|
+
require_paths:
|
29
|
+
- lib
|
30
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
requirements: []
|
41
|
+
rubygems_version: 3.0.4
|
42
|
+
signing_key:
|
43
|
+
specification_version: 4
|
44
|
+
summary: Terasms sms messaging
|
45
|
+
test_files: []
|