Вот примерно такие всхлипы и стоны мне часто приходится слушать от своих заказчиком....точней приходилось когда я увлекался прикладным фрилансом (под прикладным я понимаю заказы на разработку скриптов программ)О Божечки, такой обалденный блог сервис но у него нет апи а мне очень хочется организовать туда кросспостинг со своего сайта!!! Господа программисты хелп!!!!
И мне обычно таким горе-киберсантам хочется сказать только одно:
Господа интернет-бизнесмены!!! Мне вот вообще интересно как у вас получается что то зарабатывать в интернете не имея элементарных азов web-программирования???
Ну ладно у каждого свои секреты а я по натуре человек добрый поэтому приоткрою вам сирым завесу тайны в этом вопросе.
Современный интернет бизнес это сплошная автоматизация со стороны технологий и системный анализ со стороны технологов - тоесть какждого из нас.
И реализация технологий эмуляции браузера очень важна: к примеру нам необходимо заходить на какой то www-сервис и брать от туда информацию а сервис требует авторизацию с куками и прочей атрибутикой. Браузер то наш справится ему не в первой а вот наше ПО придется научить.
В php самое оптимальное решение в таких ситуациях это cURL сейчас он есть на подавляющем большинстве хостингов (даже в некоторых бесплатных есть). Но сам по себе cURL для многих особенно начинающих программистов не совсем понятен потому как сам по себе является включением сишной библиотеки в php интерпретатор. Но существует такая замечательная вещь как процедурное программирование. Это когда все нетривиальные моменты кода мы заключаем в функции процедуры (когда точно знаем что подать на вход и что получить на выходе) после чего спокойно прописываем вызов функции там где надо подавая ей на вход то что надо - просто и изящно не правда ли? Тоже самое можно сделать и с курлом чтобы с ним было проще работать. Итак у нас задача сэмулировать браузер.
Давайте разобьем сей процесс на элементарные действия чтобы на каждое написать функцию.
1)POST-запрос это когда мы передаем данные с какой либо формы на какой либо обработчик, при такой передаче данные помещаются в специальный http контейнер - но это нам знать не нужно курл сам определить как скомпоновать так действие определили тоесть нам надо написать функциюю post-передачи данных а вообще было бы супер если бы эта функция могла бы передавать данные попутно могла работать через прокси сохранять куки ну и передавать юзер-агент полноценный браузер епта!!!! сказали - делаемPHP код:тут все просто :function post_content ($url,$postdata,$proxy="") {
$uagent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt($ch, CURLOPT_USERAGENT, $uagent);
if($proxy!="")
{
curl_setopt($ch, CURLOPT_PROXY, "$proxy");
}
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_COOKIEJAR,$_SERVER['DOCUMENT_ROOT']."/newser/coo.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE,$_SERVER['DOCUMENT_ROOT']."/newser/coo.txt");
$content = curl_exec($ch);
$err = curl_errno($ch);
$errmsg = curl_error($ch);
$header = curl_getinfo($ch);
curl_close($ch);
$header['errno'] = $err;
$header['errmsg'] = $errmsg;
$header['content'] = $content;
return $header;
}
параметр url - здесь мы пишем адрес куда передавать данные параметр
postdata - здесь мы пишем что хотим передать параметр proxy благодаря вот такому выверту
$proxy="" мы сделали необязательным потому что не всегда он нужен но при желании его всегда можно указать.
теперь само тело функции:
$uagent - ну это понятно браузер под который мы маскируемся я его в параметры не заводил но при желании всегда можно это сделать а вот это:PHP код:мы определили место положение файла куда будем записывать куки это очень важно ведь благодаря такому механизму можно записанные куки использовать при заходе на сайт get запросом при помощи get функцииcurl_setopt($ch, CURLOPT_COOKIEJAR,$_SERVER['DOCUMENT_ROOT']."/coo.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE,$_SERVER['DOCUMENT_ROOT']."/coo.txt");
2)GET запрос - это когда мы просто открываем страницу како то сайтатоесть нам нужна GET функцияPHP код:тут все просто - 2 параметр url это адрес куда хотим попасть и proxy тоже по желанию все остальное по сути так же как и с POST думаю обьяснять излишнеfunction get_content($url,$postdata,$proxy="") {
$uagent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt($ch, CURLOPT_USERAGENT, $uagent);
if($proxy!="")
{
curl_setopt($ch, CURLOPT_PROXY, "$proxy");
}
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT']."/newser/coo.txt");
curl_setopt($ch, CURLOPT_COOKIEFILE,$_SERVER['DOCUMENT_ROOT']."/newser/coo.txt");
$content = curl_exec($ch);
$err = curl_errno($ch);
$errmsg = curl_error($ch);
$header = curl_getinfo($ch);
curl_close($ch);
$header['errno'] = $err;
$header['errmsg'] = $errmsg;
$header['content'] = $content;
return $header;
}
Ну а теперь разберемся с выходными данными они у нас представлены в виде массива
$header['errno'] - тут находятсявсе ошибки которые посыпались при работе с cURL в виде цифр $header['errmsg'] - то же только в виде сообщений ну и то что нам конкретно нужно от функций
$header['content'] - результат обработки страницы при работе наших функций так саму теорию изложил теперь давайте перейдем к практике. Давайте в качестве эксперимента попробуем авторизироваться на каком нибудь простеньком сервисе...к примеру blog.ru при помощи наших функцийPHP код:1 строчка посылаем POST запрос с логином и паролем на страницу авторизации и функция автоматом сохраняет куки в файл$str=post_content ('http://blog.ru/login','backurl=&login=vash_login&password=vash_parol&remember=on','');
$str=get_content('http://blog.ru/post_insert_form','');
echo $str['content'];
2 строчка заходим на главную страницу и так как функция GET использует тот же файл для кук что и пост то заходим мы уже залогиненные
3 строчка выводим ответ сервера на страницу благодаря специальной настройки в теле функций ответ у нас содержит только вывод содержимого без заголовков сервера для чистоты но это простой пример.
Чаще всего.. к примеру на том же яндкесе в коде формы авторизации присутствует какое нибудь hidden поле содержащее ключ сессии.
Это такая лайтовая защита от роботов. И чтобы валидно авторизироваться нашему скрипту необходимо сначала зайти на страницу формы авторизации покопаться в html коде чтобы взять этот самый ключ и уже с ним соваться на страницу обработчик.
Для этого нам поможет библиотека simple_html_dom ну по крайней мере я ей пользуюсь и мне она жутко нравится.
скачать ее можно отсюда к примеру:
http://sourceforge.net/projects/simplehtmldom/
яркий пример работы с ней на странице есть вот такое поле:Код HTML:мы взяли содержание страницы в переменную $str и нам надо выделить значение этого поля<input type="hidden" name="primer" value="chto to tam">
1) подключаем библиотекуPHP код:2)преобразуем текст страницы в dom объект для работы с нимinclude("simple_html_dom.php");
PHP код:3)Находим значение ключа$html=str_get_html($str);
PHP код:Все теперь значение ключа находится в переменной $key и мы можем запихнуть его в пост запрос$key=$html->find('input[name="primver"]')->value;
Ну а теперь итогом моей статьи будут две функции кросспостинга
1)кросспостинг в сервис blog.ru
2) кросспостинг в Закладки яндекс.руPHP код:function get_avtoriz($str)
{
$html=str_get_html($str);
foreach($html->find('input[name=idkey]') as $e)
{
$idcey=$e->value;
}
return $idcey;
}
function parse_y($str)
{
$html=str_get_html($str);
foreach($html->find('input[name=feed_id]') as $e)
{
$ext['feed_id']=$e->value;
}
foreach($html->find('input[name=sk]') as $e)
{
$ext['sk']=$e->value;
}
return $ext;
}
///
function post_ss_ya($title,$content,$kewords,$link)
{
$title=urlencode(iconv("windows-1251","utf-8",$title));
$content=urlencode(iconv("windows-1251","utf-8",$content));
$kewords=urlencode(iconv("windows-1251","utf-8",$kewords));
$link=urlencode(iconv("windows-1251","utf-8",$link));
$str=post_content('http://passport.yandex.ru/passport?mode=auth','');
$idkey=get_avtoriz($str['content']);
$str=post_content('http://passport.yandex.ru/passport?mode=auth','from=passport&idkey='.$idcey.'&display=page&login=vash_login&passwd=vash_parol&twoweeks=&','');
$str=get_content('http://zakladki.yandex.ru','');
$str=post_content('http://zakladki.yandex.ru/newlink.xml?folder_id=0','ajax=1');
$html=str_get_html($str['content']);
foreach($html->find('input[name="sk"]') as $e)
{
$sk=$e->value;
}
$req="ajax=1&descr=$content&folder_id=0&from=bookmarks_web&name=$title&newfolder=&sk=$sk&tags=$kewords&url=$link";
$str=post_content('http://zakladki.yandex.ru/addlink.xml',$req);
$fh=fopen($_SERVER['DOCUMENT_ROOT']."/newser/coo.txt","w");
fwrite($fh,'');
fclose($fh);
return true;
}
///
function parse_br($str)
{
$html=str_get_html($str);
foreach($html->find('input[name="_post_form_key"]') as $e)
{
$ext['_post_form_key']=$e->value;
}
foreach($html->find('input[name="postRow[id_blog]"]') as $e)
{
$ext['id_blog']=$e->value;
}
foreach($html->find('input[name="postRow[id_draft]"]') as $e)
{
$ext['id_draft']=$e->value;
}
foreach($html->find('input[name="postRow[post_time_day]"]') as $e)
{
$ext['post_time_day']=$e->value;
}
foreach($html->find('input[name="postRow[post_time_hours]"]') as $e)
{
$ext['post_time_hours']=$e->value;
}
foreach($html->find('input[name="postRow[post_time_minutes]"]') as $e)
{
$ext['post_time_minutes']=$e->value;
}
foreach($html->find('input[name="postRow[post_time_seconds]"]') as $e)
{
$ext['post_time_seconds']=$e->value;
}
return $ext;
}
//
function post_br($title,$content,$link,$img="")
{
$titl=urlencode(iconv("windows-1251","utf-8",$title));
$text=urlencode(iconv("windows-1251","utf-8",$content));
$str=post_content ('http://blog.ru/login','backurl=&login=vash_login&password=vash_parol&remember=on','');
$str=get_content('http://blog.ru/post_insert_form','');
$vrs=parse_br($str['content']);
$req="_post_form_key={$vrs['_post_form_key']}&editor_auto_save_checkbox=1&message=&permissions[BLOG.COMMENT]=all&permissions[BLOG.READ]=all&postRow[automatic_time]=1&postRow[body]=$text&postRow[default_access]=1&postRow[editor_mode]=wysiwyg&postRow[id_blog]={$vrs['id_blog']}&postRow[id_draft]=new&postRow[post_time_day]={$vrs['post_time_day']}&postRow[post_time_hours]={$vrs['post_time_hours']}&postRow[post_time_minutes]={$vrs['post_time_minutes']}&postRow[post_time_month]={$vrs['post_time_month']}&postRow[post_time_seconds]={$vrs['post_time_seconds']}&postRow[post_time_year]={$vrs['post_time_year']}&postRow[tags]=&postRow[title]=$titl&postRow[use_tipograph]=1";
$str=post_content('http://blog.ru/post_save',$req,'');
$fh=fopen($_SERVER['DOCUMENT_ROOT']."/newser/coo.txt","w");
fwrite($fh,'');
fclose($fh);
return true;
}
Эмуляция браузера или кросспостинг туда где нет api
(Ответов: 4, Просмотров: 3441)
- 17.12.2013 13:20Студент


