Пишем элементарный рассылщик
LWP +
HTTP::Request::Common +
HTML::Parser
Как считает Ларри Уол - одно из величайших
качеств любого прогрммиста - это его лень. Согласен. Надоели наши каналы,
надоело платить деньги за три строки текста, и самое главное - надоело
грузить иксы и Нетскейп что бы бесплатно отправить sms.
Хорошо что этот
самый ленивый Уол изобрел perl, а остальые линивцы - модуля.
К
делу. Задача - отправлять sms из командной строки не загружая
браузера. При успешном выполнении - широковещательную неограниченную рассылку
(спамом неохота это называть) sms.
1. Ищем
подходящий ресурс рассылки. Неоднократно отсылаем sms разным
операторам, Засекаем время доставки и надежность. 2. Смотрим на систему
безопасности ресурса и кем предоставлен гейт. Мне было принципиально важно
гейт Киевстара т.к. на него шлю чаще всего а свою страничку они защитили
лучше всего (.gif не разбереш, хотя послушал бы
мнения).
По первым двум пунктам мое внимани привлек ресурс "Телекома"
//telecom.com.ua он не только очень быстро доставляет смс на Киевстар
но там жирным светилась надпись "Программное обеспечение для гейта
предоставлено компанией "Киевстар GSM"". У меня аж ручки зачесались. Бегло
ознакомившись с формой (разлядывая html)- никаких преград. Три параметра
запроса:
1. Номер получателя, в форме to_addr. 2. "Щелкунчик" - принимает ли телефон кирилицу, в форме dcs. 3. Собственно
сам текст смс, в форме new_body.
вот форма без лишний требухи:
<form name=sms method="post"
action="/cgi-bin/sms/sms.pl" onsubmit="return SendForm()"> <input type=text name=to_addr><input
type=radio value=1 name=dcs onClick=setLen(this.value)> <input
type=radio value=0 name=dcs checked
onClick=setLen(this.value)> <textarea name=new_body cols=40
rows=4 wrap=virtual onChange=checkLen(document.forms[0])
onKeyUp=checkLen(document.forms[0])></textarea> <input
type=hidden name=kfY
value='KLHNcbbv7pPXg7Frdjl9V8SS7bGRDHyOS6bvX3gV'> <!-- <input
type=hidden name=no_spam value='YLIQc4jXJZeAdvrtQHoQ'> -->
</form>
Неужели все так просто? И тут вижу еще два
непонятных параметра с пометочко hidden: один из них менял свое значение с
каждой загрузкой причем что name что value имели абсолютно умопомрачительные
названия кот нормальный человек в нормальном состоянии никогда бы не
придумал. Второй - типа закоментированный no_spam - из наблюдений и
последнего названия делаем вывод: "кинули" в нас цифровой подписю! Значит
атакой "в лоб" не получится.
Алгоритм прост: Выгребаем страницу,
разбираем, достаем значения динамически изменяемых параметров подписи как то
хеш и саму подпись. Пишем письмо другу, к нему атачим эти же параметры.
Засовываем серверу и пусть жует. С криком - "Нет преграды патриотам!" достал
из CPANа и заточил HTML::Parser.
Вот что получается...
#!/usr/bin/perl warn "Загрузка ...nn";
#
модули
use strict; use warnings; use LWP; use
HTTP::Request::Common; use HTML::Parser;
# константы: 1-я адрес
странички с формой, 2-я адресс самого скрипта.
use constant SMS_CENTER
=> '//telecom.com.ua/smsgate/'; use constant SMS_SCRIPT =>
'//telecom.com.ua/cgi-bin/sms/sms.pl';
###########################
Прием данных для отсылки KOI8-ru ###############
print "Kyiv Star
067XXXXXXXn UMC
050XXXXXXXn Goblin Telecom
039XXXXXXn WellCOM
068XXXXXn Номер телефона
получателя:n"; my $to_addr = <STDIN>; chomp($to_addr); $to_addr =
'0000000000' unless $to_addr;
print "Распознает ли получатель кирилицу?
(0 - Нет) (1 - Да)n"; my $dcs = <STDIN>; chomp($dcs); $dcs = 0 unless
$dcs;
print "Текст сообщения:n"; my $new_body = <STDIN>;
chomp($new_body); $new_body = 'test message from LWP' unless
$new_body;
######################## Отправка данных на сервер
#############
############## Параметры типа браузера (спасибо
perl.dp.ua :) ##################
my @ns_headers =
( 'User-Agent' => 'Mozilla/4.76
[ru] (Win98; U)', 'Accept' =>
'image/gif, image/x-xbitmap,
image/jpeg, image/pjpeg,
image/png, */*', 'Accept-Charset'
=> 'koi8-ru,*,utf-8',
'Accept-Language' => 'en-US', );
########################
Подключение к серверу ############# $|=1; ### отключаем буферизацию my $ua
= LWP::UserAgent -> new; $ua -> agent(@ns_headers,
push@{$ua->requests_redirectable},'POST');
###### Идем за новой
страницей с формой #########
my $request = HTTP::Request -> new(GET
=> SMS_CENTER); my $parser = HTML::Parser->new(api_version => 3);
### новый обьект разборщика
############# Настройка разборщика
###
здесь разбирается название хэша и его значение. Этим займется функция
start my ($hash_name,$hash) = $parser ->handler(start => &start,
'tagname,attr'); ### как атрибуты функции передаются имя тега и его
значение
### значение цифровой подписи - функция hidden my $cifer =
$parser -> handler(comment =>&hidden, 'tagname'); ## тут нам нужно
только имя тега
my $response = $ua -> request($request,
sub{$parser->parse(shift)}); ### получаем страницу и передаем
разборщику $parser->eof;### разборщик больше не
нужен
die $response->status_line unless
$response->is_success; ### "умираем" если нет ответа
system ('clear'); ### очищаем экран print
"Получены данные...n Номер
получателя: $to_addrn Получение
кирилицы: $dcsn Сообщение:
$new_bodyn Данные хэша:
$hash_name = $hashn Подпись:
$cifernn ";
########### заполняем форму
###############
$request =
POST(SMS_SCRIPT,
Content=>[
to_addr =>
$to_addr,
dcs =>
$dcs,
new_body =>
$new_body,
$hash_name =>
$hash,
no_spam => $cifer
], Referer =>
SMS_CENTER ); $response = $ua->request($request);
########## Отправляем на сервер die
$response->status_line unless $response->is_success; ###
если нет ответа - выходим
print $response->content;##### получаем
(для отладки) ответ сервера
######################## functions
################# ######## Все функции прозрачны если нужно описание
будет.
sub start{ my ($tag,
$attr) = @_; if ($tag eq
'input'){
return unless $attr->{type}; if($attr->{type}
eq 'hidden'){
$hash_name=$attr->{name}; $hash =
$attr->{value}; return; } }
} sub hidden{ my ($tag) = @_; if ($tag =~ m/(input type=hidden
name=no_spam value=')(w+)('*)/i){ $cifer =
$2;
return;
} }
Ну и под конец скажу, что дл я остальных "зверей "подключил это все дело
через CGI с возможностью рассылки до 30 абонентам
сразу, выложил на серваке в офисе,
все счастливы и довольны такой халяве.
Сразу предупреждаю, там же стоит вычислялка IP, так
что без нормального маскарада все равно не получится отправить больше 5 смс. И
этот сервак хреновенько шлет на номера UMC (гейт все
таки Киевстаровский). Так что берите другие и долбите.
Кстати у UMC все реализовано не сложнее чем у
"Телекома". Делайте выводы :)
Удачи.
|