Выдираем sms из GOIP на PHP

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

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

    Итак, имеем 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 последних смс, то есть — данные при отсутствии изменений все равно будут, следите за дубликатами.

    Удачи!
    Share post

    Comments 6

      +1
      Класс!!!
        0
        Писал что-то похожее, но еще и с отправкой. Исходников, к сожалению, не осталось. =(
        PS: в итоге клиент все равно перешел на услуги смс-провайдера, ибо дешевле.
          –1
          Да, если речь об отправке — так. Тут же задачи другие — баланс посмотреть, да и как я уже написал — «постольку поскольку».
          отправку сейчас пишу, в комменте выложу.
          0
          Я недавно скрипт написал, который строку в таблицу MySQL сохраняет, тоже думаю статью написать
            0
            Главное — максимально развернуто напишите. Как блокнот запустить, не забудьте )
            –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');
            ?>
            

            Only users with full accounts can post comments. Log in, please.