Делюсь скриптом для работы с сервисом Мой Склад.
Задача, ради которой всё затевалось это вытащить картинки из Мой Склад для последующего использования их в интернет магазине.
Попутно всё это оформить в 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. Скрипт писался всего за пару часов,(причём большая часть времени ушла на работу с документацией) поэтому красивости не наводил. Если есть вопросы спрашивайте.
Весь скрипт целиком