Pull to refresh

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

Reading time3 min
Views9.4K

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

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

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 только с классом авторизации вконтакте — пишите в личку.
Tags:
Hubs:
Total votes 25: ↑15 and ↓10+5
Comments15

Articles