Bling v0.6 Released
A few weeks ago, Feedburner pings began throwing an exception: "Request Throttled. Try again later" so this new release of Bling removes Feedburner from the list of XMLRPC services.
It also seemed that shortly after introducing BlogBuzzMachine into Bling's list, they decided to throw an exception that they should only be pinged using Feedburner's Pingshot service. So, if you are a user of Feedburner, like I am, and you enable the Pingshot service, you will be sending notifications out to BlogBuzzMachine. Therefore, BlogBuzzMachine has been removed.
So, the number of services currently receiving pings via Bling is at 19 along with the 5 search engines getting sitemap pings.
There is one new feature included in this release. A "debug" command-line option has been added. If you pass a -d
or --debug
(for POSIX compliance!) argument to bling, failed pings will include the reason for the failure from the xmlrpc service.
The main bling page has been updated and you can grab a copy from the downloads page. Please let me know of any problems in the comments. Thanks for taking a look and using it!
#!/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 def cli = new CliBuilder(usage: 'bling [-d,--debug]') cli.d(longOpt:'debug', required:false, type: GString, 'Run with verbose error messages') def opt = cli.parse(args) if (!opt) return // You'll want to make this next section your own def blogTitle = "YOUR_BLOG_TITLE_HERE" def blogURL = "YOUR_BLOG_URL_HERE" // def feedURL = "YOUR_BLOG_FEED_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', 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/', 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 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(20) + "${weal}" else if (!opt.d) println " ${it.key}".padRight(20) + "${woe}" else println " ${it.key}".padRight(20) + "${woe} - Reason: ${response.message}" }catch(ConnectException ex) { println " ${it.key}".padRight(20) + "${woe}" }catch(IOException ex){ println " ${it.key}".padRight(20) + "${woe}" } } println "===========================" 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.6' headers.'Referer' = 'http://blog.techstacks.com/bling.html' response.success = { resp, html -> println " ${it.key}".padRight(20) + "${weal}" } response.failure = { resp, html -> println " ${it.key}".padRight(20) + "${woe}" } } } println "==========================="