Пропустить навигацию.
Home

RXP/Stimul - посылка клика javascript-ом

В движках RXP (и, насколько мне известно Stimula) данные о заргрузке страницы (клике) отправляется в админку из php скрипта, генерящего страницу шопа. Вероятно, у такого способа есть преимущества, например, RXP получает полные данные об индексации шопа поисковиками, но и немало минусов. Прежде всего, тормозится загрузка страницы - пока скрипт достучится до кликхоста. А ведь последний может и лежать... Далее, в статистику попадает масса кликов (правильнее было бы сказать - заходов) сделанных не людьми (а сволочами какими-то :). RXP пытается их фильтровать, но эффект от фильтрования далек от идеального. 

 

Когда я внедрил на своих шопах первую версию JS-клика, то оказалось, что каждый чел мне приносит раз в 10 больше денег - человеков на самом деле оказалось мало.

Вобщем, перейдем к реализации. Отправка клика осуществляется методом send_click, расположенным в файле Cart.class.php.

Было:

		if ($_SERVER['RX_DEBUG'])
			{ if (0) warn($query_string); }
		elseif (is_resource($sock = @fsockopen(gethostbyname($host), 80, $errno, $errstr)))
		{
			@fputs($sock, "GET /click.php?$query_string HTTP/1.0\r\nHost:$host\r\n\r\n");
			@fclose($sock);
		}
		else warn("send_click() failed via $errstr/$errno ($host)");

Стало:

		if ($_SERVER['RX_DEBUG'])
			{ if (0) warn($query_string); }
//		elseif (is_resource($sock = @fsockopen(gethostbyname($host), 80, $errno, $errstr)))
		else
		{
			 $query_string = base64_encode($query_string);
			 $rand = rand(111111111,999999999);			
print <<<QQQ
<script language="javascript">
document.cookie = "click=$query_string";
document.write('<img src="/click.php?$rand" border="0" width="1" height="1">');</script>
QQQ;
   //			@fputs($sock, "GET /click.php?$query_string HTTP/1.0\r\nHost:$host\r\n\r\n");
    //			@fclose($sock);
    		}
    //		else warn("send_click() failed via $errstr/$errno ($host)");

То есть удаляем/комментарим ту часть кода, которая открывает кликхост и отправляет ему инфу, а вместо нее пишем print, печатающий джаваскрипт. Последний записывает куку, содержащую данные о клике и печатает код, вызывающий рисунок отдаваемый файлом /click.php. Вот - его код:

	include "config.php";
	if (file_exists("config_def.php")) include "config_def.php";
	$imgfile = file_get_contents("imgs/spacer.gif");
	$click_url = @$config['click_script'];
	if (!$click_url) $click_url = "http://$config[click_host]/click.php";
	$query_str = $_COOKIE['click'];
	if (!$query_str) die();
	$query_str = base64_decode($query_str);
	$purl = parse_url($click_url);
	$query_str = urldecode(urlencode($query_str));
	if (isset($_GET['debug']))
	{
		print "click_url: $click_url";
		print "
query_str: ".htmlentities($query_str); die(); } if ($_SERVER['REMOTE_ADDR']=='127.0.0.1') die(); $sock = fsockopen(gethostbyname($purl['host']), 80, $errno, $errstr); if ($sock) { fputs($sock, "GET /click.php?$query_str HTTP/1.0\r\nHost: $purl[host]\r\n\r\n"); fclose($sock); } // date in the past header("Expires: Mon, 1 Jan 2000 00:00:00 GMT"); // always modified header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // HTTP/1.1 header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); // HTTP/1.0 header("Pragma: no-cache"); header("Content-Type: image/gif"); header("Content-Length: ".strlen($imgfile)); print $imgfile;

 

Понятно, что файл click.php должен находиться в корне. Этот скрипт читает из куки данные о клике и отсылает их в на кликхост. Таким образом, будут пересылаться данные только о тех заходах, где выполняется джаваскрипт и поддерживаются куки. Также, отправка данных будет отвязана от загрузки страницы, и не будет ее тормозить.

Версия движка ваших шопов может отличаться от последней, для которой я привел код, но смышленный программер сообразит что где подправить, не забыв заранее сохраниться ;)

Надеюсь, нечто подобное намечается в третьей версии движка

в версии EdSelection (и,

в версии EdSelection (и, возможно, других) 2.5 эта фича встроена, но не активированна. чтоб ее активировать, надо в файле aff_camp.php установить

'USE_EXTERNAL_CLICK_SCRIPT'=>'1'

 

update

в тескт вкралась ошибка (спасибо - sky), точнее друпал ее вкрал 8-[]
там теги < br > в ненужном месте были, если кто ставил патч и не добился результата, то сейчас доступен правильный вариант.