- Регистрация: 13.09.2011
- Сообщений: 64
- Репутация: 23
Последний раз редактировалось Kenars; 17.12.2013 в 13:32.
Спасибо сказали:
- 17.12.2013 13:46
- 17.12.2013 13:57
aidem, к чему ваша реплика вообще? Нам представили конкретный пример работы, если вы считаете, что ваш вариант лучше - опубликуйте свой код, чтобы люди смогли сравнить достоинства и недостатки каждого способа:)
Спасибо сказали:
Sabirchik(17.12.2013), - 17.12.2013 14:25
Тут проблема с яваскриптами будет, сейчас много где используется,
эмуляция кастрированная получается
Обязательно надо использовать в конце функцииPHP код:а то память будет есть немерено.$html->clear();
- 18.12.2013 22:12Студент


- Регистрация: 13.09.2011
- Сообщений: 64
- Репутация: 23
mescalito, Ну вот такие детали постигаются уже методом проб и ошибок))))
А если кроме шуток да вы совершенно правы по поводу данного метода. Но в данном примере это ни к чему мы не слишком много кода парсим, данный метод ощутимо помогает если нам к примеру нужно за один вызов кода перелопатить как минимум 10 html документов тогда да с вами согласен.
---------- Сообщение добавлено 21:12 ---------- Предыдущее 21:05 ----------
aidem, Изящней и мощнее не Python - scrapy+selenium+PhantomJS, а четкие и грамотные программы, дающие пользу людям и облегчающие их труд. Абсолютно нет ни какой разницы на каком языке писать уважаемый хорошо написанная и отлаженная программа на php будет в тысячу раз юзабельней и оптимизированней чем хреновая но на том же Python, а все эти холивары - разговоры в пользу бедных. Нету ни какой разницы на каком языке писать я пишу на php только потому что он есть на подавляющем большинстве хостингов по умолчанию и без всякого гемора и за 100 рублей в месяц максимум, было бы тоже самое с питоном писал бы на нем от души. А покупать VPS или сервер только ради того чтобы поставить питон и всем хвастаться какой у меня красивый код в приложениях это маразм.
Тэги топика:
Похожие темы
| Темы | Раздел | Ответов | Последний пост |
|---|---|---|---|
Правда ли то что ссылка закрытая в nofollow, не туда не сюда? | Общие вопросы поисковой оптимизации | 31 | 30.12.2013 18:03 |
Обзоры на Яндекс Маркет - кто туда попадал? | Yandex | 3 | 28.06.2013 14:29 |
Хочу в Гомель(РБ), есть кто от туда? | Оффтоп и свободные темы | 7 | 30.05.2013 09:39 |
Перенос домена, не туда куда нужно. | Прочее | 7 | 13.03.2013 00:10 |
Кто еще не был на Интеравто? И не зачем туда идти... | Прочее | 1 | 26.08.2011 14:36 |




