Сервис парсинга Wordpress сайтов (указываете донора, логин/пароль акцептора и сайт наполнен) + бесплатные лицензии

O
На сайте с 29.05.2008
Offline
195
1304

Здравствуйте!

Был у меня клиент, который практически каждые 3 дня заказывали парсинг Wordpress сайтов.

Ничего нестандартного - обычный блог, комментарии.

Я подошел к делу очень абстрактно и создал плагин, который может импортировать практически любой Wordpress сайт.

Единственное требование к донору - включенный REST API (встроен и включен по умолчанию в Wordpress начиная с версии 4.7).

Плагин может парсить данные в уже наполненный рабочий Wordpress сайт, а также из множества доноров
(никаких прямых записей в базу данных + созданию уникальный хешей на основе ID REST сущности на стороне донора + хост донора в качестве префикса)

Основные особенности плагина:

Вытягивает содержимое Wordpress сайтов через встроенный в Wordpress REST API, соответственно, экономит ресурсы (время, трафик, ОЗУ) по сравнению с парсингом HTML страниц с использованием регулярных выражений или simplehtmldom.

Среднее время копирования блога (500 публикаций, 2000 комментариев, 2000 медиафайлов) - 15 минут

Плагин не требует установки дополнительных библиотек на сервер, типа Curl, потому, что работает исключительно за счет встроенного в ядро функционала Wordpress, например, WP HTTP для сетевых запросов, WP CRON для планировщика, WP Transient Cache для кеширования.

Плагин поддерживает обновление уже импортированных данных по расписанию (WP CRON - не требует настройки на сервере), а также опрос новых комментариев, обновлений.

В отличии от стандартных решений, парсер, который работает по REST API узнает об обновлениях без повторной проверки и сравнения документов (просто передав HTTP GET параметр after=ДАТА ПОСЛЕДНЕГО ЗАПУСКА ПАРСЕРА в REST запросе).

Соответственно, если по сравнению с предыдущим запуском есть обновления, в ответ парсер получает эти обновления, если нет - ошибку 400.

Парсер импортирует ВСЕ СТАНДАРТНЫЕ СУЩНОСТИ WORDPRESS, а именно

публикации,

страницы,

комментарии,

медиафайлы (скачивает на сервер),

категории,

метки,

мета данные медиафайлов,

аватары и мета данные комментаторов

Плагин заменяет URL донора на URL акцептора в содержимом публикаций, страниц и комментариев используя simplehtmldom,

угадывает шорткоды WPBakery (большинство шорткодов Wordpress отдает в оригинале по REST API, вам нужно только загуглить и установить соответствующие плагины для их обработки на стороне акцептора).

Плагин импортирует данные используя стандартные функции Wordpress, такие как - wp_insert_post, add_post_meta, ... соответственно, плагин совместим с другими плагинами, например, Yoast SEO.

Плагин работает из под чистой инсталляции Wordpress (акцептор), плавно заполняя ваш сайт, поддерживает планирование расписаний в WP CRON, умные интервалы (для обхода автоматических блокировок), а также, приятный бонус - если ваш сайт работает из под Cloudflare, вы практически неуязвимы блокировке со стороны донора (благодаря динамическому адресу сервера).

Вы можете сами протестировать плагин бесплатно и неограниченно (плагин с поддержкой Woocommerce получает каждый спонсор)
http://167.71.82.159/wp-rest-api-import.zip

Разархивируйте содержимое архива в папку wp-content/plugins чистой инсталляции Wordpress, откройте wp-rest-api-import.php и укажите константы WP_REST_API_IMPORT_SCHEME (http либо https) и WP_REST_API_IMPORT_HOST (домен Wordpress сайта с открытым REST API).

Активируйте плагин в консоли Wordpress.

Инструменты - Импорт Wordpress REST API - Запустить задачу немедленно и наблюдайте за плавным наполнением сайта

