generated from mirzaev/pot
fix avito + drom to two files
This commit is contained in:
parent
aa22499fc7
commit
2034d23e13
|
@ -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Б',
|
||||||
|
|
|
@ -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');
|
||||||
|
|
|
@ -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); */
|
|
@ -1,8 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
return [
|
|
||||||
'endpoint' => 'unix:///var/run/arangodb3/arango.sock',
|
|
||||||
'database' => 'parser_from_rossko',
|
|
||||||
'name' => 'parser_from_rossko',
|
|
||||||
'password' => ''
|
|
||||||
];
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
return [
|
||||||
|
'mail' => '@gmail.com',
|
||||||
|
'password' => ''
|
||||||
|
];
|
|
@ -1 +1,2 @@
|
||||||
images
|
!.gitignore
|
||||||
|
products.db
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
!.gitignore
|
||||||
|
avaiable/*
|
||||||
|
order/*
|
Loading…
Reference in New Issue