информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Perl] Проблема с кодировкой при отправке HTTP-запроса на livejournal.com 26.03.07 16:15  
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
Отредактировано 26.03.07 18:24  Количество правок: 2
<"чистая" ссылка>
Здравствуйте.

Реализую возможность при добавлении новости на портал, отправлять её в коммьюнити на 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
[Perl] я в аналогичной ситуации для трансляции ezhe.ru/pravda в utf кодирую тело запроса 26.03.07 17:36  
Автор: dl <Dmitry Leonov>
Отредактировано 26.03.07 17:40  Количество правок: 1
<"чистая" ссылка>
Плюс я не очень понимаю, какое отношение кодировка своего движка имеет к кодировке запроса, уходяшего на lj.
Спасибо, разобрался. 26.03.07 21:40  
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
<"чистая" ссылка>
Encode::from_to($subject, "cp1251", "utf8");
Encode::from_to($event, "cp1251", "utf8");

+ доскональное изучение документации и, как результат, указание в запросе &var=1
помогло :)

> Плюс я не очень понимаю, какое отношение кодировка своего
> движка имеет к кодировке запроса, уходяшего на lj.

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




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach