Несколько месяцев назад меня посетила мысль перенести все мои записи c блога на livejournal.com на собственный сайт. Стандартные средства ЖЖ предлагают только экспорт в XML формат, проблема в том что записи придется сохранять вручную. Если у вас с десяток записей - проблем не возникнет, а если их несколько сотен/тысяч?
Промучав несколько дней гугол и не найдя решений, которые бы меня устроили, было решено самостоятельно реализовать механизм переезда с ЖЖ на собственный сайт.
На выходе мы получим php скрипт, который позволит перенести данные из блога в ЖЖ в базу данных MySQL. Будут перенесены сами записи, включая теги,комментарии(уровни вложенности сохранены), будет возможность построить облако тегов.
Если вы не знаете что делать с базой данный MySQL, то дальше пожалуй читать не стоит
1. Экспорт данных с livejournal.com.
Для получения записей с livejoural нам потребуется десктопная программа - LJArchive. Она абсолютно бесплатна и скачать ее можно тут: http://sourceforge.net/projects/ljarchive/
* Вариант скрипта не требующий десктопной части уже проходит стадию тестирования.
Устанавливаем программу и создаем новый проект
Если вы не планируете отображать у себя на сайте комментарии с ЖЖ, то галочку "Download comments" можно убрать.
Немного подумав(зависит от количества записей в Блоге) программа покажет все ваши посты.
Далее нам необходимо сохранить скачанный материал в формате XML
В следующем окне выбиваем папку куда будет произведено сохранение материала. В качестве имени файла указываем "1". Параметр "Split Export" выбираем равный "Per Entry". Т.е. каждому посту у нас будет соответствовать один xml файл. Ждем ОК.
Подумав несколько секунды мы обнаружим кучу файликов вида "1 - (порядковый номе).xml".
Для корректной работы скрипта нам нужно преобразовать имена файла в вид "(порядковый номе).xml", т.е. убрать префикс "1 - " и лишние нули. Конечно этого можно было бы реализовать на php, но я решил не усложнять себе жизнь и воспользовался программной для массового переименования файла. Вы можете воспользоваться любой программной, я пользовался Total Commander
На скриншоте видно названия файлов до и после переименования. Сохранив полученные XML файлы в папку XML приступим к написанию скрипта для импорта данных.
2. Импорт данных с Базу данных.
Итак у нас есть папочка с XML файлами. Где каждому посту соответствует один файл. Файлы пронумерованы в соответствии с тем как они появлялись в блоге на ЖЖ. Т.е. файл 1.xml содержит самую первую запись. Осталось только обработать данные и записать в БД.
На первом этапе нам нужно подготовить базу данных.
Создадим новую базу, например blog и новые таблицы.
Таблицы:
blog_comment содержит комментарии к постам,
blog_post содержит собственно сами посты,
blog_tag содержит теги к постам,
blog_tagcount содержит количество упоминаний о теге, для построения облака тегов.
CREATE TABLE IF NOT EXISTS `blog_comment`
(
`id` int(10) NOT NULL auto_increment,
`parent_id` int(10) NOT NULL default '0',
`post_id` int(10) NOT NULL default '0',
`text` text NOT NULL,
`name` varchar(15) NOT NULL default '',
`date` varchar(12) NOT NULL default '',
`time` varchar(10) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1207 ;
CREATE TABLE IF NOT EXISTS `blog_post`
(
`id` int(10) NOT NULL default '0',
`subj` varchar(50) default NULL,
`text` text NOT NULL,
`date` varchar(12) NOT NULL default '',
`time` varchar(10) NOT NULL default '',
`privat` int(1) NOT NULL default '0',
`view` int(10) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
CREATE TABLE IF NOT EXISTS `blog_tag`
(
`id` int(10) NOT NULL auto_increment,
`tag` varchar(30) NOT NULL default '',
`post_id` int(10) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=597 ;
CREATE TABLE IF NOT EXISTS `blog_tagcount`
(
`tag` varchar(30) NOT NULL default '',
`count` int(10) NOT NULL default '0',
PRIMARY KEY (`tag`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
Теперь, когда база данных у нас готова, приступим к обработке данных.
Рассмотрим скрипт index.php. Код комментирован, поэтому трудностей с его пониманием не должно возникнуть.
// Скрипт для переноса записей из Livejornal.com(ЖЖ) на собственный сайт
// LJ parse | LJ_XML to MySQL
// Версия 1.3
// (c) МихА http://mihavxc.ru
// 13.11.2009
// Настройки для подключения к БД
@$connect = mysql_connect("localhost","root","") or die("DB is not avalible now"); //подключение к БД
mysql_select_db ("blog"); // выбор БД
mysql_query ("set character_set_client='cp1251'");
mysql_query ("set character_set_results='cp1251'");
mysql_query ("set collation_connection='cp1251_general_ci'");
// Определяем сколько записей уже содержится в БД
$total_post = mysql_query("SELECT MAX(id) FROM blog_post");
list($total_post) = mysql_fetch_row($total_post);
// Подключаем парсер XML файлов
include("lj_parse.php");
// Увеличиваем количесвто постов на 1
$total_post++;
// Счетчик добавленных постов
$count_add_p = 0;
// Читаем в цикле содержимое директории с XML файлами
while(file_exists("/xml/".$total_post.".xml"))
{
// Обрабатываем полученные данные
xmlparces("/xml/".$total_post.".xml",$total_post);
$total_post++;
$count_add_p++;
}
echo "Добавлено $count_add_p постов";
// Скрипт для переноса записей из Livejornal.com(ЖЖ) на собственный сайт
// LJ parse | LJ_XML to MySQL
// Версия 1.3
// (c) МихА http://mihavxc.ru
// 13.11.2009
Как вы наверное заметили ключевым место в этом коде является функция "xmlparces". Она подключается в строке include("lj_parse.php");
Рассмотрим алгоритм реализации этой функции.
// Скрипт для переноса записей из Livejornal.com(ЖЖ) на собственный сайт
// LJ parse | LJ_XML to MySQL
// Версия 1.3
// (c) МихА http://mihavxc.ru
// 13.11.2009
// Функция парсинга XML файла .
function xmlparces($file_id,$total_post)
{
// Читаем имходный файл
$xml = simplexml_load_file($file_id);
foreach ($xml->entry as $entry)
{
}
// Получаем информацию о самом посте
$p_date=$entry->eventtime;
$p_subj=$entry->subject;
$p_text=$entry->event;
$p_privat=$entry->allowmask;
$p_tag=$entry->taglist;
//Преобразуем дату размещения поста в ннормальный вид.
$year = substr($p_date, 0, 4);
$mounth = substr($p_date, 5, 2);
$day = substr($p_date, 8, 2);
$p_time = substr($p_date, 11, 19);
$p_date2=$day.".".$mounth.".".$year;
// Если у поста нет Названия - берем первые 50 символов из текста.
if ($p_subj=='')
{
// Обрезаем теги.
$p_subj_tmp = preg_split ("/", $p_text);
$p_subj=substr($p_subj_tmp[0],0,50);
$p_subj.='...';
}
//Теги у нас записаны в одну стору через запятую,разбиваем их на массив.
$p_tag=preg_split('~\s*,\s*~', $p_tag);
//Обрабатываем комментарии.
//Записываем все комментарии к этому посту в массив.
$count = count($entry->comment);
$i=0;
for ($i=0;$i<$count;$i++)
{
$c_id[$i]=$entry->comment[$i]->itemid;
$c_parent_id[$i]=$entry->comment[$i]->parent_itemid;
$c_date[$i]=$entry->comment[$i]->eventtime;
$c_year[$i] = substr($c_date[$i], 0, 4);
$c_mounth[$i] = substr($c_date[$i], 5, 2);
$c_day[$i] = substr($c_date[$i], 8, 2);
$c_time[$i] = substr($c_date[$i], 11, 19);
$c_date2[$i]=$c_day[$i].".".$c_mounth[$i].".".$c_year[$i];
$c_text[$i]=$entry->comment[$i]->event;
$c_name[$i]=$entry->comment[$i]->author->name;
}
// Экзанируем все кавычки.
$p_text=mysql_escape_string($p_text);
$p_subj=mysql_escape_string($p_subj);
//Записываем пост в БД
// $total_post - уникальный ID записи
// $p_subj - Заголовок
// $p_text - Сам текст поста
// $p_date2 - Дата, преобразованная в нормальный вид
// $p_time - Время
// $p_privat - уровень приватности
// '0' - количество просмотров, которое пока равно 0
$query = "INSERT INTO blog_post VALUES ('$total_post','$p_subj','$p_text' ,'$p_date2','$p_time','$p_privat',0)";
mysql_query ($query);
// Пишем комментарии в БД
$i=0;
$count_com = count($c_id);
for ($i=0;$i<$count_com;$i++)
{
$c_text[$i] = iconv('UTF-8','Windows-1251',$c_text[$i]);
$c_name[$i] = iconv('UTF-8','Windows-1251',$c_name[$i]);
// $c_id[$i] - уникальный ID комментария
// $c_parent_id[$i] - номер родительского комментария, если есть
// $total_post - номер поста, к которому относится пост
// $c_text[$i] - сам текст комментария
// $c_name[$i] - ник автора
// $c_date2[$i] - дата добавления
// $c_time[$i] - время добавления
$query = "INSERT INTO blog_comment VALUES ('$c_id[$i]','$c_parent_id[$i]','$total_post','$c_text[$i]' ,'$c_name[$i]','$c_date2[$i]','$c_time[$i]')";
mysql_query ($query);
}
// Обработка тегов
// Узнаем количество комментариев к записи.
$count_tag=count($p_tag);
$i=0;
for($i=0;$i<$count_tag;$i++)
{
if ($p_tag[$i]!='')
{
// Меняем кодировку на win-1251
$p_tag[$i] = iconv('UTF-8','Windows-1251',$p_tag[$i]);
// '' - Уникальный номер тега присваевается автоматически(autoincreament в БД)
// $p_tag[$i] - сам тег
// $total_post - номер записи к которой относится тег.
$query = "INSERT INTO blog_tag VALUES ('','$p_tag[$i]','$total_post' )";
mysql_query ($query);
// Подбиваем статистику тегов
$query = mysql_query("Select tag,count from blog_tagcount where tag='".$p_tag[$i]."' ");
$total_tag =mysql_fetch_row($query);
// Если такого тега раньше не было в нашей БД - добавляем строчку
if ($total_tag[1] == '')
{
$query = "INSERT INTO blog_tagcount VALUES ('$p_tag[$i]','1' )";
mysql_query ($query);
}
// Если такой тег уже присутствует - увеличиваем счетчик на единицу
else
{
list($tag,$tag_c) = mysql_fetch_row($query);
$tag_c=$total_tag[1];
$tag_c++;
$query = "Update blog_tagcount SET count='$tag_c' where tag='".$total_tag[0]."' ";
mysql_query ($query);
}
}
}
return true;
}
// Скрипт для переноса записей из Livejornal.com(ЖЖ) на собственный сайт
// LJ parse | LJ_XML to MySQL
// Версия 1.3
// (c) МихА http://mihavxc.ru
// 13.11.2009
Все файлы index.php и lj_parse.php нужно положить в одну папку с папкой XML. Далее запускаем index.php и наслаждаемся.
Советы по улучшению и багрепорт приветствуются.
В ближайшее время будет выложена версия не требующая использования десктопной программы.
С помощью данного скрипта реализуется синхронизация между miha-vxc.livejournal.com и mihavxc.ru.
Просмотров: 239734
Автор: МихА | 19:51 13 ноября 2009
| Комментариев: 17
HeyrnrnI wanted to invite you for today's webinar.rnrnTo reserve your seat, for the Live webinar from Carol Bell & Michel de Bakker for today 11:00 AM in Eastern Time (US and Canada), sent us an email to [email protected]'s a quick Overview of what we're going to cover:rn 5 Expensive Marketing Mistakes many business owners make, that prevent them from getting the results they want and how to avoid them (we'll show you what's working now)rn How to know where to start and what to focus onrn How to put together a cohesive marketing plan and stop wasting time on tasks that have no valuern How to know if you are targeting the wrong keywords rn How to know if you are missing one of the most important components of your marketing Learning this can dramatically lead to more sales rn And much MUCH more...rnrnSincerelyrnMichel de Bakker & Carol Bellrnrn"Sent from my iPhone"
Intergenerational messaging about strength may obscure the benefits of <a href=https://manciali.wordpress.com/>cialis</a>. Your path to true recovery begins with trusted medical advice.