Парсер сайтов для phpbbEx

Список разделов phpBBex 1.x (поддерживается) Поддержка 1.x

Описание: У вас проблемы с phpBBex 1.x и вам необходима помощь? Спрашивайте здесь!
Правила раздела: Одна тема — один вопрос или группа связанных вопросов. Обязательно формируйте внятный заголовок, максимально отражающий суть вопроса. Подробно описывайте проблему. Не забудьте указать версию phpBBex и какие моды установлены, по возможности добавьте скриншоты проблемы или ссылку на страницу с проблемой.
Модератор: Поддержка

Сообщение #21 vbnm » 07.07.2014, 14:49

VEG:проще сразу на PHP под конкретный источник информации писать
это,- да
но ведь есть стандартные сборки движков, на которые можно настроить парсинг один раз
причем, за счет использования библиотек для парсинга это сейчас сделать не сложно
если речь идет об источнике информаци

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

И потом, какой дорогой идти при создании самого скрипта?
1)То ли мы просто напрямую копируем в БД нужную нам информацию используя СКЛ запросы.
2)То ли мы пользуемся набором функционала движка?
Автор RSS Ленты пошел вторым путем создав свой класс PHP в котором собрал то что ему было нужно.

Какой из вариантов более оптимален, в отношении нагрузки на сервер, безопасности, сложности исполнения?

VEG:Я писал бота для fb2k.ru, который генерирует темы о новых плагинах, и внутри тем пишет сообщения об обновлениях этих плагинов
А можно его скачать и посмотреть внутренности?
Я пока в своих изысканиях дошел только до того, что размещено на гурупхпбб в теме об атоматическом создании тем.
Спойлер
https://wiki.phpbb.com/Using_phpBB3's_Basic_Funct ... sertingPostsandPrivateMessages

http://www.phpbbguru.net/community/topic21144.html
сам пробовал напрямую заливать данные в БД(этот путь в начале мне показался более простым), но пока не смог найти все необходимые таблицы, которые должны быть задействованы, чтобы создать тему, а затем и продолжить ее
оказывается этот процесс не такой простой, где-то должны срабатывать механизмы, которые регистрируют тему, 1- пост, а затем и ответы, и только тогда они появляются на форуме
vbnm
Репутация: 108
С нами: 11 лет

Сообщение #22 Sumanai » 07.07.2014, 14:59

vbnm:2)То ли мы пользуемся набором функционала движка?

Так лучше.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #23 vbnm » 07.07.2014, 15:25

Sumanai, да?
но есть одна загвоздка, которую пока не обойти
Сессии пользователя, от имени которого размещается сообщение, пусть даже это бот
И автор темы и последующие ответы идут под одним ником
даже, если при этом в БД автор ответа указан другой
Ведь на автомате ID пользоваеля берется из сессии и по нему определяется автор
Спойлер
<?php

define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);

$user->session_begin();
$auth->acl($user->data);
$user->setup();
это если мы хотим, чтобы был автор

вот для бота:
Спойлер
<?php

define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);

// Start session management
$user->session_begin();
$auth->acl($user->data);

навскидку я поробовал напрямую подключится к БД

Спойлер

define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
require($phpbb_root_path . '../config.' . $phpEx);

//Подключение к БД;
$db = mysql_connect("$dbhost","$dbuser","$dbpasswd");
mysql_select_db("$dbname",$db);
mysql_query("SET NAMES utf8");
нормально, конект есть, но теперь пришлось искать какие именно таблицы нужно заполнять?
навскидку пробовал так
мы создаем тему:
INSERT INTO `phpbb_topics`
INSERT INTO `phpbb_posts`

так мы реализуем оветы в теме:
INSERT INTO `phpbb_posts`

логика была простая, избежать вопросов связанный с сессиями и ID пользователя.

вот и думаю, просто нужно найти опред таблицы в БД, которые должны быть заполенны опред образом
тогда уже можно думать и о том, что скрипт может работать отдельно от движка
vbnm
Репутация: 108
С нами: 11 лет

Сообщение #24 Sumanai » 07.07.2014, 15:33

vbnm:Сессии пользователя, от имени которого размещается сообщение, пусть даже это бот

