Вопросы и ответы

Платная массовая отправка смс черезе смс-шлюз SMSPILOT в вопросах и ответах:

  1. Как это работает?
  2. Что такое массовая SMS рассылка? С какой целью используются смс рассылки?
  3. Какие преимущества у вашей системы?
  4. Хотелось бы узнать, насколько надежен и долговременен Ваш сервис?
  5. Работаете с юр. лицами и предпринимателями?
  6. Работаете с физ. лицами?
  7. Разработчику: Быстрый старт.
  8. Поясните как работают скидки? Переходы на тарифы?
  9. Какая скорость рассылки SMS?
  10. Какие есть ограничения на идентификатор отправителя (подпись, SenderID, FROM)?
  11. Какой длины должна быть sms?
  12. Что такое API-ключ?
  13. Есть online-отчеты о доставке SMS?
  14. Есть SMS-уведомления о низком балансе?
  15. Почему-то выдает: 107: EMPTY MESSAGE Хотя сообщение не пустое!!
  16. Указываю в параметрах своего отправителя, но всё равно приходит от smspilot.ru, что не так?
  17. Сообщения,отправленные через сервис,проходят пост-модерацию? Могут быть проверены и прочитаны посторонними людьми?
  18. Сколько дней сообщения хранятся на сервере?
  19. Можно ограничить доступ по IP?
  20. Как определить российский номер мобильного?
  21. Как извлекать/проверять статусы? (пример клиента SMSPilot, PHP)
  22. Как отправить sms на Perl?
  23. Как отправить SMS на VisualBasic (SMS VBA MS Excel, MS Word...)?
  24. Как отправить XML или JSON документ по HTTP?
  25. Где взять иконку SMS Пилот?
  26. Что нужно чтобы разместить мою программу в разделе Приложения?
  27. Сколько номеров телефонов можно вставить при отправке сообщение через консольную программу sms.exe или http-запрос?
  28. Наблюдаются проблемы с доставкой смс? Статус "в очереди" висит уже час.

1. Как это работает?

Сервис SMSPILOT даёт возможность отправки коротких сообщений на мобильные телефоны через интернет. Выкупая большие объёмы смс трафика у операторов и других провайдеров мы предоставляем услуги смс рассылок дешевле чем в среднем по рынку.

2. Что такое массовая SMS рассылка? С какой целью используются смс рассылки?

Прочитайте небольшую статью о том, что такое массовая SMS рассылка.

3. Какие преимущества у вашей системы?

Наши основные преимущества:
- нет платы за установку;
- нет скрытых платежей;
- нет срока годности;
- нет ежемесячных обязательств;
- бесплатный динамический ID отправителя;
- очень хорошая скорость доставки.
- отчеты о доставке;
- HTTP API;
- простота программирования;
- бесплатное перепрограммирование смс-уведомлений на наш шлюз (PHP).

4. Хотелось бы узнать, насколько надежен и долговременен Ваш сервис?

SMS Пилот надёжно летает с января 2010.

5. Работаете с юр. лицами и предпринимателями?

Да, заключается письменный договор и предоставляются закрывающие документы для бухгалтерии.

Для заключения договора и оплаты первого счета:


После заключения письменного договора:

6. Работаете с физ. лицами?

Да.

7. Разработчику: Быстрый старт.

Чуть позже будет пошаговое описание, начните с регистрации

8. Поясните как работают скидки? Переходы на тарифы?

Абонентской платы нет. Тариф только улучшается. Покупая однократно большой объём вы получаете постоянную скидку на будущее.
Пример:

  1. В январе вы купили 10000 смс кредитов за 1900 руб. по 19 копеек (тариф №4) - ваш баланс 10000
  2. В течении января потратили 7000 - ваш баланс стал 3000
  3. В феврале вы купили ещё 5000 за 950 руб. по 19 копеек (тариф №4) - ваш баланс 8000
  4. Истратили 7000 кредитов - баланс 1000
  5. В конце февраля вы купили 50000 кредитов за 8500 по 17 копеек (тариф №5) - ваш баланс 51000

9. Какая скорость рассылки SMS?

Зависит от нагрузки, в штатном режиме составляет 100 смс/сек

10. Какие есть ограничения на идентификатор отправителя (подпись, SenderID, FROM)?

Значение SenderID (отправитель, from) высвечивается у абонента в качестве отправителя SMS.

  1. Это может быть номер телефона 3-16 цифр, например 79087964781
  2. или буквенно-цифровое значение минимум 3, максимум 11 символов. Поддерживаются латинские буквы a-zA-Z, цифры 0-9, дефис и точка, например smspilot.ru

