@jirniy

Способы сбора доп. ссылок с Яндекс.Директа?

Бодрого утра,Тостер.

Образовалась проблемка одна с парсингом дополнительных ссылок, которые размещаются под объявлениями, которые отображаются в Яндексе. Основные ссылки нормально забираются и сохраняются, но вот отдел рекламы нашей фирмы решил, что им нужны обязательно еще и дополнительные ссылки, которые под этими объявлениями, сохранять, и вот тут встала проблема.

Выглядит она следующим образом - тот когда системы который достался, абсолютно без документации и до разработчиков тоже нету доступа уже, отказаться и взять что-то другое нельзя,
а копания в коде привели вот к этому куску кода:

public function importYandexDirect($account) {
        $login  = $account->login;
        $appid  = $account->application_id;
        $token  = $account->token;

        $stream  = $account->fetchStream();
        $service = $account->fetchService();
        $user    = $stream->fetchUser();

        $wsdlurl = 'https://soap.direct.yandex.ru/wsdl/v4/';
        $client = new SoapClient($wsdlurl, array(
            'trace'          => 1,
            'exceptions'     => 1,
            )
        );

        $headers = array();
        $headers[] = new SoapHeader($wsdlurl, 'login', $login);
        $headers[] = new SoapHeader($wsdlurl, 'application_id', $appid);
        $headers[] = new SoapHeader($wsdlurl, 'token', $token);
        $headers[] = new SoapHeader($wsdlurl, 'locale', 'ru');

        $client->__setSoapHeaders($headers);
        if ($account->sub_account) {
            $sas = explode(',', $account->sub_account);
        } else {
            $sas = array('' => '');
        }

        foreach ($sas as $sa) {
            try {
                if ($sa) {
                    $campaigns = $client->GetCampaignsList(array($sa));
                } else {
                    $campaigns = $client->GetCampaignsList();
                }
            } catch (Exception $e) {
                echo "auth: $login failed\n";
                return false;
            }

 $cids = array();
            if ($account->campaign_id || $service) {
                foreach ($campaigns as $row) {
                    if ((! $account->campaign_id && $row->IsActive == 'Yes') || $account->campaign_id == $row- >CampaignID) {
                        $cids[] = $row->CampaignID;
                    }
                }
            } else {
                foreach ($campaigns as $row) {
                    $campaign = Wt_Factory::getInstance('Campaigns')->fetchRow(array('remote_id = ?' => $row- >CampaignID, 'user_id = ?' => $user->i$
                    if ($row->IsActive == 'Yes') {
                        $cids[] = $row->CampaignID;
                    }
                }
            }

            $params = array(
                'CampaignIDS' => $cids,
                'GetPhrases'  => 'WithPrices'
            );


            $adverts = array();

            if (! empty($cids)) {

 try {
                    $adverts = $client->GetBanners($params);
                } catch (Exception $e) {
                    "get banners: $login" . $e->getMessage() . "\n";
                    continue;
                }
            }

            $toUpdate = array();
            foreach ($adverts as $row) {
                if ($row->StatusArchive == 'Yes') continue;


                $campaign = Wt_Factory::getInstance('Campaigns')->fetchRow(array('remote_id = ?' => $row->CampaignID, 'user_id = ?' => $user->id));
                if ($service) {
                    $serviceId = $service->id;
                } elseif ($campaign) {
                    $serviceId = $campaign->fetchService()->id;
                } else {
                    continue;
                }


 $data = array(
                    'title'         => $row->Title,
                    'text'          => $row->Text,
                    'external_link' => 'http://' . $row->Href,
                    'service_id'    => $serviceId,
                    'user_id'       => $user->id,
                    'type'          => 'yandex_direct',
                    'remote_id'     => $row->BannerID,
                    'campaign_id'   => $campaign ? $campaign->id : null,
                );

                $item = $this->fetchRow(array('remote_id = ?' => $row->BannerID));
                if ($item) $data['id'] = $item->id;

                $id = $this->save($data);


     if (strpos($row->Href, 'aid=') === false) {
                    if (! $item) {
                        $item = $this->findById($id);
                    }

                    if (strpos($row->Href, '?') === false) {
                        $sep = '?';
                    } else {
                        $sep = '&';
                    }

                    $url = $row->Href . $sep . "aid={$item->id}&stid={$stream->id}&src={keyword}";

                    $row->Href = $url;
                    $item->external_link = 'http://' . $url;

                    $toUpdate[$row->BannerID] = $row;
                    $item->save();
                }


 if (! empty($row->Sitelinks)) {
                    $changed = false;
                    foreach ($row->Sitelinks as &$link) {
                        if (strpos($link->Href, 'aid=') === false) {
                            if (! $item) {
                                $item = $this->findById($id);
                            }

                            if (strpos($link->Href, '?') === false) {
                                $sep = '?';
                            } else {
                                $sep = '&';
                            }



                         $link->Href = $link->Href . $sep . "aid={$item->id}&stid={$stream->id}&src={keyword}";
                            $changed = true;
                        }
                    }

                    if ($changed) {
                        $toUpdate[$row->BannerID] = $row;
                    }
                }
            }

            if (count($toUpdate)) {
                try {
                    $res = $client->CreateOrUpdateBanners($toUpdate);
                } catch (Exception $e) {
                    echo "update: $login " . $e->getMessage() . "\n";
                }
            }
        }

        return count($this->errors) ? false : true;
    }



    public function archive($ids) {
        if (! is_array($ids)) {
            $ids = array($ids);
        }

        return $this->update(array('is_hidden' => 't'), array('id IN (?)' => $ids));
    }

    public function pickArticle($id, $stid) {
        $advert = $this->findById($id);
        $stream = Wt_Factory::getInstance('Streams')->findById($stid);

        $data = array();
        $data['title']     = $advert->getTitle();
        $data['stream_id'] = $stream->id;
        $data['user_id']   = $stream->user_id;
        $data['type']      = 'article';

        $rotation = array(
            array('advert_id' => $advert->id)
        );

        return Wt_Factory::getInstance('Blocks')->save($data, array(), $rotation);
    }
}


Так как я сам кодю больше на C#\C++ вот так вот сразу разобраться с кодом на PHP сложно
(три месяца опыта всего с этим языком), а начальство требует уже завтра к вечеру сдавать задачу, намекая на то что там ничего сложного, а я уже неделю пытаюсь разобраться в написанном предыдущими прогерами, которые внезапно свалили. Как удалось узнать, тут где-то в коде отсекаются как раз именно эти дополнительные ссылки, и вот прошу, может, кто умный в теме подскажет, что подправить. Огромное спасибо всем откликнувшимся.
  • Вопрос задан
  • 2719 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы