403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/ilovecveti.ru/bitrix/modules/seo/lib/retargeting/services/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/ilovecveti.ru/bitrix/modules/seo/lib/retargeting/services/audienceyandex.php
<?php

namespace Bitrix\Seo\Retargeting\Services;

use Bitrix\Main\Error;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\NotImplementedException;
use Bitrix\Main\Result;
use \Bitrix\Seo\Retargeting\Audience;
use Bitrix\Seo\Retargeting\Response;

class AudienceYandex extends Audience
{
	const TYPE_CODE = 'yandex';

	const MAX_CONTACTS_PER_PACKET = 0;
	const MIN_CONTACTS_FOR_ACTIVATING = 1000;
	const URL_AUDIENCE_LIST = 'https://audience.yandex.ru/';
	private const EXAMPLE_MAIL = 'example@mail.domain';

	const NEW_AUDIENCE_FAKE_ID = -1;
	const UPDATE_AUDIENCE_TIMEOUT = 60;

	protected static $listRowMap = array(
		'ID' => 'ID',
		'NAME' => 'NAME',
		'COUNT_VALID' => 'VALID_UNIQUE_QUANTITY',
		'COUNT_MATCHED' => 'MATCHED_QUANTITY',
		'HASHED' => 'HASHED',
		'STATUS' => 'STATUS',
		'SUPPORTED_CONTACT_TYPES' => array(
			self::ENUM_CONTACT_TYPE_PHONE,
			self::ENUM_CONTACT_TYPE_EMAIL
		),
	);

	public static function normalizeListRow(array $row)
	{
		$map = array(
			//'email' => [self::ENUM_CONTACT_TYPE_EMAIL],
			//'phone' => [self::ENUM_CONTACT_TYPE_PHONE],
			'crm' => [
				self::ENUM_CONTACT_TYPE_PHONE,
				self::ENUM_CONTACT_TYPE_EMAIL
			],
		);
		static::$listRowMap['SUPPORTED_CONTACT_TYPES'] = $map[$row['CONTENT_TYPE']];
		return parent::normalizeListRow($row);
	}

	public static function isSupportMultiTypeContacts()
	{
		return true;
	}

	public static function isSupportAccount()
	{
		return false;
	}

	public static function isAddingRequireContacts()
	{
		return true;
	}

	public static function isSupportRemoveContacts()
	{
		return false;
	}

	public static function isSupportAddAudience()
	{
		return true;
	}

	public static function isSupportCreateLookalikeFromSegments(): bool
	{
		return false;
	}

	/**
	 * @param array $data Data.
	 * @return \Bitrix\Seo\Retargeting\Response
	 * @deprecated Not supported by Yandex
	 * @throws NotImplementedException
	 */
	public function add(array $data)
	{
		$response = $this->request->send(array(
			'methodName' => 'retargeting.audience.add',
			'parameters' => array(
				'name' => $data['NAME'],
				'hashed' => 0,
				'contacts' => $this->prepareContacts(["email" => [self::EXAMPLE_MAIL]]),
			),
		));

		$responseData = $response->getData();
		if (isset($responseData['id']))
		{
			$response->setId($responseData['id']);
		}

		return $response
			;
	}

	/**
	 * Create contacts list in proper format.
	 * @param array $contacts Contacts.
	 * @param bool $hashed Should result be hashed.
	 * @param string $type Type (email|phone).
	 * @return string
	 */
	protected function prepareContacts(array $contacts = array(), $hashed = false, $type = '')
	{
		// filter by type
		if ($type)
		{
			$contacts = [
				$type => isset($contacts[$type]) ? $contacts[$type] : []
			];
		}

		// prepare data
		$eol = "\r\n";
		$separator = ",";
		$types = array_keys($contacts);
		$typeCount = count($types);
		$result = implode($separator, $types);
		foreach ($types as $index => $contactType)
		{
			foreach ($contacts[$contactType] as $contact)
			{
				$contact = $hashed ? md5($contact) : $contact;
				$data = array_fill(0, $typeCount, "");
				$data[$index] = $contact;
				$result .= $eol . implode($separator, $data);
			}
		}

		return $result;
	}

	/**
	 * @param string $audienceId Audience id.
	 * @param array $contacts Contacts.
	 * @param array $options Options.
	 * @return Result|\Bitrix\Seo\Retargeting\Response
	 * @throws \Bitrix\Main\SystemException
	 */
	public function importContacts($audienceId, array $contacts, array $options)
	{
		$createNewAudience = ($audienceId == static::NEW_AUDIENCE_FAKE_ID);
		$audienceData = $this->getById($audienceId);
		if (!$audienceData)
		{
			$result = new Result();
			$result->addError(new Error('Audience '.$audienceId.' not found'));
			return $result;
		}

		$hashed = (bool)$audienceData['HASHED'];
		$payload = $this->prepareContacts($contacts, $hashed, $options['type']);

		if ($createNewAudience)
		{
			$name = $options['audienceName'] ?: Loc::getMessage('SEO_RETARGETING_SERVICE_AUDIENCE_NAME_TEMPLATE', ['#DATE#' => FormatDate('j F')]);
			$response = $this->getRequest()->send(array(
				'methodName' => 'retargeting.audience.add',
				'parameters' => array(
					'name' => $name,
					'hashed' => $hashed ? 1 : 0,
					'contacts' => $payload
				),
				'timeout' => static::UPDATE_AUDIENCE_TIMEOUT
			));
		}
		else
		{
			$response = $this->getRequest()->send(array(
				'methodName' => 'retargeting.audience.contacts.rewrite',
				'parameters' => array(
					'audienceId' => $audienceId,
					'contacts' => $payload
				),
				'timeout' => static::UPDATE_AUDIENCE_TIMEOUT
			));
		}

		return $response;
	}

	/**
	 * Remove contacts from audience
	 * @param string $audienceId Audience id.
	 * @param array $contacts Contacts.
	 * @param array $options Options.
	 * @deprecated Not supported by Yandex anymore
	 * @return \Bitrix\Seo\Retargeting\Response|null
	 */
	public function removeContacts($audienceId, array $contacts, array $options)
	{
		$response = Response::create(static::TYPE_CODE);
		return $response;
	}

	/**
	 * Audiences list
	 * @return \Bitrix\Seo\Retargeting\Response
	 * @throws \Bitrix\Main\SystemException
	 */
	public function getList()
	{
		$response = $this->getRequest()->send(array(
			'methodName' => 'retargeting.audience.list',
			'parameters' => array()
		));
		$data = $response->getData();
		if (is_array($data['segments']))
		{
			$data = array_values(array_filter($data['segments'], function ($item) {
				return (
					$item['type'] == 'uploading' && // based on uploaded data
					$item['content_type'] == 'crm'// Data from crm
				);
			}));
		}
		else
		{
			$data = [];
		}

		$data = $this->addNewAudienceValue($data);
		$response->setData($data);
		return $response;
	}

	/**
	 * "New audience" value in audiences list
	 * @param array $data Audiences list.
	 * @return array
	 */
	protected function addNewAudienceValue($data)
	{
		array_unshift($data, [
			'name' => Loc::getMessage("SEO_RETARGETING_SERVICE_AUDIENCE_YANDEX_ADD"),
			'id' => static::NEW_AUDIENCE_FAKE_ID,
			'valid_unique_quantity' => '',
			'matched_quantity' => '',
			'status' => '',
			'hashed' => false,
		]);
		return $data;
	}

	/**
	 * @return array
	 */
	public function getLookalikeAudiencesParams(): array
	{
		return [
			'FIELDS' => [
				'AUDIENCE_LOOKALIKE',
				'DEVICE_DISTRIBUTION',
				'GEO_DISTRIBUTION'
			],
			'AUDIENCE_LOOKALIKE' => [
				'MIN' => 1,
				'MAX' => 5,
			],
		];
	}

	/**
	 * @param $sourceAudienceId
	 * @param array $options
	 * @return Response
	 * @throws \Bitrix\Main\SystemException
	 */
	public function createLookalike($sourceAudienceId, array $options): Response
	{
		$result = $this->getRequest()->send([
			'methodName' => 'retargeting.audience.lookalike.add',
			'parameters' => [
				'name' => (string) $options['name'],
				'lookalike_link' => (int) $sourceAudienceId,
				'lookalike_value' => (int) $options['lookalike_value'],
				'maintain_device_distribution' => (bool) $options['maintain_device_distribution'],
				'maintain_geo_distribution' => (bool) $options['maintain_geo_distribution'],
			],
		]);

		if ($result->isSuccess())
		{
			$result->setId($result->getData()['id']);
		}

		return $result;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit