Compare commits

..

3 Commits

12 changed files with 139 additions and 28 deletions

View File

@ -241,9 +241,11 @@ while ($product = $products->fetchArray()) {
Пункт выдачи находится в г.Красноярске по адресу Дудинская 2Б Пункт выдачи находится в г.Красноярске по адресу Дудинская 2Б
Часы работы: 10:00-19:00 Часы работы: 10:00-19:00
Отправка запчастей и деталей по всей России. Отправка запчастей и деталей по всей России.
Не является публичной офертой
TXT, TXT,
(int) ($product['cost_rossko'] + ($product['cost_rossko'] * 0.23)), (int) ($product['cost_rossko'] + ($product['cost_rossko'] * 0.21)),
implode(' ', $images), implode('|', $images),
'Новое', 'Новое',
'Оригинал', 'Оригинал',
'Красноярск, Дудинская улица, 2Б', 'Красноярск, Дудинская улица, 2Б',

View File

@ -32,20 +32,22 @@ $db = new db(STORAGE . DIRECTORY_SEPARATOR . 'products.db');
// Инициализация товаров // Инициализация товаров
$products = $db->query('SELECT * FROM product;'); $products = $db->query('SELECT * FROM product;');
// Инициализация директории с документом Drom // Инициализация директории со всем, что связано с Drom
define('DROM', STORAGE . DIRECTORY_SEPARATOR . 'drom'); define('DROM', STORAGE . DIRECTORY_SEPARATOR . 'drom');
// Инициализация хранилища фотографий товаров // Инициализация хранилища фотографий товаров
define('IMAGES', STORAGE . DIRECTORY_SEPARATOR . 'images'); define('IMAGES', STORAGE . DIRECTORY_SEPARATOR . 'images');
// Инициализация таблицы // Инициализация таблиц
$spreadsheet = excel::create(['export']); $spreadsheet_avaiable = excel::create(['export']);
$spreadsheet_order = excel::create(['export']);
// Инициализация рабочего листа // Инициализация рабочих листов
$worksheet = $spreadsheet->sheet(); $worksheet_avaiable = $spreadsheet_avaiable->sheet();
$worksheet_order = $spreadsheet_order->sheet();
// Инициализация заголовков // Инициализация заголовков
$worksheet->writeHeader([ $headers = [
'Артикул', 'Артикул',
'Наименование товара', 'Наименование товара',
'Новый или б/у', 'Новый или б/у',
@ -68,7 +70,9 @@ $worksheet->writeHeader([
'Наличие', 'Наличие',
'Сроки доставки', 'Сроки доставки',
'Фотография' 'Фотография'
]); ];
$worksheet_avaiable->writeHeader($headers);
$worksheet_order->writeHeader($headers);
while ($product = $products->fetchArray()) { while ($product = $products->fetchArray()) {
// Перебор товаров // Перебор товаров
@ -123,8 +127,11 @@ while ($product = $products->fetchArray()) {
// Форматирование названия // Форматирование названия
$product['description'] = trim(preg_replace('/\|.*/', '', $product['description']), ' '); $product['description'] = trim(preg_replace('/\|.*/', '', $product['description']), ' ');
// Запись строки // Товар в наличии? (доставка 2 часа)
$worksheet->writeRow([ $avaiable = $product['delivery'] === 0 && $product['amount'] > 0;
// Генерация строки
$row = [
$product['code'], $product['code'],
$product['description'], $product['description'],
'Новый', 'Новый',
@ -141,14 +148,19 @@ while ($product = $products->fetchArray()) {
'', '',
'', '',
'', '',
'По запчастям уточняйте наличие по телефону или через кнопку "спросить", ТАК КАК ОН МОЖЕТ БЫТЬ ПРОДАН В ТЕЧЕНИИ ДНЯ ИЛИ НАХОДИТЬСЯ В РЕЗЕРВЕ, часть запчастей находится на складе, на перемещение может потребоваться от 2 часов', 'По запчастям уточняйте наличие и цену по телефону или через кнопку "спросить", ТАК КАК ОН МОЖЕТ БЫТЬ ПРОДАН В ТЕЧЕНИИ ДНЯ ИЛИ НАХОДИТЬСЯ В РЕЗЕРВЕ, часть запчастей находится на складе, на перемещение может потребоваться от 2 часов. Не является публичной офертой',
rand(1, 6), $product['amount'],
(int) ($product['cost_rossko'] + ($product['cost_rossko'] * 0.23)), (int) ($product['cost_rossko'] + ($product['cost_rossko'] * 0.21)),
'В наличии', $avaiable ? 'В наличии' : 'Под заказ',
1, $product['delivery'] === 0 ? '2 часа' : $product['delivery'],
implode(' ', $images) implode(' ', $images)
]); ];
// Запись строки в документ
if ($avaiable) $worksheet_avaiable->writeRow($row);
else $worksheet_order->writeRow($row);
} }
// Сохранение файла // Сохранение файлов
$spreadsheet->save(DROM . DIRECTORY_SEPARATOR . 'export.xlsx'); $spreadsheet_avaiable->save(DROM . DIRECTORY_SEPARATOR . 'avaiable' . DIRECTORY_SEPARATOR . 'export.xlsx');
$spreadsheet_order->save(DROM . DIRECTORY_SEPARATOR . 'order' . DIRECTORY_SEPARATOR . 'export.xlsx');

View File

@ -0,0 +1,95 @@
<?php
/*
declare(strict_types=1);
namespace mirzaev\parser_from_rossko;
use GuzzleHttp\Client as client,
GuzzleHttp\Psr7\Request as request;
use DOMDocument as dom,
DOMXPath as xpath;
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
define('VIEWS', realpath('..' . DIRECTORY_SEPARATOR . 'views'));
define('STORAGE', realpath('..' . DIRECTORY_SEPARATOR . 'storage'));
define('INDEX', __DIR__);
// Автозагрузка
require __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
// Инициализация клиента Guzzle
$client = new client(['cookies' => true]);
function auth(int $attempts = 5)
{
global $client;
if (--$attempts <= 0) return false;
$request = new request('GET', 'https://krsk.rossko.ru/');
return $client->sendAsync($request)
->then(function ($response) {
$dom = new dom;
@$dom->loadHTML((string) $response->getBody());
$xpath = new xpath($dom);
// Кнопка "ВХОД" ('ul[class="header-top__menu-inner"] > li:nth-child(3)')
$entries = $xpath->query('/html/body/div[1]/header/div[2]/div/div/nav/ul/li[5]/div/a/span');
if (!empty($entries[0])) {
// Аутентифицирован
echo 'Аутентифицирован: ' . $entries[0]->textContent . "\n";
return false;
} else {
// Не аутентиффицирован
// Кнопка "ВХОД" ('ul[class="header-top__menu-inner"] > li:nth-child(3)')
$entries = $xpath->query('/html/body/div[1]/header/div[2]/div[1]/div/nav/ul/li[3]/div/a/span');
return $entries[0]->textContent === 'Вход';
}
})
->then(function ($guest) use ($attempts, $client) {
if ($guest) {
// Не аутентифицирован
echo "Не аутентифицирован\n";
// Инициализация данных аккаунта [mail => '', password => '']
$account = require(__DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'settings' . DIRECTORY_SEPARATOR . 'rossko.php');
// Инициализация запроса для аутентификации
$request = new request(
'POST',
'https://krsk.rossko.ru/utils/',
[
'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8'
],
'auth%5Bemail%5D=' . urlencode($account['mail']) . '&auth%5Bpassword%5D=' . urlencode($account['password']) . '&action=auth&type=header'
);
$promise = $client->sendAsync($request)->then(function ($response) use ($attempts) {
auth($attempts);
});
$promise->wait();
} else {
// Аутентифицирован (подразумевается) !!! могут быть ошибки
return true;
}
});
}
// Аутентификация (проверяет или аутентифицирует)
auth()->wait();
echo (123); */

View File

@ -1,8 +0,0 @@
<?php
return [
'endpoint' => 'unix:///var/run/arangodb3/arango.sock',
'database' => 'parser_from_rossko',
'name' => 'parser_from_rossko',
'password' => ''
];

View File

@ -0,0 +1,6 @@
<?php
return [
'mail' => '@gmail.com',
'password' => ''
];

View File

@ -1 +1,2 @@
images !.gitignore
products.db

View File

@ -0,0 +1,3 @@
!.gitignore
avaiable/*
order/*