<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: Mcandre's Code Snippets</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sun, 27 Jul 2008 03:02:35 GMT</pubDate>
    <description>DZone Snippets: Mcandre's Code Snippets</description>
    <item>
      <title>Runt.rb</title>
      <link>http://snippets.dzone.com/posts/show/5009</link>
      <description>// A tiny Ruby web server.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/env ruby&lt;br /&gt;&lt;br /&gt;require "webrick"&lt;br /&gt;&lt;br /&gt;s=WEBrick::HTTPServer.new(&lt;br /&gt;        :BindAddress =&gt; "localhost",&lt;br /&gt;        :Port =&gt; 8080,&lt;br /&gt;        :DocumentRoot =&gt; File.dirname($0)+"/"+"www/"&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;trap("INT") { s.shutdown }&lt;br /&gt;&lt;br /&gt;s.start&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 19 Jan 2008 06:46:42 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5009</guid>
      <author>mcandre (Andrew Pennebaker)</author>
    </item>
    <item>
      <title>itcrowdquote.rb</title>
      <link>http://snippets.dzone.com/posts/show/4621</link>
      <description>// Prints a quote from Channel 4's "The IT Crowd"&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/env ruby&lt;br /&gt;&lt;br /&gt;require "rubygems"&lt;br /&gt;require "open-uri"&lt;br /&gt;require "hpricot"&lt;br /&gt;require "htmlentities"&lt;br /&gt;&lt;br /&gt;coder=HTMLEntities.new()&lt;br /&gt;&lt;br /&gt;doc=open("http://www.channel4.com/entertainment/tv/microsites/I/itcrowd/quote_generator/") { |f| Hpricot(f) }&lt;br /&gt;&lt;br /&gt;section=doc/"blockquote"/"p"&lt;br /&gt;(section/"cite").remove()&lt;br /&gt;quote=section.inner_html&lt;br /&gt;&lt;br /&gt;# remove leading whitespace&lt;br /&gt;quote=quote.gsub(/^\s+/, "")&lt;br /&gt;&lt;br /&gt;# remove trailing whitespace&lt;br /&gt;quote=quote.gsub(/\s+$/, $/)&lt;br /&gt;&lt;br /&gt;# remove dash&lt;br /&gt;quote=quote.gsub(/\s\-\s+$/, $/).chomp&lt;br /&gt;&lt;br /&gt;# decode HTML entities&lt;br /&gt;quote=coder.decode(quote)&lt;br /&gt;&lt;br /&gt;puts quote&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 08 Oct 2007 05:28:14 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4621</guid>
      <author>mcandre (Andrew Pennebaker)</author>
    </item>
    <item>
      <title>yn.rb</title>
      <link>http://snippets.dzone.com/posts/show/4400</link>
      <description>// Ruby Yubnub launcher&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/env ruby&lt;br /&gt;&lt;br /&gt;# Andrew Pennebaker (andrew.pennebaker@gmail.com)&lt;br /&gt;# 7 Aug 2007&lt;br /&gt;# Copyright 2007 Andrew Pennebaker&lt;br /&gt;# License: GPL&lt;br /&gt;# URL: http://snippets.dzone.com/posts/show/4400&lt;br /&gt;&lt;br /&gt;parser="http://yubnub.org/parser/parse?command="&lt;br /&gt;&lt;br /&gt;command=ARGV.join("+")&lt;br /&gt;&lt;br /&gt;system "open "+parser+command&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 08 Aug 2007 01:54:17 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4400</guid>
      <author>mcandre (Andrew Pennebaker)</author>
    </item>
    <item>
      <title>jaiku.conf</title>
      <link>http://snippets.dzone.com/posts/show/4224</link>
      <description>// example configuration file for jaiku.py&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;config = "jaiku.conf"&lt;br /&gt;xmlrpcurl = "http://api.jaiku.com/xmlrpc"&lt;br /&gt;feedurlstart = "http://"&lt;br /&gt;feedurlend = ".jaiku.com/feed/atom"&lt;br /&gt;itemdelimeter = "&lt;entry&gt;"&lt;br /&gt;titledelimeter1 = "&lt;title&gt;"&lt;br /&gt;titledelimeter2 = "&lt;/title&gt;"&lt;br /&gt;username = "mcandre"&lt;br /&gt;personalkey = "FILL IN YOUR API KEY HERE"&lt;br /&gt;location = ""&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 29 Jun 2007 02:32:47 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4224</guid>
      <author>mcandre (Andrew Pennebaker)</author>
    </item>
    <item>
      <title>jaiku.py</title>
      <link>http://snippets.dzone.com/posts/show/4223</link>
      <description>// Set and view Jaiku statuses&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/env python&lt;br /&gt;&lt;br /&gt;__author__="Andrew Pennebaker (andrew.pennebaker@gmail.com)"&lt;br /&gt;__date__="28 Jun 2007"&lt;br /&gt;__copyright__="Copyright 2007 Andrew Pennebaker"&lt;br /&gt;__license__="GPL"&lt;br /&gt;__version__="0.0.1"&lt;br /&gt;__URL__="http://snippets.dzone.com/posts/show/4223"&lt;br /&gt;&lt;br /&gt;import sys, getopt, urllib2, xmlrpclib&lt;br /&gt;&lt;br /&gt;import configreader&lt;br /&gt;&lt;br /&gt;STATUS_MODE="STATUS"&lt;br /&gt;VIEW_MODE="VIEW"&lt;br /&gt;&lt;br /&gt;def set_status(settings, status):&lt;br /&gt;	s=xmlrpclib.ServerProxy(settings["xmlrpcurl"])&lt;br /&gt;	&lt;br /&gt;	calldata={"user":settings["username"], "personal_key":settings["personalkey"], "message":status, "location":settings["location"]}&lt;br /&gt;	&lt;br /&gt;	try:&lt;br /&gt;		s.presence.send(calldata)&lt;br /&gt;	except:&lt;br /&gt;		raise "Could not connect."&lt;br /&gt;&lt;br /&gt;def view_status(settings):&lt;br /&gt;	item=settings["itemdelimeter"]&lt;br /&gt;	t1=settings["titledelimeter1"]&lt;br /&gt;	t2=settings["titledelimeter2"]&lt;br /&gt;&lt;br /&gt;	try:&lt;br /&gt;		instream=urllib2.urlopen(&lt;br /&gt;			settings["feedurlstart"]+settings["username"]+settings["feedurlend"]&lt;br /&gt;		)&lt;br /&gt;&lt;br /&gt;		for line in instream:&lt;br /&gt;			if item in line:&lt;br /&gt;				break&lt;br /&gt;&lt;br /&gt;		title=instream.readline()&lt;br /&gt;&lt;br /&gt;		instream.close()&lt;br /&gt;&lt;br /&gt;		status=title[title.index(t1)+len(t1):title.index(t2)]&lt;br /&gt;&lt;br /&gt;		return status&lt;br /&gt;&lt;br /&gt;	except IOError, e:&lt;br /&gt;		raise "Could not connect."&lt;br /&gt;&lt;br /&gt;def usage():&lt;br /&gt;	print "Usage: %s [options]" % (sys.argv[0])&lt;br /&gt;	print "\nWithout any options, uses status mode. Leftover args are concatenated to form message."&lt;br /&gt;	print "\n-u|--username &lt;username&gt; specified in jaiku.conf"&lt;br /&gt;	print "-p|--personal-key &lt;key&gt;"&lt;br /&gt;	print "-l|--location &lt;location&gt;"&lt;br /&gt;	print "-s|--status mode"&lt;br /&gt;	print "-v|--view status"&lt;br /&gt;	print "-c|--config &lt;configfile&gt;"&lt;br /&gt;	print "-h|--help"&lt;br /&gt;&lt;br /&gt;	sys.exit()&lt;br /&gt;&lt;br /&gt;def main():&lt;br /&gt;	global STATUS_MODE&lt;br /&gt;	global VIEW_MODE&lt;br /&gt;&lt;br /&gt;	systemArgs=sys.argv[1:]&lt;br /&gt;&lt;br /&gt;	mode=STATUS_MODE&lt;br /&gt;&lt;br /&gt;	settings={&lt;br /&gt;		"config":"jaiku.conf",&lt;br /&gt;		"xmlrpcurl":"http://api.jaiku.com/xmlrpc",&lt;br /&gt;		"feedurlstart":"http://",&lt;br /&gt;		"feedurlend":".jaiku.com/feed/atom",&lt;br /&gt;		"itemdelimeter":"&lt;entry&gt;",&lt;br /&gt;		"titledelimeter1":"&lt;title&gt;",&lt;br /&gt;		"titledelimeter2":"&lt;/title&gt;",&lt;br /&gt;		"username":"mcandre",&lt;br /&gt;		"personalkey":"",&lt;br /&gt;		"location":""&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	optlist, args=[], []&lt;br /&gt;&lt;br /&gt;	try:&lt;br /&gt;		optlist, args=getopt.getopt(systemArgs, "u:p:l:svc:h", ["username=", "personal-key=", "location=", "status", "view", "config=", "help"])&lt;br /&gt;	except e:&lt;br /&gt;		usage()&lt;br /&gt;&lt;br /&gt;	for option, value in optlist:&lt;br /&gt;		if option=="-c" or option=="--config":&lt;br /&gt;			settings["config"]=value&lt;br /&gt;&lt;br /&gt;	try:&lt;br /&gt;		configreader.load(open(settings["config"], "r"), settings)&lt;br /&gt;	except IOError, e:&lt;br /&gt;		pass&lt;br /&gt;&lt;br /&gt;	for option, value in optlist:&lt;br /&gt;		if option=="-h" or option=="--help":&lt;br /&gt;			usage()&lt;br /&gt;&lt;br /&gt;		elif option=="-u" or option=="--username":&lt;br /&gt;			settings["username"]=value&lt;br /&gt;		elif option=="-p" or option=="--personal-key":&lt;br /&gt;			settings["personalkey"]=value&lt;br /&gt;		elif option=="-l" or option=="--location":&lt;br /&gt;			settings["location"]=value&lt;br /&gt;		elif option=="-s" or option=="--status":&lt;br /&gt;			mode=STATUS_MODE&lt;br /&gt;		elif option=="-v" or option=="--view":&lt;br /&gt;			mode=VIEW_MODE&lt;br /&gt;&lt;br /&gt;	if mode==STATUS_MODE:&lt;br /&gt;		if len(args)&lt;1:&lt;br /&gt;			usage()&lt;br /&gt;&lt;br /&gt;		message=" ".join(args)&lt;br /&gt;&lt;br /&gt;		set_status(settings, message)&lt;br /&gt;	elif mode==VIEW_MODE:&lt;br /&gt;		print view_status(settings)&lt;br /&gt;&lt;br /&gt;if __name__=="__main__":&lt;br /&gt;	try:&lt;br /&gt;		main()&lt;br /&gt;	except KeyboardInterrupt, e:&lt;br /&gt;		pass&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 29 Jun 2007 02:31:33 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4223</guid>
      <author>mcandre (Andrew Pennebaker)</author>
    </item>
    <item>
      <title>tiny.conf</title>
      <link>http://snippets.dzone.com/posts/show/4202</link>
      <description>// Configuration for tiny.py&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;config = "tiny.conf"&lt;br /&gt;service = "urltea"&lt;br /&gt;urltea url = "http://urltea.com/api/text/?url="&lt;br /&gt;tinyurl url = "http://tinyurl.com/api-create.php?"&lt;br /&gt;description delimeter = "?"&lt;br /&gt;description = ""&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 24 Jun 2007 17:10:03 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4202</guid>
      <author>mcandre (Andrew Pennebaker)</author>
    </item>
    <item>
      <title>tea.py</title>
      <link>http://snippets.dzone.com/posts/show/4196</link>
      <description>// Converts long URLs to tiny URLs with URLTea.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/env python&lt;br /&gt;&lt;br /&gt;__author__="Andrew Pennebaker (andrew.pennebaker@gmail.com)"&lt;br /&gt;__date__="22 Jun 2007"&lt;br /&gt;__copyright__="Copyright 2007 Andrew Pennebaker"&lt;br /&gt;__license__="GPL"&lt;br /&gt;__version__="0.0.1"&lt;br /&gt;__URL__="http://urltea.com/to8"&lt;br /&gt;__credits__="http://tinyurl.com/yswqg3"&lt;br /&gt;&lt;br /&gt;import sys, urllib, getopt&lt;br /&gt;&lt;br /&gt;CREATE_URL="http://urltea.com/api/text/?url="&lt;br /&gt;COMMENT_DELIMETER="?"&lt;br /&gt;&lt;br /&gt;def tiny(url, description=""):&lt;br /&gt;	global CREATE_URL&lt;br /&gt;	global COMMENT_DELIMETER&lt;br /&gt;&lt;br /&gt;	try:&lt;br /&gt;		encodedurl=CREATE_URL+urllib.urlencode({"url":url})&lt;br /&gt;		instream=urllib.urlopen(encodedurl)&lt;br /&gt;		tinyurl=instream.read()&lt;br /&gt;		instream.close()&lt;br /&gt;&lt;br /&gt;		if len(tinyurl)==0:&lt;br /&gt;			return url&lt;br /&gt;&lt;br /&gt;		if len(description)&gt;0:&lt;br /&gt;			tinyurl+=COMMENT_DELIMETER+description&lt;br /&gt;&lt;br /&gt;		return tinyurl&lt;br /&gt;	except IOError, e:&lt;br /&gt;		raise "Could not connect."&lt;br /&gt;&lt;br /&gt;def usage():&lt;br /&gt;	print "Usage: %s &lt;url1&gt; &lt;url2&gt; &lt;url3&gt; ..." % (sys.argv[0])&lt;br /&gt;	print "-d|--description &lt;comment&gt;"&lt;br /&gt;	print "-h|--help (usage)"&lt;br /&gt;&lt;br /&gt;	sys.exit()&lt;br /&gt;&lt;br /&gt;def main():&lt;br /&gt;	systemArgs=sys.argv[1:]&lt;br /&gt;	oplist, args=[], []&lt;br /&gt;&lt;br /&gt;	comment=""&lt;br /&gt;&lt;br /&gt;	try:&lt;br /&gt;		optlist, args=getopt.getopt(systemArgs, "d:h", ["description=", "help"])&lt;br /&gt;	except:&lt;br /&gt;		usage()&lt;br /&gt;&lt;br /&gt;	for option, value in optlist:&lt;br /&gt;		if option=="-h" or option=="--help":&lt;br /&gt;			usage()&lt;br /&gt;		elif option=="-d" or option=="--description":&lt;br /&gt;			comment=value&lt;br /&gt;&lt;br /&gt;	if len(args)&lt;1:&lt;br /&gt;		usage()&lt;br /&gt;&lt;br /&gt;	for u in args:&lt;br /&gt;		print tiny(u, comment)&lt;br /&gt;&lt;br /&gt;if __name__=="__main__":&lt;br /&gt;	try:&lt;br /&gt;		main()&lt;br /&gt;	except KeyboardInterrupt, e:&lt;br /&gt;		pass&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 22 Jun 2007 18:54:14 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4196</guid>
      <author>mcandre (Andrew Pennebaker)</author>
    </item>
    <item>
      <title>tiny.py</title>
      <link>http://snippets.dzone.com/posts/show/4195</link>
      <description>&lt;code&gt;&lt;br /&gt;#!/usr/bin/env python&lt;br /&gt;&lt;br /&gt;"""Converts long URLs to tiny URLs, with either tinyurl, urltea, or a custom url."""&lt;br /&gt;&lt;br /&gt;__author__="Andrew Pennebaker (andrew.pennebaker@gmail.com)"&lt;br /&gt;__date__="22 Jun 2007 - 24 Jun 2007"&lt;br /&gt;__copyright__="Copyright 2007 Andrew Pennebaker"&lt;br /&gt;__license__="GPL"&lt;br /&gt;__version__="0.0.1"&lt;br /&gt;__URL__="http://snippets.dzone.com/posts/show/4195"&lt;br /&gt;__credits__="http://lateral.netmanagers.com.ar/weblog/2007/04/08.html#BB548"&lt;br /&gt;&lt;br /&gt;import sys, getopt, urllib&lt;br /&gt;&lt;br /&gt;import configreader&lt;br /&gt;&lt;br /&gt;def tiny(url, settings):&lt;br /&gt;	try:&lt;br /&gt;		encodedurl=settings["posting url"]+urllib.urlencode({"url":url})&lt;br /&gt;		instream=urllib.urlopen(encodedurl)&lt;br /&gt;		tinyurl=instream.read()&lt;br /&gt;		instream.close()&lt;br /&gt;&lt;br /&gt;		if len(tinyurl)==0:&lt;br /&gt;			return url&lt;br /&gt;&lt;br /&gt;		if settings["service"]=="urltea" and len(settings["description"])&gt;0:&lt;br /&gt;				tinyurl+=settings["description delimeter"]+settings["description"]&lt;br /&gt;&lt;br /&gt;		return tinyurl&lt;br /&gt;	except IOError, e:&lt;br /&gt;		raise "Could not connect."&lt;br /&gt;&lt;br /&gt;def usage():&lt;br /&gt;	print "Usage: %s [options] &lt;url1&gt; &lt;url2&gt; &lt;url3&gt; ..." % (sys.argv[0])&lt;br /&gt;	print "\nDefaults to urlTea unless specified in options or a config file."&lt;br /&gt;	print "\n-s|--service [tinyurl|urltea]"&lt;br /&gt;	print "-u|--custom-url &lt;posting url&gt;"&lt;br /&gt;	print "-d|--description &lt;comment&gt; May only be used with urltea."&lt;br /&gt;	print "-c|--config &lt;configfile&gt;"&lt;br /&gt;	print "-h|--help (usage)"&lt;br /&gt;&lt;br /&gt;	sys.exit()&lt;br /&gt;&lt;br /&gt;def main():&lt;br /&gt;	systemArgs=sys.argv[1:]&lt;br /&gt;	oplist, args=[], []&lt;br /&gt;&lt;br /&gt;	settings={&lt;br /&gt;		"config":"tiny.conf",&lt;br /&gt;		"service":"urltea",&lt;br /&gt;		"urltea url":"http://urltea.com/api/text/?url=",&lt;br /&gt;		"tinyurl url":"http://tinyurl.com/api-create.php?",&lt;br /&gt;		"description delimeter":"?",&lt;br /&gt;		"description":""&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	try:&lt;br /&gt;		optlist, args=getopt.getopt(systemArgs, "s:u:d:c:h", ["service=", "custom-url=", "description=", "config=", "help"])&lt;br /&gt;	except:&lt;br /&gt;		usage()&lt;br /&gt;&lt;br /&gt;	for option, value in optlist:&lt;br /&gt;		if option=="-c" or option=="--config":&lt;br /&gt;			settings["config"]=value&lt;br /&gt;&lt;br /&gt;	try:&lt;br /&gt;		configreader.load(open(settings["config"], "r"), settings)&lt;br /&gt;	except IOError, e:&lt;br /&gt;		pass&lt;br /&gt;&lt;br /&gt;	for option, value in optlist:&lt;br /&gt;		if option=="-h" or option=="--help":&lt;br /&gt;			usage()&lt;br /&gt;		elif option=="-s" or option=="--service":&lt;br /&gt;			settings["service"]=value&lt;br /&gt;		elif option=="-d" or option=="--description":&lt;br /&gt;			settings["description"]=value&lt;br /&gt;&lt;br /&gt;	if settings["service"]!="urltea" and len(settings["description"])&gt;0:&lt;br /&gt;		usage()&lt;br /&gt;&lt;br /&gt;	try:&lt;br /&gt;		settings["posting url"]=settings[settings["service"]+" url"]&lt;br /&gt;	except:&lt;br /&gt;		usage()&lt;br /&gt;&lt;br /&gt;	for option, value in optlist:&lt;br /&gt;		if option=="-u" or option=="--custom-url":&lt;br /&gt;			settings["posting url"]=value&lt;br /&gt;&lt;br /&gt;	if len(args)&lt;1:&lt;br /&gt;		usage()&lt;br /&gt;&lt;br /&gt;	for u in args:&lt;br /&gt;		print tiny(u, settings)&lt;br /&gt;&lt;br /&gt;if __name__=="__main__":&lt;br /&gt;	try:&lt;br /&gt;		main()&lt;br /&gt;	except KeyboardInterrupt, e:&lt;br /&gt;		pass&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 22 Jun 2007 18:32:06 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4195</guid>
      <author>mcandre (Andrew Pennebaker)</author>
    </item>
    <item>
      <title>tw.conf</title>
      <link>http://snippets.dzone.com/posts/show/4160</link>
      <description>// Example configuration file for tw.py.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;config = "tw.conf"&lt;br /&gt;username = "mcandre"&lt;br /&gt;rootauthurl = "http://twitter.com/statuses/"&lt;br /&gt;useragent = "tw.py 0.0.1"&lt;br /&gt;statusdelimeter1 = "&lt;p class=\"entry-title entry-content\"&gt;"&lt;br /&gt;statusdelimeter2 = "&lt;/p&gt;"&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 19 Jun 2007 04:59:53 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4160</guid>
      <author>mcandre (Andrew Pennebaker)</author>
    </item>
    <item>
      <title>tw.py</title>
      <link>http://snippets.dzone.com/posts/show/4150</link>
      <description>// Sets and views Twitter status&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/env python&lt;br /&gt;&lt;br /&gt;__author__="Andrew Pennebaker (andrew.pennebaker@gmail.com)"&lt;br /&gt;__date__="17 Jun 2007 - 28 Jun 2007"&lt;br /&gt;__copyright__="Copyright 2007 Andrew Pennebaker"&lt;br /&gt;__license__="GPL"&lt;br /&gt;__version__="0.0.1"&lt;br /&gt;__credits__="Based on tweetyPy (http://muffinresearch.co.uk/archives/2007/03/24/tweetypy-python-based-cli-client-for-twitter/)"&lt;br /&gt;__URL__="http://snippets.dzone.com/posts/show/4150"&lt;br /&gt;&lt;br /&gt;import sys, getopt, getpass, urllib, urllib2&lt;br /&gt;&lt;br /&gt;import configreader&lt;br /&gt;&lt;br /&gt;STATUS_MODE="STATUS"&lt;br /&gt;VIEW_MODE="VIEW"&lt;br /&gt;COMMAND_MODE="COMMAND"&lt;br /&gt;&lt;br /&gt;COMMANDS="""Command\t\tMeaning&lt;br /&gt;&lt;br /&gt;d username\tDirect Text&lt;br /&gt;@username\tReply&lt;br /&gt;follow username\tReceive updates via phone or IM&lt;br /&gt;leave username\tStop following username&lt;br /&gt;leave all\tStop following all friends&lt;br /&gt;remove username\tRemove username from friends list&lt;br /&gt;delete username\tDelete username from friends list&lt;br /&gt;get username\tGet the last update from username&lt;br /&gt;get\tGet the most recent updates from all friends&lt;br /&gt;nudge username\tTwitter aks what the person is currently up to&lt;br /&gt;whois username\tGet username's bio&lt;br /&gt;add phonenumber\tSend text invite. If already a member, invite will turn into a friend request.&lt;br /&gt;accept username\tAccept username as a friend&lt;br /&gt;deny username\tDeny username as friend"""&lt;br /&gt;&lt;br /&gt;def usage():&lt;br /&gt;	print "Usage: %s [options]" % (sys.argv[0])&lt;br /&gt;	print "\nWithout any options, uses status mode. Leftover args are concatenated to form message."&lt;br /&gt;	print "\n-u|--username &lt;username&gt; specified in tw.conf"&lt;br /&gt;	print "-s|--status mode"&lt;br /&gt;	print "-v|--view status"&lt;br /&gt;	print "-l|--list-commands List Twitter commands"&lt;br /&gt;	print "-c|--config &lt;configfile&gt;"&lt;br /&gt;	print "-h|--help"&lt;br /&gt;&lt;br /&gt;	sys.exit()&lt;br /&gt;&lt;br /&gt;def set_status(settings, status):&lt;br /&gt;	auth=urllib2.HTTPPasswordMgrWithDefaultRealm()&lt;br /&gt;	auth.add_password(None, settings["rootauthurl"], settings["username"], settings["password"])&lt;br /&gt;	authHandler=urllib2.HTTPBasicAuthHandler(auth)&lt;br /&gt;	opener=urllib2.build_opener(authHandler)&lt;br /&gt;&lt;br /&gt;	url="http://twitter.com/statuses/update.xml"&lt;br /&gt;	post=urllib.urlencode({"status":status})&lt;br /&gt;&lt;br /&gt;	request=urllib2.Request(url, post)&lt;br /&gt;	request.add_header("User-Agent", settings["useragent"])&lt;br /&gt;&lt;br /&gt;	try:&lt;br /&gt;		response=opener.open(request)&lt;br /&gt;	except IOError, e:&lt;br /&gt;		raise "Could not connect."&lt;br /&gt;&lt;br /&gt;def view_status(settings):&lt;br /&gt;	url="http://twitter.com/"+settings["username"]&lt;br /&gt;	message=""&lt;br /&gt;&lt;br /&gt;	statusdelimeter1=settings["statusdelimeter1"]&lt;br /&gt;	statusdelimeter2=settings["statusdelimeter2"]&lt;br /&gt;&lt;br /&gt;	try:&lt;br /&gt;		instream=urllib.urlopen(url)&lt;br /&gt;		for line in instream:&lt;br /&gt;			if statusdelimeter1 in line:&lt;br /&gt;				message=line[&lt;br /&gt;					line.index(statusdelimeter1)+len(statusdelimeter1):line.index(statusdelimeter2)&lt;br /&gt;				]&lt;br /&gt;				break&lt;br /&gt;		instream.close()&lt;br /&gt;&lt;br /&gt;		return message&lt;br /&gt;				&lt;br /&gt;	except IOError, e:&lt;br /&gt;		raise "Could not connect."&lt;br /&gt;&lt;br /&gt;def main():&lt;br /&gt;	global STATUS_MODE&lt;br /&gt;	global VIEW_MODE&lt;br /&gt;	global COMMAND_MODE&lt;br /&gt;	global COMMANDS&lt;br /&gt;&lt;br /&gt;	sysArgs=sys.argv[1:]&lt;br /&gt;&lt;br /&gt;	mode=STATUS_MODE&lt;br /&gt;&lt;br /&gt;	settings={&lt;br /&gt;		"config":"tw.conf",&lt;br /&gt;		"username":"mcandre",&lt;br /&gt;		"rootauthurl":"http://twitter.com/statuses/",&lt;br /&gt;		"useragent":sys.argv[0]+" "+__version__,&lt;br /&gt;		"statusdelimeter1":"&lt;p class=\"entry-title entry-content\"&gt;",&lt;br /&gt;		"statusdelimeter2":"&lt;/p&gt;"&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	optlist, args=[], []&lt;br /&gt;	try:&lt;br /&gt;		optlist, args=getopt.getopt(sysArgs, "u:svlc:h", ["username=", "status", "view", "list-commands", "config=", "help"])&lt;br /&gt;	except:&lt;br /&gt;		usage()&lt;br /&gt;&lt;br /&gt;	for option, value in optlist:&lt;br /&gt;		if option=="-c" or option=="--config":&lt;br /&gt;			settings["config"]=value&lt;br /&gt;&lt;br /&gt;	try:&lt;br /&gt;		configreader.load(open(settings["config"], "r"), settings)&lt;br /&gt;	except IOError, e:&lt;br /&gt;		pass&lt;br /&gt;&lt;br /&gt;	for option, value in optlist:&lt;br /&gt;		if option=="-h" or option=="--help":&lt;br /&gt;			usage()&lt;br /&gt;&lt;br /&gt;		elif option=="-u" or option=="--username":&lt;br /&gt;			settings["username"]=value&lt;br /&gt;		elif option=="-s" or option=="--status":&lt;br /&gt;			mode=STATUS_MODE&lt;br /&gt;		elif option=="-v" or option=="--view":&lt;br /&gt;			mode=VIEW_MODE&lt;br /&gt;		elif option=="-l" or option=="--list=commands":&lt;br /&gt;			mode=COMMAND_MODE&lt;br /&gt;&lt;br /&gt;	if mode==STATUS_MODE:&lt;br /&gt;		if len(args)&lt;1:&lt;br /&gt;			usage()&lt;br /&gt;&lt;br /&gt;		message=" ".join(args)&lt;br /&gt;&lt;br /&gt;		settings["password"]=getpass.getpass()&lt;br /&gt;&lt;br /&gt;		set_status(settings, message)&lt;br /&gt;	elif mode==VIEW_MODE:&lt;br /&gt;		print view_status(settings)&lt;br /&gt;	elif mode==COMMAND_MODE:&lt;br /&gt;		print COMMANDS&lt;br /&gt;&lt;br /&gt;if __name__=="__main__":&lt;br /&gt;	try:&lt;br /&gt;		main()&lt;br /&gt;	except KeyboardInterrupt, e:&lt;br /&gt;		pass&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 17 Jun 2007 07:07:43 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4150</guid>
      <author>mcandre (Andrew Pennebaker)</author>
    </item>
  </channel>
</rss>
