Да, Астериск в данной заметке только косвенно — метод (и скрипт) предназначены для дальнейшей интеграции в него, в зависимости от задач. Но более удачного хаба не нашлось.
Если пропустил — укажите, поправлю. Спасибо!
Итак, имеем GOIP — GSM шлюз. К нему есть разработанный производителем SMS-сервер, но я не хотел выделять под простую задачу ресурсы на vds, да и он рассчитан (имеет смысл) на работу с несколькими шлюзами и хорошим объемом. Если же у нас один-два шлюза, и смс хочется видеть «постольку — поскольку» — данный путь вполне может иметь смысл.
В вебморде шлюза sms-ки доступны в разделе «Tools» => «SMS in box». Да да, этот вопрос не ко мне — к китайцам :)
Шлюз хранит по 5 смс на канал.
Оттуда и будем их выдирать, скриптом на PHP. Постараюсь прокомментировать происходящее в исходнике.
Данный скрипт — заготовка. Что делать с данными — Ваше дело. Я буду сверять по хешу, нет ли ее еще в базе, и если нет — класть в mysql табличку. Это нужно, ибо страничка содержит всегда 5 последних смс, то есть — данные при отсутствии изменений все равно будут, следите за дубликатами.
Удачи!
Если пропустил — укажите, поправлю. Спасибо!
Итак, имеем 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)
constnw88
22.05.2015 16:02Писал что-то похожее, но еще и с отправкой. Исходников, к сожалению, не осталось. =(
PS: в итоге клиент все равно перешел на услуги смс-провайдера, ибо дешевле.whoim Автор
22.05.2015 16:04-1Да, если речь об отправке — так. Тут же задачи другие — баланс посмотреть, да и как я уже написал — «постольку поскольку».
отправку сейчас пишу, в комменте выложу.
andrewnester
22.05.2015 16:21Я недавно скрипт написал, который строку в таблицу MySQL сохраняет, тоже думаю статью написать
whoim Автор
22.05.2015 16:26Главное — максимально развернуто напишите. Как блокнот запустить, не забудьте )
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'); ?>
BuriK666
Класс!!!