// SMSC.UA API (www.smsc.ua) версия 1.19 (03.07.2019) Перем SMSC_LOGIN; // логин клиента Перем SMSC_PASSWORD; // пароль клиента Перем SMSC_HTTPS; // использовать HTTPS протокол Перем SMSC_DEBUG; // флаг отладки Перем ЕСТЬ_ПРОКСИ; // Флаг использования PROXY-сервера Перем ПРОКСИ_АДРЕС; Перем ПРОКСИ_ПОРТ; Перем ПРОКСИ_ЛОГИН; Перем ПРОКСИ_ПАРОЛЬ; Перем Соединение; Перем ФорматыСообщений; //*************************************************************************************** // ВНУТРЕННИЕ СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ //*************************************************************************************** //*************************************************************************************** // Процедура инициализации переменных // Процедура ИнициализацияПеременных() SMSC_LOGIN = ""; SMSC_PASSWORD = ""; SMSC_DEBUG = 0; SMSC_HTTPS = 1; ЕСТЬ_ПРОКСИ = Ложь; ПРОКСИ_АДРЕС = ""; ПРОКСИ_ПОРТ = ""; ПРОКСИ_ЛОГИН = ""; ПРОКСИ_ПАРОЛЬ = ""; КонецПроцедуры //*************************************************************************************** // Функция преобразования строки вида х,у в список значений // Функция Строка2Список(Стр) Перем Рез; Рез = Новый СписокЗначений; Сч = 1; Для Сч = 1 По 4 Цикл Поз = Найти(Стр, ","); Если Поз = 0 Тогда Рез.Добавить(Стр); Прервать; Иначе Рез.Добавить(Лев(Стр,Поз-1)); КонецЕсли; Стр = Сред(Стр, Поз+1, СтрДлина(Стр)-Поз); КонецЦикла; Возврат Рез; КонецФункции // Строка2Список() //*************************************************************************************** // Переводит время в формате Unix DateTimeStamp в строку с датой, временем // // Пареметры: // ШтампВремени - штамп времени в формате Unix // Функция Unix2Date (ШтампВремени) Возврат Дата("19700101000000") + ШтампВремени; КонецФункции // Unix2Date() //*************************************************************************************** функция Hex(КС) _Hex = Новый Массив(16); _Hex[0]="0"; _Hex[1]="1"; _Hex[2]="2"; _Hex[3]="3"; _Hex[4]="4"; _Hex[5]="5"; _Hex[6]="6"; _Hex[7]="7"; _Hex[8]="8"; _Hex[9]="9"; _Hex[10]="A"; _Hex[11]="B"; _Hex[12]="C"; _Hex[13]="D"; _Hex[14]="E"; _Hex[15]="F"; Возврат(_Hex[Цел(КС/16)] + _Hex[Цел(КС%16)]); конецфункции //*************************************************************************************** Функция URLEncode(Стр1) Рез = ""; Стр= СокрЛП(Стр1); Для Сч=1 По СтрДлина(Стр) Цикл Символ = Сред(Стр, Сч, 1); КС = КодСимвола(Символ); Рез = Рез + "%"+ Hex(Цел(КС/256)) + "%"+ Hex(КС%256); КонецЦикла; Возврат Рез; КонецФункции // URLEncode() //*************************************************************************************** // Функция вызова запроса. Формирует URL и делает 3 попытки чтения. // Функция _SMSC_ПрочитатьАдрес(Сервер, РесурсНаСервере, _Параметры) Экспорт Перем Рез; Перем ХТТПОтвет; ЕСТЬ_ПРОКСИ = Ложь; Прокси = Неопределено; Если ЕСТЬ_ПРОКСИ Тогда Прокси = Новый ИнтернетПрокси; Прокси.НеИспользоватьПроксиДляЛокальныхАдресов = Истина; Прокси.Пользователь = ПРОКСИ_ЛОГИН; Прокси.Пароль = ПРОКСИ_ПАРОЛЬ; Прокси.Установить("http" + ?(SMSC_HTTPS=1, "s", ""), ПРОКСИ_АДРЕС, ПРОКСИ_ПОРТ); КонецЕсли; Попытка Если SMSC_HTTPS = 0 Тогда Соединение = Новый HTTPСоединение(Сервер, , , , Прокси, Ложь); Иначе Соединение = Новый HTTPСоединение(Сервер, , , , Прокси, 10, Новый ЗащищенноеСоединениеOpenSSL); Конецесли; Исключение Сообщить("Не удалось установить соединение с сервером:" + Символы.ПС + ИнформацияОбОшибке().Описание, СтатусСообщения.Важное); Возврат ""; КонецПопытки; ИмяФайлаРезультата = ПолучитьИмяВременногоФайла(); РесурсПараметры = РесурсНаСервере+"?"+_Параметры; Если СтрДлина(РесурсПараметры) < 2000 Тогда // GET Попытка ХТТПОтвет = Соединение.Получить(РесурсПараметры, ИмяФайлаРезультата); Соединение = Неопределено; Исключение Сообщить("Не удалось получить данные с сервера", СтатусСообщения.Важное); Возврат ""; КонецПопытки; Иначе // POST //Создаём файл отправки - содержимое POST-запроса. ИмяФайлаОтправки = ПолучитьИмяВременногоФайла(); ФайлОтправки = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.ANSI, "", ЛОЖЬ); ФайлОтправки.Записать(_Параметры); ФайлОтправки.Закрыть(); //Формируем заголовок POST-запроса. ЗаголовокHTTP = Новый Соответствие(); ЗаголовокHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded"); ФайлОтправки = Новый Файл(ИмяФайлаОтправки); РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер()); ЗаголовокHTTP.Вставить("Content-Length", Строка(РазмерФайлаОтправки)); Попытка ХТТПОтвет = Соединение.ОтправитьДляОбработки(ИмяФайлаОтправки, РесурсНаСервере, ИмяФайлаРезультата, ЗаголовокHTTP); Соединение = Неопределено; Исключение Сообщить("Не удалось получить данные с сервера:" + Символы.ПС + ИнформацияОбОшибке().Описание, СтатусСообщения.Важное); Возврат ""; КонецПопытки; КонецЕсли; Кодировка = ""; Если Найти(ХТТПОтвет.Заголовки.Получить("Content-Type"), "charset=utf-16be") > 0 Тогда Кодировка = "UTF-16BE"; КонецЕсли; ФайлРезультата = Новый ЧтениеТекста(ИмяФайлаРезультата, Кодировка); Рез = ФайлРезультата.ПрочитатьСтроку(); Возврат Рез; КонецФункции //_SMSC_ПрочитатьАдрес() //*************************************************************************************** // Функция вызова запроса. Формирует URL и делает 5 попыток чтения. // Функция _SMSC_ПослатьКоманду(Команда, Аргументы = "") Сервер = "smsc.ua"; Ресурс = "/sys/" + Команда + ".php"; _Параметры = "login=" + СокрЛП(URLEncode(SMSC_LOGIN)) + "&psw=" + СокрЛП(URLEncode(SMSC_PASSWORD)) + "&fmt=1&charset=utf-16" + ?(Не ПустаяСтрока(Аргументы), "&" + СокрЛП(Аргументы), ""); Для Сч = 1 По 5 Цикл Если Сч > 1 Тогда Сервер = "www" + Сч + ".smsc.ua"; КонецЕсли; Рез = _SMSC_ПрочитатьАдрес(Сервер, Ресурс, _Параметры); Если НЕ ПустаяСтрока(Рез) Тогда Прервать; КонецЕсли; КонецЦикла; Если ПустаяСтрока (Рез) Тогда Если SMSC_DEBUG = 1 Тогда Сообщить("Ошибка чтения адреса: "+ Сервер + Ресурс + "?" + _Параметры); КонецЕсли; Рез = "," // Фиктивный ответ КонецЕсли; Возврат Строка2Список(Рез); КонецФункции // _SMSC_ПослатьКоманду() //*************************************************************************************** // Функция отправки SMS // // обязательные параметры: // // Телефоны - список телефонов через запятую или точку с запятой // Сообщение - отправляемое сообщение // // необязательные параметры: // // Транслит - переводить или нет в транслит (1 или 0) // Время - необходимое время доставки в виде строки (DDMMYYhhmm, h1-h2, 0ts, +m) // ИД - идентификатор сообщения // ФорматСообщения - формат сообщения (0 - обычное sms, 1 - flash-sms, 2 - wap-push, 3 - hlr, 4 - bin, 5 - bin-hex, 6 - ping-sms, 7 - mms, 8 - mail, 9 - call, 10 - viber, 11 - soc) // Отправитель - имя отправителя (Sender ID) // ДопПараметры - строка дополнительных параметров, добавляемая в URL-запрос ("valid=01:00&maxsms=3&tz=2") // // возвращает список (, <количество sms>, <стоимость>, <баланс>) в случае успешной отправки // либо массив (, -<код ошибки>) в случае ошибки // Функция ПослатьSMS(Телефоны, Сообщение, Транслит = Ложь, Время = "", ИД = 0, ФорматСообщения = 0, Отправитель = "", ДопПараметры = "") Ответ = _SMSC_ПослатьКоманду ("send", "cost=3&phones=" + URLEncode(Телефоны) + "&mes=" + URLEncode(Сообщение) + "&translit=" + ?(Транслит,1,0) + "&id=" + XMLСТрока(ИД) + ?(ФорматСообщения > 0, "&" + ФорматыСообщений[ФорматСообщения], "") + ?(ПустаяСтрока(Отправитель), "", "&sender=" + URLEncode(Отправитель)) + ?(ПустаяСтрока(Время), "", "&time=" + URLEncode(Время)) + ?(ПустаяСтрока(ДопПараметры), "", "&" + ДопПараметры)); // (id, cnt, cost, balance) или (id, -error) Если SMSC_DEBUG = 1 Тогда РезИД = Число(Ответ[0].Значение); Рез = Число(Ответ[1].Значение); Если (Рез > 0) Тогда Сообщить ("Сообщение отправлено успешно. ID: " + РезИД + ", всего SMS: " + Ответ[1].Значение + ", стоимость: " + Ответ[2].Значение + " руб., баланс: " + Ответ[3].Значение + " руб."); Иначе Сообщить ("Ошибка № " + Строка(-Рез) + ?(РезИД > 0, ", ID: " + РезИД, "")); КонецЕсли; КонецЕсли; Возврат Ответ; КонецФункции // ПослатьSMS() //*************************************************************************************** // Функция получения стоимости SMS // // обязательные параметры: // // Телефоны - список телефонов через запятую или точку с запятой // Сообщение - отправляемое сообщение // // необязательные параметры: // // Транслит - переводить или нет в транслит // Отправитель - имя отправителя (Sender ID) // ДопПараметры - строка дополнительных параметров, добавляемая в URL-запрос ("list=79999999999:Ваш пароль: 123\n78888888888:Ваш пароль: 456") // // возвращает список (<стоимость>, <количество sms>) либо список (0, -<код ошибки>) в случае ошибки // Функция ПолучитьСтоимость(Телефоны, Сообщение, Транслит = Ложь, Отправитель = "", ДопПараметры = "") Ответ = _SMSC_ПослатьКоманду("send", "cost=1&phones=" + URLEncode(Телефоны) + "&mes=" + URLEncode(Сообщение) + ?(ПустаяСтрока(Отправитель), "", "&sender=" + URLEncode(Отправитель)) + "&translit=" + ?(Транслит,1,0) + ?(ПустаяСтрока(ДопПараметры), "", "&" + ДопПараметры)); // (cost, cnt) или (0, -error) Если SMSC_DEBUG = 1 Тогда Рез1 = Число(Ответ[0].Значение); Рез2 = Число(Ответ[1].Значение); Если (Рез2 > 0) Тогда Сообщить ("Стоимость рассылки: " + Рез1 + " руб. Всего SMS: " + Рез2); Иначе Сообщить ("Ошибка № " + Строка(-Рез2)); КонецЕсли; КонецЕсли; Возврат Ответ; КонецФункции //*************************************************************************************** // Функция проверки статуса отправленного SMS // // ИД - ID cообщения // Телефон - номер телефона // // возвращает список: // для отправленного SMS (<статус>, <время изменения>, <код ошибки sms>) // для HLR-запроса (<статус>, <время изменения>, <код ошибки sms>, <код страны регистрации>, <код оператора абонента>, // <название страны регистрации>, <название оператора абонента>, <название роуминговой страны>, <название роумингового оператора>, // <код IMSI SIM-карты>, <номер сервис-центра>) // либо список (0, -<код ошибки>) в случае ошибки // Функция ПолучитьСтатус(ИД, Телефон) Ответ = _SMSC_ПослатьКоманду("status", "phone=" + URLEncode(Телефон) + "&id=" + XMLСтрока(ИД)); // (status, time, err) или (0, -error) Если SMSC_DEBUG = 1 Тогда Рез1 = Число(Ответ[0].Значение); Рез2 = Число(Ответ[1].Значение); Если (Рез2 >= 0) Тогда Сообщить ("Статус SMS = " + Рез1 + ?(Рез2 > 0, ", время изменения статуса - " + Ответ[1].Значение, "")); Иначе Сообщить ("Ошибка № " + Строка(-Рез2)); КонецЕсли; КонецЕсли; Возврат Ответ; КонецФункции // ПолучитьСтатус() //*************************************************************************************** // Функция получения баланса // // без параметров // // возвращает баланс в виде строки или 0 в случае ошибки // Функция ПолучитьБаланс() Ответ = _SMSC_ПослатьКоманду("balance"); // (balance) или (0, -error) Рез = Число(Ответ[0].Значение); Если SMSC_DEBUG Тогда Если Рез >= 0 тогда Сообщить("Сумма на счете: " + Рез + " руб."); Иначе Сообщить("Ошибка № " + Строка(-Число(Ответ[1].Значение))); КонецЕсли; КонецЕсли; Возврат Рез; КонецФункции // ПолучитьБаланс() //*************************************************************************************** // Предопределенная процедура // Процедура ПередОткрытием(Отказ, СтандартнаяОбработка) ИнициализацияПеременных(); КонецПроцедуры // ПередОткрытием() Процедура КнопкаВыполнитьНажатие() // Ответ = ПослатьSMS("79999999999", "Ваш пароль: 123", Истина); // Сообщение(Ответ); КонецПроцедуры //*************************************************************************************** // ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ //*************************************************************************************** ФорматыСообщений = Новый Массив(12); ФорматыСообщений[1] = "flash=1"; ФорматыСообщений[2] = "push=1"; ФорматыСообщений[3] = "hlr=1"; ФорматыСообщений[4] = "bin=1"; ФорматыСообщений[5] = "bin=2"; ФорматыСообщений[6] = "ping=1"; ФорматыСообщений[7] = "mms=1"; ФорматыСообщений[8] = "mail=1"; ФорматыСообщений[9] = "call=1"; ФорматыСообщений[10] = "viber=1"; ФорматыСообщений[11] = "soc=1"; // Examples: // Ответ = ПослатьSMS("79999999999", "Ваш пароль: 123", Истина); // Ответ = ПослатьSMS("79999999999", "http://smsc.ua\nSMSC.UA", Ложь, 0, 0, 0, "", "maxsms=3"); // Ответ = ПослатьSMS("79999999999", "0605040B8423F0DC0601AE02056A0045C60C036D79736974652E72750001036D7973697465000101", Ложь, 0, 0, 5, ""); // Ответ = ПослатьSMS("79999999999", "", Ложь, 0, 0, 3, ""); // Ответ = ПолучитьСтатус(sms_id, "79999999999"); // Баланс = ПолучитьБаланс();