Работа с API Sape в PHP для новичков

12
elkini
На сайте с 03.07.2009
Offline
15
16863

Мой первый топик на форуме, пинайте нестрого, пожалуйста :) Поиском подобное не нашёл.

Пост предназначен для тех, кто "оптимизатор" на сапе и кому нужно быстро написать обработчик апи на php, с реальными примерами, при этом совершенно не вдаваясь в подробности. Тем, кто хочет покопаться, пост будет удобен как трамплин :)

Итак. Некоторое время назад мне понадобилось анализировать ссылки для своих проектов, купленные на Sape. Так как у Sape есть вполне приличный API (http://www.sape.ru/api_xmlrpc.php?v=extended), решил использовать его, а не парсить страницы. Забегая вперёд, скажу, что для моих целей его хватило полностью.

Долго искал готовые решения, но ничего не нашёл и написал своё (правда, используя чужие советы, найденные в интернете).

Для того, чтобы работать с API, необходима библиотека, понимающая XML-RPC (по большому счёту, вам ничего и не нужно знать об этой аббревиатуре, так как в итоге вы будете получать при запросе к сапе обычные php-массивы). Я выбрал самую легкую и простую XML-RPC for PHP - http://phpxmlrpc.sourceforge.net/.

Скачиваем архив по ссылке и распаковываем на хостинг.

Затем просто начинаем с помощью библиотеки работать с Sape.

Подключаем библиотеку (всё общение с сапой и результаты будут в уникоде):

include_once($_SERVER["DOCUMENT_ROOT"]."/xmlrpc-2.2.2/lib/xmlrpc.inc");
$GLOBALS['xmlrpc_defencoding'] = "UTF8";
$GLOBALS['xmlrpc_internalencoding'] = "UTF-8";

Создаём объект:

$client = new xmlrpc_client("/api_xmlrpc.php?v=extended", "xmlrpc.sape.ru", 80);

Если хотим видеть, что будет отвечать Сапа в ответ на наши запросы, раскомментируем строку:

//	$client->setdebug(2);

Логинимся в сапу:

$msg = new xmlrpcmsg("sape.login", array(
new xmlrpcval($login, "string"),
new xmlrpcval($password, "string"),
new xmlrpcval(true, "boolean") // шлём в md5
));

Смотрим на предпоследнюю строчку предыдущего кода: здесь указывается, что авторизация в сапу будет зашифрованным паролем, а не открытым текстом.

Я гоняю пароли между моим сервером и сапой только в md5, чего и вам советую. Для этого с помощью простецкого скрипта на php получаем из строки пароля его md5-хеш

<?
echo md5('мой-клёвый-и-секурный-пароль');
?>

и загоняем его в переменную $password.

Есть одна тонкость: иногда сапе плохо и она может не выполнить ваш запрос. Для победы этой проблемы пробуем при ошибочном результате пнуть её три раза (вероятность успеха повышается):

for($i=0;$i<3;$i++)
{
$resp=$client->send($msg);
if(!$resp->faultCode())
{
$ret = php_xmlrpc_decode($resp->value());
break;
}
sleep(1);
}

Залогинились, едем дальше. Один тонкий момент - нужно при любом запросе к сапе передавать куки, которые были получены при логине. У меня в коде это есть, можно не париться. Но всё-равно, учтите.

Сохраняем куки, полученные от Сапы:

$cookies = $resp->cookies();
$client->setcookie('SAPE', $cookies["SAPE"]["value"], $cookies["SAPE"]["path"], $cookies["SAPE"]["domain"]);

Теперь я расскажу о использовании некоторых функций API Сапы, например получении или удалении списка проектов, ваших урлов в проектах, ссылок для этих урлов.

Получаем все проекты вашего аккаунта:

$msg = new xmlrpcmsg("sape.get_projects", array(new xmlrpcval(false, "boolean")));

for($i=0;$i<3;$i++) // знакомый код, пробуем три раза, если возникают ошибки со стороны сапы
{
$val=$client->send($msg);
if(!$val->faultCode())
{
$projects = php_xmlrpc_decode($val->value());
break;
}
sleep(1); // не спешим и не ддосим любимую сапу, ждём секунду
}

В массиве $projects будут все ваши проекты. Какие внутри поля - можно посмотреть в документации API Сапы или сделать var_dump($projects);

Как получить список ваших урлов внутри отдельного проекта (в примере - для первого в списке проекта):

$msg = new xmlrpcmsg("sape.get_urls", array(
new xmlrpcval($projects[1]["id"], "int"),
new xmlrpcval(false, "boolean")
));
for($i=0;$i<3;$i++)
{
$val=$client->send($msg);
if(!$val->faultCode())
{
$project_urls = php_xmlrpc_decode($val->value());
break;
}
sleep(1);
}

В $project_urls теперь лежат все урлы для выбранного проекта.

Как теперь получить самое вкусное - ссылки для вашего сайта, которые вы напокупали в Сапе:

$msg = new xmlrpcmsg("sape.get_url_links", array(
new xmlrpcval($project_urls[1]["id"], "int"), // здесь указан первый урл, вместо единицы вставляйте нужный вам индекс
new xmlrpcval("", "string"),
new xmlrpcval("", "string"),
new xmlrpcval("", "string"),
new xmlrpcval($page, "int")
));

for($i=0;$i<3;$i++)
{
$val=$client->send($msg);
if(!$val->faultCode())
{
$url_links = php_xmlrpc_decode($val->value());
break;
}
sleep(1);
}

В массиве $url_links будут все купленные ссылки для выбранного сайта одного из выбранных проектов.

Отдельного замечания стоит переменная $page - номер страницы результатов из списка ссылок. Можно передавать ноль и на сколько помню, вернется результат со всеми ссылками, но лучше так не делать, а запрашивать небольшими порциями. Так надежнее. В одной странице, если правильно помню, выдаётся 500 результатов.

Как удалить пачку купленных ссылок:

$for_delete = array(1, 2, 3); // вместо 1, 2, 3 вбивайте полученные вами от сапы ID ссылок.
foreach($for_delete as $key => $value)
{
$deleted_IDs[] = new xmlrpcval($value, 'int');
}
$msg = new xmlrpcmsg("sape.placements_delete", array(new xmlrpcval($deleted_IDs, "array")));

Весь приведённый код - реальный, я только убрал лишнее типа сохранения в базу и поменял имена переменных и пути, надеюсь, нигде не опечатался :)

А как использовать полученные знания - думаю, вы догадаетесь сами.

Если что-то осталось непонятным или неясно, как использовать какую-то функцию или вы заметили ошибки - спрашивайте и комментируйте.

Спасибо за внимание.

Как работать с API Сапы на PHP (/ru/forum/378776) Я анализирую статистику в Вебвизоре (http://webwisor.ru/) и Woopra (http://www.woopra.com/features/).
Xover
На сайте с 22.05.2006
Offline
101
#1
Как удалить пачку купленных ссылок:
... sape.placements_delete ...

Странно, но это не описано на сайте сапы http://xmlrpc.sape.ru/api_xmlrpc.php

Где об этом методе написано? Есть какие-то скрытые методы?

Покупаю внутренние PR4 на sape.ru (http://www.sape.ru/r.f3cfb23480.php)
elkini
На сайте с 03.07.2009
Offline
15
#2

Это написано в расширенном варианте API, ссылка в начале поста - http://www.sape.ru/api_xmlrpc.php?v=extended

R
На сайте с 03.04.2008
Offline
90
#3

это закрытый тестовый интерфейс с расширенными функциями, вроде как его уже прикрыли для масс после слишком интенсивного пользования для парсинга базы. На форуме сапы писали что функции теперь доступны только ограниченому числу пользователей.

ICQ: 577-662-540 продвижение сайтов за еду (/ru/forum/480944) продвину Ваш сайт за 3000/мес. Портфолио по запросу
elkini
На сайте с 03.07.2009
Offline
15
#4

эвона как

я использую расширенный интерфейс довольно давно и ничего не делал для того, чтобы попасть в это ограниченное число пользователей

A
На сайте с 07.11.2006
Offline
87
#5

с кукс что-то намудрили. авторизация работает. а остальные функции пишут "Please, login"

надо было просто убрать path и domain

L2
На сайте с 24.07.2009
Offline
0
#6

Привет. Ознакомился с твоими примерчиками. Спасибо, помогло.

Написал webservice на .NET. для работы с этой системой. Заметил одну странность при работе с API САПЫ.

При вызове метода, например, по возврату наименований всех проектов (sape.get_projects) при вводе false получаю список 56-ти проектов. В то время, как через Web интерфейс вижу те, котороые в работе и их 25.

Вот интересно, какого ... Sape мне выдает удаленные ранее проекты?

И еще одна неприятная деталь:

- при получении url проектов (sape.get_urls) выскакивает ошибка 500 - "Неправильный ID проекта". Прошелся отладчиком - ID все те, какие в SAPE стоят. И эти проекты в работе у оптимизатора находятся.

Откуда такие глюки, как думаешь?

maxivanov
На сайте с 25.07.2006
Offline
58
#7

liho26, перепроверь несколько раз, если все так же - напишы на форуме сапы, вроде адекватно реагируют.

Главное не в том что ты делаешь, а в том как ты это делаешь!
L2
На сайте с 24.07.2009
Offline
0
#8
maxivanov:
liho26, перепроверь несколько раз, если все так же - напишы на форуме сапы, вроде адекватно реагируют.

Уже который день наблюдаю. Сегодня написал на форуме SAPE. Пока тишина в ответ....

elkini
На сайте с 03.07.2009
Offline
15
#9
liho26:
При вызове метода, например, по возврату наименований всех проектов (sape.get_projects) при вводе false получаю список 56-ти проектов. В то время, как через Web интерфейс вижу те, котороые в работе и их 25.
Вот интересно, какого ... Sape мне выдает удаленные ранее проекты?

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

liho26:
И еще одна неприятная деталь:
- при получении url проектов (sape.get_urls) выскакивает ошибка 500 - "Неправильный ID проекта". Прошелся отладчиком - ID все те, какие в SAPE стоят. И эти проекты в работе у оптимизатора находятся.
/?
Откуда такие глюки, как думаешь?

а если попробовать пхпшным кодом с упомянутой в посте библиотекой? Возможно, обрабочик XML в дотнетовском приложении общается с сапой не так, как она того ждет.

liho26:
Уже который день наблюдаю. Сегодня написал на форуме SAPE. Пока тишина в ответ....

Все-же предполагаю, что надо убедиться в верности работы с XML со стороны дотнетовской реализации (никогда не пробовал, могу ошибаться). На моих текущих сервисах описанные в посте методы работают по прежнему.

elkini добавил 25.07.2009 в 03:55

Сапа поднялась, посмотрел в доки.

Да, точно, надо указывать явно, показывать удаленные проекты или нет.

sape.get_projects([(boolean) show_deleted]) 
L2
На сайте с 24.07.2009
Offline
0
#10
elkini:


а если попробовать пхпшным кодом с упомянутой в посте библиотекой? Возможно, обрабочик XML в дотнетовском приложении общается с сапой не так, как она того ждет.


Все-же предполагаю, что надо убедиться в верности работы с XML со стороны дотнетовской реализации (никогда не пробовал, могу ошибаться). На моих текущих сервисах описанные в посте методы работают по прежнему.

elkini добавил 25.07.2009 в 03:55
Сапа поднялась, посмотрел в доки.
Да, точно, надо указывать явно, показывать удаленные проекты или нет.

sape.get_projects([(boolean) show_deleted]) 

Вся прелесть в том, что указываю передаваемые параметры согласно документации. Если с SAPE обращаться не так, как она того ждет - она вообще ничего не возвращает. Матерится ошибками о том, что "такая функция на сервере не существует".

PHP-шным кодом проверить не смогу. У меня Winforms (Читай - windows приложение) и webservice. Короче, трехзвенка.

Что касается XML-RPC, у .NET нет своих встроенных механизмов работы по этому протоколу (Microsoft продвигает SOAP). Использую библиотеку, разработанную Charles Cook (Чарли Куком). Эта библиотеа реализует все стандарты передачи, приема и обработки данных XML-RPC. На этой библиотеке работают почти все разработчики .NET

Еще одно наблюдение: удаленные ранее проекты SAPE стала возвращать после глобального сбоя, который был со среды на четверг. До этого все работало нормально.

Ну и относительно "правильности" работы XML в .NET. Поверь, работает корректно и правильно. Все передаваемые и принимаемые данные отслеживаю через HTTPAnalyzer. Приходит тот набор данных, который должен приходить :)

Ну и в догонку. SAPE всегда отключается в 3 часа ночи. На сколько часов - не знаю. Я до 5 однажды ждал - так и не заоаботала...

С уважением...

liho26 добавил 25.07.2009 в 10:42

Да, и вот что еще хотел спросить. Какой функцией можно посмотреть данные по новым заявкам?

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий