Итак, по долгу службы пришлось реализовывать отправку СМС средствами этого сервиса с сайта.
Я сделал модуль на PHP и решил его здесь выложить (мне нежалко + вдруг кто-то найдёт ошибки
)
ComtubeSMS - обработка результата с помощью SimpleXML
ComtubeSMS_notXML - с помощью парсинга HTML
ComtubeSMS_test необходим для процесса встраивания и тестирования в сам сайт. при этом сообщения на сервер не отправляются
Отправку можно осуществлять двумя методами: get (возможно отправлять сообщения до 2000 символов, зависит от серверов и прочего, 2000 - это наверняка) и post - отправлять сообщения любой длины, но необходим cURL.
Реализован абстрактный метод protected function user_function(), который вызывается по окончанию обработки результатов. Если создать новый класс, пронаследованный от одного из приведённых трёх, то можно его реализовать.
Ниже приведём мой говнокод:
- Код: Выделить всё
<?php
//-------------------------------------------------------------------------------------------------------
//Класс для рассылки смс
class ComtubeSMS
{
protected $baseurl = "http://api.comtube.ru/scripts/sms_api/sendsms.php"; //адрес сервиса - для отправки запроса
protected $login = ""; //логин
protected $password = ""; //пароль
protected $params = array(); //массив переданных параметров
protected $encode_params = ""; //преобразованные параметры, готовые к отправке
protected $result = array(); //результаты отправки SMS
//свойства для отправки конкретного письма
protected $message = "";
protected $to =null;
protected $from = null;
protected $method = "get";
protected $return_type = "xml";
/**
* Конструктор - определяет пользователя comtube
*
* @param строка - логин пользователя
* @param строка - пароль
* @return ComtubeSMS - объект, посредством которого осуществляется отправка SMS
*/
public function __construct($login, $password)
{
$this->login = $login;
$this->password = $password;
}
/**
* Метод, отвечающий за формирование и отправку письма тем или иным методом
*
* @param строка - сообщение для отправки
* @param массив/строка - номер/номера получателя. Запись нескольких номеров возможна массивом или через ";". 218784 - тестовый номер
* @param строка - номер отправителя - не более 11 симоволов. По умолчанию "comtube"
* @param get/post - принимает 2 возможных значения: get и post. С помощью метода POST возможно отправлять любые объёмы информации(свыше 2000 символов по сравнению с GET), однако, для работы необходима библиотека cURL
*/
public function send_sms($message, $to, $from=null, $method="get")
{
//сам текст сообщения
$this->message = $message;
//если это строка, сделаем из неё массив из одного элемента
if(!is_array($to)) $this->to = array($to);
else $this->to = $to;
//от кого
$this->from = $from;
//метод отправки
$this->method = $method;
//создаём параметры для отправки
$this->create_params();
//а теперь отправляем
$this->go_sending();
//вызываем пользовательскую функцию
$this->user_function();
return $this->result;
}
/**
* Создаём каркас - массив, содеражщий все параметры.
*
*/
protected function create_params()
{
$this->params =array();
$this->params['username'] = $this->login;
$this->params['message'] = $this->message;
$this->params['to'] = implode(";",$this->to);
if(!is_null($this->from)) $this->params['from'] = substr($this->from, 0, 11);
$this->params['type']=$this->return_type;
//сортируем - это обязательно!
ksort($this->params);
//и вызываем метод, который закодируем и соберёт параметры в нужный нам вид
$this->create_encode_params();
}
/**
* Метод, создающий из массива $this->params данные, готовые для отправки одним из методов
*
*/
protected function create_encode_params()
{
$this->encode_params="";
foreach($this->params as $key => $value)
{
$this->encode_params .= $key . "=" . urlencode($value) . "&";
}
$this->encode_params .= "signature=" . md5($this->encode_params . "&password=".urlencode($this->password));
}
/**
* Запуск рассылки на указанные номера
*
* @param массив/строка - номер/номера получателя
* @param get/post - принимает 2 возможных значения: get и post. С помощью метода POST возможно отправлять
*/
protected function go_sending()
{
$this->result = array_merge($this->result, $this->params);
//проверяем наличие такого метода
$method_name = "use_".$this->method;
if(!method_exists($this, $method_name))
{
$this->result['code_error'] = "Указан неверный метод отправки: $method_name. Допустимые методы: post и get.";
return false;
}
//если такой метод есть, рассылаем на указанные номера
$check_result = $this->check_result($this->$method_name());
$this->result = array_merge($this->result, $check_result);
return true;
}
/**
* Отправка сообщения запросом GET
*
*/
protected function use_get()
{
$result = file_get_contents($this->baseurl."?".$this->encode_params);
return $result;
}
/**
* Отправка сообщения запросом POST
*
*/
protected function use_post()
{
$curl = curl_init();
if(!$curl)
{
$this->result['code_error']="Не удалось инициализировать curl";
return false;
}
curl_setopt($curl, CURLOPT_URL, $this->baseurl);
curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $this->encode_params);
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
/**
* Обработка результатов работы XML
*
*/
protected function check_result($result)
{
$return_result_array = array();
if($result)
{
$simple_xml_obj = new SimpleXMLElement($result);
foreach($simple_xml_obj as $key => $value)
{
$return_result_array[$key] = (string)$value;
}
}
return $return_result_array;
}
/**
* Виртуальный метод, позволяющий навесить какую-либо дополнительную обработку.
* Например, запись в БД или отправка отчёта об отправке на почту
* Для использования необходимо создать класс, наследуемый от ComtubeSMS или ComtubeSMS_notXML
* и реализовать данный метод
*
*/
protected function user_function()
{}
}
//-------------------------------------------------------------------------------------------------------
//Класс для рассылки смс - резервный. Можно использовать, если не поддерживается SimpleXML
class ComtubeSMS_notXML extends ComtubeSMS
{
protected $return_type = "html";
/**
* Обработка результатов работы HTML
*
*/
protected function check_result($result)
{
$return_result_array = array();
if($result)
{
$explode_result = explode("<br>",$result);
foreach($explode_result as $string)
{
if(empty($string)) continue;
$explode_parameter=explode(":",$string);
$return_result_array[$explode_parameter[0]]=$explode_parameter[1];
}
}
return $return_result_array;
}
}
//-------------------------------------------------------------------------------------------------------
//Класс для тестирования рассылки. Письма не отправляются, однако методы возвращают результат.
//Необходимо для встраивания в остальной код, чтоюы не спамить СМС-ками
class ComtubeSMS_test extends ComtubeSMS_notXML
{
/**
* Отправка сообщения запросом GET
*
*/
protected function use_get()
{
$this->result['desc']="тест метода GET";
return false;
}
/**
* Отправка сообщения запросом POST
*
*/
protected function use_post()
{
$this->result['desc']="тест метода POST";
$curl = curl_init();
if(!$curl) $this->result['code_error']="Не удалось инициализировать curl";
curl_close($curl);
return false;
}
}
$test = new ComtubeSMS("login","password");
$result = $test->send_sms("test",'218784',null,'post');
print_r($result);
?>