'ACCOUNT_ID',
'NAME' => 'NAME',
);
public function getList()
{
// https://vk.com/dev/ads.getAccounts
$result = $this->getRequest()->send([
'method' => 'GET',
'endpoint' => 'ads.getAccounts',
]);
if ($result->isSuccess())
{
$list = [];
while ($item = $result->fetch())
{
if ($item['ACCOUNT_TYPE'] === 'general')
{
$list[] = $item;
}
}
$result->setData($list);
}
return $result;
}
public function getProfile()
{
$response = $this->getRequest()->send(array(
'method' => 'GET',
'endpoint' => 'users.get',
'fields' => array(
//'user_ids' => array(),
'fields' => 'photo_50,screen_name'
)
));
if ($response->isSuccess())
{
$data = $response->fetch();
return array(
'ID' => $data['ID'],
'NAME' => $data['FIRST_NAME'] . ' ' . $data['LAST_NAME'],
'LINK' => 'https://vk.com/' . $data['SCREEN_NAME'],
'PICTURE' => $data['PHOTO_50'],
);
}
else
{
return null;
}
}
/**
* @param mixed $accountId VK Ad Account Id.
* @param Date|null $dateFrom
* @param Date|null $dateTo
* @return Response
*/
public function getExpenses($accountId, Date $dateFrom = null, Date $dateTo = null)
{
$result = new ResponseVkontakte();
$fields = [
'account_id' => $accountId,
'ids_type' => 'office',
'ids' => $accountId,
];
if($dateFrom && $dateTo)
{
$fields['period'] = 'day';
$fields['date_from'] = $dateFrom->format('Y-m-d');
$fields['date_to'] = $dateTo->format('Y-m-d');
}
else
{
$fields['period'] = 'overall';
$fields['date_from'] = '0';
$fields['date_to'] = '0';
}
$response = $this->getRequest()->send([
'method' => 'GET',
'endpoint' => 'ads.getStatistics',
'fields' => $fields,
]);
if($response->isSuccess())
{
$data = $response->getData();
if (isset($data[0]))
{
$data = $data[0];
}
$expenses = new Expenses();
foreach($data['stats'] as $stat)
{
$expenses->add([
'impressions' => $stat['impressions'],
'clicks' => $stat['clicks'],
'actions' => $stat['clicks'],
'spend' => $stat['spent'],
'currency' => static::CURRENCY_CODE,
]);
}
$result->setData(['expenses' => $expenses]);
}
else
{
$result->addErrors($response->getErrors());
}
return $result;
}
/**
* @return bool
*/
public function hasPublicPages()
{
return true;
}
/**
* @param $accountId
* @return Response
* @throws \Bitrix\Main\SystemException
*/
public function getPublicPages($accountId)
{
$adsLayoutResult = $this->getAdsLayout($accountId);
if(!$adsLayoutResult->isSuccess())
{
return $adsLayoutResult;
}
$groupIDs = [];
$ads = $adsLayoutResult->getData();
foreach($ads as $ad)
{
if(isset($ad['group_id']))
{
$groupIDs[] = $ad['group_id'];
}
}
$response = $this->getGroups($groupIDs);
if(!$response->isSuccess())
{
return $response;
}
$result = [];
$groups = $response->getData();
foreach($groups as $page)
{
$result[] = new Page([
'id' => $page['id'],
'name' => $page['name'],
'about' => $page['description'],
'image' => $page['photo_200'],
'phone' => $page['phone'],
]);
}
$response->setData($result);
return $response;
}
/**
* @param $accountId
* @param array $params
* @param array $publicPageIds
* @return Response
* @throws \Bitrix\Main\SystemException
*/
public function updateAnalyticParams($accountId, array $params, array $publicPageIds = [])
{
$result = new ResponseVkontakte();
if(empty($params))
{
return $result;
}
$result = $this->getAdsLayout($accountId);
if(!$result->isSuccess() || empty($result->getData()))
{
return $result;
}
$data = [];
$ads = $result->getData();
$groupIDs = $postIDs = [];
foreach($ads as $ad)
{
if(isset($ad['group_id']) && in_array($ad['group_id'], $publicPageIds))
{
$groupIDs[] = $ad['group_id'];
}
if(isset($ad['post_id']))
{
$postIDs[] = $ad['post_id'];
}
if(!empty($params['url_tags']) && isset($ad['link_domain']) && !empty($ad['link_domain']) && !empty($ad['link_url']))
{
$url = new Uri($ad['link_url']);
$url->addParams($params['url_tags']);
$data[] = [
'ad_id' => $ad['id'],
'link_url' => $url->getUri(),
];
}
if(count($data) == self::MAX_ADS_EDIT)
{
$editAdsResult = $this->editAds($accountId, $data);
if(!$editAdsResult->isSuccess())
{
$result->addErrors($editAdsResult->getErrors());
}
$data = [];
}
}
if(!empty($data))
{
$editAdsResult = $this->editAds($accountId, $data);
if(!$editAdsResult->isSuccess())
{
$result->addErrors($editAdsResult->getErrors());
}
}
//edit groups
if(!empty($groupIDs))
{
$result = $this->editGroupAnalyticParams($groupIDs, $params);
if(!$result->isSuccess())
{
return $result;
}
}
//edit posts
if(!empty($postIDs))
{
$result = $this->editPostAnalyticParams($postIDs, $params);
}
return $result;
}
/**
* @param $accountId
* @param array $data
* @return Response
* @throws \Bitrix\Main\SystemException
*/
protected function editAds($accountId, array $data)
{
return $this->getRequest()->send([
'method' => 'POST',
'endpoint' => 'ads.updateAds',
'fields' => [
'account_id' => $accountId,
'data' => Json::encode($data)
]
]);
}
/**
* @param $accountId
* @return Response
* @throws \Bitrix\Main\SystemException
*/
protected function getAdsLayout($accountId)
{
$fields = [
'account_id' => $accountId,
'include_deleted' => '0',
];
$response = $this->getRequest()->send([
'method' => 'GET',
'endpoint' => 'ads.getAdsLayout',
'fields' => $fields,
]);
if($response->isSuccess())
{
$ads = $response->getData();
foreach($ads as &$ad)
{
if(isset($ad['link_url']))
{
$parsedData = $this->parseVkUrl($ad['link_url']);
if($parsedData)
{
$ad += $parsedData;
}
}
}
$response->setData($ads);
}
return $response;
}
/**
* @param array $groupIDs
* @param array $params
* @return Response
* @throws \Bitrix\Main\SystemException
*/
protected function editGroupAnalyticParams(array $groupIDs, array $params)
{
$result = $this->getGroups(array_values($groupIDs));
if(!$result->isSuccess())
{
return $result;
}
$groups = $result->getData();
foreach($groups as $group)
{
$data = [];
if(isset($params['url_tags']) && !empty($params['url_tags']) && isset($group['site']))
{
$uri = new Uri($group['site']);
$uri->addParams($params['url_tags']);
$data['website'] = $uri->getUri();
}
if(isset($params['phone']) && !empty($params['phone']) && $group['phone'] != $params['phone'])
{
$data['phone'] = $params['phone'];
}
if(!empty($data))
{
$data['id'] = $group['id'];
$response = $this->getRequest()->send([
'method' => 'POST',
'endpoint' => 'groups.edit',
'fields' => $data,
]);
if(!$response->isSuccess())
{
$result->addErrors($response->getErrors());
}
}
if(isset($params['url_tags']) && !empty($params['url_tags']) && isset($group['links']) && is_array($group['links']) && !empty($group['links']))
{
foreach($group['links'] as $link)
{
$url = new Uri($link['url']);
$url->addParams($params['url_tags']);
if($url->getUri() != $link['url'])
{
$response = $this->getRequest()->send([
'method' => 'POST',
'emdpoint' => 'groups.deleteLink',
'fields' => [
'group_id' => $group['id'],
'link_id' => $link['id'],
]
]);
if($response->isSuccess())
{
$response = $this->getRequest()->send([
'method' => 'POST',
'endpoint' => 'groups.addLink',
'fields' => [
'group_id' => $group['id'],
'text' => $link['desc'],
'link' => $url->getUri(),
]
]);
}
if(!$response->isSuccess())
{
$result->addErrors($response->getErrors());
}
}
}
}
// todo add here edit call_to_action button
}
return $result;
}
/**
* @param array $groupIDs
* @return Response
* @throws \Bitrix\Main\SystemException
*/
protected function getGroups(array $groupIDs)
{
return $this->getRequest()->send([
'method' => 'GET',
'endpoint' => 'groups.getById',
'fields' => [
'group_ids' => implode(',', $groupIDs),
'fields' => 'name,type,id,links,site,status,description,phone'
]
]);
}
/**
* @param string $url
* @return array|false
*/
protected function parseVkUrl($url)
{
if(preg_match('#vk\.com\/wall-(\d+)_(\d+)#', $url, $matches) && count($matches) > 2)
{
return [
'group_id' => $matches[1],
'post_id' => '-'.$matches[1].'_'.$matches[2],
];
}
return false;
}
/**
* @param array $postIDs
* @param array $params
* @return Response
* @throws \Bitrix\Main\SystemException
*/
protected function editPostAnalyticParams(array $postIDs, array $params)
{
$result = $this->getPosts($postIDs);
if(!$result->isSuccess())
{
return $result;
}
$posts = $result->getData();
foreach($posts as $post)
{
if($post['post_type'] == 'post_ads' && isset($post['attachments']) && is_array($post['attachments']) && count($post['attachments']) == 1)
{
$attachment = reset($post['attachments']);
if($attachment['type'] != 'link' || mb_strpos($attachment['link']['url'], 'vk.com') !== false)
{
continue;
}
$data = [];
if(isset($params['phone']) && !empty($params['phone']) && mb_strpos($attachment['link']['url'], 'tel:') === 0)
{
$data = [
'owner_id' => $post['owner_id'],
'post_id' => $post['id'],
'attachments' => 'tel:'.$params['phone'],
];
}
elseif(isset($params['url_tags']) && !empty($params['url_tags']))
{
$url = new Uri($attachment['link']['url']);
$url->addParams($params['url_tags']);
if($url->getUri() != $attachment['link']['url'])
{
$data = [
'owner_id' => $post['owner_id'],
'post_id' => $post['id'],
'attachments' => $url->getUri(),
];
}
}
if(!empty($data))
{
$response = $this->getRequest()->send([
'method' => 'POST',
'endpoint' => 'wall.editAdsStealth',
'fields' => $data,
]);
if(!$response->isSuccess())
{
$result->addErrors($response->getErrors());
}
}
}
}
return $result;
}
/**
* @param array $postIDs
* @return Response
* @throws \Bitrix\Main\SystemException
*/
protected function getPosts(array $postIDs)
{
return $this->getRequest()->send([
'method' => 'GET',
'endpoint' => 'wall.getById',
'fields' => [
'posts' => implode(',', array_values($postIDs)),
'fields' => 'id,attachments',
]
]);
}
}