Найдите исполнителя для вашего проекта прямо сейчас!
Разместите заказ на фриланс-бирже и предложения поступят уже через несколько минут.

Необходимо переделать скрипт с Яндекс API 4 на новый Яндекс API 5. Без переделки основного функционала.

Сам скрипт:

session_start();

set_time_limit(60);

# Путь к файлу YML

$xml_file = 'http://****.ru/ymllist.xml';

# Логин в Директе 

$login = '*****';

$domain = '*****.ru';

$client_id = '******'; #app id

$client_secret = '******'; #app password

$ignoreCampaignList = array('10571956');

//---

/*

GetCampaignsList (без ограничений.)

GetBanners (до 2000 объявлений или до 10 кампаний в одном запросе.)

StopBanners и ResumeBanners (до 2000 идентификаторов объявлений.)

CreateOrUpdateBanners (1000 вызовов на кампанию.)

*/

function utf8($struct)

{

# перекодировка строковых данных в UTF-8

foreach ($struct as $key => $value) {

   if (is_array($value)) {

       $struct[$key] = utf8($value);

   }

   elseif (is_string($value)) {

       $struct[$key] = utf8_encode($value);

   }

}

return $struct;

}

function getData($method, $params)

{

# формирование запроса

$request = array(

  'token'=> $_SESSION['access_token'], 

  'method'=> $method,

  'param'=> utf8($params),

  'locale'=> 'ru',

);

# преобразование в JSON-формат

$request = json_encode($request);

# параметры запроса

$opts = array(

  'http'=>array(

      'method'=>"POST",

      'content'=>$request,

  )

);

# создание контекста потока

$context = stream_context_create($opts); 

# отправляем запрос и получаем ответ от сервера

$result = file_get_contents('https://api.direct.yandex.ru/live/v4/json/', 0, $context);

$result = json_decode($result);

if( !empty($result->error_str) ){

if( $result->error_code == '53' ){

resetToken();

}

die($result->error_str.' (code '.$result->error_code.')');

}

return $result;

}

function clearUrl($url)

{

$url = trim($url);

$urlInfo = parse_url($url);

$url = str_replace('?'.$urlInfo["query"], '', $url);

$url = str_replace('www.', '', $url);

$url = str_replace('https://', 'http://', $url);

return $url;

}

function setPrice($newPrice, $str)

{

$str = preg_replace('@ ([0-9]+( ?[0-9]+)*)(\s*)руб@', ' '.$newPrice."$3руб", $str);

return $str;

}

function getPrice($str)

{

preg_match('@ ([0-9]+( ?[0-9]+)*)\s*руб@', $str, $reg);

return str_replace(' ', '', $reg[1]);

}

function resetToken()

{

unset($_SESSION['access_token']);

header('Location: '.basename(__FILE__));

exit;

}

# ============================================================

if( empty($_SESSION['access_token']) ){

if( !isset($_GET['code']) ){

header('Location: https://oauth.yandex.ru/authorize?response_type=code&client_id='.$client_id);

exit;

}else{

   $query = array(

     'grant_type' => 'authorization_code',

     'code' => $_GET['code'],

     'client_id' => $client_id,

     'client_secret' => $client_secret

   );

   $query = http_build_query($query);

   $header = "Content-type: application/x-www-form-urlencoded";

   $opts = array('http' =>

     array(

     'method'  => 'POST',

     'header'  => $header,

     'content' => $query

     ) 

   );

   $context = stream_context_create($opts);

   $result = file_get_contents('https://oauth.yandex.ru/token', false, $context);

   $result = json_decode($result);

$_SESSION['access_token'] = strval($result->access_token);

}

}

# ============================================================

$xml = simplexml_load_file($xml_file);

$products = array();

$duplicateProducts = array();

foreach($xml->shop->offers->offer as $data){

$url = clearUrl($data->url);

if( isset($products[$url]) && $products[$url]->price.'' != $data->price.'' ){

$duplicateProducts[$url] = true;

}

$products[$url] = $data;

}

# ============================================================

$campaigns = getData('GetCampaignsList', array($login));

$campaignInfo = array();

$CampaignIDS = array();

foreach($campaigns->data as $data){

$campaignInfo[$data->CampaignID.''] = $data;

if( in_array($data->CampaignID.'', $ignoreCampaignList) ) continue;

array_push($CampaignIDS, $data->CampaignID);

}

# ============================================================

$bannersFilter = array(

//'StatusBannerModerate' => array('Yes'), #Результат модерации объявления (проверяется текст и ссылка)

//'StatusPhrasesModerate' => array('Yes'), #Результат модерации фраз

//'StatusPhoneModerate' => array('Yes'), #Результат модерации визитки

//'StatusActivating' => array('Yes'), #Все внесенные изменения вступили в силу — Yes/Pending

//'StatusShow' => array('Yes'), #Показ объявления включен — Yes/No

//'IsActive' => array('Yes'), #Под активностью понимается состояние объявлений, 

#при котором показ включается и выключается автоматически

'StatusArchive' => array('No') #Состояние архивации объявления

);

$banners = getData('GetBanners', array(

   'CampaignIDS' => $CampaignIDS,

   'Filter' => $bannersFilter,

   'GetPhrases' => 'No'

));

# ============================================================

$changeLog = array();

$stopBannerIds = array();

$resumeBannerIds = array();

$updateBanners = array();

$bannerInfo = array();

foreach($banners->data as $data){

$url = clearUrl($data->Href);

$url_and_id = $url.'_=_'.$data->BannerID;

if( !strstr($url, $domain) || !strstr($url, '/products/') ) continue;

$bannerInfo[$url_and_id] = $data;

$titlePrice = getPrice($data->Title);

$textPrice = getPrice($data->Text);

$changeLog[$url_and_id] = array();

if( isset($products[$url]) ){

$priceChanged = false;

if( !empty($titlePrice) && $titlePrice != $products[$url]->price ){

array_push($changeLog[$url_and_id], 'Изменен заголовок:
С:: «'.

$data->Title.'»
На: «'.setPrice($products[$url]->price, $data->Title).'»');

$priceChanged = true;

}

if( !empty($textPrice) && $textPrice != $products[$url]->price ){

array_push($changeLog[$url_and_id], 'Изменен текст:
С:: «'.

$data->Text.'»
На: «'.setPrice($products[$url]->price, $data->Text).'»');

$priceChanged = true;

}

if( $priceChanged && isset($_POST["banner_".$data->BannerID]) ){

$saveData = array(

'BannerID' => $data->BannerID,

'CampaignID'=>$data->CampaignID,

'AdGroupID'=>$data->AdGroupID,

'Title' => setPrice($products[$url]->price, $data->Title),

'Text' => setPrice($products[$url]->price, $data->Text),

'Href'=>$data->Href,

);

if( is_array($data->Sitelinks) && count($data->Sitelinks) ){

$saveData['Sitelinks'] = array();

foreach($data->Sitelinks as $link){

array_push($saveData['Sitelinks'], array('Title'=>$link->Title, 'Href'=>$link->Href));

}

}

array_push($updateBanners, $saveData);

}

if( $products[$url]["available"] != "true" && $data->StatusShow == "Yes" ){

array_push($changeLog[$url_and_id], 'Изменен статус: выкл.');

if( isset($_POST["banner_".$data->BannerID]) ) array_push($stopBannerIds, $data->BannerID);

}

if( $products[$url]["available"] == "true" && $data->StatusShow != "Yes" ){

array_push($changeLog[$url_and_id], 'Изменен статус: вкл.');

if( isset($_POST["banner_".$data->BannerID]) ) array_push($resumeBannerIds, $data->BannerID);

}

}elseif($data->StatusShow == "Yes"){

array_push($changeLog[$url_and_id], 'Изменен статус: выкл.');

if( isset($_POST["banner_".$data->BannerID]) ) array_push($stopBannerIds, $data->BannerID);

}

continue;

echo "BannerID: {$data->BannerID}
";

echo "StatusShow: {$data->StatusShow}
";

echo "Title: {$data->Title}
";

echo "Text: {$data->Text}
";

echo "Href: {$data->Href}
";

echo "---
";

echo "StatusBannerModerate: {$data->StatusBannerModerate}
";

echo "StatusActivating: {$data->StatusActivating}
";

echo "IsActive: {$data->IsActive}
";

echo "StatusShow: {$data->StatusShow}
";

echo "
";

}

# ============================================================

if( isset($_POST["update_banners"]) ){

if( !empty($stopBannerIds) ){

$update = getData('StopBanners', array(

  'BannerIDS' => array_slice($stopBannerIds, 0, 2000)

));

}

if( !empty($resumeBannerIds) ){

$update = getData('ResumeBanners', array(

  'BannerIDS' => array_slice($resumeBannerIds, 0, 2000)

));

}

if( !empty($updateBanners) ){

$update = getData('CreateOrUpdateBanners', $updateBanners);

}

}

# ============================================================

$lastCampaignName = '';

$changes = '';

foreach($changeLog as $url_and_id=>$data){

if(empty($data)) continue;

list($url) = explode('_=_', $url_and_id);

$campaignName = $campaignInfo[$bannerInfo[$url_and_id]->CampaignID]->Name;

if( isset($_POST["banner_".$bannerInfo[$url_and_id]->BannerID]) ) continue;

if( $lastCampaignName != $campaignName ){

$changes.= '

Кампания: '.$campaignName.'

';

$lastCampaignName = $campaignName;

}

$color = 'black';

if( isset($duplicateProducts[$url]) ) $color = 'red';

$changes.= '

Объявление № '.$bannerInfo[$url_and_id]->BannerID.'

('.(isset($products[$url])? $products[$url]->model : $url).')


- '.implode('
- ', $data).'

';

}

?>

Список изменений

if( !empty($changes) ){

echo '

';

echo $changes;

echo ' ';

echo '';

echo '

';

}

else

echo 'Нет изменений.';

?>

7 лет назад
roart
Артем 
43 годаРоссия
12 лет в сервисе
Был
3 года назад