Compare commits

..

1 Commits

Author SHA1 Message Date
Arsen Mirzaev Tatyano-Muradovich cabdfb8cc7 работа завершена 2024-08-06 14:31:52 +03:00
12 changed files with 28 additions and 139 deletions

View File

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

View File

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

View File

@ -1,95 +0,0 @@
<?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

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

View File

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

View File

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

View File

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

Binary file not shown.