Зачем вам сессия? В БД пишется айди, никаких проблем с записью числа не должно быть.
Вы сами привели ссылки на гуру и вики, где это всё подробно объяснено.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #25 VEG » 07.07.2014, 15:54

Сессию для бота я создаю так:
Код: Выделить всё
// Start session management
$user->session_begin();
$sql = 'SELECT * FROM ' . USERS_TABLE . ' WHERE user_id = ' . $bot_id;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$row['is_registered'] = true;
$db->sql_freeresult($result);
$user->data = array_merge($user->data, $row);
$auth->acl($user->data);

А вот сам постинг:
Код: Выделить всё
   $poll = $uid = $bitfield = $options = '';
   $subject = utf8_normalize_nfc($title.' ['.implode('.',array_reverse(explode('-', $updated))).']');
   generate_text_for_storage($subject, $uid, $bitfield, $options, false, false, false);

   // ...

   $message = $plugin_row
      ? utf8_normalize_nfc("Вышла новая версия плагина: {$title} [" .implode('.',array_reverse(explode('-', $updated))). "]")
      : utf8_normalize_nfc($description . "\n" . 'Страница плагина: http://foobar2000.org/components/view/' . $plugin);
   generate_text_for_storage($message, $uid, $bitfield, $options, true, true, true);

   $data = array(
      'forum_id'            => $forum_id,      // The forum ID in which the post will be placed. (int)
      'topic_id'            => $plugin_row ? $plugin_row['topic_id'] : 0, // Post a new topic or in an existing one? Set to 0 to create a new one, if not, specify your topic ID here instead.
      'icon_id'            => false,         // The Icon ID in which the post will be displayed with on the viewforum, set to false for icon_id. (int)

      'enable_bbcode'         => true,         // Enable BBcode in this post. (bool)
      'enable_smilies'      => true,         // Enabe smilies in this post. (bool)
      'enable_urls'         => true,         // Enable self-parsing URL links in this post. (bool)
      'enable_sig'         => true,         // Enable the signature of the poster to be displayed in the post. (bool)

      'message'            => $message,      // Your text you wish to have submitted. It should pass through generate_text_for_storage() before this. (string)
      'message_md5'         => md5($message),   // The md5 hash of your message
      'bbcode_bitfield'      => $bitfield,      // Value created from the generate_text_for_storage() function.
      'bbcode_uid'         => $uid,         // Value created from the generate_text_for_storage() function.

      'post_edit_locked'      => 0,            // Disallow post editing? 1 = Yes, 0 = No
      'topic_title'         => $subject,      // Subject/Title of the topic. (string)
      'force_approved_state'   => true,         // Allow the post to be submitted without going into unapproved queue
      'enable_indexing'      => true,         // Allow indexing the post? (bool)

      'notify_set'         => false,
      'notify'            => false,
      'post_time'            => 0,            // Set a specific time, use 0 to let submit_post() take care of getting the proper time (int)
      'forum_name'         => '',            // For identifying the name of the forum in a notification email. (string)
   );
   $result = submit_post($plugin_row ? 'reply' : 'post', $plugin_row ? '' : $subject, $user->data['username'], POST_NORMAL, $poll, $data, true, true);
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 1653
С нами: 11 лет 11 месяцев

Сообщение #26 vbnm » 07.07.2014, 18:35

VEG, Спасибо, было бы легче если бы весь код был, а то логику не вижу.
Немного упростил код, потому что не совсем врубился, но тему с его помощью уже можно создать, терь надо думать , как ответы (риплики) включать, ну а затем, как под разными никами это все представить.
vbnm
Репутация: 108
С нами: 11 лет

Сообщение #27 vbnm » 08.07.2014, 13:38

Пока весь код привел вот в такой вид, чтобы понять, как он работает:

Спойлер
Код: Выделить всё
<?php

define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);

$bot_id = '62'; //выставляя ай-ди юзера мы присваеваем ему авторство постика

// Start session management

$user->session_begin();
$sql = 'SELECT * FROM ' . USERS_TABLE . ' WHERE user_id = ' . $bot_id;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$row['is_registered'] = true;
$db->sql_freeresult($result);
$user->data = array_merge($user->data, $row);
$auth->acl($user->data);

