RSS и user agent

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
kd0t
Сообщения: 67
Зарегистрирован: Пт дек 27, 2013 11:20 pm
Благодарил (а): 5 раз
Поблагодарили: 2 раза

RSS и user agent

Сообщение kd0t » Пн май 12, 2014 7:58 am

Добрый день. Вопрос, наверное больше к Сергею: каким образом происходит загрузка rss лент в MD и есть ли возможность сменить user agent при загрузке. Добавляя ленты, столкнулся с проблемой: curl из консоли с родным UA загружает 404-ю, при смене UA, получаю страницу, которая дальше может быть распарсена. Собственные слабые познания в PHP подсказывают, что ответ может быть в modules/rss_channels/rss_channels.class.php в

Код: Выделить всё

$data=simplexml_load_file($ch['URL']);
, но что делать дальше не пойму. Спасибо.
kd0t
Сообщения: 67
Зарегистрирован: Пт дек 27, 2013 11:20 pm
Благодарил (а): 5 раз
Поблагодарили: 2 раза

Re: RSS и user agent

Сообщение kd0t » Пн май 12, 2014 3:51 pm

Вобщем, после правки файла modules/rss_channels/rss_channels.class.php
Было:

Код: Выделить всё

 
 function updateChannel($id) {
  $ch=SQLSelectOne("SELECT * FROM rss_channels WHERE ID='".(int)$id."'");

  $ch['LAST_UPDATE']=date('Y-m-d H:i:s');
  $ch['NEXT_UPDATE']=date('Y-m-d H:i:s', time()+$ch['UPDATE_EVERY']*60);
  SQLUpdate('rss_channels', $ch);


  $data = simplexml_load_file($ch['URL']);
Стало:

Код: Выделить всё

function updateChannel($id) {
  $ch=SQLSelectOne("SELECT * FROM rss_channels WHERE ID='".(int)$id."'");

  $ch['LAST_UPDATE']=date('Y-m-d H:i:s');
  $ch['NEXT_UPDATE']=date('Y-m-d H:i:s', time()+$ch['UPDATE_EVERY']*60);
  SQLUpdate('rss_channels', $ch);

  $cch =curl_init();
  curl_setopt($cch, CURLOPT_URL, $ch['URL']);
  curl_setopt($cch, CURLOPT_HTTPHEADER, array("User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3"));
  curl_setopt($cch, CURLOPT_RETURNTRANSFER, true);
  $rssdata = curl_exec($cch);
  curl_close($cch);
  $data = simplexml_load_string($rssdata);
После этого лента нормально загрузилась и отобразилась. Просьба к Сергею рассмотреть этот вопрос и в обновлениях предусмотреть user agent при загрузке rss вместо этого костыля.
Параллельный вопрос: приведенная ссылка на rss ленту форума, новости в MD у меня не добавляет, и в лог апача не дает ошибки.
Последний раз редактировалось kd0t Пн май 12, 2014 6:33 pm, всего редактировалось 2 раза.
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: RSS и user agent

Сообщение LutsenkoDenis » Пн май 12, 2014 4:47 pm

я бы еще добавил проверку $id, например так:

Код: Выделить всё

function updateChannel($id) 
{
   if (is_numeric($id) === false) // $id содержит что-то, что не является числом. Можно записать в лог или забить.
      return;  // ничего дальше не делаем и выходим из функции
   
   $ch = SQLSelectOne("SELECT * FROM rss_channels WHERE ID = " . (int)$id); // одинарные кавычки '' нам не нужны т.к. вставляем число.
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
Ответить