Pull to refresh

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

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

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

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

Удачи!
Tags:
Hubs:
0
Comments 6
Comments Comments 6

Articles