Эмуляция браузера или кросспостинг туда где нет api

(Ответов: 4, Просмотров: 3354)
  1. Студент
    • Регистрация: 14.09.2011
    • Сообщений: 64
    • Репутация: 23
    О Божечки, такой обалденный блог сервис но у него нет апи а мне очень хочется организовать туда кросспостинг со своего сайта!!! Господа программисты хелп!!!!
    Вот примерно такие всхлипы и стоны мне часто приходится слушать от своих заказчиком....точней приходилось когда я увлекался прикладным фрилансом (под прикладным я понимаю заказы на разработку скриптов программ)

    И мне обычно таким горе-киберсантам хочется сказать только одно:
    Господа интернет-бизнесмены!!! Мне вот вообще интересно как у вас получается что то зарабатывать в интернете не имея элементарных азов 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($chCURLOPT_URL$url);
      
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
      
    curl_setopt($chCURLOPT_HEADER0);
      
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
      
    curl_setopt($chCURLOPT_ENCODING"");
      
    curl_setopt($chCURLOPT_USERAGENT$uagent);
      if(
    $proxy!="")
      {
      
    curl_setopt($chCURLOPT_PROXY"$proxy");
      }
      
    curl_setopt($chCURLOPT_TIMEOUT120);
      
    curl_setopt($chCURLOPT_FAILONERROR1);
      
    curl_setopt($chCURLOPT_AUTOREFERER1);
      
    curl_setopt($chCURLOPT_POST1);
      
    curl_setopt($chCURLOPT_POSTFIELDS$postdata);
      
    curl_setopt($chCURLOPT_COOKIEJAR,$_SERVER['DOCUMENT_ROOT']."/newser/coo.txt");
      
    curl_setopt($chCURLOPT_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 код:
      curl_setopt($chCURLOPT_COOKIEJAR,$_SERVER['DOCUMENT_ROOT']."/coo.txt"); 
    curl_setopt($chCURLOPT_COOKIEFILE,$_SERVER['DOCUMENT_ROOT']."/coo.txt"); 
    мы определили место положение файла куда будем записывать куки это очень важно ведь благодаря такому механизму можно записанные куки использовать при заходе на сайт get запросом при помощи get функции
    2)GET запрос - это когда мы просто открываем страницу како то сайтатоесть нам нужна GET функция
    PHP код:
    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($chCURLOPT_URL$url);
      
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
      
    curl_setopt($chCURLOPT_HEADER0);
      
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
      
    curl_setopt($chCURLOPT_ENCODING"");
      
    curl_setopt($chCURLOPT_USERAGENT$uagent);
      if(
    $proxy!="")
      {
      
    curl_setopt($chCURLOPT_PROXY"$proxy");
      }
      
    curl_setopt($chCURLOPT_TIMEOUT120);
      
    curl_setopt($chCURLOPT_FAILONERROR1);
      
    curl_setopt($chCURLOPT_AUTOREFERER1);
      
    curl_setopt($chCURLOPT_COOKIEJAR$_SERVER['DOCUMENT_ROOT']."/newser/coo.txt");
      
    curl_setopt($chCURLOPT_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;

    тут все просто - 2 параметр url это адрес куда хотим попасть и proxy тоже по желанию все остальное по сути так же как и с POST думаю обьяснять излишне
    Ну а теперь разберемся с выходными данными они у нас представлены в виде массива
    $header['errno'] - тут находятсявсе ошибки которые посыпались при работе с cURL в виде цифр $header['errmsg'] - то же только в виде сообщений ну и то что нам конкретно нужно от функций
    $header['content'] - результат обработки страницы при работе наших функций так саму теорию изложил теперь давайте перейдем к практике. Давайте в качестве эксперимента попробуем авторизироваться на каком нибудь простеньком сервисе...к примеру blog.ru при помощи наших функций
    PHP код:
    $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']; 
    1 строчка посылаем POST запрос с логином и паролем на страницу авторизации и функция автоматом сохраняет куки в файл
    2 строчка заходим на главную страницу и так как функция GET использует тот же файл для кук что и пост то заходим мы уже залогиненные
    3 строчка выводим ответ сервера на страницу благодаря специальной настройки в теле функций ответ у нас содержит только вывод содержимого без заголовков сервера для чистоты но это простой пример.
    Чаще всего.. к примеру на том же яндкесе в коде формы авторизации присутствует какое нибудь hidden поле содержащее ключ сессии.
    Это такая лайтовая защита от роботов. И чтобы валидно авторизироваться нашему скрипту необходимо сначала зайти на страницу формы авторизации покопаться в html коде чтобы взять этот самый ключ и уже с ним соваться на страницу обработчик.

    Для этого нам поможет библиотека simple_html_dom ну по крайней мере я ей пользуюсь и мне она жутко нравится.
    скачать ее можно отсюда к примеру:
    http://sourceforge.net/projects/simplehtmldom/
    яркий пример работы с ней на странице есть вот такое поле:
    Код HTML:
    <input type="hidden" name="primer" value="chto to tam">
    мы взяли содержание страницы в переменную $str и нам надо выделить значение этого поля
    1) подключаем библиотеку
    PHP код:
    include("simple_html_dom.php"); 
    2)преобразуем текст страницы в dom объект для работы с ним
    PHP код:
    $html=str_get_html($str); 
    3)Находим значение ключа
    PHP код:
    $key=$html->find('input[name="primver"]')->value
    Все теперь значение ключа находится в переменной $key и мы можем запихнуть его в пост запрос
    Ну а теперь итогом моей статьи будут две функции кросспостинга

    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;

    Последний раз редактировалось Kenars; 17.12.2013 в 14:32.
    • 4

    Спасибо сказали:

    ArhStrAngeR(17.12.2013), OKyJIucT(17.12.2013), Orcstation(17.12.2013), TbIKBA(17.12.2013),
  2. Orange Аватар для aidem
    • Регистрация: 11.11.2010
    • Сообщений: 502
    • Репутация: 127
    • Webmoney BL: ?
    Цитата Сообщение от Kenars Посмотреть сообщение
    просто и изящно не правда ли?
    Но вот Python - scrapy+selenium+PhantomJS изящней и мощнее
    • 0
  3. Sunshine reggae Аватар для OKyJIucT
    • Регистрация: 02.09.2011
    • Сообщений: 3,240
    • Репутация: 1830
    • Webmoney BL: ?
    aidem, к чему ваша реплика вообще? Нам представили конкретный пример работы, если вы считаете, что ваш вариант лучше - опубликуйте свой код, чтобы люди смогли сравнить достоинства и недостатки каждого способа:)
    • 1

    Спасибо сказали:

    Sabirchik(17.12.2013),
  4. Студент Аватар для mescalito
    • Регистрация: 30.09.2009
    • Сообщений: 71
    • Репутация: 26
    Тут проблема с яваскриптами будет, сейчас много где используется,
    эмуляция кастрированная получается

    Обязательно надо использовать в конце функции
    PHP код:
    $html->clear(); 
    а то память будет есть немерено.
    Money Making: earn up to 60% rev share or $50CPA
    • 0
  5. Студент
    • Регистрация: 14.09.2011
    • Сообщений: 64
    • Репутация: 23
    mescalito, Ну вот такие детали постигаются уже методом проб и ошибок))))
    А если кроме шуток да вы совершенно правы по поводу данного метода. Но в данном примере это ни к чему мы не слишком много кода парсим, данный метод ощутимо помогает если нам к примеру нужно за один вызов кода перелопатить как минимум 10 html документов тогда да с вами согласен.

    ---------- Сообщение добавлено 21:12 ---------- Предыдущее 21:05 ----------

    aidem, Изящней и мощнее не Python - scrapy+selenium+PhantomJS, а четкие и грамотные программы, дающие пользу людям и облегчающие их труд. Абсолютно нет ни какой разницы на каком языке писать уважаемый хорошо написанная и отлаженная программа на php будет в тысячу раз юзабельней и оптимизированней чем хреновая но на том же Python, а все эти холивары - разговоры в пользу бедных. Нету ни какой разницы на каком языке писать я пишу на php только потому что он есть на подавляющем большинстве хостингов по умолчанию и без всякого гемора и за 100 рублей в месяц максимум, было бы тоже самое с питоном писал бы на нем от души. А покупать VPS или сервер только ради того чтобы поставить питон и всем хвастаться какой у меня красивый код в приложениях это маразм.
    • 0

Похожие темы

Темы Раздел Ответов Последний пост
Правда ли то что ссылка закрытая в nofollow, не туда не сюда?
Общие вопросы поисковой оптимизации 31 30.12.2013 19:03
Обзоры на Яндекс Маркет - кто туда попадал?
Yandex 3 28.06.2013 15:29
Хочу в Гомель(РБ), есть кто от туда?
Оффтоп и свободные темы 7 30.05.2013 10:39
Перенос домена, не туда куда нужно.
Прочее 7 13.03.2013 01:10
Кто еще не был на Интеравто? И не зачем туда идти...
Прочее 1 26.08.2011 15:36

У кого попросить инвайт?

Вы можете попросить инвайт у любого модератора:

Информеры