Архив форума "Клуб любителей DVD" с 2000 по 2014гг


NNTP

Автор: Nikki
< >

Дата: 06.02.00, @14:28

  ` Ну, давайте подумаем вместе, как сделать такое с минимальными усилиями

Не самый отпимальный вариант - я торопился.

#!/usr/bin/perl -w
require 5.004;
use strict;

use Mail::Header;
use Mail::Address;
# use MIME::QuotedPrint;
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
use MIME::Words qw(:all);

#-------------------------------------------------------------------

my $REF_HOST = "lybrand.securities.com.ru"; # prefix before message ref number
my $DVD_NEWSGROUP = "cityline.dvd";

my $MAX_NAME = 50;
my $MAX_MAIL = 40;
my $MAX_SUBJ = 50;
my $MAX_PASS = 40;

my $POST_CGI = 'http://www.rusdvdportal.com/cgi-bin/board.cgi?post';
#my $POST_CGI = 'http://localhost/cgi-bin/board.cgi?post';

#--------------------------------------------------------------------
my @koi2cp_t = (

128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,

144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,

160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,

176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,

254,224,225,246,228,229,244,227,245,232,233,234,235,236,237,238,

239,255,240,241,242,243,230,226,252,251,231,248,253,249,247,250,

222,192,193,214,196,197,212,195,213,200,201,202,203,204,205,206,

207,223,208,209,210,211,198,194,220,219,199,216,221,217,215,218
);

sub koi2cp {

my $ch = shift;

return substr($ch,0,1) if ord($ch) < 128;

return chr($koi2cp_t[ord($ch)-128]);
}

sub koi2cp_str {

my $s = shift;

my $r = "";

while (length $s > 0) {

$r .= koi2cp($s);

$s = substr($s, 1);

}

return $r;
}

my $head = new Mail::Header \*STDIN;

# Parse for proper newsgroup first (just agains wrong inn config)
$head->combine('Newsgroups', ',');
my @newsgroups = split(/,/, $head->get('Newsgroups'));
if ($#newsgroups < 0) {

printf STDERR "No newsgroup in header\n";

exit 65; # EX_DATAERR
}

my $group;
my $group_found = 0;
foreach $group ( @newsgroups ) {

chomp $group;

if ($group eq $DVD_NEWSGROUP) {

$group_found = 1;

last;

}
}

unless ($group_found) {

print STDERR "Message doesn't belong to $DVD_NEWSGROUP\n";

exit 78; # EX_CONFIG
}

#print "Valid newsgroup found\n";

# Extract ref number if present
$head->combine('References', ',');

my $ref = -1; # watermark
if ($#newsgroups >= 0) {

my @addrs = Mail::Address->parse($head->get('References'));

my $addr;

foreach $addr ( @addrs ) {

my $extracted_ref = $addr->user();

$ref = $extracted_ref

if $addr->host eq $REF_HOST and $ref < $extracted_ref;

}
}

# get user and address
unless (defined $head->get('From')) {

print STDERR "Missing From header\n";

exit 65;
}
my ($user, $email, @addrs);
@addrs = Mail::Address->parse($head->get('From'));
unless ($#addrs >= 0)
{

print STDERR "Ill-formed from field\n";

exit 65;
}
my $addr = $addrs[0];
$user = decode_mimewords($addr->name());
$user = "Ill-formed user name" unless $user;
$user = substr($user, 0, $MAX_NAME);

$email = substr($addr->address(), 0, $MAX_MAIL);

# Possible reply-to support should be here
#if (defined $head->get('Reply-To')) {
#...
#}

# Password is just user address + magic str for now
my $pass = substr("PASS_tilsxc_$email", 0, $MAX_PASS);

# subject
my $subject = $head->get('Subject');
chomp $subject;
$subject = decode_mimewords($subject);
$subject = 'Ill-formed subject' unless($subject);
$subject = substr($subject, 0, $MAX_SUBJ);

my $body;
while (<>) {

$body .= $_;
}
$user = koi2cp_str($user);
$email = koi2cp_str($email);
$subject = koi2cp_str($subject);
$pass = koi2cp_str($pass);
$body = koi2cp_str($body);

#$pass = '123'; # for testing
#print "Answer to post #$ref\n" if $ref >= 0;
#print "Name: $user\nEmail: $email\n";
#print "Subject: $subject\n";
#print "Password: $pass\n------------------------\n\n";

# When the fun begins
my $ua = new LWP::UserAgent;
#$ua->agent("NNTP_HTTP_Gateway/0.1 " . $ua->agent);
$ua->agent('Mozilla/4.7 [en] (X11; I; Linux 2.2.15pre4 i686)');
$ua->from('nikkic@cityline.ru');
$ua->timeout(120);

# Create a request
my $http_req;

if ($ref >= 0) {

$http_req = POST $POST_CGI,

Content => [ followup => $ref, name => $user, email => $email,

subject => $subject, body => $body, password => $pass,

Post => "Post+Message" ];

} else {

$http_req = POST $POST_CGI,

Content => [ name => $user, email => $email,

subject => $subject, body => $body, password => $pass,

Post => "Post+Message" ];
}

my $res = $ua->request($http_req);
if ($res->is_success) {

exit 0;
} else {

print STDERR $res->as_string;

exit 75;
}

Сообщения в ветке


Ответ на сообщение
Ваше имя:
Пароль:
Ваш e-mail:
Тема:
Текст сообщения:
  
Посылать уведомление об ответе: