Пользователь
0,0
рейтинг
27 февраля 2013 в 16:37

Разработка → Как сделать свой сервер для приема, обработки и передачи смс

PHP*

Доброго времени суток, уважаемое хабросообщество!
Недавно в универе мне была поставлена задача создать сервис смс-рассылки уведомлений старостами (деканатом и прочими) своим группам.
Основные требования к сервису были следующими:
— Сервис должен быть многопользовательским (старост более 1) с возможностью одновременной обработки запросов
— Не должен быть привязан к online сервисам рассылки (дабы не утекли базы пользователей)
— Должен быть достаточно легким и мобильным
— Максимально малозатратным
— Должен использовать только открытое программное обеспечение
— Должен обеспечивать отправку уведомлений, даже если у отправляющей стороны нет доступа к Интернету и/или компьютеру. (т.е. не только отправлять, но и принимать входящие смс сообщения от старост + определять от кого конкретно они поступили и делать рассылку по их группам)

Как удалось это реализовать — смотрите под катом.

Итак, начнем.

Список ингредиентов.



Для того, чтобы приступить к организации сервиса, нам будет нужно собрать все необходимые железки.

  • Компьютером у меня будет выступать нетбук ASUS EEEPC 701
  • Мобильный телефон, используемый для отправки смс — Nokia 3110
  • USB bluetooth адаптер — для связи компьютера и телефона
  • Зарядки для мобильника и нетбука для постоянной поддержки рабочего состояния
  • Подключение к Интернету. По LAN или Wi-Fi.
  • Симкарта с тарифом МТС «Супер МТС». У них все смски по РО на любого ОПСОСа по 10 копеек.
  • Зарегистрированный хостинг и какое-нибудь доменное имя.


В принципе, на этом можно и ограничиться. Но для более комфортной работы я бы посоветовал еще:

  • Монитор
  • Беспроводную клавиатуру
  • Дополнительное охлаждения для нетбука (ибо при работе 24/7 собственного маленького кулера ему будет явно не достаточно)


Охлаждение.


Что касается охлаждения — сделать его совершенно элементарно. Возьмите старый 80 миллиметровый кулер, зачистите красный и черный проводки, идущие от него. Затем отрежьте половину от ненужного USB кабеля. Также зачистите на нем красный и черный провод. Смотайте провода от кулера и от USB вместе, заизолируйте и ваше охлаждение готово. Желательно разместить кулер под нетбуком на пластилиновых ножках, чтобы он громко не резонировал.

Собственно, вот как это выглядит:



Если кто-то не понял, вот подробный мануал.

Что касается зачистки проводов — я люблю сначала опалить их концы на керосиновой горелке, а потом ножом легко счистить остатки. Керосинку тоже покупать не стоит — ее можно сделать из обычной 60 Ваттной лампочки Ильича. Пробиваете верхушку цоколя, заливаете туда керосин, вставляете кусок старой тряпки вместо фитиля и готово. Вот как это выглядит:



Подготавливаем железо к работе.



OS

В виде операционной системы для нетбука я выбрал EasyPeasy — система для нетбуков, основанная на ядре Linux и модифицированная для слабых компьютеров. Скачать ее, установить на флешку, а затем на нетбук можно тут.

Bluetooth

После того, как операционная система заняла свое место, подключаем bluetooth-адаптер в свободный USB порт. Система должна распознать его автоматически. Включаем Nokia и спариваем телефон и компьютер.

Установка gnokii

Нужно установить gnokii. Я уже и раньше ссылался на эту статью по его установке на Линукс. Думаю, разберетесь.
После установки наберите в консоли что-то вроде echo «Привет, друг!» | gnokii --sendsms '+7номер_вашего_друга' и проверьте, отправилась ли смска.

Подготовка хостинга

Возможно, Вам подойдет какой-либо другой способ организации многопользовательской работы, но я использовал возможности Joomla ACL (уровней доступа). Как это настроить — очень подробно описано в этой статье. Я лишь хочу заметить, что на выходе у Вас должен получиться сайт, где каждый из пользователей (те, кто будет отправлять смски) будет иметь свой личный кабинет, попасть в который он сможет введя номер своего мобильного телефона (в качестве логина, в формате 79XX XXX XX XX) и пятизначный цифровой код в качестве пароля. К примеру, как на сайте vamsms.ru

Подготавливаем программное обеспечение к работе.


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

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

Организация MySQL БД

Для начала необходимо сделать БД, относящуюся к хостингу, на котором у Вы организовали сайт. Я назвал свою БД — pXXXX_sender (под XXX скрываются цифры моего пользователя на хостинге)
Внутри этой БД нужно создать 3 таблицы. У меня они имеют следующую структуру:

starosti (идентификация и ареалы действий для старост)
— number
— group
— course
— facultet
— pass

