LinuxQuestions.org
Help answer threads with 0 replies.
Home Forums Tutorials Articles Register
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices


Reply
  Search this Thread
Old 06-30-2005, 07:07 PM   #1
sendas4
Member
 
Registered: May 2004
Location: Tacoma, Wa
Distribution: Gentoo
Posts: 94

Rep: Reputation: 15
Need help with php script


I cant seem to get this working. I am very new to php so I dont know if its me or the script. Anyone help me with this?

<?php
/* ############################################################################

RSSInjector - A program for reading a keyword-based search engine RSS feed
Copyright (C) 2005 Volatile Graphix, Inc.

This program queries a search engine (MSN or Yahoo) for a keyword phrase
and gets the results in RSS format. You can then display the results.

LICENSE

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License (GPL)
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

To read the license please visit http://www.gnu.org/copyleft/gpl.html

This program is based on the lastRSS program by Vojtech Semecky,
and was changed/added to by Daniel Kramer in April, 2005.

CONFIGURATION

Edit the $feed variable to change the RSS feed.
Edit the $cacheDir variable to change the name of the RSS feed cache directory.


INSTALLATION

Installation is simple. First, create a directory where you want to
store your cached RSS feeds. It should be named something like "RSScache".
Chmod the directory to '777'. If you choose a different name for it, make sure
to change the value of the $cacheDir variable.

Then, upload this file.


PARAMETERS

RSSInjector may be called via HTTP with a number of parameters. All of the parameters are optional
except the keyword parameter, which must be provided so you can pull a feed customized on something.

keyword = The keyword phrase used to customize the RSS feed. It should be a string. Spaces
should be replaced with a '-', a '_' or '%20'.
limit = The maximum number of items you want to display. It should be an integer.
If set to 0, then there is no limit. Defaults to 0.
link = Whether or not you want to link to the item being displayed. It should be a
'1' or a '0'. Defaults to 0.
randomize = Whether or not you want to shuffle the items. It should be a '1' or a '0'. Defaults
to 0.
format = Whether or not you want neat output (HTML paragraphs and linebreaks). It should
be a '1' or a '0'. Defaults to 1.
cache = Whether or not you want to cache the RSS feeds. It should be a '1' or a '0'.
Defaults to 1.
cachelimit = The number of seconds to store cached RSS feeds. It should be an integer.
Defaults to 86400, which is one day.


############################################################################# */

# get the parameters
$qs = getenv("QUERY_STRING");
$qsA = explode("&",$qs);
$thi = current($qsA);
while ($thi){
$tempA = explode("=",$thi);
$paramsA{$tempA[0]} = $tempA[1];
$thi = next($qsA);
}
# $keyword is the keyword phrase used to perform the search
$keyword = $paramsA{'keyword'};
# convert any KloakIt-style filenames to keyword phrases
$keyword = eregi_replace("\.s*html*$","",$keyword);
$keyword = eregi_replace("\-|\_|\.|%20| ","+",$keyword);

# $limit is the max number of items to echo
$limit = $paramsA{'limit'};if (!$limit) { $limit = 0; }

# $link is the switch used to link the items to their URLs
$link = $paramsA{'link'};if (!$link) { $link = 0; }

# $randomize is the switch used to shuffle the results
$randomize = $paramsA{'randomize'};if ($randomize == ""){ $randomize = 0;}

# $format is the switch used to format for neat output.
# Otherwise, the output is just a solid block.
$format = $paramsA{'format'};if ($format == ""){ $format = 1;}

# $cache is the switch used to turn off/on cacheing. Default is 1 (on).
$cache = $paramsA{'cache'};if ($cache == ""){ $cache = 1;}

# $cachelimit is the number of seconds to cache the RSS feeds. Default is one day.
$cachelimit = $paramsA{'cachelimit'};if ($cachelimit == ""){ $cachelimit = 86400;}

