Пишем автопоздравитель друзей по SMS на PHP

Человек - существо ленивое! Он придумал стиральную машину для стирки белья, кофеварку за заварки кофе, тостер для приготовления гренок! Все программисты обладают теми же качествами, поскольку являются прямыми потомками человека прямоходящего! В общем, сидел я на досуге, набирал SMS на телефоне чтобы поздравить знакомого человека с днем рождения: пару минут ушло на поиск поздравительного текста, пару минут на ввод SMS в телефоне... в общем, ушло целых 10-ть минут, пока туда-сюда! И это в XXI веке! Не порядок!

Пока я набирал SMS, мысленно я представил себе, сколько же у меня друзей и сколько раз в течении года придется набирать мне в телефоне поздравительный текст! В сумме получалось немало впустую потраченного времени, а ведь можно ведь еще просто забыть или проспать и не поздравить друга с замечательной датой! Собственно, на этом моменте и созрела мысль сделать скрипт автопоздравителя по SMS с днем рождения! Суть проста: вы грузите в программу список своих друзей, их дни рождения и телефоны, а программа уже сама отсылает всем поздравления с днем рождения (индивидуальные или по шаблону) в день их рождения. Разумеется, именно с вашего номера телефона!

Не надо здесь говорить, что есть социальные сети, мессенджеры и другие коммуникаторы, SMS, хоть и умирает на фоне всеобщей кибернетизации, но многие люди ими охотно пользуются.

Если такой скрипт востребован для меня, представьте себе, насколько он сможет автоматизировать такие же процедуры в маленьких и больших компаниях, желающих поздравлять своих сотрудников с днем рождения! Каких-либо аналогов такого скрипта я не нашел в интернете, кроме платных десктопных вариантов. Поразмыслив, что много людей скажем мне "спасибо", я принялся писать такой скрипт! Именно на PHP (будем исходить из того, что у всех типичных интернетчиков есть хостинг с поддержкой PHP), поскольку там всего пару строк кода!

Что потребуется?

Для написания и функционирования скрипта автопоздравителя с днем рождения по SMS нам потребуются:

  • хостинг с поддержкой PHP и наличие cron на сервере
  • сам скрипт автопоздравителя с ДР по SMS
  • список получателей в формате: число, месяц, год рождения, имя, телефон, индивидуальное или шаблонное поздравление
  • регистрация в сервисе для отправки SMS и положительный баланс

То есть, SMS платные? В нашем случае да, поскольку отправителем SMS будет именно Ваш номер телефона или, даже по желанию, буквенный отправитель (название вашей фирмы, компании), без рекламы, с гарантией доставки и т.д. И пусть этот факт вас не смущает, за автоматическую SMS вы заплатите не больше чем мобильному оператору. Смысл скрипта в автоматизации Ваших действий - вы один раз настраиваете его работу и скрипт бесперебойно работает весь год, автоматически поздравляя ваших друзей с днем рождения от вашего имени!

Что будет реализовано?

Для нормального функционирования скрипта, нам потребуется реализовать такие пункты:

  • Административная часть скрипта автопоздравителя по SMS, с возможностью редактирования получателей, сохранением настроек скрипта и т.д.;
  • Ежедневная проверка списка (по cron) получателей. Если есть именинники, скрипт отправляет им SMS с поздравлением посредством шлюза отправки SMS;
  • Возможность отправки индивидуального поздравления или по шаблону (если индивидуальное поздравление отсутствует). В шаблоне возможно использование таких переменных как имя и возраст (высчитывается от года рождения);
  • Отладка скрипта (тест работы скрипта применительно к сегодняшним именинникам);
  • Извещение администратора по e-mail об отправленных поздравлениях (кому и что было отправлено);

Пишем скрипт...

Создадим файл index.php в котором будет реализована вся администраторская - от авторизации, до внесения правок в настройки работы скрипта:

