Google
 
Main Page
 The gatekeeper of reality is
 quantified imagination.

Stay notified when site changes by adding your email address:

Your Email:

Bookmark and Share
Coming Soon
Email Notification
Project "Facebook Graph Feed"
Purpose
The purpose of this project is to demonstrate how to create a RSS feed from a public group discussion board on Facebook from the new Graph API option.

Introduction
The output of the graph API (graph.facebook.com/PUBLICWALL) is JSON-based and appears to be oriented towards being used client-side. There are a few tips on using it with PHP but very little exists in terms of how to use it with ASP.NET in order to create a simple RSS feed (server-side) that can then be called into a webpage. This page demonstrates one simple way to convert it into RSS with ASP.NET.

The items that you will need to change are "discussionGroupPage", "feed_link" and "feed_webmaster". Call the page as yourscriptname.aspx?feedNumber=10&name=yourfeed (feedNumber = number of entries to show, name = name of your feed).

ASP.NET 3.5 Code:
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.Text" %>
<script runat="server">
Dim discussionGroupPage As String = "http://graph.facebook.com/YOURPUBLICGROUP/feed?limit=" ' URL to Graph API of Group Wall
Dim rssCacheClear As Integer = 0 ' 1 = clear server-cache, 0 = do not clear server-cache.
' RSS Content Provider Data
Dim rssDescriptionLen As Integer = 60 ' Number of characters to allow in the poster's post (description)
Dim rssIncludeHeader As Integer = 0 ' 0 = do not include RSS provider data (below), 1 = include
Dim feed_title As String = "Public Group Wall Title"
Dim feed_link As String = "http://www.facebook.com/YOURPUBLICGROUP/"
Dim feed_description As String = "Discussion Feed"
Dim feed_language As String = "en-us"
Dim feed_pubdate As String = "20 Apr 2007 9:40:00 GMT"
Dim feed_copyright As String = String.Empty
Dim feed_webmaster As String = "webmaster@yoursite.com"
' Do Not Use
Dim discussionPageData() As String
Dim discussionPageDataCount As Integer = 1
Dim crawlAgent As String = Nothing
Dim crawlError As String = Nothing
' TRAP CONNECT ERRORS IN CRAWLPAGE - SEND TO GLOBAL FOR CHECKING
Private Function crawlPage(ByVal URL As String) As String
Dim crawlOutput As String = Nothing
Dim crawlMethod As String = "GET"
Dim crawlURL As String = URL
Try
Dim myRequest As HttpWebRequest = CType(WebRequest.Create(crawlURL), HttpWebRequest)
myRequest.UserAgent = crawlAgent
myRequest.Method = crawlMethod
Dim myResponse As HttpWebResponse = CType(myRequest.GetResponse(), HttpWebResponse)
Dim streamResponse As Stream = myResponse.GetResponseStream()
Dim streamRead As New StreamReader(streamResponse, Encoding.ASCII)
' .Net not swift enough to pick up line breaks via vbcrlf or vbcr in the stream. Hodge-podge it.
Dim hodgepodge As String = Replace(streamRead.ReadToEnd(), " ", "***REPLACEHERE***") ' 27 spaces
hodgepodge = Replace(hodgepodge, " ", "***REPLACEHERE***") ' 25 spaces
hodgepodge = Replace(hodgepodge, " ", "***REPLACEHERE***") ' 23 spaces
hodgepodge = Replace(hodgepodge, " ", "***REPLACEHERE***") ' 21 spaces
hodgepodge = Replace(hodgepodge, " ", "***REPLACEHERE***") ' 20 spaces
hodgepodge = Replace(hodgepodge, " ", "***REPLACEHERE***") ' 15 spaces
hodgepodge = Replace(hodgepodge, " ", "***REPLACEHERE***") ' 12 spaces
hodgepodge = Replace(hodgepodge, " ", "***REPLACEHERE***") ' 9 spaces
hodgepodge = Replace(hodgepodge, " ", "***REPLACEHERE***") ' 6 spaces
hodgepodge = Replace(hodgepodge, " ", "***REPLACEHERE***") ' 3 spaces
Dim docTmp() As String = Split(hodgepodge, "***REPLACEHERE***")
For Z As Integer = 0 To UBound(docTmp)
redim preserve discussionPageData(discussionPageDataCount) : discussionPageData(discussionPageDataCount) = docTmp(Z)
discussionPageDataCount = discussionPageDataCount + 1
Next
streamRead.Close()
streamResponse.Close()
myResponse.Close()
Catch ex As Exception
crawlError = Server.HtmlEncode(ex.Message)
End Try
End Function
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
' Get User's Agent Data
crawlAgent = Request.UserAgent
' Querystring Data
Dim feedName As String = CStr(Request.QueryString("name"))
If Len(feedName) = 0 Then : feedName = "default" : End If
Dim maxFeedsTotalAccept As Integer = CInt(Request.QueryString("feedNumber"))
If maxFeedsTotalAccept <= 0 Then : maxFeedsTotalAccept = 10 : End If
discussionGroupPage = discussionGroupPage & maxFeedsTotalAccept
' Do Not Use
Dim saved_ids() As String
Dim saved_messages() As String
Dim savedCount As Integer = -1
Dim rssFeed As String = Nothing
Dim feedContent As String = Nothing
If rssCacheClear = 0 Then
' Build Fresh RSS
If HttpContext.Current.Cache(feedName) Is Nothing Then
' Load Wall Page
crawlPage(discussionGroupPage)
dim likes_flag As Integer = 0
dim comments_flag As Integer = 0
dim likes_comments_reset As Integer = 0
dim step_started As Integer = 0
dim step_completed As Integer = 0
dim id_data As String = Nothing
dim message_data As String = Nothing
For X As Integer = 0 TO discussionPageDataCount - 2
dim line As String = discussionPageData(X)
dim line_advance As String = discussionPageData(X + 1)
If InStr(line, """likes""") > 0 Then
likes_flag = 1
End if
If InStr(line, """comments""") > 0 Then
comments_flag = 1
End if
if likes_comments_reset = 1 Then
likes_flag = 0 : comments_flag = 0
End if
if likes_flag = 0 AND comments_flag = 0 AND likes_comments_reset = 0 Then
if step_started = 1 Then
if step_completed > 0 Then
if step_completed = 3 Then
if InStr(line, """message"": """) > 0 Then
message_data = Split(line, """")(3)
step_completed = 4
savedCount = savedCount + 1
' Clip excess text
If Len(message_data) > rssDescriptionLen Then : message_data = Mid(message_data, 1, rssDescriptionLen) & "..." : End If
redim preserve saved_ids(savedCount) : saved_ids(savedCount) = "http://graph.facebook.com/" & id_data & "/picture" : id_data = ""
redim preserve saved_messages(savedCount) : saved_messages(savedCount) = message_data : message_data = ""
End if
End if
if step_completed = 2 Then
if InStr(line, """id"": """) > 0 Then
id_data = Split(line, """")(3)
step_completed = 3
End if
End if
if step_completed = 1 Then
if InStr(line, """from"": {") > 0 OR InStr(line, """to"": {") > 0 Then
step_completed = 2
End if
End if
End if
if InStr(line, "{") > 0 AND step_completed = 0 Then
if InStr(line_advance, """id"":") > 0 Then
step_completed = 1
End if
End if
if step_completed = 4 Then : step_completed = 0 : End if
End if
if InStr(line, """data"": [") > 0 AND step_started = 0 Then : step_started = 1 : End if
Else
if likes_comments_reset = 1 Then : likes_comments_reset = 0 : End if
if InStr(line, """count""") > 0 Then
likes_comments_reset = 1
End if
End if
Next
' Generate Output
if savedCount > -1 Then
' Assemble Data Into RSS
Dim feedStep As Integer = 0
For R As Integer = 0 To savedCount
feedStep = feedStep + 1
if feedStep <= maxFeedsTotalAccept Then
feedContent = feedContent & "<item>" & vbCrLf
feedContent = feedContent & "<title>" & feed_title & "</title>" & vbCrLf
feedContent = feedContent & "<link>" & feed_link & "</link>" & vbCrLf
feedContent = feedContent & "<description>" & Server.HtmlEncode("<img align=""left"" src=""" & saved_ids(R) & """ border=""0"" /> ") & Server.HtmlEncode(Replace(saved_messages(R), "'", "'")) & "</description>" & vbCrLf
feedContent = feedContent & "<author></author>" & vbCrLf
feedContent = feedContent & "<date>" & feed_pubdate & "</date>" & vbCrLf
feedContent = feedContent & "</item>" & vbCrLf
End if
Next
Else
' Nothing Found
If Len(crawlError) <= 0 Then
feedContent = feedContent & "<item>" & vbCrLf
feedContent = feedContent & "<title>Page Found But Data Not Recognized</title>" & vbCrLf
feedContent = feedContent & "<link></link>" & vbCrLf
feedContent = feedContent & "<description>Page Found But Data Not Recognized</description>" & vbCrLf
feedContent = feedContent & "<author></author>" & vbCrLf
feedContent = feedContent & "<date>01 Jan 1900 00:00:01 GMT</date>" & vbCrLf
feedContent = feedContent & "</item>" & vbCrLf
End If
End if
If Len(crawlError) <= 0 Then
' Compile RSS Data
if rssIncludeHeader = 1 Then
rssFeed = rssFeed & "<rss version=""2.0"">" & vbCrLf
End if
rssFeed = rssFeed & "<channel>" & vbCrLf
If rssIncludeHeader = 1 Then
rssFeed = rssFeed & "<title>" & feed_title & "</title>" & vbCrLf
rssFeed = rssFeed & "<link>" & feed_link & "</link>" & vbCrLf
rssFeed = rssFeed & "<description>" & feed_description & "</description>" & vbCrLf
rssFeed = rssFeed & "<language>" & feed_language & "</language>" & vbCrLf
rssFeed = rssFeed & "<date>" & feed_pubdate & "</date>" & vbCrLf
rssFeed = rssFeed & "<copyright>" & feed_copyright & "</copyright>" & vbCrLf
rssFeed = rssFeed & "<webmaster>" & feed_webmaster & "</webmaster>" & vbCrLf
End If
rssFeed = rssFeed & feedContent
rssFeed = rssFeed & "</channel>" & vbCrLf
if rssIncludeHeader = 1 Then
rssFeed = rssFeed & "</rss>"
End if
' Save Into Server Cache
HttpContext.Current.Cache.Add(feedName, rssFeed, Nothing, DateTime.Now.AddDays(1), System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.Normal, Nothing)
End If ' End Len(crawlError) <= 0
Else
' Use RSS From Server Cache
rssFeed = CType(HttpContext.Current.Cache(feedName), String)
End if ' End HttpContext.Current.Cache(feedName) Is Nothing
Else
' Clear Server Cache
HttpContext.Current.Cache.Remove(feedName)
' Compile RSS Data
feedContent = feedContent & "<item>" & vbCrLf
feedContent = feedContent & "<title>Server Cache Cleared</title>" & vbCrLf
feedContent = feedContent & "<link></link>" & vbCrLf
feedContent = feedContent & "<description>Server Cache Cleared</description>" & vbCrLf
feedContent = feedContent & "<author></author>" & vbCrLf
feedContent = feedContent & "<date>01 Jan 1900 00:00:01 GMT</date>" & vbCrLf
feedContent = feedContent & "</item>" & vbCrLf
if rssIncludeHeader = 1 Then
rssFeed = rssFeed & "<rss version=""2.0"">" & vbCrLf
End if
rssFeed = rssFeed & "<channel>" & vbCrLf
If rssIncludeHeader = 1 Then
rssFeed = rssFeed & "<title>" & feed_title & "</title>" & vbCrLf
rssFeed = rssFeed & "<link>" & feed_link & "</link>" & vbCrLf
rssFeed = rssFeed & "<description>" & feed_description & "</description>" & vbCrLf
rssFeed = rssFeed & "<language>" & feed_language & "</language>" & vbCrLf
rssFeed = rssFeed & "<date>" & feed_pubdate & "</date>" & vbCrLf
rssFeed = rssFeed & "<copyright>" & feed_copyright & "</copyright>" & vbCrLf
rssFeed = rssFeed & "<webmaster>" & feed_webmaster & "</webmaster>" & vbCrLf
End If
rssFeed = rssFeed & feedContent
rssFeed = rssFeed & "</channel>" & vbCrLf
if rssIncludeHeader = 1 Then
rssFeed = rssFeed & "</rss>"
End if
End if ' End rssCacheClear = 0
' Generate Output
Response.Buffer = False
If rssIncludeHeader = 1 Then
Response.ContentType = "application/rss+xml"
Else
Response.ContentType = "text/xml"
End If
Response.Write("<" & "?" & "xml version=""1.0"" encoding=""utf-8""" & "?" & ">" & vbCrLf)
Response.Write(rssFeed)
End Sub
</script>
About Joe