Главная страница статей --> Советы по фотошопу, графике и хитрости в построении php кода

Пишем элементарный рассылщик

Источник: realcoding.net

LWP + HTTP::Request::Common + HTML::Parser


Как считает Ларри Уол - одно из величайших качеств любого прогрммиста - это его лень.
Согласен. Надоели наши каналы, надоело платить деньги за три строки текста, и самое главное -
надоело грузить иксы и Нетскейп что бы бесплатно отправить sms.

Хорошо что этот самый ленивый Уол изобрел perl, а остальые линивцы - модуля.

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

1. Ищем подходящий ресурс рассылки. Неоднократно отсылаем sms разным операторам,
Засекаем время доставки и надежность.
2. Смотрим на систему безопасности ресурса и кем предоставлен гейт.
Мне было принципиально важно гейт Киевстара т.к. на него шлю чаще
всего а свою страничку они защитили лучше всего (.gif не разбереш, хотя послушал бы мнения).

По первым двум пунктам мое внимани привлек ресурс Телекома http://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 => http://telecom.com.ua/smsgate/;
use
constant SMS_SCRIPT => http://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 все реализовано не сложнее чем у "Телекома". Делайте выводы :)

Удачи.



Похожие статьи:
- Оптимизация для MSN
- RSS генератор
- Шаблоны в PHP для чайников
- Гостевая книга на PHP
- В каких поисковиках надо раскручиваться?
- Использование HTML-таблиц для вывода диаграмм
- Сколько человек на сайте?
- Безопасное программирование на PHP
- Генератор паролей
- Про тэги и метатэги
- CSS: советы и приёмы, часть 1
- Слежение за контентом на динамических сайтах
- Обработка строк в РНР


Оглавление | Обсудить на форуме | Главная страница сайта | Карта сайта |

Контакты
Редакция:
[0.001]