<?php
include('./settings.dat');
session_start(); 
$hide=$_POST['hidden'];
$pass=$_POST['pass'];
$cat=$_GET['cat'];
$login=$_POST['login'];
$type=$_POST['type'];
$text=$_POST['text'];
if (isset($_REQUEST['log_out']) or !isset($_SESSION['aa']))$_SESSION['aa']=0;
if ($_SESSION['aa']==0){
if ($hide!='' and $pass==$password_admin and $login==$login_admin){$_SESSION['aa']=1; $hide=null;}
else{
$content='<form action="" method=post>
<input value="goaa" type="hidden" name="hidden"/>
Логин:&#160;&#160;<input type="text" name="login" value="" /><br />
Пароль:<input type="password" name="pass" value="" /><br /><br />
<input value="Войти" type="submit" id="bb_blue"/>
</form>';
}
}
if ($_SESSION['aa']==1) {
$content.='Адрес скрипта для запуска cron - 1 раз в сутки: <b>http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/work.php?s='.md5($login_admin).'</b>
<a href="http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/work.php?s='.md5($login_admin+$password_admin).'" title="Нажмите, чтобы увидеть, кто из получателей получит SMS сегодня" target="_blank">(тест)</a>
<br><br><form action="./?log_out" method=post>
<a href="./" id="bb_gray">Получатели</a>
<a href="./?cat=pat" id="bb_gray">Шаблон поздравления</a>
<a href="./?cat=about" id="bb_gray">Настройки</a>
<input value="log_out" type="hidden" name="log_out"/>
<input type=submit id="bb_gray" value="Выход" style="width:auto"/>
</form>
<br><br>';
switch($cat)
{
case "pat":
if($hide!=''){
file_put_contents('./patterns.dat',$text);
$content.='<h1>Шаблон обновлен!</h1>';
}
else {
$content.='
Шаблон для поздравления (если нет индивидуального), можно подставлять переменные:
<br /><b>$NAME$</b> - имя получателя и <b>$Y$</b> текущий возраст получателя<br /><br />
<form action="" method=post>
<input value="hidden" type="hidden" name="hidden"/>
<textarea name="text" style="width:100%" rows=15>'.file_get_contents('./patterns.dat').'</textarea>
<input type=submit id="bb_gray" value="Сохранить" style="width:auto"/>
</form>';}
break;
case "about":
if($hide!=''){
file_put_contents('./settings.dat',$text);
$content.='<h1>Настройки сохранены!</h1>';
}
else{
$content.='
Настройки Вашего скрипта: доступ в админку, адрес для отчетов и ключ от сервиса seozona.sms.ru
<br><a target="_blank" href="http://seozona.sms.ru">Зарегистрируйтесь</a>, пополните баланс и впишите здесь в <b>$smskey</b> api_id из кабинета сервиса из раздела <b>ПРОГРАММИСТАМ</b><br>
<br /><br />
<form action="" method=post>
<input value="hidden" type="hidden" name="hidden"/>
<textarea name="text" style="width:100%" rows=15>'.file_get_contents('./settings.dat').'</textarea>
<input type=submit id="bb_gray" value="Сохранить" style="width:auto"/>
</form>';}
break;
default:
if($hide!=''){
file_put_contents('./list.dat',$text);
$content.='<h1>База получателей обновлена!</h1>';
}
else{
$content.='Получатели SMS в формате: <b>число|месяц|год рождения|Имя|телефон|Поздравление|</b><br>
Если поздравление (индивидуальное) отсутствует, тогда берется поздравление из шаблона
<br /><br /><form action="" method=post>
<input value="hidden" type="hidden" name="hidden"/>
<textarea name="text" style="width:100%" rows=15>'.file_get_contents('./list.dat').'</textarea>
<input type=submit id="bb_gray" value="Сохранить" style="width:auto"/>
</form>';}
}}?>
<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Панель администрирования</title>
<style>body {background-position : center center;background-repeat : no-repeat;background : white;width : 1000px;margin : 0 auto;font : 13px 'trebuchet MS', Arial, Helvetica;color : #2d6176;}h1, p {text-align : center;text-shadow : 0 1px 0 #111;}.block {overflow : hidden;background : #c1c0c0;border : #e0e0e0 solid 1px;border-radius : 5px;padding : 9px;}#button_blue, #bb_blue {text-decoration : none;cursor : pointer;background : #528cd2;color : #fff;text-shadow : 0 1px 0 #38669a;font-weight : bold;border : #4373a9 solid 1px;text-align : center;padding : 9px;border-radius : 4px;}#button_gray, #bb_gray {text-decoration : none;cursor : pointer;margin-top : 6px;color : #557aa1;text-shadow : 0 1px 0 #fff;font-weight : bold;border : #d0d0d0 solid 1px;border-top : 1px solid #c5c5c5 !important ;text-align : center;padding : 9px;border-radius : 4px;background: #f3f3f3;}#button_blue:active {background : #5891d5;}#button_gray:active {background : #edecec;}#bb_blue:active {background : #5891d5;}#bb_gray:active {background : #edecec;}#button_hr, #button_hr_append {text-decoration : none;border-top : 1px solid #dedede;border-bottom : 1px solid #f4f4f4;margin-top : 16px;}#button_hr_append {margin-top : 6px !important ;}</style>
</head>
<body>
<center>
<h1>Панель администрирования <br />Автопоздравителя по SMS</h1>
<br/><br/><br/><br/>
<div class="block">
<?php echo $content;?>
</div>
<br><br><br>
<a style="text-decoration: none;" href="https://seo-zona.ru" target="_blank"><br />Автопоздравитель по SMS © SEO-ZONA.RU</a>
</center></body></html>

Также нам потребуется создать файл work.php исполняющий все наши команды:

<?php
include('./settings.dat');
if ($_GET['s']==md5($login_admin)) { 
preg_match_all('/([0-9]+)\|([0-9]+)\|([0-9]+)\|(.*?)\|(.*?)\|(.*?)\|/s',file_get_contents('./list.dat'), $ids);
$patterns = file_get_contents('./patterns.dat');
$c=count($ids[0])-1;
for($i=0; $i<=$c; $i++)
if (date('d')==$ids[1][$i] and date('m')==$ids[2][$i])
{
if ($ids[6][$i]=='') {
$pattern=$patterns;
$pattern=str_replace('$NAME$',$ids[4][$i],$pattern);
$pattern=str_replace('$Y$',date('Y')-$ids[3][$i],$pattern);
}
else
{
$pattern=$ids[6][$i];
}
$to= $ids[5][$i];
$message = "Отправили SMS поздравление на $to следующего содержания: $pattern!";
$subject = "Поздравили с ДР, $to!";
$headers = "Content-type: text/html; charset=utf-8 \r\n";
$headers .= 'From: '.$mail;
mail($mail, $subject, $message, $headers);
$sms = str_replace(' ','+', $pattern);
$url2="http://sms.ru/sms/send?api_id=$smskey&to=$to&text=$sms";
$body=file_get_contents($url2);
}
}
///********режим отладки********************
if ($_GET['s']==md5($login_admin+$password_admin)) { 
preg_match_all('/([0-9]+)\|([0-9]+)\|([0-9]+)\|(.*?)\|(.*?)\|(.*?)\|/s',file_get_contents('./list.dat'), $ids);
$patterns = file_get_contents('./patterns.dat');
$c=count($ids[0])-1;
for($i=0; $i<=$c; $i++)
if (date('d')==$ids[1][$i] and date('m')==$ids[2][$i])
{
if ($ids[6][$i]=='') {
$pattern=$patterns;
$pattern=str_replace('$NAME$',$ids[4][$i],$pattern);
$pattern=str_replace('$Y$',date('Y')-$ids[3][$i],$pattern);
}
else
{
$pattern=$ids[6][$i];
}
$to= $ids[5][$i];
print "Кому отправляется - $to<br>";
print "Что будет отправлено - $pattern<br>";
print "<hr><br><br>";
$message = "Отправили SMS поздравление на $to следующего содержания: $pattern!";
$subject = "Поздравили с ДР, $to!";
$headers = "Content-type: text/html; charset=utf-8 \r\n";
$headers .= 'From: '.$mail;
mail($mail, $subject, $message, $headers);
$sms = str_replace(' ','+', $pattern);
$url2="http://sms.ru/sms/send?api_id=$smskey&to=$to&text=$sms";
$body=file_get_contents($url2);
}
}?>

Файлы настроек скрипта

И еще нам потребуется создать 3 файла с настройками. Создадим файл list.dat (списки именинников) и заполним его по образцу:

14|06|1981|Вадик|380987898767|Вадик, всего тебе хорошего в твой ДР|
15|07|1976|Владислав|79088987671||
17|08|1976|Ирина|79088987123||

Создадим файл patterns.dat (общий шаблон SMS поздравления) и заполним его по образцу:

$NAME$, искренне желаю тебе счастья и поздравляю с $Y$-летием! Прими мои поздравления!

Создадим файл settings.dat (файл настроек скрипта) и заполним его по образцу:

<?php
$login_admin='admin'; //Логин администратора 
$password_admin='password'; //Пароль
$mail="seo-zona@mail.ru"; //E-mail администратора для отчета об отправленных поздравлениях
$smskey = "be04a179-8279-c4e4-45cd-5c4d638038cf01"; //Ваш api_id сервиса http://seozona.sms.ru
?>

Также есть смысл создать в папке с скриптом файл .htaccess с содержимым (для закрытия внешнего доступа к файлам настроек):

<Files ~ "\.dat$">
 Order allow,deny
 Deny from all
</Files>

Как ни странно, но на этом все! Давайте заглянем внутрь скрипта и поясним некоторые моменты.

Работа скрипта

Запустив скрипт (index.php), мы увидим панель авторизации, логин и пароль мы прописали в файле settings.dat:

Авторизация в скрипте

Авторизовавшись, мы попадаем на вкладку "ПОЛУЧАТЕЛИ". Обратите внимание на формат списка получателей SMS, он имеет следующий обязательный вид:

число|месяц|год рождения|Имя|телефон|Индивидуальный текст поздравления|

Настройки получателей SMS

Если поздравление (индивидуальное) отсутствует (как у последних двух в списке), тогда берется поздравление из шаблона, смотрим вкладку "ШАБЛОН ПОЗДРАВЛЕНИЯ":

Шаблон для общего поздравления по SMS

Редактируя шаблон общего SMS поздравления, мы можем использовать в тексте переменные: $NAME$ - имя получателя (подставится имя получателя из списка) и $Y$ - текущий возраст получателя (скрипт сам подставит число лет для поздравления).

И последняя важная вкладка - "НАСТРОЙКИ":

Страница настроек автопоздравителя по SMS

Здесь мы должны сменить:

  • логин и пароль (для авторизации в скрипте)
  • адрес электронной почты (куда будут отправляться отчеты об отправленных SMS)
  • aip_id (ключ) SMS-шлюза

Что такое ключ SMS-шлюза и где его взять?

В качестве отправителя SMS мы будем использовать шлюз сервиса по отправке SMS. Зарегистрируйтесь, пополните баланс (необходим на оплату отправляемых SMS) и в разделе ПРОГРАММИСТАМ вы найдете этот ключ:

Ключ от seozona.sms.ru

После внесения всех необходимых правок, не забудьте сохранять все настройки, а также перед запуском - протестировать работу скрипта.

Проверка работы скрипта в тестовом режиме

Чтобы удостовериться, что все у вас работает должным образом, необходимо протестировать работу скрипта. Для этого, создайте в списке получателя с сегодняшним днем рождения и вашим номером телефона. Сохраните получателя. Теперь в правом верхнем углу нажмите на ссылку "ТЕСТ". Если вы все настроили правильно, то:

  • В окне браузера откроется список с получателем (будет указан телефон и текст поздравления)
  • На адрес электронной почты администратора придет извещение об отправленной SMS
  • На ваш номер телефона придет само поздравление

Если у вас все получилось с первого раза, вы настоящий программист!

Автозапуск скрипта

Мои поздравления, если тесты у вас оказались удовлетворительными! Это значит, что скрипт настроен должным образом и будет работать как часы. Для того, чтобы он работал как часы, мы должны его запустить. Для этого на сервере есть команда cron, в ней вы указываете, какой скрипт и с какой периодичностью надо запускать.

Пример cron на сервере

В нашем случае скрипт надо запускать 1 раз в сутки, обычно днем. Адрес скрипта который вам надо запускать, вы увидите в админке нашего автопоздравителя, а если возникнут трудности с заданием времени его запуска, можете обратиться за помощью к поддержке своего хостинга (для них это мелочь и вам не откажут).

Еще раз хочу обратить внимание на такой параметр, как время запуска скрипта в cron - оно должно быть 1 раз в сутки в одно и тоже время! Если допустить в нем ошибку, автопоздравитель будет работать неправильно: либо поздравлять избранных, либо вообще не поздравлять, либо поздравлять по нескольку раз в день и т.д.

Собственно, на этом всем! Кто не хочет собственноручно собирать скрипт, может скачать его целиком. Напомню, мы только что написали автопоздравитель по SMS с днем рождения для своих друзей и знакомых (собственно, он может поздравлять неограниченное число друзей, сотрудников и работников фирм и предприятий). Скрипт на PHP, закачал на хостинг, настроил и забыл... время от времени пополняя список новыми получателями, которых обязательно нужно поздравить с ДР и, время от времени, не забывая пополнять баланс SMS шлюза!

AutoSMS
AutoSMS
autoSMS.zip
4.6 KiB
122 Downloads
Детали...
Оцените материал:
Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (3 голоса, рейтинг: 5,00 из 5)
Загрузка...

Вячеслав - типичный интернетчикВячеслав Скоблей (ака files) - типичный интернетчик. Скитаюсь интернетом, пишу на PHP, увлекаюсь созданием веб-сайтов на Wordpress, решаю многочисленные проблемы, которые до появления интернета не существовали...

Специализируюсь на безопасности сайтов: защищаю сайты от атак и взломов, занимаюсь лечением вирусов на сайтах и профилактикой...

Наверняка у Вас есть вопросы, просьбы или пожелания. Не стесняйтесь спросить, я отвечаю всегда быстро...

3 комментарий

  1. ВалераДАй says:

    Ну у как сделать скрипт с бесплатной отправкой смс? я думаю всем это будет интересно.

  2. Александр says:

    На скриншоте настроек API ключ не замазал.

    1. Вячеслав Скоблей says:

      Ключ фиктивный, для наглядности!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *