Парсинг пользователей и вставка их в базу данных MyBB


Ну что ж, форум мы создали, теперь надо его наполнять. Помимо непосредственного общения, я решил добавлять контент и другими способами. Первый из них – это парсинг закрытых форумов. В данном материале мы научимся брать контент из одного такого форума, требующего авторизацию и занесение информации напрямую в базу данных.

Для начала надо получить страницу. Если идти обычным способом через file_get_contents или курлом без кук, то ничего не получится – страница с темой форума закрыта от неавторизованного пользователя. Можно отправить пост-запрос курлом, затем прочитать куки и уже так получать страницу. Но я поступил проще – скопировал куки из браузера



и подставил их:

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION, true);
$kook = "ipkey=46575; uid=1366372; up=a35b3e501a953933c; bp=185b8948381f8173f; session_id=27; user_res=1366x768; brid=3643702185; rbrid=0; au=233372; luid=233072; luids=efd4; last_user_name=Zггe; auth_time=1582899409; auth_time_md5=49ffc7d63bec669bc749; auth_secure_ip=1; auth_secure_md5=efd40d160262f4c7e9b2; store_auto=0; sidmainsign=0; ip_alert=1;; ip_alert_s=bca7fa; authtime=1582813009; authtime_sign=dfa8d; sidp=0afe3; sid_ok=1; version=v2; bversion=v2";
$headers = [
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,pl;q=0.6,la;q=0.5',
'Cookie: '.$kook,
'DNT: 1',
'Host:сайт.ru',
'Upgrade-Insecure-Requests: 1',
'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
$result = iconv("windows-1251", "utf-8", $result);
curl_close($ch);
Данные, само собой, подставьте свои. Также тут в коде сразу конвертируем windows-1251 в утф8 – сайт не новый. Ну а теперь можно дальше работать с переменной $result, в которой хранится исходный код страницы.

Воспользуемся библиотекой simple html, пример работы с которой я приводил в этой статье. Правда, так как сервер у нас на php 7.4, то потребуется новая версия библиотеки, скачать можно отсюда. Иначе будут ошибки с регулярными выражениями.

Теперь можно импортировать и получать нужное:

include_once('simple_html_dom.php');
foreach($html->find('table td') as $element)  {
	$ret = $element->find('b a', 0);
	if ($ret!="") {
		if (strpos($ret, 'info.php?id') !== false) {
			$nik = $ret->plaintext;
И если ника такого нет в базе данных, то заносим в MyBB напрямую:

if ($result = $conn->query("SELECT uid FROM `mybb_users` WHERE `username` = '$nik'")) {
				$row_cnt = $result->num_rows;
				if ($row_cnt == 0) {
					$qwer = "INSERT INTO `mybb_users` (`uid`, `username`, `password`, `salt`, `loginkey`, `email`, `postnum`, `threadnum`, `avatar`, `avatardimensions`, `avatartype`, `usergroup`, `additionalgroups`, `displaygroup`, `usertitle`, `regdate`, `lastactive`, `lastvisit`, `lastpost`, `website`, `icq`, `skype`, `google`, `birthday`, `birthdayprivacy`, `signature`, `allownotices`, `hideemail`, `subscriptionmethod`, `invisible`, `receivepms`, `receivefrombuddy`, `pmnotice`, `pmnotify`, `buddyrequestspm`, `buddyrequestsauto`, `threadmode`, `showimages`, `showvideos`, `showsigs`, `showavatars`, `showquickreply`, `showredirect`, `ppp`, `tpp`, `daysprune`, `dateformat`, `timeformat`, `timezone`, `dst`, `dstcorrection`, `buddylist`, `ignorelist`, `style`, `away`, `awaydate`, `returndate`, `awayreason`, `pmfolders`, `notepad`, `referrer`, `referrals`, `reputation`, `regip`, `lastip`, `language`, `timeonline`, `showcodebuttons`, `totalpms`, `unreadpms`, `warningpoints`, `moderateposts`, `moderationtime`, `suspendposting`, `suspensiontime`, `suspendsignature`, `suspendsigtime`, `coppauser`, `classicpostbit`, `loginattempts`, `loginlockoutexpiry`, `usernotes`, `sourceeditor`) VALUES (NULL, '$nik', '936b9fcab98720375b7ae0a5', 'e6Mqx', 'JBx2PFafP3WugNVKuGw6uW0XAqAV9XbPE00HnAPJRdPu', '$nik@mail.ru', '0', '0', '', '', '', '2', '', '0', '', '15818172', '15829725', '15818697', '15818694', '', '0', '', '', '', 'all', '', '1', '0', '0', '0', '1', '0', '1', '1', '1', '0', 'linear', '1', '1', '1', '1', '1', '1', '0', '0', '0', '0', '0', '0', '0', '0', '', '', '0', '0', '0', '0', '', '', '', '0', '0', '0', '', 0xd99f99, '', '525', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '', '0');";
					mysqli_query($conn, $qwer) or die (mysqli_error($conn)); 
					$uid = mysqli_insert_id($conn);
Также необходимо обновить число пользователей, что-то типа такого будет:

INSERT INTO `mybb_stats`(`dateline`, `numusers`, `numthreads`, `numposts`) VALUES ( UNIX_TIMESTAMP(), (SELECT COUNT(uid) AS a FROM `mybb_users`), '2', '4');
И после обновления кэша статистики число пользователей будет расти:



Да, надо не забыть еще поставить задачу крону, например, на каждые 15 минут:

*/15 * * * *     root    /usr/bin/php /var/www/сайт.ru/public_html/forum/cron789/script.php  2>&1
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, php, парсинг, mybb, форум




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




Manifest v3 и пример расширения для браузеров на основе Chromium
Урок 23. Минимальная оценка JavaScript
500 человек в день