// Start  management

 
$title = 'Прива!'; //название темы
$plugin_row = 1; // значение 0 создает тему и пост ('reply' ,'post'), значение 1  создает ответ ('reply') в теме при этом необходимо определить ($topic_id) Ай-Ди темы
$message_pars = "67898 yabuf ct"; //постик, сообщение в теме
   // ...
   $poll = $uid = $bitfield = $options = '';
   $subject = utf8_normalize_nfc("$title");
   generate_text_for_storage($subject, $uid, $bitfield, $options, false, false, false);


   $message = $plugin_row
      ? utf8_normalize_nfc("$message_pars")
      : utf8_normalize_nfc($description . "\n" . '22888Страница плагина: http://foobar2000.org/components/view/' . $plugin);
   generate_text_for_storage($message, $uid, $bitfield, $options, true, true, true);


   
   $data = array(
      'forum_id'            => $forum_id = '2',      // The forum ID in which the post will be placed. (int)
      'topic_id'            => $topic_id = '47', //$plugin_row ? $plugin_row['topic_id'] : 3, // Post a new topic or in an existing one? Set to 0 to create a new one, if not, specify your topic ID here instead.
      'icon_id'            => false,         // The Icon ID in which the post will be displayed with on the viewforum, set to false for icon_id. (int)

      'enable_bbcode'         => true,         // Enable BBcode in this post. (bool)
      'enable_smilies'      => true,         // Enabe smilies in this post. (bool)
      'enable_urls'         => true,         // Enable self-parsing URL links in this post. (bool)
      'enable_sig'         => true,         // Enable the signature of the poster to be displayed in the post. (bool)

      'message'            => $message,      // Your text you wish to have submitted. It should pass through generate_text_for_storage() before this. (string)
      'message_md5'         => md5($message),   // The md5 hash of your message
      'bbcode_bitfield'      => $bitfield,      // Value created from the generate_text_for_storage() function.
      'bbcode_uid'         => $uid,         // Value created from the generate_text_for_storage() function.

      'post_edit_locked'      => 0,            // Disallow post editing? 1 = Yes, 0 = No
      'topic_title'         => $subject,      // Subject/Title of the topic. (string)
      'force_approved_state'   => true,         // Allow the post to be submitted without going into unapproved queue
      'enable_indexing'      => true,         // Allow indexing the post? (bool)
      //'topic_first_poster_name'  => $topic_first_poster_name = 'Мить',
      'notify_set'         => false,
      'notify'            => false,
      'post_time'            => 0,            // Set a specific time, use 0 to let submit_post() take care of getting the proper time (int)
      'forum_name'         => '',            // For identifying the name of the forum in a notification email. (string)
   );
   $result = submit_post($plugin_row ? 'reply' : 'post', $plugin_row ? '' : $subject, $user->data['username'], POST_NORMAL, $poll, $data, true, true);
   
  echo "$topic_id"."</br>";
 
if ($result = $plugin_row)
{
echo "Добавлен ответ в теме". "\n".($title);

}
else
{
echo "Создана новая тема: "."\n". ($title);
}
?>

появились вопросы:
1. как вытаскивать $topic_id после создания темы///
обращаться к БД?

то есть логика такая, после создания темы мы обращаемся к БД достаем там ID вновь созданной темы и заводим в цикл уже для ответов в этой же теме?

2. $plugin_row - идет, как php класс?
vbnm
Репутация: 108
С нами: 11 лет

Сообщение #28 VEG » 08.07.2014, 13:48

$plugin_row — это обычный ассоциативный массив. Если у плагина уже есть тема — в таблице бота я сохраняю запись с ID темы, куда писать обновления. Если такая запись есть, то в $plugin_row хранится эта запись из базы. Если же плагина такого ещё нет, то $plugin_row = null. Там перед вызовом функции добавления каждая строчка почти откомментирована ведь. Заполняйте этот массив как вам нужно, вызывайте функцию — и она в зависимости от переданных данных будет создавать тему или ответ в заданной теме.
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 1653
С нами: 11 лет 11 месяцев

Сообщение #29 vbnm » 08.07.2014, 15:59

VEG, Сенкс, в принципе так и предположил, но уточнить все ж надо
у меня в этой строке
$plugin_row ? $plugin_row['topic_id'] : 3, // Post a new topic or in an existing one? Set to 0 to create a new one, if not, specify your topic ID here instead
постоянно выскакивает ошибка, что она содержи не (int) а (str)
на этом весь затык пока :smoke:
Последний раз редактировалось vbnm 08.07.2014, 16:14, всего редактировалось 1 раз.
vbnm
Репутация: 108
С нами: 11 лет

Сообщение #30 Sumanai » 08.07.2014, 16:11

vbnm:VEG, Секс,

Чего?
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #31 vbnm » 08.07.2014, 16:15

Sumanai, :biggrin: очепятка, клава давно стерлась))

Добавлено спустя 13 минут 28 секунд:
vbnm:постоянно выскакивает ошибка, что она содержи не (int) а (str)
хм, может это из-за версии php?
У меня на локале сейчас выставлен PHP 5.4

Добавлено спустя 44 секунды:
Спойлер
Код: Выделить всё
<?php
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// Начиная с PHP 5.4
$array = [
    "foo" => "bar",
    "bar" => "foo",
];
?>
vbnm
Репутация: 108
С нами: 11 лет

Сообщение #32 Sumanai » 08.07.2014, 16:43

vbnm:хм, может это из-за версии php?

Вряд ли. Приведённый вами пример- лишь альтернативный синтаксис создания массивов, а не заменяющий.
Попробуйте явно указать тип переменной
Код: Выделить всё
$plugin_row = (int)$plugin_row;
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #33 vbnm » 08.07.2014, 16:50

Sumanai, пробовал, не идет :smoke:
чего-то я не понимаю, надо найти чего
vbnm
Репутация: 108
С нами: 11 лет

Сообщение #34 Sumanai » 08.07.2014, 16:53

Покажите конкретный текст ошибки и строку, на которую указывает ошибка, и +- 10 строк от неё.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #35 vbnm » 08.07.2014, 18:14

Sumanai, немного потерял этот момент. Сейчас все по-новой пытаюсь собрать.

Если не трудно, и есть время, залейте себе вот этот код в корень форума
он без моих правок..там поэтапно будут вылазить ошибки начиная с

SQL ERROR [ mysqli ]

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 [1064]

An sql error occurred while fetching this page. Please contact an administrator if this problem persists.

Спойлер
Код: Выделить всё
<?php
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);

// Start session management
$user->session_begin();
$sql = 'SELECT * FROM ' . USERS_TABLE . ' WHERE user_id = ' . $bot_id;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$row['is_registered'] = true;
$db->sql_freeresult($result);
$user->data = array_merge($user->data, $row);
$auth->acl($user->data);

   $poll = $uid = $bitfield = $options = '';
   $subject = utf8_normalize_nfc($title.' ['.implode('.',array_reverse(explode('-', $updated))).']');
   generate_text_for_storage($subject, $uid, $bitfield, $options, false, false, false);

   // ...

   $message = $plugin_row
      ? utf8_normalize_nfc("Вышла новая версия плагина: {$title} [" .implode('.',array_reverse(explode('-', $updated))). "]")
      : utf8_normalize_nfc($description . "\n" . 'Страница плагина: http://foobar2000.org/components/view/' . $plugin);
   generate_text_for_storage($message, $uid, $bitfield, $options, true, true, true);
   
 
   $data = array(
      'forum_id'            => $forum_id ='2',      // The forum ID in which the post will be placed. (int)
      'topic_id'            => $plugin_row ? $plugin_row['topic_id'] : 0, // Post a new topic or in an existing one? Set to 0 to create a new one, if not, specify your topic ID here instead.
      'icon_id'            => false,         // The Icon ID in which the post will be displayed with on the viewforum, set to false for icon_id. (int)

      'enable_bbcode'         => true,         // Enable BBcode in this post. (bool)
      'enable_smilies'      => true,         // Enabe smilies in this post. (bool)
      'enable_urls'         => true,         // Enable self-parsing URL links in this post. (bool)
      'enable_sig'         => true,         // Enable the signature of the poster to be displayed in the post. (bool)

      'message'            => $message,      // Your text you wish to have submitted. It should pass through generate_text_for_storage() before this. (string)
      'message_md5'         => md5($message),   // The md5 hash of your message
      'bbcode_bitfield'      => $bitfield,      // Value created from the generate_text_for_storage() function.
      'bbcode_uid'         => $uid,         // Value created from the generate_text_for_storage() function.

      'post_edit_locked'      => 0,            // Disallow post editing? 1 = Yes, 0 = No
      'topic_title'         => $subject,      // Subject/Title of the topic. (string)
      'force_approved_state'   => true,         // Allow the post to be submitted without going into unapproved queue
      'enable_indexing'      => true,         // Allow indexing the post? (bool)

      'notify_set'         => false,
      'notify'            => false,
      'post_time'            => 0,            // Set a specific time, use 0 to let submit_post() take care of getting the proper time (int)
      'forum_name'         => '',            // For identifying the name of the forum in a notification email. (string)
   );
   $result = submit_post($plugin_row ? 'reply' : 'post', $plugin_row ? '' : $subject, $user->data['username'], POST_NORMAL, $poll, $data, true, true);
   ?>
