Δεν καταφέρνω να κάνω parse ένα feed που περιέχει content:encoded, βοήθεια ;

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
ManosApp
Δημοσιεύσεις: 48
Εγγραφή: 19 Ιούλ 2013 22:34

Δεν καταφέρνω να κάνω parse ένα feed που περιέχει content:encoded, βοήθεια ;

Δημοσίευση από ManosApp » 08 Δεκ 2013 04:32

Τελευταία προσπαθώ (απεγνωσμένα..) να κάνω parse ένα rss feed οποιοδήποτε που να περιέχει content:encoded (συνήθως το πετυχαίνω αυτό σε wordpress sites) με τον παρακάτω open source κώδικα το οποίο είναι ένα μικρό php script ουσιαστικά όχι τίποτα μεγάλο.

Πρόκειται για το : http://code.google.com/p/rssingest/down ... p&can=2&q=

Και απλά αλλάζοντας 4 παραμέτρους μπορείτε να το δοκιμάσετε και σείς για να δείτε πως δουλεύει !

Όλα καλά ήταν αρχικά όμως όταν δοκίμασα να κάνω parse ένα feed που στη δομή του περιείχε content:encoded αντί content που υπάρχει συνήθως τότε είχα πρόβλημα !

Πως λοιπόν μπορούμε να διαβάσουμε ένα rss feed που περιέχει content:encoded με βάση το παρακάτω script ;

Ο Πίνακας για να το δοκιμάσετε :
CREATE TABLE `rssingest` (
`item_id` VARCHAR( 32 ) NOT NULL ,
`feed_url` VARCHAR( 512 ) NOT NULL ,
`item_content` VARCHAR( 4000 ) NULL ,
`item_title` VARCHAR( 255 ) NOT NULL ,
`item_date` TIMESTAMP NOT NULL ,
`item_url` VARCHAR( 512 ) NOT NULL ,
`item_status` CHAR( 2 ) NOT NULL ,
`item_category_id` INT NULL ,
`fetch_date` TIMESTAMP NOT NULL
) ENGINE = MYISAM ;

Κώδικας: Επιλογή όλων

$db_hostname="localhost";
$db_username="yourusername";
$db_password="yourpassword";

$private_access_key="youraccesskey";

// Check a few bits and pieces

if(isset($_GET['feed_url']))
{
	$feed_url = $_GET['feed_url'];
}
else
{
	die("Need to pass the (consistent) 'feed url'");
}


