I often use Warren's rather excellent Twitter for Umbraco package to display Twitter feeds on websites. To save on hits to the Twitter server (especially on busier sites) I cache the macro, often for about 20 minutes (unless the feed is updated on a more regular basis). This has always worked fine, until recently, when I had an issue on a client site where the feed kept showing up empty.
I'd not come accross this before, so I did some digging and found out that the Twiiter for Umbraco package was getting a 403 error, and therefore no Tweets, and the Macro was caching as empty. After some digging around, I found out that Twitter have started limiting access to the open feeds, to roughly 60 or so requests an hour (this is called Rate Limiting, you can read about it here). This was still a bit odd, as the site should only have been hitting the feed three times an hour. Then I discovered that they had some other apps hitting the feed as well, that was causing us to hit the limit.
The Twitter for Umbraco feed doesn't cache the response from Twitter, so if it can't get a list of Tweets because you've fallen foul of Rate Limiting (as we had), or if the Twitter feed is unavailable (which also happens more than I realised), then you're stuck with no Tweets.
I looked into a solution for this, and came up with the idea of using Darren Ferguson's Feed Cache package to download and cache the feed (as that way if the feed was unavailable we'd still have a cached copy to read). It turned out to be quite simple, with only a few tweaks needed, so I thought I'd cover it here for anyone who's interested!
First, make sure you have the Twitter for Umbraco package installed, and make sure that you have the Macro up and running on a page and that it's pulling out Tweets and displaying them. Full instructons for setting up the feed are on the Twitter for Umbraco project page.
Next, install the Feed Cache package, again, the setup instructions are included on the project page.
Once both are installed, you can get everything set up. First up, you need the URL that your Twitter Macro is using to get the Tweets. This is pretty easy to get. Go into the developer section in the back office, and open the XSLT file called "cws_twitterStatus.xslt". Scroll down to the beginning of the "match" part of the template, and you'll see a variable called "twitterXMLUrl". Use an XSL value of just underneath this variable to get the feed (don't forget to get rid of this once you've got the feed URL!).
<xsl:value-of select="$twitterXMLUrl" />
Armed with the feed URL, you can now open the config file for the feedCache package, which is called "feedcache2.config" and is located in the "config" folder of the site. Below is an example of the file, with a feed set up:
<?xml version="1.0" encoding="utf-8"?> <Configuration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <CachePath>C:\inetpub\wwwroot\mysite\App_Data\FeedCache</CachePath> <Feeds> <Feed> <Url>[PLACE YOUR TWITTER URL HERE]</Url> <LocalFile>mytwitter.xml</LocalFile> </Feed> </Feeds> </Configuration>
Notice that we set a path to the feed to save its XML to (make sure that App Pool identity can read, write and modify to the location you specify, I normally use the "App_Data" folder). We also set a file name for the twitter feed.
Now all we need to do is schedule the feed to run on a regular basis. Open your "umbracoSettings.config" file from the config folder of the website, and scroll down to the scheduled tasks section. You can then add a scheduled task to the section for the feed cache. The interval is in seconds, the example task below will check the feed every 15 minutes. Here is an example of the task:
<scheduledTasks> <task log="true" alias="feedcache2" interval="1800" url="http://[ENTER YOUR URL HERE]/umbraco/plugins/FergusonMoriyama/FeedCache2/FmFeedCache.aspx" /> </scheduledTasks>
You can run the link from the task in a brower to make sure that it's working. If it did, there should be an XML file with the name you specified in the folder you specified. If there isn't, the main things to check are that your Twitter URL is correct, and that the permissions are set properly on the path you specified for the feed to save to!
Once that's done, you just need to make a small change to the "cws_twitterStatus.xslt" file in the developer section. First go back to the section that sets the Twitter URL and comment it out. Replace it with the folowing code:
<xsl:variable name="twitterXMLUrl" select="[RELATIVE PATH TO XML FILE HERE, e.g. '../App_Data/FeedCache/mytwitter.xml']"/>
Make sure that you set the path to the file that the feed is saving to correctly! Once that's done, scroll slightly further down the page, and you'll see two for-each loops that actually display the Tweets. They're currently using an umbraco.library call, we need to change that slightly. Change the first for-each to:
<xsl:for-each select="document($twitterXMLUrl)//statuses/status">
and the second for-each loop to:
<xsl:for-each select="document($twitterXMLUrl)//statuses/status [in_reply_to_screen_name = '']">
Save the macro, and you're done! You now have a Twitter feed that's cached, so if the feed is unreachable, your site will still display the tweets!