telephones (все телефоны в базе)
— number
— groups
— course
— facultet

on_demand (тут хранятся сообщения на отправку)
— message
— group
— course
— id_this_trans
— date_log

Отлично, на этом с базами данных все.

Организация shell-скрипта на нетбуке (сервере).

Теперь нужно сделать так, чтобы нетбук каждые 10 минут проверял:
1) Поступили ли новые сообщения с сайта? Если да, то отправляю их нужным группам.
2) Поступили новые входящие смски? Если да, то от старост ли они? Если нет, то просто удаляю их, если да, то определяю, за какую группу отвечает староста и делаю рассылку сообщения по той группе.

Привожу листинг shell-скрипта:

#!/bin/bash

a=1 #заглушка для  бесконечного цикла
test_trigger=`cat cache_test_trig.txt` #исходное значение триггера при старте программы

while [ $a == 1  ] #начало бесконечного цикла
do
if ping -c1 ya.ru &> /dev/null
then


test_trigger_now=$(wget http://site.ru/trigger.txt --quiet -O -) # получаем значение триггера

	if [ $test_trigger_now -eq $test_trigger ]; then  #совпадает ли текущий триггер с новым?
			  echo "Nothing new :("				#если совпадает, уход в сон до след цикла
			  
###############################
######### Mobile extention
###############################
aa=1 #переменная для поддержания цикла
#count=1 #счетчик для выбора смс из памяти по 1


while [ $aa == 1  ] # получение смсок из памяти по 1
do


sms_test=$(gnokii --getsms IN 1 1) #считали 1 сообщение в цикле (1 1,2 2 и т.д.)
echo $sms_test>mobile_temp.txt #поместили ответ системы в файл
answer_test=$(grep -c Date/time: mobile_temp.txt) #ищем в ответе ключевое слово, присущее сообщению(Date/time:)

if [ "$answer_test" != "1" ]; then #если ключевое слово не найдено, память закончилась, вышла ошибка

aa=2 # прерываем цикл
echo "messages over! Stop"

elif [ "$answer_test" == "1" ]; then #если ключевое слово найдено, 

echo "Here is 1 message"
#let count=$count+1 #работа со счетчиком выборки из памяти
#Теперь в переменной sms_test находится сообщение вида '1. Inbox Message (Unread) Date/time: 07/02/2013 15:33:16 +0400 Sender: +7904xxxxxx Msg Center: Text: 51235 Мое сообщение.'

server_send=$(wget http://site.ru/serv_mobile.php?text="$sms_test" -O /dev/null) #передаем сообщение на сервер для записи/незаписи в бд

sleep 1
gnokii --deletesms IN 1 1 #очищает память телефона 1 сообщение
fi

sleep 3
done




###############################
######### Mobile extention
###############################
			  
			  
			  sleep 500
				
				else 							#если не совпадает, запуск программы смс-отправки
				echo "i need to do something!"
				let different=$test_trigger_now-$test_trigger #(стало-было), сколько нового
				#echo $different #разницу выдает правильно
				get_sender=$(wget http://site.ru/trigger.php?diff=$different --quiet -O -) # в скрипт на реме передается количество новых записей (сколько папок создавать)
				#echo $get_sender # скрипт на реме воспринимает переменную different нормально
				echo $get_sender #возвращает ОК от рема
				sleep 3 #дадим рему время очухаться
				
				#Start SMS-sending
				n=0
				while [ $n -lt $different ]    # пока n < different
				do
					let n=$n+1
#!!!!!!!!!!!SENDING!!!!!!!!!!!!!!
			
					echo "send files from send$n folder" #место для запуска gnokii					
					mess_for_gnok=$(wget http://site.ru/send$n/message.txt --quiet -O -) #скачиваем сообщение
					numb_for_gnok=$(wget http://site.ru/send$n/numbers.txt) #скачиваем номера
					cat numbers.txt | while read line
					do
					inp=$line
					echo "$mess_for_gnok" | gnokii --sendsms $inp
					echo $line
					echo $mess_for_gnok
					sleep 2
					done
					rm numbers.txt #delete temporary files
					sleep 1
#!!!!!!!!!!!SENDING!!!!!!!!!!!!!!					
				done
				terminator=$(wget http://site.ru/terminate.php?kill=$different --quiet -O -) # delete all temperal folders in root
				#echo "i kill all files"
				
				test_trigger=$test_trigger_now #задание выполнено, поднимаемся и ждем новых изменений в trigger.txt
				echo $test_trigger>cache_test_trig.txt
				
				
				sleep 10 #засыпает после всех действий
			  
	fi

else
echo "Here is no Internet. Find it!"
sleep 500
fi

done



Кроме того, в папке со скриптом нужно создать файл cache_test_trig.txt со значением 1 (и в таблице on_demand сделать первую запись какую-нибудь)

Организация php-скриптов на удаленном хостинге.

В личном кабинете пользователя в joomla должна быть форма следующего содержания:

<script type="text/javascript">

function isNotMax(e){ e = e || window.event;var target = e.target || e.srcElement;var code=e.keyCode?e.keyCode:(e.which?e.which:e.charCode)switch(code){case13:case8:case9:case46:case37:case38:case39:case40:returntrue;}return target.value.length <= target.getAttribute('maxlength');}

</script>

<p><strong>Форма смс-отправки.</strong></p>

<form action="http://site.ru/handler.php" method="POST">Кому отправляется уведомление:<br />
<select name="Group"> 
<option value="11">группа 11 </option>
</select>
<select name="Course"> 
<option value="4">курс 4 </option>
</select>

<select name="Facult"> 
<option value="1">Факультет экономический </option>
</select>

<br />

<br />

<hr style="color:#B4B4B4; border:thin groove"/>
<b>Внимание!</b> Вы можете ввести не более <b>70</b> любых символов(русский/английский, знаки препинания)<hr style="color:#B4B4B4; border:thin groove"/><br />

Текст уведомления:<br />

<textarea name="message" rows="4" cols="46" maxlength="70" onkeypress="return isNotMax(event)"></textarea> <br />

<input type="submit" value="Начать отправку!" /></form>



Очевидно, данные из формы передаются в файл, лежащий в корневой директории хостинга handler.php

Вот его листинг:

<?php
$prev_page = $_SERVER['HTTP_REFERER'];

$who_is_you = substr_count("$prev_page", "http://site.ru/index.php/"); //защита от многократных запросов и запросов извне

		if ($who_is_you == 1)
		
			{

$message=$_POST['message'];
$message=htmlspecialchars(stripslashes($message)); // обработка от спецсимволов

$course=$_POST['Course'];
$course=htmlspecialchars(stripslashes($course));   // обработка от спецсимволов

$groups=$_POST['Group'];
$groups=htmlspecialchars(stripslashes($groups));   // обработка от спецсимволов

$facult=$_POST['Facult'];
$facult=htmlspecialchars(stripslashes($facult));   // обработка от спецсимволов




//validation-----------------------------
 if (empty($message))
  {
    
    echo "
<body style='background-image: url(body_bg.gif); background-repeat: repeat-x'> 

<div align='center' style='margin-top: 14%'>
<p style='color: #666666; font-family: Verdana,Helvetica,sans-serif; font-size: 18px; line-height: 1.8em;'><i>Ваше сообщение НЕ отправлено!</i> <br>Текст уведомления не указан. <a href = '$prev_page'>Вернитесь назад и заполните поле.</a> </p>
</div>

</body>
    ";
    
  }
//validation-----------------------------
  
 else
  {

//connect_to_BD-------------------------- 
include(db_connect.php);
//connect_to_BD--------------------------
mysql_query("SET NAMES 'utf8'");
$r = mysql_query("SELECT id_this_trans FROM on_demand ORDER BY id_this_trans DESC LIMIT 0, 1"); // выводит номер последней трансакции

while($row = mysql_fetch_array($r))
	{
		
		$last_tranzaktion = $row['id_this_trans'];
		
	}

$last_tranzaktion++; // подготовили id новой транзакции
$heutige_datum = date("Y-m-d H:i:s");
mysql_query ("INSERT INTO on_demand VALUES('$message','$groups','$course','$last_tranzaktion', '$heutige_datum')"); // новое указание для отправки

file_put_contents("trigger.txt", $last_tranzaktion);

    echo "
<body style='background-image: url(body_bg.gif); background-repeat: repeat-x'> 

<div align='center' style='margin-top: 14%'>
<p style='color: #666666; font-family: Verdana,Helvetica,sans-serif; font-size: 18px; line-height: 1.8em;'><i>Ваше сообщение принято  к отправке!</i> <br> Вы можете завершить работу с сервисом, или <a href = 'http://site.ru/'>вернуться в Главное меню системы</a> </p>
</div>

</body>
    ";
    
  }
  
			}
		
		
		else


			{
				
	echo "
<html>
<head><title> 404 Not Found
</title></head>
<body><h1> 404 Not Found
</h1>
The resource requested could not be found on this server!<hr />
Powered By <a href='http://www.litespeedtech.com'>LiteSpeed Web Server</a><br />
<font face='Verdana, Arial, Helvetica' size=-1>LiteSpeed Technologies is not responsible for administration and contents of this web site!</font></body></html>
	";			
			}
?>



Далее, для того, чтобы удаленный хостинг мог отвечать на запросы shell-скрипта, необходимо, чтобы в его корневой директории были расположены следующие файлы:

файл serv_mobile.php — отвечает за обработку сообщений, принятых мобильным телефоном

<?php
#$sms_text=mysql_real_escape_string($_GET['text']); // получаем очередную смску от хома + защита от инъекций
$sms_text=$_GET['text']; // получаем очередную смску от хома + защита от инъекций

file_put_contents("temp_mobile_mess.txt", $sms_text); //записываем всю смску во временное хранилище
$get_from_file = file_get_contents("temp_mobile_mess.txt"); //записываем всю смску в переменную
 
$number = substr("$get_from_file", 72, 11); //выделяем номер отправителя (не забывать про read/unread)
$pass = substr("$get_from_file", 103, 5); 	//выделяем пароль
$message = substr("$get_from_file", 109); 	//выделяем текст сообщения


//connect_to_BD-------------------------- 
include(db_connect.php);
//connect_to_BD--------------------------
mysql_query("SET NAMES 'utf8'");

//защита от инъекций
$number = mysql_real_escape_string($number);
$pass = mysql_real_escape_string($pass);
$message = mysql_real_escape_string($message);

//защита от инъекций


$r = mysql_query("SELECT COUNT(*) FROM `starosti` WHERE pass='$pass' AND number='$number'"); //проверяет наличие связки пароль/номер в базе
while($row = mysql_fetch_array($r))
	{
		

		if($row[0] == 1) //определил, что такая связка присутствует
			{


//------------определяет заполнение поля id_this_trans---------------
					$q = mysql_query("SELECT id_this_trans FROM on_demand ORDER BY id_this_trans DESC LIMIT 0, 1"); // выводит номер последней трансакции

							while($rowq = mysql_fetch_array($q))
								{
									
									$last_tranzaktion = $rowq['id_this_trans'];
									
								}

							$last_tranzaktion++; // подготовили id новой транзакции
//------------определяет заполнение поля id_this_trans---------------
							
//------------вставляет все полученные данные в таблицу on_demand----	
					$second_r = mysql_query("SELECT * FROM `starosti` WHERE pass='$pass' AND number='$number'"); //узнаем курс и группу старосты, приславшей смску
					while($second_row = mysql_fetch_array($second_r))
						{
					
							$groups = $second_row['group'];
							$course = $second_row['course'];
							$heutige_datum = date("Y-m-d H:i:s");
							mysql_query ("INSERT INTO on_demand VALUES('$message','$groups','$course','$last_tranzaktion','$heutige_datum')"); // формирует указание для отправки
						}
//------------вставляет все полученные данные в таблицу on_demand----	

	#не забыть обновить триггер на новое значение транзакции
	file_put_contents("trigger.txt", $last_tranzaktion);
		 			  
			}

		
	}
	
?>



Скрипт trigger.php, тоже лежит в корневой директории, создает папки на хостинге, содержащие файл с сообщением и файл с номерами, которым это сообщение будет рассылаться.

Его листинг:
<?php
$inp_diff = $_GET['diff'];  // принимает различия от хома

//connect_to_BD-------------------------- 
include(db_connect.php);
//connect_to_BD--------------------------
mysql_query("SET NAMES 'utf8'");

//Create files AND Folders---------------
for($i=1; $i<=$inp_diff;$i++)
	{
		mkdir("send$i");
		file_put_contents("send$i/message.txt",'');
		file_put_contents("send$i/numbers.txt",'');
	}
//Create files AND Folders---------------

$counter=1;// счетчик для записи в папки, указывает на номер папки

// Вывод последних дифферент записей-----
$r = mysql_query("SELECT * FROM on_demand ORDER BY id_this_trans DESC LIMIT 0, $inp_diff"); // выводит последние записи

while($row = mysql_fetch_array($r))
	{
		file_put_contents("send$counter/message.txt",$row['message']); //заполняет текстом файл message.txt во всех папках
// заполняем файл numbers.txt во всех папках			
			$help_course = $row['course'];
			$help_group = $row['group'];
			$second_r = mysql_query("SELECT * FROM telephones WHERE course='$help_course' AND groups='$help_group'");
			while($second_row = mysql_fetch_array($second_r))
				{
					
					$insert_number = $second_row['number']; // помогает записать в файл 1 номер на 1 итерации
					$fp=fopen("send$counter/numbers.txt","a");
					fputs($fp,$insert_number. "\n");
					fclose($fp);
					

				}
// заполняем файл numbers.txt во всех папках			
$counter++;
		
	}
// Вывод последних дифферент записей-----

echo "ok";

?>


Последний файл в корневой директории — файл terminate.php. Удаляет созданные ранее папки с сервера, когда сообщения уже разосланы.

Его листинг:
<?php
$inp_diff = $_GET['kill'];  // принимает различия от хома

//Delete files AND Folders---------------
for($i=1; $i<=$inp_diff;$i++)
	{
		unlink("send$i/message.txt");
		unlink("send$i/numbers.txt");
	        rmdir("send$i");
	}
//Delete files AND Folders---------------

?>


Подведение итогов.


Прошу меня простить, если мой рассказ получился излишне сумбурным. Я правда старался максимально последовательно изложить тут свои мысли :) Удачной вам настройки, с радостью отвечу на вопросы в комментариях.

Кстати, вот как все это выглядит у меня:

@light204
карма
20,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

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

  • +26
    Ядерное оформление кода.
  • 0
    А если этот телефон-маршрутизатор не Нокиа, есть ли аналоги консольных утилит для других производителей (например, под Андроид)?
    А вообще интересная придумка, плюсую, хоть и на словах :)
    • 0
      Gnokii отлично работает с usb 3g модемами. Думаю главное что бы телефон было видно как модем.
    • +1
      судя по фото там не 701, а asus eee pc 2g surf. там 2гб диск?
    • +1
      SMSTools3 . Отличный SMS spooler.
  • +18
    Ух ты, видак)
    • +17
      Ух ты, ламповый моник)
      • +15
        Ух ты, картриджи!
        • +26
          Ух ты, керосиновая лампа!
          • –5
            Ух ты, аудио-касета! Долой mp3… А этот пост, точно писался в наше время?
            • +2
              ух, ты, карта СССР!
              • –1
                Ух ты, кассеты для денди!
  • +10
    Керосинка выше всяких похвал!
    • +6
      Только с ней нужно быть очень, очень осторожным. Стекло лампы очень хрупкое, центр тяжести высоко и стоит она довольно неустойчиво. Достаточно ее немного зацепить и пожар будет страшным, керосин мгновенно растекается и практически не тушится в бытовых условиях (у вас есть дома огнетушитель?). Видел не один дом, сгоревший из-за не вовремя разбитой керосиновой лампы, хотя последнюю кокнуть надо постараться — колбу для керосина делают либо из полусантиметрового стекла, либо вовсе из железа.
      • +2
        Одеяло надо накидывать.
        • 0
          Не поможет одеяло. ) Керосин круче любого одеяла.
          • +5
            Разве что этот «керосин» генерирует при горении кислород.
            В противном случае — поможет
          • 0
            Был опыт, одеяло реально помогло :)
        • +3
          В этой лампочке примерно сто грамм керосина. Пятно будет 3х3 метра, одеяла вам не хватит (особенно если ручеек залетит под шкаф или под стол. А он неминуемо туда залетит). Кроме того, если одеяло у вас из синтетических материалов — вполне возможно, тушить придется еще и его.
          • –2
            Думаю, вы драматизируете на пустом месте. Или вы считаете, что я никогда не гасил горючие жидкости :)
            • +4
              Думаю, сгореть один раз будет достаточно. После единожды увиденного того, что может сотворить полстакана тривиальной на вид жидкости желание шутить пропадает.
        • +6
          Мне часто поручаю рассказывать о правилах безопасности в лаборатории студентам младших курсов, и я очень люблю приводить такие манипуляции числами (рассказал их мне мой хороший друг):
          Средний расход автомобиля: 10 литров на сто километров. А это один литр на десять километров.
          100 грамм — один километр
          1 грамм — десять метров

          Это значит, что 1 грамм бензина сгорает с энергией достаточной для перемещения тонны металла на расстояние в десять метров. А теперь представьте, что у вас загорается одновременно сто грамм бензина/керосина…
          Это так, почти байка, есть к чему придраться, но изредка её вспоминать очень полезно.

          P.S. И да, мы устраиваем «пробные» возгорания растворителей (бензин или ацетон) с использованием огнетушителя с целью устранить панику при реальном возгорании. И мы никогда не поджигаем больше двадцати грамм!!! Потому что потушить это практически нереально — только ждать пока само сгорит.
          • –1
            Тут не то что придираться, за такие вычисления с ошибкой в пару порядков, надо подзатыльники выдавать, чтобы тонна металла внезапно превращалась в 10 килограмм.
            • 0
              Расскажите пожалуйста поподробнее про это внезапное превращение.
              • +1
                Исходные «10 литров на сто километров» подразумевают поддержание скорости автомобиля постоянной в районе оптимальной. То есть работа направлена исключительно на компенсацию силы трения воздуха и комплексной силы трения качения.
                Из моего опыта протолкать тронувшийся автомобиль на скорости 5 км/ч вовсе не так уж и трудно.

                Кстати. Давайте посчитаем. Удельная теплота сгорания бензина 44 МДж/кг. Плотность 0.75 г/см3. Получаем 44e6*0.75=33 МДж/литр. Приводим к милилитрам 3.3*e4 Дж/милилитр. 33 килоджоуля из одного миллилитра. Теперь возьмём 33 килоджоуля и посмотрим какая сила нам нужна, чтобы протолкать что-либо 10 метров с этой энергией. 33 000 Дж = 33 000 Н*м. Получаем, что нам потребуется 3300 ньютонов. Что примерно эквивалентно весу 330 килограмм. Теперь вспопним про КПД двигателя внутреннего сгорания, который можно считать 25%. Остаётся ~ 85 килограмм.
                • 0
                  Если воспользоваться коэффициентом с www.3dcar.kg/avtomobil/hodovaya_chast/sily_deystvuuschie_na_dvizhuschiysya_avtomob/1074.html — 0,015. То можно прикинуть, что этого милилитра достаточно для поддержания скорости перемещения 5тонного автомобиля.
                • +2
                  Человеческие жизни к сожалению в Джоулях не измеришь.
                  Как не измеришь и то, что бензин это жидкость, и как жидкость сцуко норовит затечь в любую щель, и спрятаться там от твоих попыток его потушить. Зато окружающие горючие объекты легко добавляют ему недостающих Джоулей.

                  Цель этих баек не в том, чтобы быть точными, а в том, чтобы усилить восприятие техники безопасности.

                  ПЫСЫ: у меня близкие люди погибали в пожаре, так что вы меня своей научной точностью не запугаете. Я практик.
                  • –1
                    Я тоже практик. Но считаю, что преднамеренное введение в заблуждение недопустимо. И полностью согласен, что на ТБ надо приводить запугивающие примеры. Просто примеры надо аккуратнее подбирать.
      • 0
        Тогда это уже коктейль Молотова)
  • +10
    Мам срочно вышли 500 рублей на номер XXXXXXXXXX потом объясню
  • +3
    Очень здорово! А не могли бы Вы еще выложить архив со скриптами? (Чтоб не копировать каждый листинг :D) Будет интересно поковыряться на досуге.
  • +1
    >>Симкарта с тарифом МТС «Супер МТС». У них все смски по РО на любого ОПСОСа по 10 копеек
    Как правило, операторы ограничивают количество СМС на тарифе. Например, в питерском «Супер МТС» 1000 СМС в месяц, а потом по 2 рубля за штуку. И такое ограничение есть, наверное, на любом тарифе любого оператора. В договоре, за десятью звездочками и мелким шрифтом.
    • +1
      Специально звонил их техникам и расспрашивал. Божились, что ограничений нет.
      • +2
        Мне на днях оператор Билайна тоже божилась про безлимитный интернет, правда всего 600 Мб в месяц, но ведь безлимитный!
    • 0
      Если предоставить определенные документы об использовании сервиса и оформить корпоративный «вкусный» тариф, оператор снимает ограничение с количества SMS. Так что этот вопрос просто решается.
      • 0
        Если подписывать бумаги, оформлять договора и т.п., то тогда зачем извращаться с такими наколенными решениями? Тогда уже подключаться по smpp
        • 0
          Дороже. Не нашёл похожих цен за исключением того, что планируется запускать от 500к смсок.
        • 0
          Да, это правда значительно дороже. Тем более, что такой сервер стоит создать ради создать. Парень молодец, с огоньком.
  • +6
    маленький хинт — вместо керосинки можно использовать обычную зажигалку :)
    которой вы скорее всего керосинку и поджигаете ;)
    • +5
      Поджигал на солнце увеличительным стеклом, но верно подмечено)
      • +1
        тогда надо пометить, что всю сборку требуется проводить в яркий солнечный день :)
        • +2
          естественно, иначе идеологически неверно будет!
      • +2
        Понятно, откуда у вас такой ник :-)
      • +3
        А в интернет Вы, наверно, голубиной почтой выходите =)? (простите, не удержался)
    • 0
      Можно жечь на газовой конфорке например.
  • +4
    Извините, подумалось...
    image
  • НЛО прилетело и опубликовало эту надпись здесь
    • +4
      Или вообще обойтись смартфоном на андройде, написав сервис
      • +7
        Мало того, что не понадобится нетбук; вентилятор для охлаждения нетбука; керосин, гранёный стакан, шнур для подключения вентилятора; домен и сайт, так это и работать будет надёжней: пришло SMS от старосты — обрабатываем, рассылаем; пришло SMS с такси или кредитами — автоматическое написание и отправка заявления в ФАС не недобросовестную рекламу (опционально).

        Мало того, ещё и на Маркете продавать можно!
        • 0
          Авторизация по номеру телефона отправителя это нонсенс.
          Подделка номера отправителя никогда не представляла хоть сколько-нибудь проблему.
          Т.е. узнаем номер шлюза (а это в вашей схеме не сложно — от его имени приходят смс), узнаем номер старосты (лучше всех старост). Профит.

          И еще — операторы частенько банят всякие подобные шлюзы по своим внутренним критериям. Объяснить что-то невозможно. Тем более что подобные схемы как правило нелегальны. (про легальность лучше пообщайтесь с операторами, сейчас уже не вспомню их аргументацию).

          т.о. как для хоть какой-то защиты от атаки и для обеспечения работоспособности при бане (просто меняем карту с которой отправляем) лучше делать два номера — один на прием, другой на отправку. При большом колве входящих сообщений ваш шлюз сдохнет сам по себе, а небольшой объем операторы не будут блокировать.

          ПЫСЫ: а вообще прикольно было почитать про кустарные решения. В целом решение подобно Вашей керосинке, но зато красиво :)
          • 0
            Те сервисы, которые я видел в Сети и даже когда-то пробовал, подставляют максимум 11 символов — «от имени» +7 (***) ***-**-** отправить не получится. Может, есть другие, если знаете — расскажите пожалуйста, как от них защититься.
            Простейший вариант обезопаситься — отправка старосте подтверждающего SMS с одноразовым паролем, на которое он должен ответить.

            Второй вариант — держать в секрете номер принимающей сим-карты (Android'ы с двумя симками тоже вполне доступны).

            При большом количестве сообщений не рекламного характера да при отсутствии жалоб получателей с чего бы оператору отказывать в оказании услуг?!
            • 0
              11 символов касается именно текстового идентификатора. А номер передается в цифровом виде.
              Большинство приличных шлюзов имеют у каждого клиента список разрешенных номеров, обычно нужно подтвердить что ты владеешь этим номером. Подтверждения бывают разные, к примеру тем же смс с кодом.
              Но технически ограничений нет. И существуют шлюзы которые никак не ограничивают идентификаторы отправителей.
              Правда у них бывают сложности с доставкой к некоторым операторам или регионам, но на практике у меня были проблемы только с Лайфом. Лет пять семь назад у меня был сервис по отправке таких смс, но люди не верили в реальность, в общем сервис не пошел :) Сегодня специально заглянул на свой шлюз, да, и деньги все еще остались на счету, и номер отправителя все еще бесконтрольный.

              Что касается двух номеров, один из которых в секрете, то я об этом и говорил. Решение конечно кривое, ибо узнать номер все равно можно, методом хуман-инжиниринга, или саботаж со стороны старосты другой группы. Но хоть какая защита.
              • 0
                Если уж злоумышленник упорот и очень хочет сорвать занятия и подставить старосту, он может разослать всей группе SMS от имени старосты «завтра пар не будет», которому большинство поверит. Тут уж наличие шлюза роли не играет.

                Вариант саботажа старостой другой группы — а нафига? Все мы помним про хакера в столовой.
                • 0
                  давайте тогда и от паролей откажемся? :)
                  Я лишь озвучил недостатки схемы, помимо очевидных вопросов стабильности и т.п.
                  Нюансы почему стоит отослать с официального шлюза могут быть разные — не все телефоны есть (или ты не знаешь какой из трех телефонов Вася дал для смсок), на некоторые ты не можешь прислать сообщение — твой шлюз не пускает, не хочешь денег тратить, хочешь оставить в логах шлюза что слал староста… мало ли причин.
        • +1
          Причем писать ничего на андроид не надо. Достаточно использовать программу-автоматизатор Tasker. Ее функционала хватит в качестве костыля.
      • 0
        А еще можно не заморачиваться и заюзать groupsms.ru за 0 рублей, 0 копеек.
  • +3
    Замечания по части безопасности — SQL инъекции в handler.php.

    $message=$_POST['message']; $message=htmlspecialchars(stripslashes($message)); // обработка от спецсимволов



    mysql_query ("INSERT INTO on_demand VALUES('$message','$groups','$course','$last_tranzaktion', '$heutige_datum')"); // новое указание для отправки

    Ну это так… мелочи, а так интересная статья. Спасибо!
  • +3
    Очень теплый ламповый пост, спасибо! Когда увидел как вы керосинку варганите из лампочек, подумал об авторе, как о линуксоводе без сомнений, ну а видак и прочие атрибуты заставили прям вот… спасибо в общем (:
  • +1
    Лампочка Ильича наоборот — это, конечно, хорошо. Но как-то не пожаробезопасно.
  • 0
    сервис смс-рассылки уведомлений старостами (деканатом и прочими)

    Вот кто смс-ки рассылает! Представляю лица счастливых старост, деканов и прочих.
    Утро. Сладкий сон. И вдруг:
    — Тын-дын!
    — Ой, это наверное кто-то близкий!..
    Смотрит на табло.
    — %^&#@!!! (далее идет непереводимая игра слов)

    P.S. Руки бы отрывал за такие «сервисы».
    P.S.2. А вобще молодец, хорошо расписал.
    • 0
      Кстати, по поводу раннего утра-ночи. Сервис работает только если есть подключение по Wi-Fi, иначе копит данные и отправляет когда Сеть появится. Так вот, у меня стоит электронная «розетка в розетку». В нее я втыкаю роутер, а подает электричество она ровно с 8 до 22 часов (в выходные — 9 — 21). Такие штуки в Икеи в больших объемах продаются.
      • +3
        Эта штука из Икеи довершает картину из керосинки из лампочки ильича и прочего.
        Это безумие, но при некотором везении может получится ядерный результат в будущем (я не про рассылку смс, конечно же).

        Именно такие безумцы пишут профессору Таненбауму что его minix отстой и через 20 лет имеют один из самых больших программных проектов в истории.
  • 0
    Так то вам бы и Kannel kannel.org хватило, если уж так нужно было организовать самому весь процесс.
    Туда можно и телефон подключить в качестве шлюза, и не городить тонну говнокода, обойдясь одной формой.
  • 0
    аудио кассету не увидел, но два картриджа от 8-битки на фото точно есть!
    • 0
      Аудио кассет там нет. Точнее, есть, но они не попали в кадр. Никто не заметил пачку не распечатаных 3.5 дискет с 1999 года. А лежит — то она прямо над надписью Sony на видаке)
  • 0
    У старост ареОлы (как по тексту) или все же ареалы? А то пытаюсь себе представить… :)
    • 0
      Поправил, спасибо.
    • 0
      Зависит от пола ;)
  • 0
    А как студенты получают сообщения — от номера симки? Или таким способом можно ставить имя отправителя в отсылаемом сообщении?
  • 0
    Как проверяете номера на принадлежность Ростовской области?
    • 0
      Пока, признаться, никак. Но вообще это легко решаемо. Множество сервисов в Сети показывают принадлежность абонента к региону, причем параметр с номером передается по GET => просто делать маленький парсер и анализировать результат. Мне так кажется это можно решить.
  • 0
    Я делал робота для приёма сообщений на базе Asterisk для SMS голосования. Прослойка конечно лишняя для данной задачи, но у меня он уже работал и принимал голосовые вызовы. Просто добавил ещё один модем Huawei E150. В целом данная связка: FreeBSD+Asterisk+Huawei E150 выполнили свою задачу и за месяц проведения голосования приняли 3500 SMS.
    Отправкой SMS робот не занимался, хотя можно было бы прикрутить ответные SMS, но денег было жалко :)
    В целом самописного было бало, только конфиги Asterisk и скрипт для обработки SMS и отправки данных на веб-сервер в интернет.
  • 0
    Изоляцию с концов проводов кстати очень хорошо снимать с помощью детского набора для выжигания. Даже МГТФ и подобные берёт, и залуживать потом проще, чем после открытого пламени.
  • 0
    Ух ты, вот это велосипед :)
    А вообще для таких целей лучше использовать USB GSM модем(ы). Заодно кроме приёма/отправки SMS сможете принимать/инициировать голосовые вызовы.
  • 0
    А не проще было использовать какой-нибудь смс-гейт, коих полно в рунете?
    • 0
      гейт надежнее, проще но дороже.
      • +1
        Ну тут можно заниматься подсчетами. На описанный автором сервис ушел нетбук, телефон, зарядка, интернет, время. Если все это сложить, то можно получить нормальную такую пачку смс на долгий срок (например: 50000 смс по 0.17 р. за 8500).
        Разве что вот это ограничение из заголовка мешает:
        Не должен быть привязан к online сервисам рассылки (дабы не утекли базы пользователей)
        • 0
          Ну лично я конечно пользуюсь для аналогичной цели (с группами и «старостами», только это не совсем учебное заведение) шлюзом и небольшим пхп-скриптом. Единственный минус как для меня это то, что номера телефонов указываются в конфиге (недостатки моего скрипта), но это из области «на вкус и цвет все фломастеры разные». Да и потом — романтику велосипедостроения никто не отменял.
        • 0
          нетбук — бесполезный хлам
          телефон — достался бесплатно
          зарядка тоже
          Интернет — жрет Wi-Fi

          Так что все обошлось фактически бесплатно.
  • 0
    Пробовали ли обходить ограничение длины смс в 70 символов? У меня одинаково глючили как gammu, так и gnokii. Пробовал на разных телефонных аппаратах.
    • 0
      Вы имеете ввиду специальный формат делающий несколько сообщений в одно, или предполагаете что технически возможно отправить длинное сообщение по цене одного?
      • 0
        У меня не получалось принять несколько склеенных сообщений как одно, а также избавиться от них(него). У вас есть жёсткое ограничение на 70 символов. Оно из-за этого?
        • –1
          70 символов в юникод или 160 латиницей. Это заложено в потоколе. На данные в смс выделено 140 байт.
          Если у вас не получается их принять то нужно смотреть в АПИ через которое вы работаете. Либо вы получаете их списком из нескольких отдельных смс либо ваш софт или шлюз, или драйвер или что там у вас по пути — склеивает их в одно.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.