PDA

View Full Version : Доступ к Rss-каналу закрыт паролем


veland
30.11.2005, 17:37
Нюкеры! Кто сталкивался с проблемой доступа к каналу новостей (RSS), если страница с xml-файлом требует ввода логина и пароля? Судя по всему, для решения проблемы нужно использовать библиотеку CURL. Поделитесь опытом или может быть скриптом, который передаст серверу логин/пароль.

Soniks
03.12.2005, 03:21
veland ну можно и curl и через fsockopen, это все зависит как он требует ввод пароля?
попытайтесь сначало самым простым способом, добавить логин и пароли в строку запроса rss, т.е.

скажем файл rss доступин по адресу http://site.ru/rss.php? то с паролем будет выглядить так:
http://login:pass@site.ru/rss.php
обычно это помогает.

veland
07.12.2005, 23:28
Всё получается, если попробовать зайти таким образом через броузер, но в функции headlines() используется доступ к rss-файлу через открытие сокета. Вопрос как передать пароль/логин не сильно изменяя саму функцию. Хотя подозреваю, что просто не получится - fsockopen() не допускает имя хоста, перед которым указаны логин/пароль. Есть ли выход? Мне это надо для доступа к новостям Консультант+, а тамошние программеры, не понятно по какой причине, закрыли эту страницу.

Soniks
08.12.2005, 03:47
veland ну можите в принципе узнать у тамошних админов, почему закри, может откроют, или же у них уже есть скрипт для импорта.
а так можите почитать http://ru.php.net/manual/ru/function.fsockopen.php
там в коментариях даны пару вариантов передачи пароля, но не факт что сработает, тогда придется воспользоваться CURL

veland
08.12.2005, 16:57
Поковырялся вчера вечером и переделал немного функцию headlines() - сделал новый блок, вместо сокета использовал передачу по HTTP, в принципе блок получился индивидуальным именно для этого RSS-канала, но при необходимости можно и доработать, чтобы при создании нового блока в админе указывать логин/пароль. Если есть интерес, могу выложить блок сюда. А пример его работы можно посмотреть здесь: http://www.kazakevich.ru/index.php - сайт в процессе строительства, блок называется "Rss-канал от Консультант Плюс"

veland
08.12.2005, 20:27
Вот, как обещал, блок для доступа к rss-каналу, закрытому паролем:

<?php

/************************************************************************/
/* PHP-NUKE: Web Portal System */
/* =========================== */
/* */
/* Copyright (c) 2005 by Francisco Burzi */
/* http://phpnuke.org */
/* */
/* This program is free software. You can redistribute it and/or modify */
/* it under the terms of the GNU General Public License as published by */
/* the Free Software Foundation; either version 2 of the License. */
/************************************************************************/

/* Block to fit perfectly in the center of the site, remember that not all
blocks looks good on Center, just try and see yourself what fits your needs */

if (eregi("block-Consultant_rss-News.php", $_SERVER['PHP_SELF'])) {
Header("Location: index.php");
die();
}

$dir = "http://login:password@www.site.ru/rss/";

$fp = fopen($dir, "r");

if (!$fp) {
$content = "";
$cont = 0;
fclose($fp);
return;
}

if ($fp) {
$string = "";
while(!feof($fp)) {
$pagetext = fgets($fp,300);
$string .= $pagetext;
}
fclose($fp);
$content = explode("\n",$string);
ksort($content);
$lencontent = count($content);
$pos = strpos($content[$lencontent-5],"xml");
$file_name = strip_tags(trim(substr($content[$lencontent-5],43,$pos-11)));
$rssfile = $dir.$file_name;
}


$fp = fopen($rssfile, "r");

if (!$fp) {
$content = "";
$cont = 0;
fclose($fp);
return;
}

if ($fp) {
$string = "";
while(!feof($fp)) {
$pagetext = fgets($fp,300);
$string .= chop($pagetext);
}
fclose($fp);
$items = explode("</item>",$string);
$content = "<font class=\"content\">";
for ($i=0;$i<10;$i++) {
$link = ereg_replace(".*<link>","",$items[$i]);
$link = ereg_replace("</link>.*","",$link);
$cat = ereg_replace(".*<category>","",$items[$i]);
$cat = ereg_replace("</category>.*","",$cat);
$title2 = ereg_replace(".*<title>","",$items[$i]);
$title2 = ereg_replace("</title>.*","",$title2);
$title2 = stripslashes($title2);
if (strcmp($link,$title2) AND $items[$i] != "") {
$content .= "<div align=\"justify\"><img src=\"../images/pg.gif\" alt=\"\" width=\"11\" height=\"14\" border=\"0\" align=\"middle\" hspace=\"10\"><strong>".$cat.": </strong><a href=\"$link\" target=\"new\">".$title2."</a></div><hr width=\"80%\" size=\"1\">\n";
}
}
}
?>

Учтите, что строка
$file_name = strip_tags(trim(substr($content[$lencontent-5],43,$pos-11)));
индивидуальна для конкретного сайта Консультант+, и для другого сайта её, возможно, придётся изменить.

Soniks
09.12.2005, 03:51
veland вот именно так и надо было поступить, это самый простой вариант :)