11. Какой длины должна быть sms?

  1. Длина одного SMS сообщения составляет 70 символов кириллицей либо 160 символов латиницей.
  2. Если количество символов превышает максимально допустимое, то SMS разбивается на кусочки.
  3. Длина отдельных частей «длинной» SMS составляет 67 символов для сообщения кириллицей и по 153 символа для латиницы.
  4. Нельзя отправить «длинную» SMS которая состоит больше чем из 10 частей.
  5. На телефоне абонента «длинная» SMS отображается как одно сообщение.
  6. Каждая часть «длинной» SMS оплачивается отдельно.

12. Что такое API-ключ?

64-символьный код, нужен для подключения внешних программ и сайтов к серверу SMS Пилот.

13. Есть online-отчеты о доставке SMS?

Да.

14. Есть SMS-уведомления о низком балансе?

Да.

15. Почему-то выдает: 107: EMPTY MESSAGE Хотя сообщение не пустое!!

Исходники или данные из базы в кодировке отличной от UTF-8.

Добавьте строку перед подключением библиотеки:
define('SMSPILOT_CHARSET', 'WINDOWS-1251');
include('smspilot.php')
.....

16. Указываю в параметрах своего отправителя, но всё равно приходит от smspilot.ru, что не так?

Неверный формат отправителя (параметр from) см. http://www.smspilot.ru/faq.php#q8

17. Сообщения,отправленные через сервис,проходят пост-модерацию? Могут быть проверены и прочитаны посторонними людьми?

Да, выборочно, особенное внимание уделяется новым отправителям.

Требования к содержанию:
http://www.smspilot.ru/pravda.php

1-й этап выявления нарушений - это автоматические фильтры,
2-й - выборочная ручная проверка сообщений помеченных роботом.

Ручную пост-модерацию осуществляет администратор в единственном лице и с единственной целью оградить абонентов от нежелательных сообщений в будущем (спам, мошенничество, оскорбление личности и т.п.)

18. Сколько дней сообщения хранятся на сервере?

SMS-сообщения хранятся на сервере 40 дней.

19. Можно ограничить доступ по IP?

Да. Отправьте список IP администратору http://www.smspilot.ru/support.php

20. Как определить российский номер мобильного?

Планы международной нумерации (телефонные коды стран) WIKI

Copy Source | Copy HTML
  1. <?php
  2. $phone = '79087964781';
  3.  
  4. if ( substr($phone, 0,2) == '79' && substr($phone, 0,4) != '7940' )
  5.     echo "$phone (Россия)";
  6. else
  7.     echo "$phone (Зарубеж)";
  8. ?>

7940 - Абхазия

21. Как извлекать/проверять статусы? (пример клиента SMSPilot, PHP)

Copy Source | Copy HTML
  1. <?php // скрипт send.php массовая отправка с сохранением server_id и статуса
  2. /* создайте БД mypilot, и в ней таблицу:
    CREATE TABLE `sms_out` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `server_id` int(10) unsigned NOT NULL,
      `phone` varchar(15) NOT NULL,
      `message` text NOT NULL,
      `zone` tinyint(3) unsigned NOT NULL,
      `status` tinyint(4) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `server_id` (`server_id`),
      KEY `status` (`status`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8
    */
  3. include('smspilot.class.php');

  4. mysql_connect('localhost','root','');
  5. mysql_select_db('mypilot');

  6. $message = 'hello';
  7. $phones = array(
  8.     '79087964781',
  9.     '7908111111'
  10. );

  11. $sms = new SMSPilot('XYZ');
  12. $sms->send($phones,$message);

  13. foreach( $phones as $phone) {
  14.     $status = $sms->statusByPhone( $phone );
  15.     $sql = "INSERT INTO sms_out SET server_id=$status[id],phone='$phone',message='$message',zone='$status[zone]', status='$status[status]'";
  16.     mysql_query( $sql );
  17. }
  18. // конец скрипта send.php
  19. ?>
  20. <?php // скрипт check.php проверка статусов, лучше настроить крон
  21. include('smspilot.class.php');

  22. mysql_connect('localhost','root','');
  23. mysql_select_db('mypilot');

  24. $sql = "SELECT server_id FROM sms_out WHERE status=0 OR status=1";
  25. $result = mysql_query( $sql );
  26. $ids = array();
  27. while( $r = mysql_fetch_assoc($result) )
  28.     $ids[] = $r['server_id'];

  29. $sms = new SMSPilot('XYZ');
  30. $sms->check( $ids );
  31. foreach( $sms->status as $s) {
  32.     $sql = "UPDATE sms_out SET status='$s[status]' WHERE server_id='$s[id]'";
  33.     mysql_query( $sql );
  34. }
  35. // конец скрипта check.php
  36. ?>
  37. <?php //скрипт status.php вывод всех текущих статусов
  38. include('smspilot.class.php');

  39. mysql_connect('localhost','root','');
  40. mysql_select_db('mypilot');

  41. $sql = 'SELECT * FROM sms_out ORDER BY id DESC';
  42. $result = mysql_query( $sql );
  43. echo '<table><tr><th>ID</th><th>SERVER_ID</th><th>PHONE</th><th>MESSAGE</th><th>ZONE</th><th>STATUS</th></tr>';
  44. while( $r = mysql_fetch_assoc( $result ) )
  45.     echo '<tr><td>'.$r['id'].'</td><td>'.$r['server_id'].'</td><td>'.$r['phone'].'</td><td>'.$r['message'].'</td><td>'.$r['zone'].'</td><td>'.$r['status'].'</td></tr>';
  46. echo '</table>';
  47. // конец скрипта status.php
  48. ?>

22. Как отправить sms на Perl?

http://search.cpan.org/~dadis/Net-SMS-SMSPilot-0.05/lib/Net/SMS/SMSPilot.pm

или

#!/usr/bin/perl -w
use Output;
use Socket;
$send = "Hello World!";
$to = "79087964781";
$apikey = "XXXXXXXXXXXXYYYYYYYYYYYYZZZZZZZZXXXXXXXXXXXXYYYYYYYYYYYYZZZZZZZZ";
$host="smspilot.ru";
$port="80";
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp')); $iaddr = inet_aton($host);
$paddr = sockaddr_in($port, $iaddr);
connect(SOCK, $paddr); $send =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg;
send (SOCK, "GET /api.php?send=$send&to=$to&apikey=$apikey HTTP/1.0\nHOST:$host\n\n", 0); @data=<SOCK>;
close(SOCK); print $data;

23. Как отправить SMS на VisualBasic (SMS VBA MS Excel, MS Word...)?

Copy Source | Copy HTML
  1. ' Процедура для демонстрации использования
  2. Sub Кнопка1_Щелчок()

  3.   If SMS("79087964781", "Привет") Then MsgBox ("Сообщение отправлено") Else MsgBox SMSError()

  4. End Sub


  5. ' Собственнно функция для отправки SMS http://www.smspilot.ru/apikey.php
  6. Public Function SMS(Phone As String, Text As String) As Boolean

  7.   SMS = False

  8.   Set HttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")

  9.   URL = "http://smspilot.ru/api.php"
  10.   URL = URL & "?send=" & URLEncode(Text)
  11.   URL = URL & "&to=" & Phone

  12.   ' Своя подпись
  13.   ' URL = URL & "&from=smspilot"

  14.   ' (!) Замените на свой API-ключ
  15.   URL = URL & "&apikey=XXXXXXXXXXXXYYYYYYYYYYYYZZZZZZZZXXXXXXXXXXXXYYYYYYYYYYYYZZZZZZZZ"

  16.   URL = URL & "&charset=windows-1251"

  17.   If HttpReq.Open("GET", URL, False) <> 0 Then
  18.     SMSError ("Connection error")
  19.     Exit Function
  20.   End If
  21.   If HttpReq.Send() <> 0 Then
  22.     SMSError ("Open URL " & URL & " error")
  23.     Exit Function
  24.   End If

  25.   If Left$(HttpReq.responseText, 7) <> "SUCCESS" Then
  26.     SMSError (HttpReq.responseText)
  27.     Exit Function
  28.   End If

  29.   SMS = True
  30.   SMSError ("")

  31. End Function


  32. ' Функция для хранения последней ошибки
  33. Public Function SMSError(Optional SetErr As String = "") As String
  34.     Static Err
  35.     If SetErr <> "" Then Err = SetErr
  36.     SMSError = Err
  37. End Function


  38. ' Кодирование URL параметров http://ru.wikipedia.org/wiki/URL
  39. Public Function URLEncode(StringVal As String, Optional SpaceAsPlus As Boolean = False) As String

  40.   Dim StringLen As Long: StringLen = Len(StringVal)

  41.   If StringLen > 0 Then
  42.     ReDim result(StringLen) As String
  43.     Dim i As Long, CharCode As Integer
  44.     Dim Char As String, Space As String

  45.     If SpaceAsPlus Then Space = "+" Else Space = "%20"

  46.     For i = 1 To StringLen
  47.       Char = Mid$(StringVal, i, 1)
  48.       CharCode = Asc(Char)
  49.       Select Case CharCode
  50.         Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
  51.           result(i) = Char
  52.         Case 32
  53.           result(i) = Space
  54.         Case 0 To 15
  55.           result(i) = "%0" & Hex(CharCode)
  56.         Case Else
  57.           result(i) = "%" & Hex(CharCode)
  58.       End Select
  59.     Next i
  60.     URLEncode = Join(result, "")
  61.   End If
  62. End Function

24. Как отправить XML или JSON документ по HTTP?

Copy Source | Copy HTML
  1. // sockets version HTTP/POST
  2. function http_post( $url, $data ) {

  3.     $eol = "\r\n";

  4.     $post = '';

  5.     if (is_array($data)) {
  6.         foreach( $data as $k => $v)
  7.             $post .= $k.'='.urlencode($v).'&';
  8.         $post = substr($post, 0,-1);
  9.         $content_type = 'application/x-www-form-urlencoded';
  10.     } else {
  11.         $post = $data;
  12.         if (strpos($post, '<?xml') ===  0)
  13.             $content_type = 'text/xml';
  14.         else if (strpos($post, '{') ===  0)
  15.             $content_type = 'application/json';
  16.         else
  17.             $content_type = 'text/html';
  18.     }
  19.     if ((($u = parse_url($url)) === false) || !isset($u['host'])) return false;

  20.     if (!isset($u['scheme'])) $u['scheme'] = 'http';

  21.     $request = 'POST '.(isset($u['path']) ? $u['path'] : '/').((isset($u['query'])) ? '?'.$u['query'] : '' ).' HTTP/1.1'.$eol
  22.         .'Host: '.$u['host'].$eol
  23.         .'Content-Type: '.$content_type.$eol
  24.         .'Content-Length: '.mb_strlen($post, 'latin1').$eol
  25.         .'Connection: close'.$eol.$eol
  26.         .$post;

  27.     $host = ($u['scheme'] == 'https') ? 'ssl://'.$u['host'] : $u['host'];

  28.     if (isset($u['port']))
  29.         $port = $u['port'];
  30.     else
  31.         $port = ($u['scheme'] == 'https') ? 443 : 80;

  32.     $fp = @fsockopen( $host, $port, $errno, $errstr, 10);
  33.     if ($fp) {

  34.         $content = '';
  35.         $content_length = false;
  36.         $chunked = false;

  37.         fwrite($fp, $request);

  38.         // read headers                
  39.         while ($line = fgets($fp)) {

  40.             if (preg_match('~Content-Length: (\d+)~i', $line, $matches)) {
  41.                 $content_length = (int) $matches[1];
  42.             } else if (preg_match('~Transfer-Encoding: chunked~i', $line)) {
  43.                 $chunked = true;
  44.             } else if ($line == "\r\n") {
  45.                 break;
  46.             }

  47.         }
  48.         // read content        
  49.         if ($content_length !== false) {

  50.             $_size = 4096;
  51.             do {
  52.                 $_data = fread($fp, $_size );
  53.                 $content .= $_data;
  54.                 $_size = min($content_length-strlen($content), 4096);
  55.             } while( $_size >  0 );

  56.         } else if ($chunked) {

  57.             while ( $chunk_length = hexdec(trim(fgets($fp))) ) {

  58.                 $chunk = '';
  59.                 $read_length =  0;

  60.                 while ( $read_length < $chunk_length ) {

  61.                     $chunk .= fread($fp, $chunk_length - $read_length);
  62.                     $read_length = strlen($chunk);

  63.                 }
  64.                 $content .= $chunk;

  65.                 fgets($fp);

  66.             }
  67.         } else {
  68.             while(!feof($fp)) $content .= fread($fp, 4096);
  69.         }
  70.         fclose($fp);

  71. //        echo $content;

  72.         return $content;

  73.     } else {
  74.         return false;
  75.     }
  76. }

25. Где взять иконку SMS Пилот?

http://www.smspilot.ru/download/smspilot_icon.zip

26. Что нужно чтобы разместить мою программу в разделе Приложения?

Отправьте письмо на info@smspilot.ru

  1. название программы
  2. краткое описание (платформа,возможности,используемая версия API,требования)
  3. условия распространения (платно/бесплатно/триал), цена
  4. адрес страницы для загрузки
  5. дистрибутив на тестирование

27. Сколько номеров телефонов можно вставить при отправке сообщение через консольную программу sms.exe или http-запрос?

В Windows максимальная длина командной строки равна 8191 символам.
HTTP-сервер настроен на обработку 16384 символов в GET-запросе.

Рекомендуем пакеты по 500 номеров.

28. Наблюдаются проблемы с доставкой смс? Статус "в очереди" висит уже час.

90% что такие сообщения уже доставлены.
Несоответствие связано с тем, что SMS может иметь 10-15 состояний, а у нас поддерживается 5 значений статуса, поэтому система отображает "ближайший по смыслу".
Окончательный статус устанавливается в течение 24 часов.