Задать вопрос

Как написать скрипт оповещения смс-сообщением о новом видео на YouTube?

Здравствуйте.
Описываю ситуацию:
Есть на YouTube канал одного пользователя, он где-то раз в пару недель выкладывает новое видео.
Постоянно ходить на Yotube и проверять лень.
Можно включить уведомления о приходе новых сообщений через e-mail, но данные сообщения приходят, в большинстве случаев, через час, а то и больше.

Решил написать скрипт, который будет проверять появилось ли новое видео на канале пользователя.
Если появилось - прислать мне смску.

Путем проб и ошибок выяснилось, что ссылка вида
https://gdata.youtube.com/feeds/users/Пользователь/uploads
отдает страничку с информацией о последних обновлениях пользователя. У каждого видео есть тег <published> с уникальной датой публикации, например <published>2014-01-28T14:57:53.000Z</published>.
Было решено проверять содержимое первого вхождения <published>, если значение отличается от ранее известного - появилось новое видео.

Итак, родился скрипт (написан ниже). После этого осталось придумать, как его запускать на выполнение. Есть свой маленький сайт, было принято решение залить скрипт туда и запустить через Cron, в панели управления хостингом. Работает.

А теперь нюанс: как только появится новое видео - скрипт будет слать постоянно смски, пока его не остановить, т.к. первое вхождение <published> уже будет отличаться, при повторном запуске скрипта.

Теперь вопрос: как реализовать остановку работы скрипта, после первого успешного выполнения(т.е. найдено новое видео).

Буду рад любой помощи.

<?php

function send_sms($to, $msg, $login, $password){
 $u = 'http://www.websms.ru/http_in5.asp';
 $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0);
 curl_setopt($ch, CURLOPT_TIMEOUT, 10);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_POST, 1);
 curl_setopt($ch, CURLOPT_POSTFIELDS, 'Http_username='.urlencode($login). '&Http_password='.urlencode($password).  '&Phone_list='.$to.'&Message='.urlencode($msg));
 curl_setopt($ch, CURLOPT_URL, $u);
 $u = trim(curl_exec($ch));
 curl_close($ch);
 preg_match("/message_id\s*=\s*[0-9]+/i", $u, $arr_id );
 $id = preg_replace("/message_id\s*=\s*/i", "", @strval($arr_id[0]) );
 return $id;
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11');

$url = 'https://gdata.youtube.com/feeds/users/USER/uploads'; //ссылка на канал
$find = '<published>2014-01-26T04:00:00.000Z</published>'; //время публикации последнего видео на канале пользователя
$mob = ''; //твой мобильный в формате +380123456789
$login = ''; //твой логин на сервисе отправки смс
$pass = '';//твой пароль на сервисе отправки смс

curl_setopt($ch, CURLOPT_URL, $url);
$page = curl_exec($ch);
$page = iconv('utf-8', 'windows-1251', $page);

if ($page != false){
  $page = trim(substr($page, 0, 20000));
  $pos = strpos($page, $find);
  
  if ($pos == true) {
    $msg = 'You have a new video!!!';
	//send_sms($mob, $msg, $login, $pass);
  } 

} 

else die;
curl_close($ch);
?>
  • Вопрос задан
  • 3831 просмотр
Подписаться 4 Оценить Комментировать
Решения вопроса 1
Как-то так
<?php

function send_sms($to, $msg, $login, $password){
	$u = 'http://www.websms.ru/http_in5.asp';
	$ch = curl_init();

	curl_setopt($ch, CURLOPT_HEADER, 0);
	curl_setopt($ch, CURLOPT_TIMEOUT, 10);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, 'Http_username='.urlencode($login). '&Http_password='.urlencode($password).  '&Phone_list='.$to.'&Message='.urlencode($msg));
	curl_setopt($ch, CURLOPT_URL, $u);

 	$u = trim(curl_exec($ch));
 	curl_close($ch);

 	preg_match("/message_id\s*=\s*[0-9]+/i", $u, $arr_id );
 	$id = preg_replace("/message_id\s*=\s*/i", "", @strval($arr_id[0]) );

 	return $id;
}

// some defaults
$url = 'https://gdata.youtube.com/feeds/users/USER/uploads'; //ссылка на канал

$filename = './lastvideo.txt';
$find = file_get_contents($filename);
$find = !empty($find) ? $find : '<published>2014-01-26T04:00:00.000Z</published>'; //время публикации последнего видео на канале пользователя

$mob = ''; //твой мобильный в формате +380123456789
$login = ''; //твой логин на сервисе отправки смс
$pass = '';//твой пароль на сервисе отправки смс

// запрос к youtube
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11');
curl_setopt($ch, CURLOPT_URL, $url);
$page = curl_exec($ch);
curl_close($ch);

// parse
if ($page == false) {
	exit('Empty curl response.');
}

preg_match_all('/(<published>.*?<\/published>)/ui', $page, $matches);
if (empty($matches[1])) {
	exit('Empty parse results.');
}

if ($matches[1][0] != $find) {	// если новое видео вверху, то оно должно быть нулевым матчем, иначе - появилось что-то новое
	file_put_contents($filename, $matches[1][0]); // пишем дату публикации нового видео, чтоб не было смс постоянно

	$msg = 'You have a new video!!!';
	//send_sms($mob, $msg, $login, $pass);
}


Сори, если чего не так, но идея такая же, как у @Medic84. Также, немного подправил код на мой вкус.

Код не тестировал, проблемы могут быть в регулярке.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Нашел видео -> Запиши в файл -> Следующий вызов скрипта -> Проверка совпадает ли последнее видео со временем из файла, если совпадает, то ничего не делаем.

else die;
curl_close($ch);

И кто Вас научил убивать скрипт, до освобождения ресурсов?
Ответ написан
avalak
@avalak
Есть более простой вариант:
- Google Apps Script или Google App Engine для логики.
- sms.ru для отправки sms (60 бесплатных sms на свой номер в день).

Получается весьма надёжно, гибко и, что приятно, бесплатно.
Ответ написан
Комментировать
@frees2
Настоятельно советую парсить JSON V3. Надо только получить свой key на гугл апи.
Загружается моментально, на глаз в "несколько раз быстрее" V2 RSS.
Аплоадс или поиск, выбор, ленты по скорости одинаковы,
(аплодс
$fff2 ='https://www.googleapis.com/youtube/v3/playlistItem...'.$v.'&key=AIzaSyA..............3gEo'; )

Варианты по поиску
$v21 ='&type=channel&order=viewCount';
$v21 ='&type=video&order=viewCount';
..................


$fff ='https://www.googleapis.com/youtube/v3/search?key=AIz....................DAo3gEo'.$v21.'&part=snippet&safeSearch=none&maxResults=25';
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $fff);
 curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Bot');
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_exec($ch); 
  $json = curl_exec($ch);
  curl_close($ch);
  if ($json !== false) { 
$json = preg_replace("#(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|([\s\t]//.*)|(^//.*)#", '', $json);
setlocale(LC_ALL, 'ru_RU.utf8');
 Header("Content-Type: text/html;charset=UTF-8");
$json = json_decode($json, true) ; 
// print_r($json);


if (isset($json['items']))
 {
 foreach($json['items'] as $items) {
$thumbnails =$items['snippet']['thumbnails']['default']['url'];
$title =$items['snippet']['title'];
// $description =$items['snippet']['description'];
$channelId =$items['snippet']['channelId'];
.................................

Апи позволяет настроить ленту, к примеру получать только последнюю дату, или заголовок новый, или то и другое, то есть сервер будет отдавать только дату или иное, только нужное а не всю ленту (типа RSS) для парсинга
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы