Битрикс24 произвольный PHP код

Битрикс24 произвольный PHP код

crm_bp-min

В Битрикс24 есть отличный инструментарий бизнес-процессов. С помощью него можно сделать практически всё, что угодно. Что ещё лучше — есть даже поддержка произвольного PHP кода.

Screenshot_18-min

И вот, когда Вы уже обрадовались, что попали в рай для программиста, наступает небольшое огорчение — облачная версия Битрикс24 не поддерживает произвольный PHP код в бизнес-процессах.

php_error-min

Вот что по этому поводу говорит поддержка: https://forums.bitrix24.ru/forum15/topic4501/

И казалось бы всё! Выхода нет! Жизнь окончена! Занавес! Но программисты не сдаются просто так! Только не сейчас, когда счастье было таким возможным!

Если гора не идёт к Магомету… Правильно: если код не может быть выполнен на этом сервере (в облаке), он может быть выполнен на другом сервере.

Но тут тоже есть ряд проблем:

  • как доставить параметры на сторонний сервер?
  • как получить результат выполнения скрипта на стороннем сервере?

Расскажу всё по порядку. Недавно к нам обратилась одна компания именно с такой задачей: выполнить произвольный код PHP в облачной версии Битрикс24.

Код должен был получать параметры от бизнес-процесса, который обрабатывает лид, и отправлять некоторые данные для статистики в Google Analytics.

И вот как мы это сделали.

В бизнес процессах Битрикс24 есть чудесная возможность отправки оповещений по E-mail. И мы решили отправлять данные для скрипта по почте.

Screenshot_19-minНа другом конце этой цепочки установили cron скрипт, который каждые несколько минут проверяет почту (на которую мы шлём параметры для скрипта) и, если находит непрочитанные письма определённого формата, читает из них параметры и выполняет.

Чтобы не заморачиваться с SSL сертификатами, мы использовали почтовик ukr.net

И вот, что у нас получилось:

<?php
//Задаём время исполнения скрипта побольше
set_time_limit(4000);

// Connect to mail
$imapPath = '{imap.ukr.net:143}INBOX';
$username = '[email protected]';
$password = 'your_pass';

// try to connect
$inbox = imap_open($imapPath,$username,$password) or die('Cannot connect to email: ' . imap_last_error());

// search and get unseen emails, function will return email ids
$emails = imap_search($inbox,'UNSEEN');

$output = '';
if(count($emails) > 0)  {
	 foreach($emails as $mail) {
	    $headerInfo = imap_headerinfo($inbox,$mail);
	    $output .= '<strong>Subject:</strong> ' . iconv_mime_decode($headerInfo->subject).'<br/>';
	    $output .= '<strong>To:</strong> ' . $headerInfo->toaddress.'<br/>';
	    $output .= '<strong>Date:</strong> ' . $headerInfo->date.'<br/>';
	    $output .= '<strong>From:</strong> ' . $headerInfo->fromaddress.'<br/>';

	    imap_setflag_full($inbox,$mail,"Seen");  //помечаем просмотренным
	    $emailStructure = imap_fetchstructure($inbox,$mail);

	    $subject = iconv_mime_decode($headerInfo->subject);

	    if(!isset($emailStructure->parts)) {
	        $output .= '<strong>Body:</strong> ' . imap_body($inbox, $mail, FT_PEEK) . '<br/>';
	        $post_data = imap_body($inbox, $mail, FT_PEEK);
	    } else {
	        //
	    }
	    echo $output;

	    //Проверяем тему
	    if($subject == 'Post data for send GA') {
	    	 //Проверяем установлен ли CURL и заданы ли нужные нам параметры в письме
			   if( $curl = curl_init() AND !empty($post_data)) {
					$post_url = 'https://www.google-analytics.com/collect';
			   	echo '<strong>POST url:</strong> ' . $post_url . '<br/>';
			   	echo '<strong>POST data:</strong> ' . 'payload_data&' . $post_data . '<br/>';

			   	//Отправляем данные на сервер GA
			    curl_setopt($curl, CURLOPT_URL, $post_url);
			    curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
			    curl_setopt($curl, CURLOPT_POST, true);
			    curl_setopt($curl, CURLOPT_POSTFIELDS, 'payload_data&' . $post_data);

			    //Читаем ответ сервера GA
			    $out = curl_exec($curl);
			    echo '<strong>GA server answer:</strong><br><br>';
					echo '<strong>REQUEST HEADERS:</strong><br>';
					$headers = curl_getinfo($curl);
					echo '<strong><i>url:</i> ' . $headers['url'] . '<br/>';
					echo '<i>httpss_code:</i> ' . $headers['httpss_code'] . '<br/></strong>';
					echo '<i>content_type:</i> ' . $headers['content_type'] . '<br/>';
					echo '<i>header_size:</i> ' . $headers['header_size'] . '<br/>';
					echo '<i>request_size:</i> ' . $headers['request_size'] . '<br/>';
					echo '<i>filetime:</i> ' . $headers['filetime'] . '<br/>';
					echo '<i>ssl_verify_result:</i> ' . $headers['ssl_verify_result'] . '<br/>';
					echo '<i>redirect_count:</i> ' . $headers['redirect_count'] . '<br/>';
					echo '<i>total_time:</i> ' . $headers['total_time'] . '<br/>';
					echo '<i>namelookup_time:</i> ' . $headers['namelookup_time'] . '<br/>';
					echo '<i>connect_time:</i> ' . $headers['connect_time'] . '<br/>';
					echo '<i>pretransfer_time:</i> ' . $headers['pretransfer_time'] . '<br/>';
					echo '<i>size_upload:</i> ' . $headers['size_upload'] . '<br/>';
					echo '<i>size_download:</i> ' . $headers['size_download'] . '<br/>';
					echo '<i>speed_download:</i> ' . $headers['speed_download'] . '<br/>';
					echo '<i>speed_upload:</i> ' . $headers['speed_upload'] . '<br/>';
					echo '<i>download_content_length:</i> ' . $headers['download_content_length'] . '<br/>';
					echo '<i>upload_content_length:</i> ' . $headers['upload_content_length'] . '<br/>';
					echo '<i>starttransfer_time:</i> ' . $headers['starttransfer_time'] . '<br/>';
					echo '<i>redirect_time:</i> ' . $headers['redirect_time'] . '<br/>';

					echo 'RESPONSE:<br>';
					echo $out;
			    curl_close($curl);
			  } else {
			  	//Не установлен CURL или не заданы параметры
					echo "ERROR: no curl OR no post data!<br>";
				}
			} else {
					//Не та тема письма
			    echo "ERROR: no valid email subject!<br>";
			}
	    echo '<hr>';
	    $output = '';

	}
} else {
		//Нет новых писем
		echo 'ERROR: no mails!';
}

// colse the connection
imap_expunge($inbox);
imap_close($inbox);
?>