Интеграция Мой Склад и Human Emulator

Автоматическое наполнение простых сайтов, форумов, блогов и различных CMS контентом. Автоматическое ведение сайта, блога или форума.
Ответить
Аватара пользователя
xscripts
Сообщения: 80
Зарегистрирован: 24 янв 2012, 12:48
Контактная информация:

Интеграция Мой Склад и Human Emulator

Сообщение xscripts » 26 дек 2017, 19:15

Недавно пришлось решать одну задачку по интеграции Human Emulator с популярным ныне облачным сервисом МойСклад.

Делюсь скриптом для работы с сервисом Мой Склад.

Задача, ради которой всё затевалось это вытащить картинки из Мой Склад для последующего использования их в интернет магазине.
Попутно всё это оформить в csv нужного формата для импорта в этот же интернет магазин.

При решении этой задачи решили использовать существующее API у МойСклад.

Честно скажу примеров с использованием очень мало.

Есть одна растиражированная статья на хабре. На основе этой статьи и документации получилось наваять представленный ниже скриптик.

Суть действий простая - получаем товары из МойСклад и используем интересующие нас поля. Надо сказать, что МойСклад предоставляет всю исчерпывающую информацию по товарам, но реализовано это всё через вложенные друг в друга массивы.

Так имя картинки мы получаем через

$position['image']['filename']

а вот путь для её скачивания будет выглядеть следующим образом

$arr = $position['image'];

$browser->navigate(trim($arr['meta']['href']));

При этом путь к картинке реализован как ссылка на скачивание, поэтому что бы сохранить картинку приходиться делать на неё переход в браузере и обрабатывать диалог сохранения

Для этого мы получаем сначала группу товаров, к торой относиться текущий товар

    
// группа товаров
$img_fld=$position['pathName'];

и затем создаём в заданной папке с картинками папки по имени группы товаров и уже туда сохраняем саму картинку. Что бы картинка сохранялась в эту папку мы задаём её как по умолчанию для скачивания файлов.

    // информация по картинке
    $arr = $position['image'];
    // создаём папку для закачки фотографий
    $folder->create($path_imgs."\\".trim($img_fld));
    // задать папку для сохранения файлов
    $browser->set_default_download($path_imgs.trim($img_fld));
    // скачиваем фотографию
    $browser->navigate(trim($arr['meta']['href']));

Логин и пароль для авторизации на сервисе надо выставить в двух местах

$browser->set_default_authorization("ваш логин","ваш пароль");
в основном скрипте parser_goods.php


и

MOYSKLAD_USERNAME => 'ваш логин',
MOYSKLAD_PASSWORD => 'ваш пароль',

в файле moysklad_curl_details.php



Сам скрипт:
<?php

$xhe_host = "127.0.0.1:7010";

// The following code is required to properly run XWeb Human Emulator
require("../../Templates/xweb_human_emulator.php");
// путь к файлу с результатами
$path_to_res_file="res\\goods.csv";
// путь к списку мануфактур
$path_to_man = "data\\manufacture.txt";
// разделители в csv 
$delem_field='^';
$delem_text='~';
// публиковать или нет 
$published=1;
// скачивать ли фотку
$b_img_download=false;

include ('moysklad_routine_library.php');

// удалять старый файл с результатами
$file_os->delete($path_to_res_file);
// не показывать диалог загрузки файла
$browser->disable_download_file_dialog(true);
// производители
$arr_man=file($path_to_man);

// путь к папке куда сохранить напиши
$path_imgs=$debug->get_cur_script_folder()."\\imgs\\";

$browser->set_default_authorization("ваш логин","ваш пароль");

// соединение с моим складом 
$apiSettings = getSettings();
$curl = setupCurl($apiSettings);

$offset=0;

while(true)
{
echo "<b>".$offset."</b><br>";
$curl = setCurl(
    $curl,
    $apiSettings[MOYSKLAD_API_URL] . $apiSettings[MOYSKLAD_GET_NOMENCLATURE].$offset,
    MOYSKLAD_GET_NOMENCLATURE_METHOD);
$nomenclature = getNomenclature($curl);

if (empty($nomenclature)) break;

echo count($nomenclature)."<br>";

//foreach ($nomenclature as $key => $position) 
for($i=0;$i<count($nomenclature);$i++)
{
    $position = $nomenclature[$i];
    
    $sres="";
    if(array_key_exists('code', $position))
    {// product_sku
    $sres=$position['code'];}
  
    // группа товаров
    $img_fld=$position['pathName'];

    //category_path
    $sres.=$delem_field.$img_fld;
    
    $path_imgs1="";
    $text_img="";
    if(array_key_exists('image', $position))
    {
    $arr = $position['image'];
    $folder->create($path_imgs."\\".trim($img_fld));
    $text_img = $position['image']['filename'] ;
    $path_imgs1=$path_imgs.trim($img_fld)."\\".$text_img;
    //echo trim($arr['meta']['href'])."<br>";
    $path_imgs1 = str_replace("/","\\",$path_imgs1);
    echo $path_imgs1."<br>";
    // задать папку для сохранения файлов
    $browser->set_default_download($path_imgs.trim($img_fld));

    if($b_img_download)
       $browser->navigate(trim($arr['meta']['href']));
    }
    // manufacturer_name
    $sres.=$delem_field.get_manufacture_name($arr_man,trim($position['name']));
    // product_name
    $sres.=$delem_field.trim($position['name']);
    // buyPrice	Закупочная цена
    $buyPrice = substr(trim($position['buyPrice']['value']), 0, -2); 
    $sres.=$delem_field.$buyPrice;
     //print_r($position['buyPrice']);
     //  salePrices - Цены продажи
    //$sres.=$delem_field.$position['salePrices']['value'];
     //print_r($position['salePrices']);
    $product_desc="";	
    if(array_key_exists('description', $position))
       $product_desc=trim($position['description']);
    else
       $product_desc = trim($position['name']);
    
    $sres.=$delem_field.$delem_text.$product_desc.$delem_text;
    // file_url	
    $sres.=$delem_field.$path_imgs1;
    // published
    $sres.=$delem_field.$published;

    //echo $sres."<br>";
    // добавляем строку в файл с результатами
    $textfile->add_string_to_file($path_to_res_file,$sres."\r\n");

    //echo "мы тут $i<br>";

   // usleep(500);
}
echo 'удаляем массив<br>';

//unset($nomenclature);

// новый индекс старта
  if($offset==0)
     $offset=101;
  else
    $offset = $offset+100;

//echo $offset.'<br>';
}
// получить производитель
function get_manufacture_name($arr, $good_name)
{
   foreach ($arr as $key => $manufacture)
   { 
        $good_name = strtolower(trim($good_name));
        $manufacture = strtolower(trim($manufacture));

        $pos = strpos($good_name, $manufacture);
        if($pos!==FALSE)
        {
              return $manufacture;
        }
   }
  return "";
}
// Quit
$app->quit();
?>
P.S. Скрипт писался всего за пару часов,(причём большая часть времени ушла на работу с документацией) поэтому красивости не наводил. Если есть вопросы спрашивайте.

Весь скрипт целиком
parser_goods.zip
(4.1 КБ) 102 скачивания
http://x-scripts.com/

Код: Выделить всё

<?php
$xhe_host ="127.0.0.1:7010";

require("../Templates/xweb_human_emulator.php");

$browser->navigate("http://x-scripts.com");

$app->quit();?>

Ответить