| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
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