Главная > Web-разработка, Программирование > Отправляем SMS с сайта на PHP

Отправляем SMS с сайта на PHP

Меня уже давно занимает одна задача — отправка SMS через Интернет. Конечно, скажите Вы, это можно сделать с сайта оператора, но, во-первых, там везде стоит CAPTCHA, так что автоматически отправлять sms не получится, а во-вторых, оператор вставляет в текст SMS свою рекламу и мой IP-адрес. Мне же хотелось бы сделать отправку SMS со своего сайта, в полностью автоматическом режиме — чтобы можно было, скажем, рассылать SMS-сообщения подписчикам, либо даже себе в случае каких-либо событий. Для этого, скажите Вы, тоже есть специальные сервисы, которые еще и номер отправителя подменять умеют. Но дело в том, что все эти сервисы платные, что вполне нормально, если я использую отправку SMS в бизнес-целях, но не подходит, если я на этом не зарабатываю денег.

И вот, наконец, задача решена! Наконец, появился сервис, который позволит автоматически бесплатно отправлять со своего сайта SMS-сообщения на любой номер.

Так вот, не далее, как пару дней назад, наткнулся я на программу Radar. Первое и главное назначение программы, по мнению ее разработчиков — позиционирование пользователя по IP-адресу и близлежащим WiFi-точкам доступа, но умеет программа и отправлять SMS-сообщения. SMS отправляются на номера любого оператора, без всяких CAPTCHA и, главное, совершенно бесплатно. Единственное ограничение — SMS можно отправлять не чаще, чем раз в 5 минут, но мы же не спамеры какие-нибудь, нам этого вполне достаточно.

Приложение отправляет SMS через Интернет, а значит, зная протокол взаимодействия, можно написать свое приложение, которое тоже будет отправлять сообщения через Интернет. Протокол на сайте программы не описан, но используя Wireshark, восстановить его не составляет труда.

Результатом моих изысканий стал класс на языке PHP. О простоте используемого протокола свидетельствует размер класса, вместе с комментариями на превышающий 300 строк кода. Если в кратце, то для отправки данных на сервер используются обыкновенные HTTP-запросы методом POST, а результат сервер возвращает в виде XML-документа. Для отправки SMS-сообщения достаточно выполнить всего два запроса: первый — для авторизации на сервера, а второй — собственно, отправка SMS.

Конечно, для того, чтобы отправлять SMS, надо для начала зарегистрироваться на сайте http://altergeo.ru/, скачать программу «Yason» и через ее подтвердить номер своего мобильного телефона, который будет использован в качестве номера отправителя SMS-сообщений.

Итак, перейдем, наконец, к кодированию. Для работы с сетью я использовал функции cURL, как самое простое, но одновременно, функциональное средство.

Авторизация выглядит так:

//инициализация библиотеки
$ch = curl_init();

//подготавливаем запрос на сервер
curl_setopt_array(
    $ch,
    array(

        //для авторизации нужно отправить запрос методом POST на этот URL
        CURLOPT_URL => 'http://altergeo.ru/apiauth/',
        CURLOPT_POST => true,

        //такие параметры нужно передать серверу
        CURLOPT_POSTFIELDS => 'version=2&login='.$username.'&'.
                              'pwd='.md5($pass),

        //это для того, чтобы получить ответ сервера в строку
        CURLOPT_RETURNTRANSFER => true
    )
);

//выполняем запрос
$answ = curl_exec($ch);

После выполнения этого кода, мы получим в переменной $answ ответ сервера. Это будет XML-документ типа такого:


    0
    9563214af874ac0a16eb6521bed8920e
79257521234
    75213
    username@email.ru
    Alexander Smith
    Alexander
    Smith
1987-01-01
    m
    Это строка статуса на сайте Altergeo

Главное в этом XML — содержимое тега <skey>. Это идентификатор сессии, который понадобится нам, когда мы будем отправлять SMS. Чтобы получить это значение, используем SimpleXML:

$xml = new SimpleXMLElement($answ);

Далее, приступаем, непосредственно, к отправке SMS-сообщения:

curl_setopt_array(
    $ch,
    array(

        //URL для отправки сообщений уже другой
        CURLOPT_URL => 'http://altergeo.ru/apisms',
        CURLOPT_POST => true,

        //строка параметров POST для отправки SMS
        CURLOPT_POSTFIELDS => 'app_type=4&os_type=4&'.
                              'session_key='.$xml->skey.'&'.
                              'receipient_number='.$number.'&'.
                              'text='.$sms_message.'&act=sendsms',

        CURLOPT_RETURNTRANSFER => true
    )
);

Далее продолжать не имеет смысла, так как все остальное очень просто. А ниже Вы можете скачать конечный результат:

  • класс yasms на PHP yasms-2.1.zip (в архиве сам класс и пример использования).

Пример использования класса yasms:

    require_once 'yasms.class.php';

    $sms = new yasms('myemail@mail.ru', 'password_qwerty');
    $sms->lang = 'ru';
    $sms->send('+79207495002', 'Моя СМС-ка!');
    echo $sms->status;
  1. Людмила
    4 Октябрь 2009 в 09:50 | #1

    Ваша работа вызывает интерес.
    Правильно ли я Вас поняла:
    для того, чтобы отправлять смс со своего сайта, достаточно:
    – воспользоваться созданным Вами классом yasms.php,
    – установить программу Yason?

  2. Kolonist
    4 Октябрь 2009 в 11:06 | #2

    Людмила,
    Да, абсолютно правильно.

    В будущем, возможно, реализую и подтверждение номера, так что дополнительного ПО устанавливать не потребуется.

  3. Иван
    4 Октябрь 2009 в 14:21 | #3

    А это законно?

  4. Павел
    4 Октябрь 2009 в 15:14 | #4

    Тут фишка в том, что поймать пользователя этого сервиса, поставившего спам на поток задача не особо сложная. Весь wi2geo.ru именно об том чтобы находить людей.
    А для частных целей сервис очень даже подходит.

  5. Женя
    4 Октябрь 2009 в 15:31 | #5

    Павел,

    Ага, даже слишком простая задача. Ведь там еще и номер телефона надо подтверждать. Через какое-то время просто позвонят) если на поток поставить.

  6. Kolonist
    4 Октябрь 2009 в 17:17 | #6

    Иван:
    А это законно?

    Спам при помощи этого средства отправлять не получится. Во-первых, всего одно сообщение раз в пять минут. Во-вторых, во всех СМС-сообщениях будет указан Ваш номер, так что если владельцы сервиса Вас не забанят, то один из недовольных «спамополучателей» Вас таки вычислит, и тут уже Вам придется беспокоиться о законности его действий ;)

    Что касается законности вот такого использования сервиса, то это надо «перетереть» с администрацией Wi2Geo. Буду решать этот вопрос с ними.

  7. Kolonist
    4 Октябрь 2009 в 17:21 | #7

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

  8. Людмила
    6 Октябрь 2009 в 20:38 | #8

    Возможно ли подключить созданный Вами класс к форуму phpbb? Если да, то каким образом?

  9. Kolonist
    6 Октябрь 2009 в 22:58 | #9

    Людмила,
    Что Вы подразумеваете под словом «подключить»? Конечно, можно внести в код phpBB изменения, чтобы, допустим, когда кто-то входит в панель администрирования, Вам отправлялось СМС.

    Что касается вопроса, «каким образом», то вместе с классом в архиве лежит пример использования. Кроме того, если Вы откроете код класса, то увидите, что он подробно задокументирован.

    Если есть конкретные вопросы (конкретные – это вот такие: «я делаю вот так: код примера, а мне выдает ошибку: текст ошибки»), я с радостью на них отвечу прямо здесь. Если же конкретных вопросов нет, то на сайте указан адрес форума, где можно поговорить более свободно.

  10. DM
    13 Октябрь 2009 в 04:36 | #10

    спасибо за информацию. по коду возник вопрос
    не знаю пхп, но вроде получается, что ваш пхп скрипт передает пароль как обычный текст. а wireshark показывает, что Ясон передает его в MD5 шифре. может я чего-то не понимаю?)
    пароль простым текстом не подходит, выдает ошибку авторизации. а в MD5 всё гут.
    и еще. ясон не передает UA

  11. Kolonist
    13 Октябрь 2009 в 21:25 | #11

    DM:
    не знаю пхп, но вроде получается, что ваш пхп скрипт передает пароль как обычный текст. а wireshark показывает, что Ясон передает его в MD5 шифре. может я чего-то не понимаю?)

    Мой скрипт точно так же передает пароль в md5. В статье даны отрывки кода, в которые не вошло преобразование.

    Спасибо за замечание, статью подправил.

    DM:
    и еще. ясон не передает UA

    Хм, а я как-то не обратил внимание. Спасибо, уже исправляю.

  12. Константин
    16 Октябрь 2009 в 20:38 | #12

    Штука очень интересная, захотелось иметь у себя))
    Я просто скопировал ваш скрипт в директори. Я что-то не учёл?
    Parse error: syntax error, unexpected T_CONST, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ‘}’ in …/yasms/yasms.class.php on line 69

  13. Kolonist
    16 Октябрь 2009 в 22:24 | #13

    Константин,
    Такая ошибка может возникать, если у Вас установлен PHP 4. Для скрипта необходим PHP 5.

  14. Константин
    17 Октябрь 2009 в 14:16 | #14

    К сожлению, не видел ранее системных требований для скрипта. Хостер действительно предоставляет PHP 4.4.7. Извините за беспокойство))

  15. Kolonist
    18 Октябрь 2009 в 18:18 | #15

    Константин,
    Не надо извиняться – это мой косяк, так как я не указал на сайте системные требования, хотя надо это делать.

  16. Kolonist
    19 Октябрь 2009 в 23:52 | #16

    Иван:
    «А это законно?»

    Получен ответ от администрации Wi2Geo. Вы можете спокойно использовать класс yasms в своих приложениях, при условии, что Wi2Geo будет указан провайдером сервиса отправки СМС.

  17. 8 Февраль 2010 в 19:49 | #17

    Жаль что ограничение поставили…(

  18. Dmitriy Lexx
    9 Февраль 2010 в 00:00 | #18

    Спасибо огромное)) Давно заморачивался, как сделать для себя решение для смс уведомлений о падении сервера и других критических проблемах ))

  19. 25 Февраль 2010 в 11:34 | #19

    Здравствуйте. объясните пожалуйста как можно использовать ваше творение на сайте под WordPress? возможно ли организовать отправку rss новостей по смс?

  20. 25 Февраль 2010 в 23:31 | #20

    Ну напишете соответствующий плагин – можно будет. А пока это лишь PHP-класс, который Вы можете использовать, как хотите.

  21. Zeratyl
    3 Март 2010 в 22:07 | #21

    Написал программу для symbian используя частично ваш класс, спасибо.
    Хотелось бы спросить вот теперь по поводу ограничения на число смс, сколько смс и за какой период не кто не исследовал этот вопрос?

  22. 3 Март 2010 в 23:37 | #22

    Точно пока никто не знает. Вроде бы, есть ограничение на количество СМС-сообщений в день.

  23. Михаил
    9 Июль 2010 в 08:44 | #23

    А сервис еще работает. Зарегистрировался на сайте, потвердил свой номер, а при отправки смс выходит ошибка «Все СМС израсходованы». Вопрос как их пополнить? Или сами должны пополняться через определеное время?

  24. Михаил
    9 Июль 2010 в 09:12 | #24

    @Михаил
    А сервис еще работает. Хотел написать А сервис еще работает?

  25. 9 Июль 2010 в 10:43 | #25

    Сервис работает. По крайней мере, я до сих пор отправляю СМС со своего аккаунта. Честно говоря, не знаю, как пополнять, раньше такого не было. Буду проверять, спасибо за комментарий.

  26. Михаил
    12 Июль 2010 в 11:26 | #26

    @Kolonist
    Ну так как результаты проверки?

  27. 12 Июль 2010 в 18:52 | #27

    @Михаил
    Никак. На один и тот же номер нельзя зарегистрироваться несколько раз. А другого у меня нет.

  28. Михаил
    13 Июль 2010 в 07:45 | #28

    @Kolonist
    Спасибо и на этом ))) Буду искать тогда другой способ, раз этот для новый пользователей не доступен.

  29. 13 Июль 2010 в 07:53 | #29

    Единственное, позже попробую глянуть на предмет изменений в протоколе. Хотя раз СМС отправляются, то врядли в этом дело.

  30. Михаил
    14 Июль 2010 в 12:27 | #30

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