Skip to content

Instantly share code, notes, and snippets.

@gmarcus
Last active July 23, 2022 13:36
Show Gist options
  • Save gmarcus/5893479 to your computer and use it in GitHub Desktop.
Save gmarcus/5893479 to your computer and use it in GitHub Desktop.
A php script to fetch the raw atom feed for your Google Reader tags.

This script authenticates using the Google Client Login protocol, then enumerates your Google Reader tags and creates a local .xml file for each tag name in an output folder.

Run locally by typing

$php readerauthtags.php

The script will create a local ./output folder with the atom feeds. It will store up to 1000 feed entries per tag. You can then host these files on your own web server and import them to your favorite new RSS reader :)

In order for the script to work, search and replace YOUR-GOOGLE-USERNAME and YOUR-GOOGLE-PASSWORD with your credentials.

Credits

Derived from a great script from Dave Shea. http://snipt.net/thejames/php-google-reader-authentication-script/

<?php
// ----------------------------------------
// Fetch Google Reader tag atom feeds
// ----------------------------------------
//
// Authored by Glenn Marcus
// @glennmarcus
// http://linkedin.com/in/glennmarcus
//
// Derived from original work done by
// Dave Shea.
// http://snipt.net/thejames/php-google-reader-authentication-script/
//
// these are the urls we'll need to access various services
$urlAuth = "https://www.google.com/accounts/ClientLogin";
$urlAtom = "https://www.google.com/reader/atom";
// our array of login data
$login = array(
"service" => "reader",
// Google email address the account holder
"Email" => "YOUR-GOOGLE-USERNAME",
// the account's password in plaintext
"Passwd" => "YOUR-GOOGLE-PASSWORD",
// an identifying name for your script, can be anything
"source" => "my-reader-script"
);
// Check that we have an updated email
if (strpos($login["Email"], '@') == FALSE) {
echo "You need to replace YOUR-GOOGLE-USERNAME and YOUR-GOOGLE-PASSWORD with your credentials." . PHP_EOL;
die();
}
// first step is to authenticate
// let's build a POST request using the login data array
$postRequest = "";
foreach($login as $field => $value) {
$postRequest .= $field . "=" . $value . "&";
}
// start buffering what we get back
ob_start();
$ch = curl_init($urlAuth);
curl_setopt ($ch, CURLOPT_POST, true);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postRequest);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec ($ch);
curl_close ($ch);
// throw the buffer into a variable
$loginResult = ob_get_contents();
ob_end_clean();
// we just received three lines of ugliness to contend with.
// each line is a huge string preceded with an ID
// the IDs are: SID, LSID, and Auth; we only want Auth
$loginResultsArray = preg_split('/\r\n|\n|\r/', $loginResult);
$authString = "";
foreach ($loginResultsArray as $value) {
if (preg_match('/Auth=(.*)/', $value, $matches)) {
$authString = $matches[1];
}
};
// Build an action to fetch the label tags from Google Reader as json
$action = sprintf("https://www.google.com/reader/api/0/tag/list?output=json&ck=%1", time());
// start buffering what we get back
ob_start();
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $action);
//curl_setopt ($ch, CURLOPT_HTTPGET, true);
curl_setopt ($ch, CURLOPT_HTTPHEADER, array(
"Authorization: GoogleLogin auth=" . $authString
));
curl_exec ($ch);
curl_close ($ch);
// throw the buffer into a variable
$json_tags = ob_get_contents();
ob_end_clean();
// Extract all the tag names
$json_tags_decoded = json_decode($json_tags, TRUE);
$tag_items = $json_tags_decoded['tags'];
if (count($tag_items) == 0){
echo "No tags found. Exiting." . PHP_EOL;
die();
}
$tags = array();
foreach($tag_items as $tag_item) {
$tag_id = $tag_item['id'];
// look for only ids with /label/ in the name
$tag_id_array = explode("/label/", $tag_id);
if (count($tag_id_array) > 1)
$tags[] = $tag_id_array[1];
}
$num_tags = count($tags);
echo "Found " . $num_tags . " tags.". PHP_EOL;
// Make an output folder
$output_folder_name = @"./output";
if (is_dir($output_folder_name) == 0) {
echo "Making ./output folder" . PHP_EOL;
mkdir($output_folder_name);
}
// Save out the tag names into a file
$tag_names_file_name = $output_folder_name . "/tagnames.txt";
$tag_names_string = implode(PHP_EOL, $tags);
echo "Saving list of tag names to '" . $tag_names_file_name . "'" . PHP_EOL;
file_put_contents($tag_names_file_name, $tag_names_string);
$num_tags_processed = 1;
foreach($tags as $tag) {
echo PHP_EOL . "Processing '" . $tag . "' (" . $num_tags_processed . " of ". $num_tags. ")" . PHP_EOL;
echo "Fetching feed from Google Reader" . PHP_EOL;
// Fetch the tag atom feed from Google Reader
$action = $urlAtom . "/user/-/label/" . rawurlencode($tag) . "?n=1000";
// start buffering what we get back
ob_start();
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $action);
curl_setopt ($ch, CURLOPT_HTTPHEADER, array(
"Authorization: GoogleLogin auth=" . $authString
));
curl_exec ($ch);
curl_close ($ch);
// throw the buffer into a variable
$tag_feed = ob_get_contents();
ob_end_clean();
$tag_feed_file_name = $output_folder_name . "/" . $tag . ".xml";
echo "Saving feed to '" . $tag_feed_file_name . "'" . PHP_EOL;
file_put_contents($tag_feed_file_name, $tag_feed);
$num_tags_processed = $num_tags_processed + 1;
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment