// SMSC.UA API (smsc.ua) версия 1.9 (03.07.2019) Перем SMSC_Логин; // логин клиента Перем SMSC_Пароль; // пароль клиента Перем SMSC_HTTPS; // использовать HTTPS протокол Перем SMSC_Отладка; // флаг отладки Перем SMSC_Кодировка; // кодировка сообщения (utf-8 или koi8-r), по умолчанию используется windows-1251 Перем ЕСТЬ_ПРОКСИ; // Флаг использования PROXY-сервера Перем ПРОКСИ_АДРЕС; Перем ПРОКСИ_ПОРТ; Перем ПРОКСИ_ЛОГИН; Перем ПРОКСИ_ПАРОЛЬ; Перем Соединение; Перем Hex[16]; Перем ФорматыСообщений[11]; //*************************************************************************************** // ВНУТРЕННИЕ СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ //*************************************************************************************** // Процедура инициализации переменных // Процедура ИнициализацияПеременных() SMSC_Логин = "login"; SMSC_Пароль = "password"; SMSC_Отладка = 0; SMSC_HTTPS = 1; SMSC_Кодировка = ""; ЕСТЬ_ПРОКСИ = 0; ПРОКСИ_АДРЕС = ""; ПРОКСИ_ПОРТ = ""; ПРОКСИ_ЛОГИН = ""; ПРОКСИ_ПАРОЛЬ = ""; КонецПроцедуры //*************************************************************************************** // Функция преобразования строки вида х,у в список значений // Функция Строка2Список(Стр) Перем Рез; Рез = СоздатьОбъект("СписокЗначений"); й = 1; Для й = 1 По 4 Цикл Поз = Найти(Стр, ","); Если Поз = 0 Тогда Рез.ДобавитьЗначение(Стр); Прервать; Иначе Рез.ДобавитьЗначение(Лев(Стр,Поз-1)); КонецЕсли; Стр = Сред(Стр, Поз+1, СтрДлина(Стр)-Поз); КонецЦикла; Возврат Рез; КонецФункции // Строка2Список() //*************************************************************************************** Функция URLEncode(Стр1) //СтрокаСимволов = " !""@№#;%:?*().,/$^&\"; СтрокаСимволов = " @№#%?/$&+"; Рез = ""; Стр = СокрЛП(Стр1); Для Сч=1 По СтрДлина(Стр) Цикл Символ = Сред(Стр, Сч, 1); КС = КодСимв(Символ); флЗаменили = 0; Если Найти(СтрокаСимволов, Символ) > 0 Тогда Рез = Рез + "%"+ Hex[Цел(КС/16)+1] + Hex[Цел(КС%16)+1]; флЗаменили = 1; КонецЕсли; Если (КС <= 127) и (флЗаменили = 0) Тогда Рез = Рез + Символ; ИначеЕсли флЗаменили = 0 Тогда Рез = Рез + "%"+ Hex[Цел(КС/16)+1] + Hex[Цел(КС%16)+1]; КонецЕсли; КонецЦикла; Возврат Рез; КонецФункции // URLEncode() //******************************************************************************* // Переводит время в формате Unix DateTimeStamp в строку с датой, временем // // Пареметры: // ШтампВремени - штамп времени в формате Unix // Функция Unix2Date (ШтампВремени) ЧислоДней = Цел(ШтампВремени / 86400); Д = Дата("01.01.1970") + ЧислоДней; ОстСек = ШтампВремени % 86400; Ч = Цел(ОстСек / 3600); ОстСек = ОстСек % 3600; М = Цел(ОстСек / 60); С = ОстСек % 60; Возврат Формат(Д, "Д ДДММГГГГ") + " " + Ч + ":" + М + ":" + С; КонецФункции // Unix2Date() //******************************************************************************* // Осуществляет загрузку внешней компоненты WinHttp.dll // Функция УстановитьКомпоненту() Попытка Соединение = СоздатьОбъект("WinHttp.WinHttpRequest.5.1"); Соединение.Option(9, 80); Если ЕСТЬ_ПРОКСИ = 1 Тогда Соединение.SetProxy(2, СокрЛП(ПРОКСИ_АДРЕС) + ":" + СокрЛП(ПРОКСИ_ПОРТ)); КонецЕсли; Исключение Сообщить("Не удалось создать объект WinHttp.WinHttpRequest.5.1!" + РазделительСтрок + "Проверьте наличие системной библиотеки ""WinHttp.dll""!"); Возврат 0; КонецПопытки; Возврат 1; КонецФункции // УстановитьКомпоненту() //*************************************************************************************** // Функция чтения адреса // Функция _SMSC_ПрочитатьАдрес(Адрес, Параметры) Перем Рез; Попытка Соединение.Open("POST", СокрЛП(Адрес), 0); Если ЕСТЬ_ПРОКСИ = 1 Тогда Соединение.SetCredentials(СокрЛП(ПРОКСИ_ЛОГИН), СокрЛП(ПРОКСИ_ПАРОЛЬ), 1); КонецЕсли; Соединение.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); Соединение.Send(СокрЛП(Параметры)); Рез = Соединение.ResponseText(); Исключение Сообщить("Не удалось получить данные с сервера!", "!"); Возврат ""; КонецПопытки; Возврат Рез; КонецФункции //_SMSC_ПрочитатьАдрес() //*************************************************************************************** // Функция вызова запроса. Формирует URL и делает 5 попыток чтения. // Функция _SMSC_ПослатьКоманду(Команда, Аргументы = "") Адрес = "http" + ?(SMSC_HTTPS = 2, "s", "") + "://smsc.ua/sys/" + Команда + ".php"; Параметры = "login=" + СокрЛП(URLEncode(SMSC_Логин)) + "&psw=" + СокрЛП(URLEncode(SMSC_Пароль)) + "&fmt=1" + ?(ПустаяСтрока(SMSC_Кодировка) = 1, "", "&charset=" + SMSC_Кодировка) + "&" + СокрЛП(Аргументы); Для Сч = 1 По 5 Цикл Если Сч > 1 Тогда Адрес = "http" + ?(SMSC_HTTPS = 2, "s" , "") + "://" + "www" + Сч + ".smsc.ua/sys/" + Команда + ".php"; КонецЕсли; Рез = _SMSC_ПрочитатьАдрес(Адрес, Параметры); Если ПустоеЗначение(Рез) = 0 Тогда Прервать; КонецЕсли; КонецЦикла; Если ПустоеЗначение (Рез) = 1 Тогда Если SMSC_Отладка = 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, ФорматСообщения = 0, Отправитель = "", ДопПараметры = "") Ответ = _SMSC_ПослатьКоманду ("send", "cost=3&phones=" + URLEncode(Телефоны) + "&mes=" + URLEncode(Сообщение) + "&translit=" + Транслит + "&id=" + ИД + ?(ФорматСообщения > 0, "&" + ФорматыСообщений[ФорматСообщения], "") + ?(ПустаяСтрока(Отправитель) = 1, "", "&sender=" + URLEncode(Отправитель)) + ?(ПустаяСтрока(Время) = 1, "", "&time=" + URLEncode(Время)) + ?(ПустаяСтрока(ДопПараметры) = 1, "", "&" + ДопПараметры)); // (id, cnt, cost, balance) или (id, -error) Если (SMSC_Отладка = 1) Тогда РезИД = Число(Ответ.ПолучитьЗначение(1)); Рез = Число(Ответ.ПолучитьЗначение(2)); Если (Рез > 0) Тогда Сообщить ("Сообщение отправлено успешно. ID: " + РезИД + ", всего SMS: " + Ответ.ПолучитьЗначение(2) + ", стоимость: " + Ответ.ПолучитьЗначение(3) + " руб., баланс: " + Ответ.ПолучитьЗначение(4) + " руб."); Иначе Сообщить ("Ошибка № " + Строка(-Рез) + ?(РезИД > 0, ", ID: " + РезИД, "")); КонецЕсли; КонецЕсли; Возврат Ответ; КонецФункции // ПослатьSMS() //*************************************************************************************** // Функция получения стоимости SMS // // обязательные параметры: // // Телефоны - список телефонов через запятую или точку с запятой // Сообщение - отправляемое сообщение // // необязательные параметры: // // Транслит - переводить или нет в транслит (1 или 0) // Отправитель - имя отправителя (Sender ID) // ДопПараметры - строка дополнительных параметров, добавляемая в URL-запрос ("list=79999999999:Ваш пароль: 123\n78888888888:Ваш пароль: 456") // // возвращает список (<стоимость>, <количество sms>) либо список (0, -<код ошибки>) в случае ошибки // Функция ПолучитьСтоимость(Телефоны, Сообщение, Транслит = 0, Отправитель = "", ДопПараметры = "") Ответ = _SMSC_ПослатьКоманду("send", "cost=1&phones=" + URLEncode(Телефоны) + "&mes=" + URLEncode(Сообщение) + ?(ПустаяСтрока(Отправитель) = 1, "", "&sender=" + URLEncode(Отправитель)) + "&translit=" + Транслит + ?(ПустаяСтрока(ДопПараметры) = 1, "", "&" + ДопПараметры)); // (cost, cnt) или (0, -error) Если (SMSC_Отладка = 1) Тогда Рез1 = Число(Ответ.ПолучитьЗначение(1)); Рез2 = Число(Ответ.ПолучитьЗначение(2)); Если (Рез2 > 0) Тогда Сообщить ("Стоимость рассылки: " + Рез1 + " руб. Всего SMS: " + Рез2); Иначе Сообщить ("Ошибка № " + Строка(-Рез2)); КонецЕсли; КонецЕсли; Возврат Ответ; КонецФункции //*************************************************************************************** // Функция проверки статуса отправленного SMS // // ИД - ID cообщения // Телефон - номер телефона // // возвращает список: // для отправленного SMS (<статус>, <время изменения>, <код ошибки sms>) // для HLR-запроса (<статус>, <время изменения>, <код ошибки sms>, <код страны регистрации>, <код оператора абонента>, // <название страны регистрации>, <название оператора абонента>, <название роуминговой страны>, <название роумингового оператора>, // <код IMSI SIM-карты>, <номер сервис-центра>) // либо список (0, -<код ошибки>) в случае ошибки // Функция ПолучитьСтатус(ИД, Телефон) Ответ = _SMSC_ПослатьКоманду("status", "phone=" + URLEncode(Телефон) + "&id=" + ИД); // (status, time, err) или (0, -error) Если (SMSC_Отладка = 1) Тогда Рез1 = Число(Ответ.ПолучитьЗначение(1)); Рез2 = Число(Ответ.ПолучитьЗначение(2)); Если (Рез2 >= 0) Тогда Сообщить ("Статус SMS = " + Рез1 + ?(ПустоеЗначение(Рез2) = 0, ", время изменения статуса - " + Unix2Date(Число(Ответ.ПолучитьЗначение(2))), "")); Иначе Сообщить ("Ошибка № " + Строка(-Рез2)); КонецЕсли; КонецЕсли; Возврат Ответ; КонецФункции // ПолучитьСтатус() //*************************************************************************************** // Функция получения баланса // // без параметров // // возвращает баланс в виде строки или 0 в случае ошибки Функция ПолучитьБаланс() Ответ = _SMSC_ПослатьКоманду("balance"); // (balance) или (0, -error) Рез = Число(Ответ.ПолучитьЗначение(1)); Если (SMSC_Отладка = 1) Тогда Если Рез >= 0 тогда Сообщить("Сумма на счете: " + Рез + " руб."); Иначе Сообщить("Ошибка № " + Строка(-Число(Ответ.ПолучитьЗначение(2)))); КонецЕсли; КонецЕсли; Возврат Рез; КонецФункции // ПолучитьБаланс() //*************************************************************************************** // Предопределенная процедура // Процедура ПриОткрытии() Если УстановитьКомпоненту() = 0 Тогда Возврат; КонецЕсли; ИнициализацияПеременных(); КонецПроцедуры // ПриОткрытии() //*************************************************************************************** // ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ //*************************************************************************************** Hex[1]="0"; Hex[2]="1"; Hex[3]="2"; Hex[4]="3"; Hex[5]="4"; Hex[6]="5"; Hex[7]="6"; Hex[8]="7"; Hex[9]="8"; Hex[10]="9"; Hex[11]="A"; Hex[12]="B"; Hex[13]="C"; Hex[14]="D"; Hex[15]="E"; Hex[16]="F"; ФорматыСообщений[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", 1); // Ответ = ПослатьSMS("79999999999", "http://smsc.ua\nSMSC.UA", 0, 0, 0, 0, "", "maxsms=3"); // Ответ = ПослатьSMS("79999999999", "0605040B8423F0DC0601AE02056A0045C60C036D79736974652E72750001036D7973697465000101", 0, 0, 0, 5, ""); // Ответ = ПослатьSMS("79999999999", "", 0, 0, 0, 3, ""); // Ответ = ПолучитьСтатус(sms_id, "79999999999"); // Баланс = ПолучитьБаланс();