Наполненный сайт будет работать с любой Wordpress темой, так, как использует исключительно стандартный функционал Wordpress
Соответственно, вы можете выводить содержимое донора (или доноров) на оптимизированном более современном фронтэнде (например, установив оптимизированную премиум-тему) обойдя по качеству финального сайта даже донора.

Данный плагин в виде Wordpress плагина не будет обновляться, поэтому, его будущее сейчас зависит от спроса.

На данный момент я работаю над сервисом, который упростит процесс копирования Wordpress сайта до того, что вам будет достаточно указать адрес донора, адрес акцептора, логин/пароль Wordpress пользователя на стороне акцептора с правами администратора и сервис сам будет добавлять содержимое используя тот же REST API.

Каждый параметр, который импортируется можно пропустить через неограниченное количество встроенных в сервис функций, в том числе, автоматический перевод/синонимизация на phpmorphy.

Какие возможности процессинга хотели бы увидеть вы в первую очередь?

Лицензирование скорее всего за количество REST запросов к донору (больше содержимого - дороже парсинг).

На данный момент, я ищу спонсоров, которые получают доступ к ранним версиям сервиса, а также бесплатные годовые+ лицензии.

Вступить в ряды ожидающих, получить первые неограниченные годовые+ лицензии
Яндекс кошелек 410011404826845 (в комментариях указывайте REST + электронная почта)

Для обратной связи используйте данную тему
media.galer@gmail.com
Telegram @arturkohut

Также, публикую участки исходного кода на случай заинтересованных в написании более специфичного Wordpress плагина/функционала

(контакты выше)

Инкрементальная пауза с привязкой к вызывающей функции/ID итерации с использованием последнего успешного интервала для обхода/предотвращения блокировок со стороны донора

	function wp_rest_api_import_incremental_sleep($function, $id = 0) {
$usleep_delays = array(
200,
500,
1000,
2000,
5000
);

if (!isset($GLOBALS[__FUNCTION__]))
$GLOBALS[__FUNCTION__] = array();

if (!isset($GLOBALS[__FUNCTION__]['last_used_usleep_delay']))
$GLOBALS[__FUNCTION__]['last_used_usleep_delay'] = 0;

if (!isset($GLOBALS[__FUNCTION__][$function]))
$GLOBALS[__FUNCTION__][$function] = array();

if (!isset($GLOBALS[__FUNCTION__][$function][$id])) {

if ($GLOBALS[__FUNCTION__]['last_used_usleep_delay'] > 0)
$GLOBALS[__FUNCTION__]['last_used_usleep_delay']--;

$GLOBALS[__FUNCTION__][$function][$id] = $GLOBALS[__FUNCTION__]['last_used_usleep_delay'];
}

if ($GLOBALS[__FUNCTION__][$function][$id] >= sizeof($usleep_delays)) {
return false;
}

usleep(1000 * $usleep_delays[$GLOBALS[__FUNCTION__][$function][$id]]);
$GLOBALS[__FUNCTION__][$function][$id]++;
$GLOBALS[__FUNCTION__]['last_used_usleep_delay']++;

return true;
}

Импорт найденных в содержимом публикации/страницы медиафайлов на сервер акцептора, а также их метаданных (title, alt) в Wordpress медиатеку акцептора (возвращает ID добавленного медиафайла)

	function wp_rest_api_import_prepare_media($id, $src = '', $alt = '', $skip_rest = false) {
die_if_wp_rest_api_import_task_is_expired();

$wp_query = new WP_Query(array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'meta_key' => 'wp_rest_api_import_prepare_media_id',
'meta_value' => $id,
'meta_compare' => '='
));

if ($wp_query->have_posts()) {
$wp_query->the_post();

$attachid = get_the_ID();

wp_reset_postdata();
}

$wp_query->wp_reset_query();

if (isset($attachid)) return $attachid;

if (!$skip_rest) {
$url = WP_REST_API_IMPORT_BASE . '/media/'.$id;

$body = wp_rest_api_import_wp_remote_retrieve_body($url, __FUNCTION__, $id);
if (is_wp_error($body))
return call_user_func(__FUNCTION__, $id, $src, $alt, true);

if ((!$media_json = json_decode($body)))
return call_user_func(__FUNCTION__, $id, $src, $alt, true);

$src = $media_json->source_url;
}

