|
|
|
| Здравствуйте, господа программисты.
Я написал новостной граббер. Суть его работы такова, он авторизуется считывает заголовки новостей, затем считывает сами новости, затем все новые новости отправляет на указанный адрес. Но вот в чём собственно проблема, под Denwer-ом нормально новости отправляет, под FreeBSD приходят пустые новости. Вот исходный код:
<?
$EMail = "mail@host.ru";
$MaxReload = 100;
//********************************* rosan.su ***********************************
$rLogin = "qwerty";
$rPassword = "12345";
$rHost = "http://www.rosan.su/dealers/";
$rAuthString = "login=$rLogin&password=$rPassword";
$rAuthPage = "http://www.rosan.su/dealers/auth.php";
$rParseString = "#<a href='(.+?)' class=\"linkb\">(.+?)</a>.*?<span class=\"text\">(.+?)</span>#is";
$rLinkIndex = 1;
$rFileName = "rosan.dat";
//******************************************************************************
//******************************* awm-trade.ru *********************************
$aLogin = "qwerty";
$aPassword = "12345";
$aHost = "http://www.awm-trade.ru";
$aAuthString = "login=$aLogin&password=$aPassword&auth=войти";
$aAuthPage = "http://awm-trade.ru/index.php5?module=users&class=auth";
$aParseString = "#<a.*?class=\"newsDealersDate\">(.+?)</a>.*?<a href=\"(.+?)\" class=\"headerDealersNews\">(.+?)</a>#is";
$aLinkIndex = 2;
$aFileName = "awm-trade.dat";
//******************************************************************************
function EmptyMass($Mass)
{
for($i=1;$i<=3;$i++)
foreach($Mass[$i] as $key=> $value)
if($Mass[$i][$key]!="")
return 1;
return 0;
}
function LoadHeadingsNews($AuthPage,$AuthString)
{
$SessID = str_replace('\\', '/', dirname(__FILE__)) . 'sessid.txt';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$AuthPage);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch, CURLOPT_POST, 1);
if($AuthString)
{
curl_setopt($ch, CURLOPT_POSTFIELDS, $AuthString);
echo "> Загружаю старницу загаловков новостей;<br>";
}
else echo "> Загружаю старницу новостей;<br>";
curl_setopt($ch, CURLOPT_COOKIEFILE, $SessID);
curl_setopt($ch, CURLOPT_COOKIEJAR, $SessID);
curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_HEADER, 0);
$NewsPage = curl_exec($ch);
curl_close($ch);
return $NewsPage;
}
function LoadNews($Host,$AuthPage,$AuthString,$ParseString,$LinkIndex,$FileName)
{
global $MaxReload, $Headers, $EMail;
preg_match_all($ParseString,LoadHeadingsNews($AuthPage,$AuthString),$OuterMass);
unset($OuterMass[0]);
echo "<b>> Выбираю данные со станицы заголовков новостей в массив;<br></b>";
if(!EmptyMass($OuterMass))
{
echo "<b>> Данные не обнаружены, перезагружаю страницу заголовков новостей;<br><br></b>";
if($MaxReload)
{
sleep(1);
$MaxReload--;
LoadNews($Host,$AuthPage,$AuthString,$ParseString,$LinkIndex,$FileName);
}
return;
}
$FileDisc = fopen($FileName, "r") or die("<b>> Не могу найти файл $FileName;<br></b>");
if(filesize($FileName))
{
$OldNews = fread($FileDisc, filesize($FileName));
echo "<b>> Считал данные из временного файла;<br></b>";
}
fclose($FileDisc);
echo "<b>> Ищу последнюю отправленную новость;<br></b>";
for($key=0;$key<count($OuterMass[$LinkIndex]);$key++)
if(substr_count($OldNews, $OuterMass[$LinkIndex][$key]))
break;
if($key)
{
echo "<b>> Записываю текущую последнюю новость;<br></b>";
$FileDisc = fopen($FileName, "w") or die("<b>> Не могу найти файл $FileName;<br></b>");
fputs($FileDisc,$OuterMass[$LinkIndex][0]);
fclose($FileDisc);
}
else
echo "<b>> Новых новостей не найдено;<br></b>";
$Headers = "Content-type: text/html; charset=windows-1251 \r\nFrom: News from $Host \r\nBcc: $email \r\n";
if($key)
{
echo "<b>> Отправляю письма с новостями;<br></b>";
while($key--)
{
$Mail = LoadHeadingsNews($Host."".$OuterMass[$LinkIndex][$key],0);
$Mail = str_replace("a href=\"", "a href=\"$Host", $Mail);
$Mail = str_replace("a href='", "a href='$Host", $Mail);
mail($EMail,"Новости с $Host",$Mail,$Headers);
}
}
echo "<b>> Загрузка новостей с $Host, завершена;</b><br><br>";
}
LoadNews($rHost,$rAuthPage,$rAuthString,$rParseString,$rLinkIndex,$rFileName);
LoadNews($aHost,$aAuthPage,$aAuthString,$aParseString,$aLinkIndex,$aFileName);
?>
|
Боду очень благодарен за Ваши советы и предложения! | |
|
|
|
|
|
|
|
для: Icen
(08.07.2008 в 05:35)
| | Неужели нет ни у кого, никаких догадок по этому поводу :) | |
|
|
|
|
|
|
|
для: Icen
(08.07.2008 в 05:35)
| | Я бы начал проверку с прав на файлы и регистра их имен. Затем бы проверил что регулярное выражение в обоих системах выполняется одинаково - такие случаи науке тоже известны:) А вообще диагностика очевидна: искать на каком этапе теряются данные. | |
|
|
|
|
|
|
|
для: Loki
(08.07.2008 в 16:25)
| | Проверил, регулярные выражения. Ссылки выбирает правильно. Также поставил самые высокие права на файл с сессией. Всё бесполезно. Проблема вот в этом куске кода:
<?
function LoadHeadingsNews($AuthPage,$AuthString)
{
$SessID = str_replace('\\', '/', dirname(__FILE__)) . 'sessid.txt';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$AuthPage);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch, CURLOPT_POST, 1);
if($AuthString)
{
curl_setopt($ch, CURLOPT_POSTFIELDS, $AuthString);
echo "> Загружаю старницу загаловков новостей;<br>";
}
else echo "> Загружаю старницу новостей;<br>";
curl_setopt($ch, CURLOPT_COOKIEFILE, $SessID);
curl_setopt($ch, CURLOPT_COOKIEJAR, $SessID);
curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_HEADER, 0);
$NewsPage = curl_exec($ch);
curl_close($ch);
return $NewsPage;
}
?>
|
после вызова функции:
LoadHeadingsNews($Host."".$OuterMass[$LinkIndex][$key],0);
|
переменная $NewsPage имеет пустое значение.
P.S.: Начинаю потихоньку рвать волосы на голове .... :) | |
|
|
|
|
|
|
|
для: Icen
(09.07.2008 в 16:18)
| | Может я что то неправильно сделал с cURL??? | |
|
|
|
|
|
|
|
для: Icen
(09.07.2008 в 16:18)
| | Может я что то неправильно сделал с cURL??? | |
|
|
|
|