<%@ Import Namespace="System" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.Text" %>
<script runat="server">
' Call this page as: somepage.aspx?name=Group1&feedNumber=6
' name = the server cache object name
' feedNumber = number of posts on wall to accept
' Feed Customizaiton
Dim discussionGroupPage As String = "http://www.facebook.com/PUBLIC-GROUP?sk=wall" ' URL of the public group wall
Dim rssDescriptionLen As Integer = 60 ' Number of characters to allow in the poster's post (description)
Dim numberOfPostsShow As Integer = 6 ' Number of posts on the wall to show
Dim rssIncludeImg As Integer = 1 ' 0 = do not include the thumbnail image of posters in description, 1 = include
Dim rssIncludeHeader As Integer = 0 ' 0 = do not include RSS provider data (below), 1 = include
Dim rssShowErrors As Integer = 0 ' 0 = do not show server-side errors with wall data retrieval, 1 = show
Dim feed_title As String = "Your Feed Title"
Dim feed_link As String = "http://www.facebook.com/PUBLIC-GROUP/"
Dim feed_description As String = "Public Group Wall 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 = "you@yoursite.com"
' Maintenance
Dim overrideCache As Integer = 0 ' 1 = override referring to cache when testing (useful when you have more than one instance of this code running referring to the same cache object and others are loading a different instance), 0 = do not override
Dim rssCacheClear As Integer = 0 ' 1 = clear server-cache, 0 = do not clear server-cache
Dim rawDump As Integer = 0 ' 1 = show fetched content without reorganization/formatting, 0 = do not show fetched content
' Do Not Use
Dim crawlAgent As String = String.Empty
Dim crawlError As String = String.Empty
' TRAP CONNECT ERRORS IN CRAWLPAGE
Private Function crawlPage(ByVal URL As String) As String
Dim buffSize As Integer = 2048
Dim crawlOutput As String = String.Empty
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)
Dim readBuff(buffSize) As [Char]
Dim lineStep As Integer = streamRead.Read(readBuff, 0, buffSize)
While lineStep > 0
Dim outputData As New [String](readBuff, 0, lineStep)
crawlOutput = crawlOutput & outputData
lineStep = streamRead.Read(readBuff, 0, buffSize)
End While
streamRead.Close()
streamResponse.Close()
myResponse.Close()
Catch ex As Exception
crawlError = Server.HtmlEncode(ex.Message)
End Try
Return (crawlOutput)
End Function
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim feedContent As String = String.Empty
Dim rssFeed As String = String.Empty
' Querystring Data
Dim feedName As String = CStr(Request.QueryString("name"))
If Len(feedName) = 0 Then : feedName = "default" : End If
' Handle Manual Cache Clearing
If rssCacheClear = 0 Then
Dim maxFeedsTotalAccept As Integer = CInt(Request.QueryString("feedNumber"))
If maxFeedsTotalAccept <= 0 Then : maxFeedsTotalAccept = numberOfPostsShow : End If
' Retrieve Page Since Cache Does Not Exist
If HttpContext.Current.Cache(feedName) Is Nothing OR overrideCache = 1 OR rawDump = 1 Then
' Get User's Agent Data
crawlAgent = Request.UserAgent
' Load Wall Page
Dim discussionPageData As String = crawlPage(discussionGroupPage)
' Process Page
if Len(crawlError) = 0 Then
' Filter Content
discussionPageData = Replace(discussionPageData, vbCrLf, "")
' Break-up Content
Dim elemLinesRaw() As String = Split(discussionPageData, ">")
' Extract Useful Content
Dim elemLines(,) As String
Dim elemLinesCount As Integer = 0
Dim contentAStartFlag As Integer = 0
Dim contentBStartFlag As Integer = 0
Dim contentCStartFlag As Integer = 0
Dim contentCOrigin As Integer = 0
Dim contentCStartSubSet1 As Integer = 0
Dim contentCVariant1 As Integer = 0
Dim contentStartedParse As Integer = 0
Dim contentRecord As Integer = 0
Dim storyPhoto As String = String.Empty
Dim storyAuthor As String = String.Empty
Dim storyStatement As String = String.Empty
For S As Integer = 0 To UBound(elemLinesRaw)
if rawDump = 1 Then
Response.Write(elemLinesRaw(S) & vbcrlf)
Else
' Read Content
if contentStartedParse = 0 Then
' Determine content layout style
if elemLinesRaw(S).indexOf("class=""storyContent""") > 0 Then ' uiUnifiedStory uiStreamStory
contentAStartFlag = 1 : contentStartedParse = 1
Elseif elemLinesRaw(S).indexOf("uiUfiComment comment") > 0 Then
contentBStartFlag = 1 : contentStartedParse = 1
Elseif elemLinesRaw(S).indexOf("timelineUnitCustomBackground") > 0 Or elemLinesRaw(S).indexOf("pvm uiListItem") > 0 Or elemLinesRaw(S).indexOf("ptm uiListItem") > 0 Or elemLinesRaw(S).indexOf("pbm uiListItem") > 0 Then
contentCStartFlag = 1 : contentStartedParse = 1
End if
Else
' Parse A Content
if contentAStartFlag = 8 Then
if (elemLinesRaw(S).indexOf("</") > 0) Then
storyStatement = Split(elemLinesRaw(S), "</")(0)
Else
storyStatement = elemLinesRaw(S)
End if
contentRecord = 1
Elseif contentAStartFlag = 7 Then
if elemLinesRaw(S).indexOf("</") > -1 Then
contentAStartFlag = 8
End if
Elseif contentAStartFlag = 6 Then
if elemLinesRaw(S).indexOf("class=""") > 0 Then
contentAStartFlag = 7
Else
if elemLinesRaw(S).indexOf("</") > 0 Then
storyStatement = Split(elemLinesRaw(S), "</")(0)
contentRecord = 1
Elseif elemLinesRaw(S).indexOf("<br /") > 0 Then
storyStatement = Split(elemLinesRaw(S), "<br /")(0)
contentRecord = 1
End if
End if
Elseif contentAStartFlag = 5 Then
if elemLinesRaw(S).indexOf("<a href") > -1 And elemLinesRaw(S).indexOf("event, bagof(") > 0 Then
contentAStartFlag = 6
End if
' Catch that variant from contentAStartFlag = 3 earlier
if elemLinesRaw(S).indexOf("class=""messageBody"" data-ft=""") > 0 Then
contentAStartFlag = 6
End if
Elseif contentAStartFlag = 4 Then
storyAuthor = Split(elemLinesRaw(S), "</a")(0)
contentAStartFlag = 5
Elseif contentAStartFlag = 3 Then
' Catch variant of a closing tag that is not there under other circumstances
if elemLinesRaw(S).indexOf("</") > 0 Then
storyAuthor = Split(elemLinesRaw(S), "</")(0)
contentAStartFlag = 5
Else
contentAStartFlag = 4
End if
Elseif contentAStartFlag = 2 Then
if elemLinesRaw(S).indexOf("actorName") > 0 Then
contentAStartFlag = 3
End if
Elseif contentAStartFlag = 1 Then
if contentCOrigin = 1 Then
contentCOrigin = 0 : contentAStartFlag = 2
Elseif elemLinesRaw(S).indexOf("uiProfilePhoto") > 0 Then
storyPhoto = Split(Split(elemLinesRaw(S), "src=""")(1), """")(0)
contentAStartFlag = 2
End if
End if
' Parse B Content
if contentBStartFlag = 5 Then
storyStatement = Split(elemLinesRaw(S), "</span")(0)
contentRecord = 1
Elseif contentBStartFlag = 4 Then
if elemLinesRaw(S).indexOf("commentBody") > 0 Then
contentBStartFlag = 5
End if
Elseif contentBStartFlag = 3 Then
storyAuthor = Split(elemLinesRaw(S), "</")(0)
contentBStartFlag = 4
Elseif contentBStartFlag = 2 Then
if elemLinesRaw(S).indexOf("actorName") > 0 Then
contentBStartFlag = 3
End if
Elseif contentBStartFlag = 1 Then
if elemLinesRaw(S).indexOf("uiProfilePhoto") > 0 Then
storyPhoto = Split(Split(elemLinesRaw(S), "src=""")(1), """")(0)
contentBStartFlag = 2
End if
End if
' Parse C Content
if contentCStartFlag = 2 Then
' Start Variants
if contentCStartSubSet1 = 6 Then
if elemLinesRaw(S).indexOf("</") > 0 Then
storyStatement = Split(elemLinesRaw(S), "</")(0)
contentRecord = 1
End if
Elseif contentCStartSubSet1 = 5 Then
if elemLinesRaw(S).indexOf("""messageBody""") > 0 Then
contentCStartSubSet1 = 6
End if
Elseif contentCStartSubSet1 = 4 Then
storyAuthor = Split(elemLinesRaw(S), "</")(0)
contentCStartSubSet1 = 5
Elseif contentCStartSubSet1 = 3 Then
if contentCVariant1 = 1 Then
storyStatement = Split(elemLinesRaw(S), "</div")(0)
contentRecord = 1
End if
if elemLinesRaw(S).indexOf("class=""tipOnelineStory""") > 0 Then
contentCVariant1 = 1
Elseif elemLinesRaw(S).indexOf("class=""tlTxFe""") > 0 Then
contentCVariant1 = 1
Elseif elemLinesRaw(S).indexOf("class=""fsm fwn fcg""") > 0 Then
contentCStartFlag = 0 : contentStartedParse = 0
Elseif elemLinesRaw(S).indexOf("class=""storyContent""") > 0 Then
contentCStartFlag = 0 : contentCStartSubSet1 = 0
contentAStartFlag = 1 : contentCOrigin = 1
End if
Elseif contentCStartSubSet1 = 2 Then
storyAuthor = Split(elemLinesRaw(S), "</a")(0)
contentCStartSubSet1 = 3
Elseif contentCStartSubSet1 = 1 Then
contentCStartSubset1 = 2
End if
if elemLinesRaw(S).indexOf("<span class=""fwb""") > -1 And contentCStartSubset1 = 0 Then
contentCStartSubset1 = 1
End if
' Catch New Variant
if elemLinesRaw(S).indexOf("data-hovercard=") > 0 And contentCStartSubSet1 = 0 Then
contentCStartSubset1 = 4
End if
Elseif contentCStartFlag = 1 Then
if elemLinesRaw(S).indexOf("timelinePageMostRecentLabel") > 0 Then
' Skip top entry of link to recent posts by others
contentCStartFlag = 0 : contentStartedParse = 0
Elseif elemLinesRaw(S).indexOf("uiProfilePhoto") > 0 Then
storyPhoto = Split(Split(elemLinesRaw(S), "src=""")(1), """")(0)
contentCStartFlag = 2
End if
End if
' Record Content
if contentRecord = 1 Then
' Save Data
if Len(storyPhoto) > 0 AND Len(storyAuthor) > 0 AND Len(storyStatement) > 0 Then
' Filter breaking
storyStatement = Replace(Replace(storyStatement, vbCr, ""), vbLf, "")
' Continue
storyAuthor = Server.HtmlDecode(storyAuthor)
storyStatement = Server.HtmlDecode(storyStatement)
' Filter out HTML inserted by the poster
if storyStatement.indexOf("<") > -1 OR storyStatement.indexOf(">") > -1 Then
Dim tmp_Filtered As String = String.Empty
Dim tmp_Flip As Integer = 0
For T As Integer = 0 TO Len(storyStatement)
Dim tmp_contentChar As String = Mid(storyStatement, T + 1, 1)
if tmp_contentChar = "<" Then : tmp_Flip = 1 : End if
if tmp_Flip = 0 Then : tmp_Filtered = tmp_Filtered & tmp_contentChar : End if
if tmp_contentChar = ">" Then : tmp_Flip = 0 : End if
Next
storyStatement = tmp_Filtered
End if
' Limit size of statement
if Len(storyStatement) > rssDescriptionLen Then
storyStatement = Mid(storyStatement, 1, rssDescriptionLen) & "..."
End if
ReDim Preserve elemLines(3, elemLinesCount)
elemLines(0, elemLinesCount) = storyPhoto
elemLines(1, elemLinesCount) = storyAuthor
elemLines(2, elemLinesCount) = storyStatement
elemLines(3, elemLinesCount) = feed_pubdate
elemLinesCount = elemLinesCount + 1
End if
contentAStartFlag = 0 : contentBStartFlag = 0 : contentCStartFlag = 0 : contentCOrigin = 0
contentCStartSubSet1 = 0 : contentCVariant1 = 0 : contentStartedParse = 0 : contentRecord = 0
storyPhoto = String.Empty : storyAuthor = String.Empty : storyStatement = String.Empty
End if
End if
End if
Next
if rawDump = 0 Then
' Assemble Data into RSS
if elemLinesCount > 0 Then
' Content returned
Dim feedStep As Integer = 0
For R As Integer = 0 To elemLinesCount - 1
if R < maxFeedsTotalAccept Then
feedContent = feedContent & "<item>" & vbCrLf
feedContent = feedContent & "<title>" & feed_title & "</title>" & vbCrLf
feedContent = feedContent & "<link>" & feed_link & "</link>" & vbCrLf
if rssIncludeImg = 1 Then
feedContent = feedContent & "<description>" & Server.HtmlEncode("<img align=""left"" src=""" & elemLines(0, R) & """ border=""0"" /> ") & Server.HtmlEncode(Replace(elemLines(2, R), "'", "'")) & "</description>" & vbCrLf
Else
feedContent = feedContent & "<description>" & Server.HtmlEncode(Replace(elemLines(2, R), "'", "'")) & "</description>" & vbCrLf
End if
feedContent = feedContent & "<author>" & elemLines(1, R) & "</author>" & vbCrLf
feedContent = feedContent & "<date>" & elemLines(3, R) & "</date>" & vbCrLf
feedContent = feedContent & "</item>" & vbCrLf
End if
Next
Else
' No content found; target is reachable but the source code of the wall has possibly changed
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>Server</author>" & vbCrLf
feedContent = feedContent & "<date>" & feed_pubdate & "</date>" & vbCrLf
feedContent = feedContent & "</item>" & vbCrLf
End if
End if
Else
' No page found; target is unreachable; error
feedContent = feedContent & "<item>" & vbCrLf
feedContent = feedContent & "<title>Page Not Found/Error</title>" & vbCrLf
feedContent = feedContent & "<link></link>" & vbCrLf
if rssShowErrors = 0 Then
feedContent = feedContent & "<description>Either the page specified could not be found or an error has occurred.</description>" & vbCrLf
Else
feedContent = feedContent & "<description>" & Server.HtmlEncode(crawlError) & "</description>" & vbCrLf
End if
feedContent = feedContent & "<author>Server</author>" & vbCrLf
feedContent = feedContent & "<date>" & feed_pubdate & "</date>" & vbCrLf
feedContent = feedContent & "</item>" & vbCrLf
End if ' End Len(crawlError) = 0
if rawDump = 0 And overrideCache = 0 Then
' Add RSS Envelope, if specified
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
' Add RSS to Server Cache
HttpContext.Current.Cache.Add(feedName, rssFeed, Nothing, DateTime.Now.AddDays(1), System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.Normal, Nothing)
End if
Else
' Get Feed 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 = "<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>Server</author>" & vbCrLf
feedContent = feedContent & "<date>" & feed_pubdate & "</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
if rawDump = 0 And overrideCache = 0 Then
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 if
End Sub
</script>
|