require_once(__DIR__.DIRECTORY_SEPARATOR.'wp_insert_attachment_from_url.php');
if (!$attachid = crb_insert_attachment_from_url($src))
return false;

update_post_meta($attachid, 'wp_rest_api_import_prepare_media_id', $id);

if (!empty($alt))
update_post_meta($attachid, '_wp_attachment_image_alt', $alt);

return $attachid;
}

Принудительная остановка рабочего процесса парсера после завершения текущей транзакции

	function die_if_wp_rest_api_import_task_is_expired() {
if ($GLOBALS['job_timestamp'] != ($get_transient = wp_cache_get('wp_rest_api_import_job_timestamp', 'transient', true )))
wp_rest_api_import_die(__FUNCTION__, __LINE__, array('job_timestamp' => $GLOBALS['job_timestamp'], 'get_transient' => $get_transient));

set_transient(__FUNCTION__, time());
}
Diversant
На сайте с 29.03.2006
Offline
322
#1
Единственное требование к донору - включенный REST API

а как их искать ?

O
На сайте с 29.05.2008
Offline
195
#2
Diversant:
а как их искать ?

Включен по умолчанию начиная с Wordpress 4.7.

Если владелец сайта принудительно не закрыл REST API с помощью плагина, то работает практически на любом Wordpress сайте.

Diversant
На сайте с 29.03.2006
Offline
322
#3

На локалке будет работать ?

Единственное требование к донору - включенный REST API

А есть тестовый сайт какой нибудь где точно включен ? (можно в личку)

O
На сайте с 29.05.2008
Offline
195
#4
Diversant:
На локалке будет работать ?

А есть тестовый сайт какой нибудь где точно включен ? (можно в личку)

Должно работать.

Вот, пример REST запроса.

https://openmind.com.ua/wp-json/wp/v2/posts

Сайт соответственно openmind.com.ua

Добавляйте /wp-json/wp/v2/posts к домену сайта на Wordpress, чтобы проверить доступность REST API

iskrakovrov
На сайте с 17.12.2015
Offline
108
#5

"Данный плагин в виде Wordpress плагина не будет обновляться, поэтому, его будущее сейчас зависит от спроса."

тут сразу нюанс как установил у себя - сайт прописать только в конфиг плагина можно - было б прикльно если из админки указать доноров и запустить.

Плюс на уже готовом сайте почему-то не запустилось (ничего не спарсило). Сейчас пробую на чистый wp сунуть - сразу после установки.

Мощный софт для работы c Facebook https://soft.fbcombo.com . 4g Прокси Украина и США. телеграм iskrakovrov
O
На сайте с 29.05.2008
Offline
195
#6

iskrakovrov, данный плагин это личная наработка и просто предоставлен, как демонстрация работы парсинга по WP REST API.

Я с радостью поработал бы над улучшением данного плагина и выпуском коммерческого продукта.

Но для этого нужна обратная связь от пользователей и хотя бы минимальное спонсирование покрывающее работы по ставке от 5$ в час.

В плагин интегрировано журналирование.

Для просмотра логов плагина нужно установить в значение true константы WP_DEBUG, WP_DEBUG_LOG и в значение false константу WP_DEBUG_DISPLAY.

Для корректной работы плагина также нужно дать возможность работать php процессам неограниченно по времени.

Плагин пробует снять ограничение в 30 сек с помощью функции set_time_limit(0), но для конфигурации сервера, где PHP работает, как fast_cgi, также нужно вручную установить fastcgi_read_timeout в 0

O
На сайте с 29.05.2008
Offline
195
#7

Проект отменен.

Обратная связь по проекту не предусмотрена.

Отправленные деньги по реквизитам из первого сообщения будут возвращены по тем же реквизитам с вычетом комиссии платежной системы за перевод.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий