Даник Ковалевский aka DarkEol







Программирование  |  Преподавание  |  Публикации  |  Переводы и языки  |  Прочее  |  Про меня En / De / עב

Статьи  |  Скрипты  |  Сайты  |  Полезности  |  Ссылки

Экспортирования сообщений из ЖЖ на сайт

Допустим у вас есть Живой Журнал и вы хотите чтобы самое новое сообщение в нем появлялось в определенном месте
вашего сайта. Как это сделать с помощью php? Об этом ниже.
Прежде всего для этого в Живом Журнале есть RSS. RSS это такая специальным структура для удобного доступа к данным.
В данном случае к сообщениям в Живом Журнале. RSS вашего журнала находится по адресу
http://www.livejournal.com/users/имя_пользователя/data/rss, где имя_пользователя это имя вашего аккуунта в Журнале.
В нашем RSS есть заголовок который нам не очень интересен. Сами сообщения находятся между тегами
<item></item>. Структура сообщений такова:


<item>
<guid isPermaLink="true">постянная ссылка на сообщение</guid>
<pubDate>дата сообщения</pubDate>
<title>заголовок сообщения</title>
<author>e-mail автора сообщения</author>
<link>адрес сообщения</link>
<description>текст сообщения</description>
<comments>адрес комментариев</comments>
</item>


И таких блоков в нашем RSS 25 штук. Расположены они в нисходящем порядке от более новых к более старым. Нас интересует
самое верхнее сообщение, как самое новое. Как его оттуда выдрать и разместить на сайте? А вот как. В том месте
где нам нужно чтобы появилось сообщение из Журнала напишем такой php код:


<?php
//в переменную $text прочтем содержимое rss.
//"имя_пользователя" разумеется нужно заменить на имя вашего аккаунта в Журнале
$text=file_get_contents("http://www.livejournal.com/users/имя_пользователя/data/rss/");

//в переменную $ljtext запишем второе сообщение которое находится между тэгами
//<description></description>
//это текст сообщения. А второе, потому что первое было уже использовано в заголовке rss.
preg_match_all("!<description>([^<]+)</description>!si", $text, $body);
$ljtext=$body[1][1];

//в переменную $date запишем первую дату, она находится между тэгами <pubDate></pubDate>
preg_match_all("!<pubDate>([^<]+)</pubDate>!si", $text, $body);
$date=$body[1][0];

//в переменную $ljtitle запишем третий заголовок который находится между тэгами <title></title>
//это заголовок нашего сообщения. А третий, потому что первые два уже были использованы
//в заголовке rss.
preg_match_all("!<title>([^<]+)</title>!si", $text, $body);
$ljtitle=$body[1][2];

//в переменную $ljlink запишем третью ссылку которая находится между тэгами <link></link>
//это адрес сообщения. Третье, потому что первые две уже были использованы
//в заголовке rss.
preg_match_all("!<link>([^<]+)</link>!si", $text, $body);
$ljlink=$body[1][2];


Теперь у нас есть все что нужно. Но! В Живом журнале используется кодировка юникод, в то время как на русских
сайтах обычно используется кодировка win-1251. Так что если мы просто выведем полученное нами сообщение на экран,
то увидим только крокозяблики. Есть несколько способов для решения этой проблемы. Можно к примеру поменять кодировку
страницы из win-1251 в юникод. Для этого откройте страницу в блокноте (notepad-e) и сохраните посредством Save As.
Самым нижним, выпадающем меню там идет выбор кодировки. Выбирайте utf-8 и сохраняйте. Теперь ваш документ сохранен
в юникоде, и понимает тексты импортированные из Журнала. Выведем сообщение на экран:


//заменим подстановки тэгов обратно на сами тэги, и уберем кат если есть
$search=array("'&apos;'i", "'&lt;'i", "'&gt;'i", "'&quot;'i", "'<a name="cutid1">'i");
$replace = array ("\"","<", ">", "\"", "");
$ljtext = preg_replace ($search, $replace, $ljtext);

//показать только 256 знаков в сообщение, если есть больше срезать
if (strlen($ljtext) > 256)
{
$pos = strpos($ljtext, " ", 256);
$ljtext=substr($ljtext, 0, $pos)."...";
}

//форматирование текста. заголовок жирным шрифтом по центру, под ним само сообщение
$text="<center><b>".$ljtitle."</b></center>".$ljtext;

//печатать сообщение, а внизу справа ссылка "Дальше" на обсуждение в журнале.
print($text."<div align=right><i><a href=\"".$ljlink."\">Дальше</a></i></div><i>".$date."</i>");
?>

Но если мы не хотим менять кодировку страницы из win-1251 в юникод, то можно наоборот, перекодировать сообщение
полученное из Журнала из кодировки юникод в win-1251. Для этого я разыскал такую функцию:


function utf8win1251($s){
$out = $c1 = "";
$byte2=false;
for ($c=0;$c<strlen($s);$c++){
$i=ord($s[$c]);
if ($i<=127) $out.=$s[$c];
if ($byte2){
$new_c2=($c1&3)*64+($i&63);
$new_c1=($c1>>2)&5;
$new_i=$new_c1*256+$new_c2;
if ($new_i==1025){
$out_i=168;
}
else{
if ($new_i==1105){
$out_i=184;
}
else {
$out_i=$new_i-848;
}
}
$out.=chr($out_i);
$byte2=false;
}
if (($i>>5)==6) {
$c1=$i;
$byte2=true;
}
}
return $out;
}

Добавим ее к нашему коду. И нужно чуть чуть изменить строчку вывода текста. Его нужно сначала пропустить через эту функцию.
Вот так:


print(utf8win1251($text)."<div align=right><i><a href=\"".$ljlink."\">Дальше</a></i></div><i>".$date."</i>");

На этом все. Сообщение благополучно экспортировано.







Valid XHTML 1.0 © DarkEol, 2002–2024 Valid CSS Java 11.0.9