Здравствуйте.
Реализую возможность при добавлении новости на портал, отправлять её в коммьюнити на livejournal.com через специально зарегистрированного для этого юзера. (Знаю, что изврат, но покупать платный аккаунт для экспорта RSS не хочется).
Получился примерно такой код:
#!/usr/bin/perl
print "Content-type: text/html; charset=windows1251\n\n";
# 0 1 2 3 4 5 6 7 8
($sec, $Gmin, $Ghour, $mday, $Gmon, $Gyear, $wday, $yday, $isdst) = localtime;
$Gyear += 1900;
$Gmon += 1;
use IO::Socket qw(:DEFAULT :crlf);
use CGI;
use URI::Escape;
$c = new CGI;
$year = $c->param("year");
$mon = $c->param("mon");
$day = $c->param("day");
$subject = $c->param("subject");
$hour = $c->param("hour");
$min = $c->param("min");
$event = $c->param("event");
$act = $c->param("act");
if ($act eq "post")
{
$subject = uri_escape($subject);
$event = uri_escape($event);
$post = "mode=postevent&user=netsago_news&auth_method=clear&auth_response=";
$post.="&allowmask=&auth_challenge=&hpassword=[PASSWORD]&lineendings=pc&subject=$subject";
$post.="&year=$year&mon=$mon&day=$day&hour=$hour&min=$min&event=$event&usejournal=netsago";
# открываем сокет
$sock = IO::Socket::INET->new(
PeerAddr => 'www.livejournal.com',
PeerPort => '80',
Proto => 'tcp'
);
# узнаем длину запроса для Content-length:
$l = length($post);
# отправляем запрос:
print $sock join("\r\n" =>
"POST /interface/flat HTTP/1.0",
"Host: www.livejournal.com",
"Content-type: application/x-www-form-urlencoded",
"Content-length: $l",
"",
$post
);
# пытаемся достать адрес записи
$answer = join(" ", <$sock>);
@ans_words = split(/ /, $answer);
print $answer;
foreach $word (@ans_words) {
if ($word =~ m/http:\/\/community.livejournal.com\/netsago\//)
{
$link2lj = "<a href=\"$word\">$word</a>";
} else
{
$link2lj = "BAD";
}
}
close($sock);
print "\n\n$link2lj";
} else {
print qq~
<form action="lj.pl" method="post">
<input name="subject" size="40"><br>
<input type="hidden" name="year" value="$Gyear">
<input type="hidden" name="act" value="post">
<input type="hidden" name="mon" value="$Gmon">
<input type="hidden" name="day" value="$mday">
<input type="hidden" name="hour" value="$Ghour">
<input type="hidden" name="min" value="$Gmin">
<textarea rows="12" cols="48" name="event"></textarea><br>
<input type="submit" value="Send"></form>
~;
}
---
Проблема в следующем: когда я в хедере явным образом указываю кодировку (в данном случае, это cp1251), сервер отказывается принимать запись, в которой присутствует русский язык, выдавая в ответ:
HTTP/1.0 200 OK Date: Mon, 26 Mar 2007 11:29:16 GMT Server: Apache Set-Cookie:
ljuniq=Kbs2qKFhr99ahsb:1174908556:pgstats0; expires=Friday, 25-May-2007 11:29:16 GMT;
domain=.livejournal.com; path=/ Content-length: 226 Connection: close Content-Type: text/plain
errmsg Client error: Protocol version mismatch: Posting in a community with international or
special characters require a Unicode-capable LiveJournal client. Download one at
http://www.livejournal.com/download/. success FAIL
---
Когда же кодировка не указана, то браузер автоматически воспринимает страницу в ISO-8859-1 и русский язык отсылается успешно, запись добавляется.
Не указывать кодировку в движке своего проекта я, естественно, не могу. Encode::from_to($text. "cp1251", "iso-8859-1"); не помогает и оставляет в $str одни лишь знаки вопроса. use encoding "cp1251" вообще все рушит. Что ещё делать, ума не приложу. Может быть, кто-нибудь что-нибудь посоветует?
PS ссылка на описание параметров при добавлении новой записи на livejournal (на всякий случай): http://www.livejournal.com/doc/server/ljp.csp.flat.postevent.html
|