Bling v0.5 Released - Now with Sitemap Pings!
This release of Bling introduces a new feature: Sitemap Pings. Five search engine services are included: Ask, Bing, Google, Moreover, and Yahoo!. In addition to the groovy xmlrpc module that has been required for this script to work since it was first released, I've also included the HTTPBuilder module, which is used to send the sitemap pings to each search engine.
A new variable has been added to the script: sitemapURL
. You will need to replace the default text between the quotes with the fully-qualified path to your own site's sitemap.xml file. You do not need to worry about url-encoding the URL path—bling does that for you. For example, mine is located at http://blog.techstacks.com/sitemap.xml.
The Wikipedia article I link to above contains background on Sitemaps or you can go directly to the sitemaps.org website to view the actual protocol.
No changes have been made to the services that bling sends xmlrpc pings to in this release. A future release will probably end up removing some additional services that have been failing for me every time I run this tool.
Source code is below. The main bling page has been updated and this version has been posted to the download site.
#!/usr/bin/env groovy import groovy.net.xmlrpc.* import groovy.util.slurpersupport.GPathResult import groovyx.net.http.HTTPBuilder import static groovyx.net.http.Method.GET import static groovyx.net.http.ContentType.URLENC // You'll want to make this next section your own def blogTitle = "YOUR_BLOG_TITLE_HERE" def blogURL = "YOUR_BLOG_URL_HERE" // New in Bling version 0.5: // URL for Sitemap Pings def sitemapURL = "YOUR_BLOG_SITEMAP_URL_HERE" // Set up a map (hash) of popular rpc endpoints // It is too bad for my syntax highlighter, but some of // the blogs containing periods in their names necessitated // placing them in quotes. def trackbacks = [ Google:'http://blogsearch.google.com/ping/RPC2', Weblogs:'http://rpc.weblogs.com/RPC2', FeedBurner:'http://ping.feedburner.com/', Moreover:'http://api.moreover.com/RPC2', Syndic8:'http://ping.syndic8.com/xmlrpc.php' , BlogRolling:'http://rpc.blogrolling.com/pinger/', NewsGator:'http://services.newsgator.com/ngws/xmlrpcping.aspx', Bloglines:'http://www.bloglines.com/ping', 'Blo.gs':'http://ping.blo.gs/', BlogCatalog:'http://rpc.blogcatalog.com/', PubSub:'http://xping.pubsub.com/ping/', 'MyBlog.jp':'http://ping.myblog.jp/', Goo:'http://blog.goo.ne.jp/XMLRPC', BlogPeople:'http://www.blogpeople.net/servlet/weblogUpdates', Twingly:'http://rpc.twingly.com/', Spinn3r:'http://rpc.spinn3r.com/open/RPC2', PostRank:'http://api.postrank.com/v2/ping', WasaLive:'http://www.wasalive.com/ping/', BlogBuzzMachine:'http://rpc.blogbuzzmachine.com/RPC2', IceRocket:'http://rpc.icerocket.com:10080/', FeedBlitz:'http://www.feedblitz.com/f/f.fbz?XmlPing' ] def searchengines = [ Ask:'http://submissions.ask.com/ping?sitemap=', Bing:'http://www.bing.com/webmaster/ping.aspx?siteMap=', Google:'http://www.google.com/webmasters/tools/ping?sitemap=', Yahoo:'http://search.yahooapis.com/SiteExplorerService/V1/updateNotification?appid=Bling&url=', Moreover:'http://api.moreover.com/ping?u=' ] // Set up canned responses to make the outputted responses nicer. // Previously, the output used the literal response from the endpoint // which did not look all that nice in a terminal window. def weal = "Thanks for the ping!" def woe = "PING ATTEMPT FAILED." // Here is the section responsible for iterating through each ping // url in the trackbacks map. println "====XMLRPC PING RESULTS====" trackbacks.each { try{ def url = it.value def proxy = new XMLRPCServerProxy(url) response = proxy.weblogUpdates.ping(blogTitle, blogURL) response.data instanceof GPathResult if (!response.flerror) println " ${it.key}".padRight(25) + "${weal}" else println " ${it.key}".padRight(25) + "${woe}" }catch(ConnectException ex) { println " ${it.key}".padRight(25) + "${woe}" }catch(IOException ex){ println " ${it.key}".padRight(25) + "${woe}" } } println "===========================" println "\n" println "====SITEMAP PING RESULTS===" searchengines.each { def url = it.value + sitemapURL def http = new HTTPBuilder( url ) http.request( GET, URLENC ) { req -> headers.'User-Agent' = 'Bling/0.5' headers.'Referer' = 'http://blog.techstacks.com/bling.html' response.success = { resp, html -> println " ${it.key}".padRight(25) + "${weal}" } response.failure = { resp, html -> println " ${it.key}".padRight(25) + "${woe}" } } } println "==========================="