parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Класс для работы с SAPE

StopDesign 14.01.2008 20:58

Вот простенький класс для работы с SAPE. Примеры в описании функций.
##########################################################################
# Класс для работы со скриптами SAPE (http://www.sape.ru)
# Версия 0.1 - 22.11.2007
#
# (c) StopDesign - http://forum.sape.ru/member.php?u=2245
#
# Тестировал с PHP-клиентом SAPE версий
# 1.0.0 от 18.12.2007 (c поддержкой гиперконтекста)
# 0.9.2 от 05.12.2007 (без гиперконтекста)
##########################################################################



##########################################################################
@CLASS
sape
##########################################################################



##########################################################################
# Инициализация
#
# user    - Обязательный параметр. Ваш хэш код в SAPE.
#
# uri     - URI страницы, для которой нужно вывести ссылки
#           предполагается, что uri уже обработан для защиты от
#           скриптов, определяющих продажные ссылки
#           (отрезаны лишние параметры,
#           "/index.html" заменен на "/" и т.д.).
#           По умолчанию - $request:uri.
#
# timeout - Время ожидания ответа от скрипта sape2parser.
#           Операция загрузки должна быть завершена за это время,
#           иначе страница выводится в исходном виде, без ссылок.
#           По умолчанию 2 секунды.
#
# params  - Хеш параметров, которые будут переданы в классы SAPE
#           Можно, например, принудительно указать кодировку:
#           $.request_uri[windows-1251]
#           Подробности - в справке к sape.php на их сайте
#
#
# Простой пример инициализации:
#
# @auto[]
# $sape[^sape::create[Ваш_хэш_код]]
#
#
# Пример инициализации с параметрами и защитой
# от скриптов, определяющих продажные ссылки:
#
# @auto[][uri;hParam]
# ^rem{ отрезать все параметры от url }
# $uri[^request:uri.match[\?.*][]{}]
# $hParam[
# 	$.debug[true] ^rem{ режим отладки }
# ]
# $sape[^sape::create[Ваш_хэш_код;$uri;3;$hParam]]
#
@create[user;uri;timeout;params]

^if(!def $user || $user eq ''){
	^throw[bad_sape_user;bad_user_hash]
}

$hSapeParams[^if(def $params && $params is hash){$params}{^hash::create[]}]
$hSapeParams.sape_user[$user]
$hSapeParams.request_uri[^if(def $uri){$uri}{$request:uri}]

$sSape2ParserPath[http://$env:HTTP_HOST/$user/sape2parser.php]

$iHttpTimeout(^timeout.int(2))

$iCurrentOffset(0)
##########################################################################



##########################################################################
# replace_in_text_segment[sText]
# аналог функции replace_in_text_segment класса SAPE_context
#
# Пример использования:
#
# @main[]
# <p>тут я не буду продавать ссылки</p>
# <p>^sape.replace_in_text_segment[а в этом тексте ссылки будут продаваться]</p>
#
@replace_in_text_segment[sText][param;sape_text]
^try{
	$param[^hash::create[$self.hSapeParams]]
	$param.action[text]
	$param.text[$sText]
	$param.sape_cookie[$cookie:sape_cookie]
	$param.sape_debug[$cookie:sape_debug]

	$sape_text[^file::load[text][$self.sSape2ParserPath][
		$.timeout($self.iHttpTimeout)
		$.method[POST]
		$.form[$param]
	]]
	
	$result[^untaint{$sape_text.text}]
}{
	$exception.handled(true)
	$result[]
}
##########################################################################



##########################################################################
# replace_in_page[sText]
# Аналог функции replace_in_page класса SAPE_context
#
# В коде страници необходимо тегами <sape_index> ограничить текст,
# в пределах котогого будут продаваться ссылки.
#
# Для использования удобнее всего переопределить postprocess:
#
# @postprocess[body]
# ^if($body is string){
# 	$result[^sape.replace_in_page[$body]]
# }{
#   $result[$body]
# }
#
@replace_in_page[sText][param;sape_text;cut]
^try{
	$param[^hash::create[$self.hSapeParams]]
	$param.action[page]
	$param.text[$sText]
	$param.sape_cookie[$cookie:sape_cookie]
	$param.sape_debug[$cookie:sape_debug]

	$sape_text[^file::load[text][$self.sSape2ParserPath][
		$.timeout($self.iHttpTimeout)
		$.method[POST]
		$.form[$param]
	]]
	
	$result[^untaint{$sape_text.text}]
}{
	$exception.handled(true)
	^rem{ были ошибки, выводим немодифицированный текст }
	^rem{ только убираем теги <sape_index> }
	$cut[^table::create[nameless]{<sape_index>	
</sape_index>	}]
	$result[^sText.replace[$cut]]
}
##########################################################################



##########################################################################
# return_links[nCount]
# Аналогично функции SAPE_client::return_links()
# Если подряд идут несколько ссылок, то между ними выводится разделитель,
# указанный в настройках SAPE на сайте
#
# Пример использования:
#
# @main[]
# ^sape.return_links[2] ^rem{ выводит первые две ссылки }
# ^sape.return_links[]  ^rem{ выводит все оставшиеся ссылки }
#
@return_links[nCount][param;sape_links]
^try{
	$param[^hash::create[$self.hSapeParams]]
	$param.action[link]
	
	^rem{ вывод ссылок по частям }
	^rem{ $iCurrentOffset - сколько ссылок уже выведено }
	^if(def $nCount && ^nCount.int(0) > 0){
	  $param.count($self.iCurrentOffset+^nCount.int(0))
	  $param.offset[$self.iCurrentOffset]
	  ^self.iCurrentOffset.inc(^nCount.int(0))
	}{
	  $param.count[0]
	  $param.offset[$self.iCurrentOffset]
	  ^self.iCurrentOffset.inc(999999)
	}
	
	$sape_links[^file::load[text][$self.sSape2ParserPath][
		$.timeout($self.iHttpTimeout)
		$.method[POST]
		$.form[$param]
	]]
	
	$result[^untaint{$sape_links.text}]
}{
	$exception.handled(true)
	$result[]
}
##########################################################################



##########################################################################
# return_links_table[]
# Возвращает таблицу с одной колонкой piece
# Там лежат ссылки без разделителя!!!
# Разделитель указывается в настройках SAPE на сайте.
# Растоятельно рекомендую указывать разделитель,
# который не может встретиться в тексте и коде ссылки!
# Хороший разделитель "<br>"
#
# Пример использования:
#
# @main[]
# $links[^sape.return_links_table[]]
# ^if(^links.count[] > 0){
#   <h1>Продажные ссылки:</h1>
#	  <ul>
#	    ^links.menu{ <li>$links.piece</li> }
#	  </ul>
# }
#
@return_links_table[][links;delimiter]
$delimiter[^self._delimiter[]]
$links[^self.return_links[]]
$result[^links.split[$delimiter;lv]]
##########################################################################



##########################################################################
# служебная функция
# получает разделитель у скрипта SAPE
@_delimiter[]
^try{
	$param[^hash::create[$self.hSapeParams]]
	$param.action[delimiter]
	
	$sape_links[^file::load[text][$self.sSape2ParserPath][
		$.timeout($self.iHttpTimeout)
		$.method[POST]
		$.form[$param]
	]]
	
	$result[^untaint{$sape_links.text}]
}{
	$exception.handled(true)
	$result[]
}
##########################################################################
Файл sape2parser.php (сохраните в "секретной" директории)
<?
##########################################################################
# Довесок к парсерному классу для работы со скриптами SAPE
# Версия 0.1 - 22.11.2007
#
# (c) StopDesign - http://forum.sape.ru/member.php?u=2245
##########################################################################


# SAPE user hash
define('_SAPE_USER', isset($_POST['sape_user']) ? $_POST['sape_user'] : '');

# Список параметров инициализации классов SAPE, которые передаются в sape.php
# Передаю по списку, чтобы не закинуть туда чего-нибудь лишнее...
$param = array('version',
							 'verbose',
							 'charset',
							 'server_list',
							 'cache_lifetime',
							 'cache_reloadtime',
							 'error',
							 'host',
							 'request_uri',
							 'multi_site',
							 'fetch_remote_type',
							 'socket_timeout',
							 'force_show_code',
							 'is_our_bot',
							 'debug',
							 'db_file');

$o = array();
foreach($param as $name) {
	if(isset($_POST[$name])){ $o[$name] = $_POST[$name]; }
}

# Кукисы
$_COOKIE['sape_cookie'] = isset($_POST['sape_cookie']) ? $_POST['sape_cookie'] : '';
$_COOKIE['sape_debug']  = isset($_POST['sape_debug'])  ? $_POST['sape_debug']  : '';

require_once($_SERVER['DOCUMENT_ROOT'].'/'._SAPE_USER.'/sape.php');

# контекст или ссылки или еще что...
$action = isset($_POST['action']) ? $_POST['action'] : '';
$text = isset($_POST['text']) ? stripslashes($_POST['text']) : '';
switch ($action) {
	case 'page':
		$sape_context = new SAPE_context($o);
		# функция контекста принимает в качестве параметра
		# весь код страницы и возвращает обработанную версию
		echo $sape_context->replace_in_page($text);
    break;
	case 'text':
		$sape_context = new SAPE_context($o);
		# функция контекста принимает в качестве параметра
		# кусок текста (без тэгов <sape_index>) и возвращает обработанную версию
		echo $sape_context->replace_in_text_segment($text);
    break;
	case 'link':
		$sape_client = new SAPE_client($o);
		# возвращает блок ссылок
		$count = ( isset($_POST['count']) && $_POST['count'] > 0 ) ? $_POST['count'] : null;
		$offset = ( isset($_POST['offset']) && $_POST['offset'] > 0 ) ? $_POST['offset'] : 0;
		echo $sape_client->return_links($count, $offset);
    break;
	case 'delimiter':
    $sape_client = new SAPE_client($o);
    echo $sape_client->_links_delimiter;
    break;
}
	

?>
Простейший пример:
@USE
sape.p


@auto[]
$sape[^sape::create[ВАШ_ХЭШ_КОД]]


@main[]
<p>Тут я не буду продавать никаких ссылок.</p>
<p>^sape.replace_in_text_segment[А в этом тексте контекстные ссылки будут продаваться.]</p>

<h2>А это обычные рекламные ссылки:</h2>
^sape.return_links[]
Всё кучей можно скачать тут: http://www.stopdesign.ru/sape.zip