может у вас получится найти решение
vbnm
Репутация: 108
С нами: 11 лет

Сообщение #36 Sumanai » 08.07.2014, 18:59

vbnm:там поэтапно будут вылазить ошибки начиная с

А если выше посмотреть? Включите дебаг на форуме, проще будет. Ошибка- $bot_id не определён. Добавьте
Код: Выделить всё
$bot_id = 1;
Далее:
Код: Выделить всё
[phpBB Debug] PHP Notice: in file [ROOT]/n.php on line 21: Undefined variable: title
[phpBB Debug] PHP Notice: in file [ROOT]/n.php on line 21: Undefined variable: updated
[phpBB Debug] PHP Notice: in file [ROOT]/n.php on line 27: Undefined variable: plugin_row
[phpBB Debug] PHP Notice: in file [ROOT]/n.php on line 28: Undefined variable: description
[phpBB Debug] PHP Notice: in file [ROOT]/n.php on line 28: Undefined variable: plugin

Определяйте эти переменные.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #37 vbnm » 08.07.2014, 19:07

Sumanai:Ошибка- $bot_id не определён. Добавьте
Это первая ошибка и я её исправляю так:
vbnm:$bot_id = '62'; //выставляя ай-ди юзера мы присваеваем ему авторство постика
Дает возможность присваивать посты разным юзерам.
под 62 у меня новый юзер, а не бот, но это не важно..
давайе дальше.
траблу с индификацией автора поста, темы мы пока решили.
:smoke:
vbnm
Репутация: 108
С нами: 11 лет

Сообщение #38 Sumanai » 08.07.2014, 19:11

Я всё написал. Вы просто скопировали решение VEG без понимания сути и подгонки под себя, не определили переменные и способ формирования заголовка. Конечно нижеследующий код создаст пост в теме с айди 1
Код: Выделить всё
$title = 'тайтл';
$updated = 0;
$plugin_row['topic_id'] = 1;
$description = 'Опейсание';
$plugin = 1;
Но это ни о чём. Вам нужно делать под себя. Прочитайте код, поймите, как он работает, и переделывайте под свои нужды.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #39 vbnm » 08.07.2014, 19:31

Sumanai:нижеследующий код создаст пост в теме с айди 1
вот это я и пытаюсь выяснить, как получать айди только что созданной темы, чтобы её продолжить
не вручную, а чтобы он определялся автоматом и возвращался обратно
подставлялся бы сюда:
$plugin_row['topic_id'] = 1;
и продолжался в цикле пока сообщения не закончатся.
на гуру только это http://www.phpbbguru.net/community/topic21144-45.html#p323203
vbnm
Репутация: 108
С нами: 11 лет

Сообщение #40 VEG » 08.07.2014, 19:35

Присвоенный топику id должен после вызова submit_post оказаться в $data['topic_id'], если я не ошибаюсь.
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 1653
С нами: 11 лет 11 месяцев

Пред.След.

Вернуться в Поддержка 1.x