ExamplePrivateModeRubyScript

From StatusNet

Jump to: navigation, search
#!/usr/bin/ruby -w
#
# Script to demonstrate how to determine whether an instance of
# StatusNet is configured to be "private".  -- By Zach Copley, CYI
#
require 'net/http'
require 'net/https'
require 'rexml/document'
include REXML, Net

API_ROOT = 'http://localhost/statusnet/api'
PUBLIC_TIMELINE_URL = API_ROOT + '/statuses/public_timeline.xml'
NICKNAME = 'nickname'
PASSWORD = 'password'

# get data from the API, return XML document
def get_api_data(url, nickname=nil, password=nil)
  parsed_url = URI.parse(url)
  request = HTTP::Get.new(parsed_url.path)

  # add basic auth
  if (nickname && password)
    request.basic_auth nickname, password
  end

  http = HTTP.new(parsed_url.host)
  response = http.request(request)
  return response.body
end

# query StatusNet to see whether it's a private instance 
def is_private()
  config_url = API_ROOT + '/statusnet/config.xml'
  config_xml = HTTP.get_response(URI.parse(config_url)).body;
  doc = Document.new(config_xml)
  
  # <config>
  #   <site>
  #    ....
  #     <private>true</private> 
  #    ....
  closed = XPath.first(doc, '/config/site/private/text()')
  return closed == 'true' || false
end

# print statuses
def show_statuses(xml)
  doc = REXML::Document.new(xml)
  doc.elements.each('statuses/status') do |s|
    puts s.elements['user/screen_name'].text + ': ' + s.elements['text'].text
  end
end

unless is_private()
  # request data as you normally would
  show_statuses(get_api_data(PUBLIC_TIMELINE_URL))
else
  puts "[Private site]"
  # site is closed, so everything requires basic auth
  show_statuses(get_api_data(PUBLIC_TIMELINE_URL, NICKNAME, PASSWORD))
end

Personal tools