Страница 1 из 1

RSS и user agent

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

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

$data=simplexml_load_file($ch['URL']);
, но что делать дальше не пойму. Спасибо.

Re: RSS и user agent

Добавлено: Пн май 12, 2014 3:51 pm
kd0t
Вобщем, после правки файла 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 у меня не добавляет, и в лог апача не дает ошибки.

Re: RSS и user agent

Добавлено: Пн май 12, 2014 4:47 pm
LutsenkoDenis
я бы еще добавил проверку $id, например так:

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

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