if(isset($_GET['access_key']))
{

	if($_GET['access_key']==$private_access_key)
	{
		echo "Access key correct, proceeding...<br/><br/>";
	&#125;
	else
	&#123;
		die&#40;"wrong access key"&#41;;
	&#125;
&#125;
else
&#123;
	die&#40;"Need to pass the 'access_key' URL parameter"&#41;;
&#125;


try
&#123;
	/*  query the database */
	// $db = getCon&#40;&#41;;

	$db = mysql_connect&#40;$db_hostname,$db_username,$db_password&#41;;
	if &#40;!$db&#41;
	&#123;
		die&#40;"Could not connect&#58; " . mysql_error&#40;&#41;&#41;;
	&#125;
	mysql_select_db&#40;"your_db", $db&#41;;

	echo "Starting to work with feed URL '" . $feed_url . "'";

	/* Parse XML from  http&#58;//www.instapaper.com/starred/rss/580483/qU7TKdkHYNmcjNJQSMH1QODLc */
	//$RSS_DOC = simpleXML_load_file&#40;'http&#58;//www.instapaper.com/starred/rss/580483/qU7TKdkHYNmcjNJQSMH1QODLc'&#41;;

	libxml_use_internal_errors&#40;true&#41;;
	$RSS_DOC = simpleXML_load_file&#40;$feed_url&#41;;
	if &#40;!$RSS_DOC&#41; &#123;
		echo "Failed loading XML\n";
		foreach&#40;libxml_get_errors&#40;&#41; as $error&#41; &#123;
			echo "\t", $error->message;
		&#125;
	&#125;


	/* Get title, link, managing editor, and copyright from the document  */
	$rss_title = $RSS_DOC->channel->title;
	$rss_link = $RSS_DOC->channel->link;
	$rss_editor = $RSS_DOC->channel->managingEditor;
	$rss_copyright = $RSS_DOC->channel->copyright;
	$rss_date = $RSS_DOC->channel->pubDate;

	//Loop through each item in the RSS document

	foreach&#40;$RSS_DOC->channel->item as $RSSitem&#41;
	&#123;

		$item_id 	= md5&#40;$RSSitem->title&#41;;
		$fetch_date = date&#40;"Y-m-j G&#58;i&#58;s"&#41;; //NOTE&#58; we don't use a DB SQL function so its database independant
		$item_title = $RSSitem->title;
		$item_date  = date&#40;"Y-m-j G&#58;i&#58;s", strtotime&#40;$RSSitem->pubDate&#41;&#41;;
		$item_url	= $RSSitem->link;

		echo "Processing item '" , $item_id , "' on " , $fetch_date 	, "<br/>";
		echo $item_title, " - ";
		echo $item_date, "<br/>";
		echo $item_url, "<br/>";

		// Does record already exist? Only insert if new item...

		$item_exists_sql = "SELECT item_id FROM rssingest where item_id = '" . $item_id . "'";
		$item_exists = mysql_query&#40;$item_exists_sql, $db&#41;;
		if&#40;mysql_num_rows&#40;$item_exists&#41;<1&#41;
		&#123;
			echo "<font color=green>Inserting new item..</font><br/>";
			$item_insert_sql = "INSERT INTO rssingest&#40;item_id, feed_url, item_title, item_date, item_url, fetch_date&#41; VALUES &#40;'" . $item_id . "', '" . $feed_url . "', '" . $item_title . "', '" . $item_date . "', '" . $item_url . "', '" . $fetch_date . "'&#41;";
			$insert_item = mysql_query&#40;$item_insert_sql, $db&#41;;
		&#125;
		else
		&#123;
			echo "<font color=blue>Not inserting existing item..</font><br/>";
		&#125;

		echo "<br/>";
	&#125;

	// End of form //
&#125; catch &#40;Exception $e&#41;
&#123;
    echo 'Caught exception&#58; ',  $e->getMessage&#40;&#41;, "\n";
&#125;
?>
Σκέφτηκα να προσθέσω/τροποποιήσω τον παραπάνω κώδικα του script κάπως έτσι.. αλλά δεν τα κατάφερα :(

Κώδικας: Επιλογή όλων

$test = file_get_contents&#40;"$feed_url"&#41;;
$test= str_replace&#40;"content&#58;encoded>","content>",$test&#41;;

	libxml_use_internal_errors&#40;true&#41;;
	$RSS_DOC = simpleXML_load_file&#40;$test&#41;;
	if &#40;!$RSS_DOC&#41; &#123;
		echo "Failed loading XML\n";
		foreach&#40;libxml_get_errors&#40;&#41; as $error&#41; &#123;
			echo "\t", $error->message;
		&#125;
	&#125;

 $item_content = $RSSitem->encoded;

Πρόσθεσα και το $item_content στο ΙNSERT φυσικά μπάσκε γίνει η καταχώρηση αλλά τζίφος !
...μπορεί κάποιος να με βοηθήσει να μου εξηγήσει πως στο καλό θα μπορέσω να διαβάσω το content:encoded και να γίνει η καταχώρηση στη ΒΔ ;

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Δεν καταφέρνω να κάνω parse ένα feed που περιέχει content:encoded, βοήθεια ;

Δημοσίευση από geomagas » 08 Δεκ 2013 13:20

Δεν καταλαβαίνω...

Στο πρώτο script δεν διαβάζεις καθόλου το πεδίο, ενώ στο δεύτερο προσπαθείς να το διαβάσεις σαν $RSSitem->encoded ενώ πρώτα έχεις εξαλείψει το encoded με str_replace().

Τελικά, ποιος είναι ο τρόπος που προσπαθείς, και που αποτυγχάνεις;

Επίσης, κανένα link με δείγμα rss που να αναπαράγει το πρόβλημα;;;

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Δεν καταφέρνω να κάνω parse ένα feed που περιέχει content:encoded, βοήθεια ;

Δημοσίευση από dva_dev » 08 Δεκ 2013 20:25

Για δοκίμασε κάτι τέτοιο

Κώδικας: Επιλογή όλων

$item_content = $RSSitem->children&#40;'content',true&#41;->encoded;

ManosApp
Δημοσιεύσεις: 48
Εγγραφή: 19 Ιούλ 2013 22:34

Δεν καταφέρνω να κάνω parse ένα feed που περιέχει content:encoded, βοήθεια ;

Δημοσίευση από ManosApp » 15 Δεκ 2013 21:05

dva_dev έγραψε:Για δοκίμασε κάτι τέτοιο

Κώδικας: Επιλογή όλων

$item_content = $RSSitem->children&#40;'content',true&#41;->encoded;
Αυτό ήταν η λύση να σαι καλά dav_dev !

Όμως προέκυψε ακόμα ένα θέμα αυτή τη φορά με την ημερομηνία που κάνω parse από το rss feed. Αναφέρομαι στο $item_date που στο script έχει ως εξής :

Κώδικας: Επιλογή όλων

$item_date  = date&#40;"Y-m-j G&#58;i&#58;s", strtotime&#40;$RSSitem->pubDate&#41;&#41;;
Το script όπως έχει δεν καταχωρεί στη βάση δεδομένων την σωστή ημερομηνία αλλά καταχωρεί μια άλλη που είναι λάθος !

Πιο πρακτικά, όταν πάω να κάνω με το script parse το rss feed :
Τότε παρουσιάζεται το πρόβλημα που περιγράφω πιο πάνω. Αν κοιτάξετε το rss feed θα δείτε ότι το pubDate περιέχει ημερομηνία με την παρακάτω μορφή :
<pubDate>Sun, 15 Dec 2013 20:11:15 +0200</pubDate>
To πρόβλημα όπως σας περιέγραψα είναι ότι δεν καταχωρείται στη βάση δεδομένων αυτή η ημερομηνία αλλά κάποια άλλη εντελώς λάθος !

Στον πίνακα του script μπορείτε να δείτε ότι το πεδίο για το $item_date είναι TIMESTAMP.
Τι φταίει και δεν καταχωρείται σωστά η ημερομηνία ;

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Δεν καταφέρνω να κάνω parse ένα feed που περιέχει content:encoded, βοήθεια ;

Δημοσίευση από geomagas » 16 Δεκ 2013 15:09

Εντελώς λάθος;
Μήπως έχει κάποιες ώρες διαφορά;
Αν είναι έτσι, θα έχει να κάνει με τα timezones της php και της mysql.
Σε πρώτη φάση, δες τι σου βγάζει το

Κώδικας: Επιλογή όλων

echo date&#40;"Y-m-j G&#58;i&#58;s", strtotime&#40;'Sun, 15 Dec 2013 20&#58;11&#58;15 +0200'&#41;&#41;;

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6236
Εγγραφή: 30 Νοέμ 2004 03:09

Δεν καταφέρνω να κάνω parse ένα feed που περιέχει content:encoded, βοήθεια ;

Δημοσίευση από fafos » 16 Δεκ 2013 16:11

Dialexe ti thes na apothikeueis sthn vash.. timestamp h datetime?

an thes time stamp to kaneis:

Κώδικας: Επιλογή όλων

$item_date  = strtotime&#40;$RSSitem->pubDate&#41;;
an thes datetime.. allazeis ton typo sthn vash se DATETIME kai to kaneis etsi:

Κώδικας: Επιλογή όλων

$item_date  = date&#40;"Y-m-d G&#58;i&#58;s", strtotime&#40;$RSSitem->pubDate&#41;&#41;;
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

ManosApp
Δημοσιεύσεις: 48
Εγγραφή: 19 Ιούλ 2013 22:34

Δεν καταφέρνω να κάνω parse ένα feed που περιέχει content:encoded, βοήθεια ;

Δημοσίευση από ManosApp » 17 Δεκ 2013 18:47

geomagas το :

Κώδικας: Επιλογή όλων

echo date&#40;"Y-m-j G&#58;i&#58;s", strtotime&#40;'Sun, 15 Dec 2013 20&#58;11&#58;15 +0200'&#41;&#41;;
μου δίνει 2013-12-15 13:11:15 η φιλοξενία μου είναι στην Αμερική αλλά δεν σκέφτηκα ότι μπορεί να είναι το πρόβλημα η διαφορά της ζώνης ώρας σε αυτή τη περίπτωση γιατί υπέθεσα ότι άσχετα από το που είναι η φιλοξενία μου και που η φιλοξενία του rss feed που τραβώ αυτό δεν θα επηρέαζε το parsing αφού στη βάση δεδομένων θα έπρεπε απλά να μπεί η ημερομηνία που μου δίνει το rss feed που κάνω parse, τι σχέση έχει που βρίσκεται η φιλοξενία μου.. ή μήπως τελικά αυτό φταίει ;

ManosApp
Δημοσιεύσεις: 48
Εγγραφή: 19 Ιούλ 2013 22:34

Δεν καταφέρνω να κάνω parse ένα feed που περιέχει content:encoded, βοήθεια ;

Δημοσίευση από ManosApp » 17 Δεκ 2013 18:56

fafos έγραψε:Dialexe ti thes na apothikeueis sthn vash.. timestamp h datetime?

an thes time stamp to kaneis:

Κώδικας: Επιλογή όλων

$item_date  = strtotime&#40;$RSSitem->pubDate&#41;;
an thes datetime.. allazeis ton typo sthn vash se DATETIME kai to kaneis etsi:

Κώδικας: Επιλογή όλων

$item_date  = date&#40;"Y-m-d G&#58;i&#58;s", strtotime&#40;$RSSitem->pubDate&#41;&#41;;
fafos αφού ο πίνακας του script έχει το πεδίο σε timestamp τότε σε timestamp και γώ το θέλω.

Μόνο, που αν χρησιμοποιήσω το :

Κώδικας: Επιλογή όλων

$item_date  = strtotime&#40;$RSSitem->pubDate&#41;;
Τότε στη βάση εγγράφονται μόνο μηδενικά !!!

0000-00-00 00:00:00

Ενώ στην άλλη περίπτωση αν κάνω όπως λες με DATETIME στη βάση δεδομένων και κρατώντας τον php κώδικα ως έχει τότε ναι μεν καταχωρείται η ημερομηνία αλλά είναι πάλι λάθος ημερομηνία η οποία καταχωρείται !

Το :
<pubDate>Tue, 17 Dec 2013 18:09:32 +0200</pubDate>
μου καταχωρήθηκε ως 2013-12-17 11:09:32 ..εντελώς λάθος !

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Δεν καταφέρνω να κάνω parse ένα feed που περιέχει content:encoded, βοήθεια ;

Δημοσίευση από geomagas » 17 Δεκ 2013 19:40

ManosApp έγραψε:geomagas το :

Κώδικας: Επιλογή όλων

echo date&#40;"Y-m-j G&#58;i&#58;s", strtotime&#40;'Sun, 15 Dec 2013 20&#58;11&#58;15 +0200'&#41;&#41;;
μου δίνει 2013-12-15 13:11:15 η φιλοξενία μου είναι στην Αμερική αλλά δεν σκέφτηκα ότι μπορεί να είναι το πρόβλημα η διαφορά της ζώνης ώρας σε αυτή τη περίπτωση γιατί υπέθεσα ότι άσχετα από το που είναι η φιλοξενία μου και που η φιλοξενία του rss feed που τραβώ αυτό δεν θα επηρέαζε το parsing αφού στη βάση δεδομένων θα έπρεπε απλά να μπεί η ημερομηνία που μου δίνει το rss feed που κάνω parse, τι σχέση έχει που βρίσκεται η φιλοξενία μου.. ή μήπως τελικά αυτό φταίει ;
Δεν έχει τόσο σχέση η φιλοξενία σου όσο η ρύθμιση του timezone σε php (και ενίοτε σε mysql).
Με άλλα λόγια, όπου κι αν βρίσκεται το σύστημα που σε φιλοξενεί, η php μπορεί να ρυθμιστεί σε συγκεκριμένη ζώνη.

Η ζώνη ώρας επηρεάζει τη λειτουργία της strtotime. Για παράδειγμα, δοκίμασε:

Κώδικας: Επιλογή όλων

$d='Sun, 15 Dec 2013 20&#58;11&#58;15 +0200';
date_default_timezone_set&#40;'Europe/Athens'&#41;;
echo date&#40;"Y-m-j G&#58;i&#58;s", strtotime&#40;$d&#41;&#41;."<br>";
date_default_timezone_set&#40;'America/New York'&#41;;
echo date&#40;"Y-m-j G&#58;i&#58;s", strtotime&#40;$d&#41;&#41;."<br>";
date_default_timezone_set&#40;'GMT'&#41;;
echo date&#40;"Y-m-j G&#58;i&#58;s", strtotime&#40;$d&#41;&#41;."<br>";
...και θα καταλάβεις.

Αν και δεν ξέρω την υπόλοιπη εφαρμογή σου, και συνεπώς τι άλλο θα επηρεαστεί, θεωρώ ότι αν βάλεις

Κώδικας: Επιλογή όλων

date_default_timezone_set&#40;'Europe/Athens'&#41;;
...στην αρχή του script, θα είσαι μια χαρά.

Σημείωση: Για να διαβάσεις αντίστοιχα την τρέχουσα ρύθμιση, υπάρχει και η date_default_timezone_get().

Επιπλέον, ψηφίζω TIMESTAMP για το πεδίο στη ΒΔ, επειδή δεν κρατά πληροφορίες για timezone και εμένα αυτό με βολεύει, γενικά, καλύτερα...
Πρόσεξε όμως: Αν και το timestamp είναι ουσιαστικά ένας ακέραιος, όταν εισάγεις δεδομένα θα πρέπει να δίνεις ημερομηνία, ώστε η mysql να κάνει τη μετατροπή σε UTC σύμφωνα με τις δικές της ρυθμίσεις timezone.
Γι αυτό και όταν προσπαθείς να της εισάγεις "ξερό" το αποτέλεσμα της strtotime(), που είναι timestamp, παίρνεις "κουλούρια".... :D
Το ίδιο ισχύει (αντίστροφα) κατά το select: η μετατροπή γίνεται από UTC στη ζώνη ώρας της mysql, και σου επιστρέφει ημερομηνία.

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες