XML-RPC постинг через прокси
13 Май 2011 Автор: adminВсем алоха! Итак, сегодняшний пост я хочу полностью посвятить кодингу, но сначала немного предыстории.
Появилась у меня тут необходимость наполнить контентом большое количество блогов WPMU. WordPress Multiple User, если кто не в курсе. Постов эдак по 400-500 в каждый, с отложеной публикацией естественно
Начал искать готовое решение, и в принципе нашел его. Им оказался класс для работы с WordPress блогами методом XML-RPC – WP-poster. Кстати, его автор – Charnad – уже свалил из Рашки, в Гермашку
По коду возникли некоторые вопросы, пообщался с ним по аське – вполне адекватный человек, приятно было поговорить. Класс можно найти на его блоге, с разъяснениями и мануалом.
Так вот: wp-poster – это WordPress-обертка для другого класса – ixr_client, который и осуществляет все XML-RPC запросы. Скачав все это добро, покурив мануалы и заметки автора – я адаптировал скрипт под свои нужды. Однако чуть ли не в самый последний момент стрельнула мысль – а ведь нужно прикрутить прокси! А то как-то спамить в блоги, пусть и свои, да еще массово – это ж никакой хостер не выдержит и заблокирует IP!
Полез копаться в коде.. И о ужас! Для отсылки запросов ixr_client использует сокеты!
Хочется отметить, что я привык юзать CURL, да и работа с проксями у него реализована проще. Немного поколдовав, класс был переписан под использование CURL вместо сокетов – и теперь можно было спокойно прикрутить прокси. Что я и сделал.
А нужно было всего-то переделать: метод query в классе IXR_Client. Я внес необходимые изменения и кусок кода, который отвечает за отправку запроса, принял следующий вид:
$ch = curl_init("http://".$this->server.$this->path);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$to = $this->timeout ? $this->timeout : 30;
curl_setopt($ch, CURLOPT_TIMEOUT, $to);
curl_setopt($ch, CURLOPT_USERAGENT, $this->useragent);
if (@$this->proxy) { curl_setopt($ch, CURLOPT_PROXY, $this->proxy); }
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
$result = curl_exec($ch);
curl_close($ch);
Что тут делается, по порядку: 1) Инициализируем сессию curl с адресом нашего блога; 2) включаем заголовки в ответ; 3) хотим в переменной видить «тело» ответа; 4) ответ будет возвращен в переменную, а не выведен юзеру на экран; 5) определяем таймаут запроса: установленный пользователем или 30 сек. по дефолту; 6) устанавливаем таймаут для запроса; 7) устанавливаем юзерагента; 8.) если используем прокси-сервер – устанавливаем его для текущей сессии; 9+10+11+12) устанавливаем доп.параметры для POST-запроса; 13) отправляем запрос и получаем ответ в переменную; 14) закрываем сессию curl.
Ну и метод для установки текущего прокси-сервера:
function SetProxy($proxy = false) {
$this->proxy = $proxy;
return true;
}
Вот в принципе и вся модификация, разве что подправил обработку ошибок, объявление переменных и еще по мелочи. Ссылка на модифицированный класс – внизу страницы.
Далее, в самом скрипте была реализована «логика» постинга:
- перебираем все блоги;
- в каждый блог постим нужное кол-во новостей;
- если новость не удается разместить из-за текущего прокси-сервера – пытаемся еще N раз (у меня установлено 2 попытки). По достижению лимита прокси сервер сменяется на следующий из списка;
- если новость не удается отправить после M количества попыток – берется следующая новость, устанавливается новый прокси и все начинается с пункта 3
Под мои нужды я установил N=2, M=5 – т.е. это будет работать так: установили прокси, отправили новость, если вернулась ошибка – отправляем второй раз. Если опять ошибка – меняем прокси, и пробуем отправить еще два раза. Снова ошибка – в третий раз меняем прокси на следующий по списку. Если и третий прокси-сервер вернул ошибку – пропускаем новость, берем следующую и начинаем все сначала.
Конечно же, как только новость отправлена и ошибки не возникает – скрипт переходит к размещению следующей новости, с тем же прокси-сервером.
Следует отметить, что этот класс поможет постить не только в WP-блоги, но и в другие, которые поддерживают технологию XML-RPC.
Вот так у меня получилось реализовать кросспостинг во множество блогов. Идеально для создания сетки сателитов. Осталось купить (или нарегать) фри-хостов и подобрать задержки для постинга (все таки у хостера нервы не железные). Возможно, придется реализовать постинг «в разброс»: т.е. постить не 1000 новостей в один блог, потом 1000 в следующий и т.д, а скажем одну новость – в первый блог, еще одну – в пятый, следующую в сотый, и т.д. пока все блоги не будут наполнены новостями. Также наверно придется прикручивать многопоточность – ибо блогов будет ну очень много, и пока все наполняться – состариться можно будет
О результатах эксперимента отпишуть по завершении оного.
Ну и конечно – ты можешь скачать получившийся у меня класс ixr_client c возможностью отправки запросов через прокси, используя библиотеку CURL.
А в это время: Ленивый забил на майский финстрип, Шакин пишет про Гугл и Адсенс, Терехов – про заинтересовавшую меня в последнее время внутреннюю оптимизацию, а Антон доделал сервис анализа сайтов – что я тоже давно хочу сделать, но все никак.. У меня же просел доход в сапе – Яндекс выкинул из индекса сателит в 15k страниц, но понемногу возвращает – я уж подумал что АГС, но нет – в прошлый Ап ЯВ вернулось 200 страниц, сегодня – уже 1000 в выдаче. Странный он какой-то. Купил несколько сайтов с ТИЦ – авось получится с ними что-нибудь
Пробую раскрутить СДЛ через вконтакт – довольно интересное занятие. Живем