########################
# You can edit these variables
#
# Pull feed from MSN's SERPs
$feed = 'http://search.msn.com/results.aspx?q='.$keyword.'&format=rss&FORM=R0RE';
#
# or pull feed from Yahoo's SERPs
#$feed = 'http://api.search.yahoo.com/WebSearchService/rss/webSearch.xml?appid=yahoosearchwebrss&query='.$keyword.'&adult_ok=1';
#
# Name the cache directory
$cacheDir = 'RSScache';
########################


$cacheDir = './'.$cacheDir;
// create lastRSS object
$rss = new lastRSS;

if ($cache){
// setup transparent cache
$rss->cache_dir = $cacheDir;
$rss->cache_time = $cachelimit;
}
$rss->items_limit = $limit;

$textArray = array();

// grab the RSS file
if ($rs = $rss->get($feed)) {
$count = 0;
foreach($rs['items'] as $item) {
$item['description'] = eregi_replace("\<\!\[CDATA\[","",$item['description']);
$item['description'] = eregi_replace("\]\]\>","",$item['description']);
$item['title'] = eregi_replace("\<\!\[CDATA\[","",$item['title']);
$item['title'] = eregi_replace("\]\]\>","",$item['title']);
if ($format) { $textArray[$count] = "<p>";}
if ($link){
$textArray[$count] .= "<a href=\"$item[link]\">";
}
$textArray[$count] .= $item['title'];
if ($link){
$textArray[$count] .= "</a>";
}
if ($format) { $textArray[$count] .= "<br />";}
$textArray[$count] .= $item['description'];
if ($format) { $textArray[$count] .= "</p>\n"; }
$count++;
}

if ($count){
if ($randomize){
shuffle($textArray);
}
array_walk($textArray, sendOut);
} else {
die ('Error: '.$feed.' not responding with RSS file');
}



} else {
die ('Error: RSS file at '.$feed.' not found...');
}

function sendOut($text){
echo $text;
}


class lastRSS {
// -------------------------------------------------------------------
// Public properties
// -------------------------------------------------------------------
var $default_cp = 'UTF-8';
var $CDATA = 'nochange';
var $cp = '';
var $items_limit = 0;
var $stripHTML = False;
var $date_format = '';

// -------------------------------------------------------------------
// Private variables
// -------------------------------------------------------------------
var $channeltags = array ('title', 'link', 'description', 'language', 'copyright', 'managingEditor', 'webMaster', 'lastBuildDate', 'rating', 'docs');
var $itemtags = array('title', 'link', 'description', 'author', 'category', 'comments', 'enclosure', 'guid', 'pubDate', 'source');
var $imagetags = array('title', 'url', 'link', 'width', 'height');
var $textinputtags = array('title', 'description', 'name', 'link');

// -------------------------------------------------------------------
// Parse RSS file and returns associative array.
// -------------------------------------------------------------------
function Get ($rss_url) {
// If CACHE ENABLED
if ($this->cache_dir != '') {
$cache_file = $this->cache_dir . '/rsscache_' . md5($rss_url);
$timedif = @(time() - filemtime($cache_file));
if ($timedif < $this->cache_time) {
// cached file is fresh enough, return cached array
$result = unserialize(join('', file($cache_file)));
// set 'cached' to 1 only if cached file is correct
if ($result) $result['cached'] = 1;
} else {
// cached file is too old, create new
$result = $this->Parse($rss_url);
$serialized = serialize($result);
if ($f = @fopen($cache_file, 'w')) {
fwrite ($f, $serialized, strlen($serialized));
fclose($f);
}
if ($result) $result['cached'] = 0;
}
}
// If CACHE DISABLED >> load and parse the file directly
else {
$result = $this->Parse($rss_url);
if ($result) $result['cached'] = 0;
}
// return result
return $result;
}

// -------------------------------------------------------------------
// Modification of preg_match(); return trimed field with index 1
// from 'classic' preg_match() array output
// -------------------------------------------------------------------
function my_preg_match ($pattern, $subject) {
// start regullar expression
preg_match($pattern, $subject, $out);

// if there is some result... process it and return it
if(isset($out[1])) {
// Process CDATA (if present)
if ($this->CDATA == 'content') { // Get CDATA content (without CDATA tag)
$out[1] = strtr($out[1], array('<![CDATA['=>'', ']]>'=>''));
} elseif ($this->CDATA == 'strip') { // Strip CDATA
$out[1] = strtr($out[1], array('<![CDATA['=>'', ']]>'=>''));
}

// If code page is set convert character encoding to required
if ($this->cp != '')
//$out[1] = $this->MyConvertEncoding($this->rsscp, $this->cp, $out[1]);
$out[1] = iconv($this->rsscp, $this->cp.'//TRANSLIT', $out[1]);
// Return result
return trim($out[1]);
} else {
// if there is NO result, return empty string
return '';
}
}

// -------------------------------------------------------------------
// Replace HTML entities &something; by real characters
// -------------------------------------------------------------------
function unhtmlentities ($string) {
// Get HTML entities table
$trans_tbl = get_html_translation_table (HTML_ENTITIES, ENT_QUOTES);
// Flip keys<==>values
$trans_tbl = array_flip ($trans_tbl);
// Add support for &apos; entity (missing in HTML_ENTITIES)
$trans_tbl += array('&apos;' => "'");
// Replace entities by values
return strtr ($string, $trans_tbl);
}

// -------------------------------------------------------------------
// Parse() is private method used by Get() to load and parse RSS file.
// Don't use Parse() in your scripts - use Get($rss_file) instead.
// -------------------------------------------------------------------
function Parse ($rss_url) {
// Open and load RSS file
if ($f = @fopen($rss_url, 'r')) {
$rss_content = '';
while (!feof($f)) {
$rss_content .= fgets($f, 4096);
}
fclose($f);

// Parse document encoding
$result['encoding'] = $this->my_preg_match("'encoding=[\'\"](.*?)[\'\"]'si", $rss_content);
// if document codepage is specified, use it
if ($result['encoding'] != '')
{ $this->rsscp = $result['encoding']; } // This is used in my_preg_match()
// otherwise use the default codepage
else
{ $this->rsscp = $this->default_cp; } // This is used in my_preg_match()

// Parse CHANNEL info
preg_match("'<channel.*?>(.*?)</channel>'si", $rss_content, $out_channel);
foreach($this->channeltags as $channeltag)
{
$temp = $this->my_preg_match("'<$channeltag.*?>(.*?)</$channeltag>'si", $out_channel[1]);
if ($temp != '') $result[$channeltag] = $temp; // Set only if not empty
}
// If date_format is specified and lastBuildDate is valid
if ($this->date_format != '' && ($timestamp = strtotime($result['lastBuildDate'])) !==-1) {
// convert lastBuildDate to specified date format
$result['lastBuildDate'] = date($this->date_format, $timestamp);
}

// Parse TEXTINPUT info
preg_match("'<textinput(|[^>]*[^/])>(.*?)</textinput>'si", $rss_content, $out_textinfo);
// This a little strange regexp means:
// Look for tag <textinput> with or without any attributes, but skip truncated version <textinput /> (it's not beggining tag)
if (isset($out_textinfo[2])) {
foreach($this->textinputtags as $textinputtag) {
$temp = $this->my_preg_match("'<$textinputtag.*?>(.*?)</$textinputtag>'si", $out_textinfo[2]);
if ($temp != '') $result['textinput_'.$textinputtag] = $temp; // Set only if not empty
}
}
// Parse IMAGE info
preg_match("'<image.*?>(.*?)</image>'si", $rss_content, $out_imageinfo);
if (isset($out_imageinfo[1])) {
foreach($this->imagetags as $imagetag) {
$temp = $this->my_preg_match("'<$imagetag.*?>(.*?)</$imagetag>'si", $out_imageinfo[1]);
if ($temp != '') $result['image_'.$imagetag] = $temp; // Set only if not empty
}
}
// Parse ITEMS
preg_match_all("'<item(| .*?)>(.*?)</item>'si", $rss_content, $items);
$rss_items = $items[2];
$i = 0;
$result['items'] = array(); // create array even if there are no items
foreach($rss_items as $rss_item) {
// If number of items is lower then limit: Parse one item
if ($i < $this->items_limit || $this->items_limit == 0) {
foreach($this->itemtags as $itemtag) {
$temp = $this->my_preg_match("'<$itemtag.*?>(.*?)</$itemtag>'si", $rss_item);
if ($temp != '') $result['items'][$i][$itemtag] = $temp; // Set only if not empty
}
// Strip HTML tags and other bullshit from DESCRIPTION
if ($this->stripHTML && $result['items'][$i]['description'])
$result['items'][$i]['description'] = strip_tags($this->unhtmlentities(strip_tags($result['items'][$i]['description'])));
// Strip HTML tags and other bullshit from TITLE
if ($this->stripHTML && $result['items'][$i]['title'])
$result['items'][$i]['title'] = strip_tags($this->unhtmlentities(strip_tags($result['items'][$i]['title'])));
// If date_format is specified and pubDate is valid
if ($this->date_format != '' && ($timestamp = strtotime($result['items'][$i]['pubDate'])) !==-1) {
// convert pubDate to specified date format
$result['items'][$i]['pubDate'] = date($this->date_format, $timestamp);
}
// Item counter
$i++;
}
}

$result['items_count'] = $i;
return $result;
}
else // Error in opening return False
{
return False;
}
}
}








?>
 
Old 06-30-2005, 07:51 PM   #2
Matir
LQ Guru
 
Registered: Nov 2004
Location: San Jose, CA
Distribution: Debian, Arch
Posts: 8,507

Rep: Reputation: 128Reputation: 128
Have you tried running the script? You didn't specify in your original post.

Seriously, what happens when you try to use it?
 
Old 07-01-2005, 01:49 PM   #3
sendas4
Member
 
Registered: May 2004
Location: Tacoma, Wa
Distribution: Gentoo
Posts: 94

Original Poster
Rep: Reputation: 15
When It i get

Notice Undefined variable: paramsh in rssinjector.php on line 76
Notice Undefined variable: paramsh in rssinjector.php on line 82
Notice Undefined variable: paramsh in rssinjector.php on line 85
Notice Undefined variable: paramsh in rssinjector.php on line 88
Notice Undefined variable: paramsh in rssinjector.php on line 92
Notice Undefined variable: paramsh in rssinjector.php on line 95
Notice Undefined variable: paramsh in rssinjector.php on line 98
Error: RSS file at http://api.search.yahoo.com/WebSearc...ry=&adult_ok=1 not found
 
Old 07-01-2005, 02:07 PM   #4
keefaz
LQ Guru
 
Registered: Mar 2004
Distribution: Slackware
Posts: 6,552

Rep: Reputation: 872Reputation: 872Reputation: 872Reputation: 872Reputation: 872Reputation: 872Reputation: 872
Did you do the INSTALLATION and CONFIGURATION steps as
described in the script comments ?
 
  


Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
issues with mirc script accessing our php script dtra Linux - Software 2 07-02-2005 04:30 PM
PHP script DiagonalArg Programming 2 06-18-2005 02:02 PM
PHP -- How to execute a shell script from PHP using FTP functions?? zoonalex Programming 3 07-29-2004 11:51 AM
converting shell script to php script ? ibro Linux - General 6 05-24-2004 05:19 AM
php script delta7 Programming 3 07-24-2003 01:11 PM

LinuxQuestions.org > Forums > Non-*NIX Forums > Programming

All times are GMT -5. The time now is 12:55 AM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Open Source Consulting | Domain Registration