Постинг данных из скрипта во Вконтакт на публичную страницу


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

    Идея
    Всё началось с идеи — вначале она мне показалась немного скучной, и смысл в реализации я не видел, но подумав дважды (а то и трижды) я понял, что это может принести некоторый профит к моим навыкам. Но об этом ниже :)

    Python или PHP
    Первым делом нужно было выбрать на чём я буду писать — выбор был не велик и ограничен: python, который я знаю буквально пару месяцев или php — с которым практикую различные небольшие скрипты уже года 4. Попытавшись завести виртуальное окружение под старенькой убунтой и пободавшись с ним около нескольких часов я решил, что для реализации на python я ещё не дорос :) Поэтому выбор был очевиден — php с его простой и иногда излишней корявостью в моей реализации (буду благодарен, если укажите ошибки в скриптах — ссылка будет в конце статьи).

    Авторизация во Вконтакте
    Я, конечно же, не хотел изобретать велосипедов и долго и упорно пытался нагуглить хороший класс для авторизации вконтакте, но попадались или не работающие древние скрипты или классы, работающие через API контакта. Второй вариант меня не устраивал по той причине, что нельзя будет публиковать записи от имени группы — так я думал в самом начале, понадеявшись на чей-то старый комментарий с хабра… И зря! Уже после реализации я зашёл в официальную документацию по API и прочитал, что такое уже возможно, но велосипед уже был написан… Сейчас в планах переписать его под API Вконтакта. Радует лишь то, что велосипед получился совсем не громоздким и работающим в суровых реалиях нынешней реализации авторизации на сайте.
    Код авторизации и постинга:
    define('SCR_DIR', dirname(__FILE__)); // текущая директория
    
    include_once(SCR_DIR . '/config.php'); // конфиг (емэйл, пароль, айдишник публичной страницы)
    include_once(SCR_DIR . '/classes/minicurl.class.php'); // малюхонькая обёртка над curl, чтобы проще постить было
    include_once(SCR_DIR . '/classes/vk_auth.class.php'); // класс авторизации вконтакте
    
    $vk = new vk_auth($VKEMAIL, $VKPWD, $VKPPID, $SLEEPTIME); // настраиваем класс для работы, $VKEMAIL - мыло админа публичной страницы, $VKPWD - пароль, $VKPPID - айдишник публичной страницы, $SLEEPTIME - время для таймаута между запросами
    
    // проверяем авторизованы ли мы уже на сайте, если нет то авторизуемся, если не получается, то пишем ошибки в /data/logfile.txt
    if(!$vk->check_auth())
    {
    	exit('Error! See logfile.');
    }
    
    // постим сообщение $message на стену публичной страницы
    if (!$vk->post_to_wall($message)) {
    	exit('Error! Not Posted!');
    }
    else
    {
    	echo 'Posted!';
    }
    


    Парсер погоды
    Закончив написание авторизации, перешёл к написанию парсера погоды — использовать регулярки как я делал раньше мне совсем не хотелось, т.к. пришлось бы очень долго выдумывать их и при желании сменить сайт, откуда берётся погода… На этом этапе мне очень помогла запись в блоге Дмитрия Родина о парсинге данных через XPath. О XPath я уже пару раз слышал, но никогда не вникал что это — вот и пришло время проникнуться этим удобным способом получения данных любого сайта. Протестировав его класс и чуть-чуть переписав его под себя, я решил, что это именно то, что мне нужно. Все XPath-пути можно с лёгкостью получить из FireBug'a, но некоторые будут некорректны, т.к. в работе парсера используется tidy, очищающая невалидный html-код, поэтому лучше использовать дополнение для FireBug — FirePath.
    Пару XPath-запросов на парсинг погоды с gismeteo:
    include_once(SCR_DIR . '/classes/htmlparser.class.php'); // класс парсера
    
    $parser = new HTMLParser('http://www.gismeteo.ru/city/hourly/' . $CITY); // $CITY - переменная из конфига, обозначающая город
    $weather_temperature = $parser->getConvDataFromXPath(".//*[@id='weather']/div[1]/div/div[2]"); // получаем текущую температуру и сразу же конвертируем её в UTF-8
    $weather_type = $parser->getConvDataFromXPath(".//*[@id='weather']/div[1]/div/dl/dd"); // текущее состояние погоды (ясно, пасмурно, и т.д.) 
    


    Что я получил от реализации этого небольшого скрипта:

    1. Написал свой небольшой велосипед для авторизации во вконтакте (в планах переписать под API);
    2. Познакомился с XPath и научился парсить сайты с куда более быстрой продуктивностью, нежели через регулярки;
    3. Ещё теснее познакомился с git'ом;
    4. Сделал небольшой полезный «сервис» для своего города.
    5. Вскоре узнаю все ли посетители контакта такие овощи, что им не интересна полезная информация, а интересны только картинки, да смешные статусы;


    Посмотреть на мою реализацию можно на этой странице: погода в Вологде.
    Глянуть на исходный код или сделать такую же публичную страницу с погодой для своего города: github.com/saippuakauppias/vkweather

    P.S.: если кому-то нужно, то могу сделать отдельный fork только с классом авторизации вконтакте — пишите в личку.

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 15

      –2
      Скрипт, конечно, полезный, но его не трудно на писать самому за 5 минут из примеров ВКонтакте API. Но в свете последних веяний был бы полезнее аналогичный скрипт под Google+.
        0
        Насчёт 5 минут вы приуменьшайте :)
        А вот о Google+ я как-то не задумался… Надо будет и под него что-нибудь полезное смастерить!
        0
        Насколько я помню, постить от имени группы можно было только из Desktop приложений или Flash/IFrame.
          0
          А вы уверены?
          from_group - Данный параметр учитывается, если owner_id < 0 (статус публикуется на стене группы). 1 - статус будет опубликован от имени группы, 0 - стутус будет опубликован от имени пользователя (по умолчанию).

          Я никогда не пользовался их API, поэтому буду благодарен, если вы направите меня на путь истинный :) и не дадите написать ещё один велосипед, если заранее известно, что он не будет ездить.
            0
            Читаем по Вашей ссылке, начиная сверху:
            Для вызова этого метода из Desktop приложений — приложение должно иметь права с битовой маской…
            Данный метод доступен также Flash и IFrame приложениям, использующим функцию VK.api в Javascript API.
          0
          А мне лень было в API для публичной страницы вникать и я просто добавил вторую страницу в администраторы, один раз запостил из-под нее на стену, снял куки, и curl'ом теперь с этими куками отправляю запросы :) Топорно, но уже вторую неделю работает и не глючит. А главное — неимоверно быстро и всего один запрос за раз.
            0
            Тогда моё решение авторизации и постинга именно для Вас :) Стоит лишь поменять конфиг и сообщение для постинга — всё, можно пользоваться сколько угодно! А Ваше решение умрёт вместе с сессией — стоит разлогиниться или долго не заходить во вконтакт.
              0
              Это да :) Такой вот костыль по-быстрому получился.
            0
            Что-то я не пойму, а без размещения пароля в коде (и без ручной авторизации) невозможно что ли автоматизированно постить в контакт?
              0
              О какой ручной авторизации Вы говорите? Пароль в коде в любом случае придётся размещать, если не API пользоваться.
                0
                Под ручной авторизацией я имею в виду ситуацию, когда пользователь сам заходит на определенный сайт, вручную авторизуется на вконтакте и после этого приложение, получая токен, может обращаться к API. Так вот, хотел узнать, можно ли как-то получить такой вечный токен, как это сделано в твиттере, и разместить в приложении его, а не пароль от своего аккаунта.
                  0
                  Насчёт контакта ничего сказать не могу :) Я не через OAuth делал.
                  Но, по-моему, вечный токен не получить — можно лишь каждый раз скриптом получать новые, если старый устарел. Да и не думаю, что в твиттере именно так — скорее всего вы немножко не правильно поняли (извиняюсь, если ошибаюсь).
                    0
                    В твиттере эти токены можно даже на самом сайте посмотреть и вписать в приложение.
                    0
                    Вечного токена во Вконтакте нет.
                      0
                      Теперь есть

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое