Да, Астериск в данной заметке только косвенно — метод (и скрипт) предназначены для дальнейшей интеграции в него, в зависимости от задач. Но более удачного хаба не нашлось.

Если пропустил — укажите, поправлю. Спасибо!

Итак, имеем GOIP — GSM шлюз. К нему есть разработанный производителем SMS-сервер, но я не хотел выделять под простую задачу ресурсы на vds, да и он рассчитан (имеет смысл) на работу с несколькими шлюзами и хорошим объемом. Если же у нас один-два шлюза, и смс хочется видеть «постольку — поскольку» — данный путь вполне может иметь смысл.

В вебморде шлюза sms-ки доступны в разделе «Tools» => «SMS in box». Да да, этот вопрос не ко мне — к китайцам :)
Шлюз хранит по 5 смс на канал.
Оттуда и будем их выдирать, скриптом на PHP. Постараюсь прокомментировать происходящее в исходнике.

<?php
/*  Прием SMS из GOIP
    whoim, whoim@mail.ru
*/

$goip_addr = "http://goip_external_ip:7454/"; #Внешний (если работа ведется через интернет) адрес goip. Возможно, придется пробросить порт на роутере, например, 7454 => local_goip_addr:80
$goip_user = "admin";
$goip_password = "goip-password";

#Это нужно для авторизации на goip-е
$context = stream_context_create(array(
    'http' => array(
        'header'  => "Authorization: Basic " . base64_encode("$goip_user:$goip_password")
    )
));
#получаем сырые данные - html
$data = file_get_contents($goip_addr."/default/en_US/tools.html?type=sms_inbox", false, $context);
#у меня встречались такие косяки, правим
$data = str_replace('\"', '"', $data); //fix
#выдираем содержимое sms из js-скрипта в html, ключ = каналу sim
preg_match_all("|sms= \[(.*?)\]|is", $data, $sms_dump_arr);


$sms = array();
#первый цикл - по "каналам sim", которые содержат 5 смс-ок, разделенных запятой и в кавычках. То есть в csv.
#Во втором цикле мы с помощью str_getcsv добываем валидно данные уже по каждой смс раздельно.
foreach($sms_dump_arr[1] as $sim_key => $sim_val) 
  foreach(str_getcsv($sim_val) as $sms_key => $sms_val) {
      $sms[$sim_key][$sms_key] = explode(',', $sms_val, 3); #ключи 0,1,2 содержат датувремя, номер, текст смс.
      $sms[$sim_key][$sms_key][] = md5($sms_val); #ключ 3 содержит хеш первых трех, для упрощения идентификации sms-ки в дальнейшем
      }

#смотрим результат
print_r($sms);
?>


Данный скрипт — заготовка. Что делать с данными — Ваше дело. Я буду сверять по хешу, нет ли ее еще в базе, и если нет — класть в mysql табличку. Это нужно, ибо страничка содержит всегда 5 последних смс, то есть — данные при отсутствии изменений все равно будут, следите за дубликатами.

Удачи!

Комментарии (6)


  1. BuriK666
    22.05.2015 15:08
    +1

    Класс!!!


  1. constnw88
    22.05.2015 16:02

    Писал что-то похожее, но еще и с отправкой. Исходников, к сожалению, не осталось. =(
    PS: в итоге клиент все равно перешел на услуги смс-провайдера, ибо дешевле.


    1. whoim Автор
      22.05.2015 16:04
      -1

      Да, если речь об отправке — так. Тут же задачи другие — баланс посмотреть, да и как я уже написал — «постольку поскольку».
      отправку сейчас пишу, в комменте выложу.


  1. andrewnester
    22.05.2015 16:21

    Я недавно скрипт написал, который строку в таблицу MySQL сохраняет, тоже думаю статью написать


    1. whoim Автор
      22.05.2015 16:26

      Главное — максимально развернуто напишите. Как блокнот запустить, не забудьте )


  1. whoim Автор
    22.05.2015 17:36
    -1

    Отправка sms

    <?php
    /*  Отправка SMS из GOIP
        whoim@mail.ru
    */
    
    if($_GET['token']<>"VERyStrongToken") die("Не передан token");
    if(!isset($_GET['phone'])) die("Не передан phone");
    if(!isset($_GET['line'])) die("Не передан line");
    if(!isset($_GET['text'])) die("Не передан text");
    
    #goip settings
    $goip_addr = "http://x.x.x.x:1234/";
    $goip_user = "admin";
    $goip_password = "goip-password";
    
    #start
    $context = stream_context_create(array(
        'http' => array(
            'header'  => "Authorization: Basic " . base64_encode("$goip_user:$goip_password")
        )
    ));
    $data = file_get_contents($goip_addr."/default/en_US/tools.html?type=sms", false, $context);
    preg_match_all("|name=\"smskey\" value=\"(.*?)\">|is", $data, $smskey);
    $postdata = http_build_query(
        array(
            'line' => urldecode($_GET['line']),
            'smskey' => $smskey[1][0],
            'action' => 'SMS',
            'telnum' => urldecode($_GET['phone']),
            'smscontent' => urldecode($_GET['text']),
            'send' => 'Send',
        )
    );
    $context  = stream_context_create(
      array('http' =>
        array(
            'method'  =>  'POST',
            'header'  =>  "Authorization: Basic ".base64_encode("$goip_user:$goip_password")."\r\n".
                          "Content-type: application/x-www-form-urlencoded\r\n",
            'content' =>  $postdata
        )
      )
    );
    file_get_contents($goip_addr."/default/en_US/sms_info.html?type=sms", false, $context);
    die('ok');
    ?>