// Sets and views Twitter status
1
2
3
4 __author__="Andrew Pennebaker (andrew.pennebaker@gmail.com)"
5 __date__="17 Jun 2007 - 28 Jun 2007"
6 __copyright__="Copyright 2007 Andrew Pennebaker"
7 __license__="GPL"
8 __version__="0.0.1"
9 __credits__="Based on tweetyPy (http://muffinresearch.co.uk/archives/2007/03/24/tweetypy-python-based-cli-client-for-twitter/)"
10 __URL__="http://snippets.dzone.com/posts/show/4150"
11
12 import sys, getopt, getpass, urllib, urllib2
13
14 import configreader
15
16 STATUS_MODE="STATUS"
17 VIEW_MODE="VIEW"
18 COMMAND_MODE="COMMAND"
19
20 COMMANDS="""Command\t\tMeaning
21
22 d username\tDirect Text
23 @username\tReply
24 follow username\tReceive updates via phone or IM
25 leave username\tStop following username
26 leave all\tStop following all friends
27 remove username\tRemove username from friends list
28 delete username\tDelete username from friends list
29 get username\tGet the last update from username
30 get\tGet the most recent updates from all friends
31 nudge username\tTwitter aks what the person is currently up to
32 whois username\tGet username's bio
33 add phonenumber\tSend text invite. If already a member, invite will turn into a friend request.
34 accept username\tAccept username as a friend
35 deny username\tDeny username as friend"""
36
37 def usage():
38 print "Usage: %s [options]" % (sys.argv[0])
39 print "\nWithout any options, uses status mode. Leftover args are concatenated to form message."
40 print "\n-u|--username <username> specified in tw.conf"
41 print "-s|--status mode"
42 print "-v|--view status"
43 print "-l|--list-commands List Twitter commands"
44 print "-c|--config <configfile>"
45 print "-h|--help"
46
47 sys.exit()
48
49 def set_status(settings, status):
50 auth=urllib2.HTTPPasswordMgrWithDefaultRealm()
51 auth.add_password(None, settings["rootauthurl"], settings["username"], settings["password"])
52 authHandler=urllib2.HTTPBasicAuthHandler(auth)
53 opener=urllib2.build_opener(authHandler)
54
55 url="http://twitter.com/statuses/update.xml"
56 post=urllib.urlencode({"status":status})
57
58 request=urllib2.Request(url, post)
59 request.add_header("User-Agent", settings["useragent"])
60
61 try:
62 response=opener.open(request)
63 except IOError, e:
64 raise "Could not connect."
65
66 def view_status(settings):
67 url="http://twitter.com/"+settings["username"]
68 message=""
69
70 statusdelimeter1=settings["statusdelimeter1"]
71 statusdelimeter2=settings["statusdelimeter2"]
72
73 try:
74 instream=urllib.urlopen(url)
75 for line in instream:
76 if statusdelimeter1 in line:
77 message=line[
78 line.index(statusdelimeter1)+len(statusdelimeter1):line.index(statusdelimeter2)
79 ]
80 break
81 instream.close()
82
83 return message
84
85 except IOError, e:
86 raise "Could not connect."
87
88 def main():
89 global STATUS_MODE
90 global VIEW_MODE
91 global COMMAND_MODE
92 global COMMANDS
93
94 sysArgs=sys.argv[1:]
95
96 mode=STATUS_MODE
97
98 settings={
99 "config":"tw.conf",
100 "username":"mcandre",
101 "rootauthurl":"http://twitter.com/statuses/",
102 "useragent":sys.argv[0]+" "+__version__,
103 "statusdelimeter1":"<p class=\"entry-title entry-content\">",
104 "statusdelimeter2":"</p>"
105 }
106
107 optlist, args=[], []
108 try:
109 optlist, args=getopt.getopt(sysArgs, "u:svlc:h", ["username=", "status", "view", "list-commands", "config=", "help"])
110 except:
111 usage()
112
113 for option, value in optlist:
114 if option=="-c" or option=="--config":
115 settings["config"]=value
116
117 try:
118 configreader.load(open(settings["config"], "r"), settings)
119 except IOError, e:
120 pass
121
122 for option, value in optlist:
123 if option=="-h" or option=="--help":
124 usage()
125
126 elif option=="-u" or option=="--username":
127 settings["username"]=value
128 elif option=="-s" or option=="--status":
129 mode=STATUS_MODE
130 elif option=="-v" or option=="--view":
131 mode=VIEW_MODE
132 elif option=="-l" or option=="--list=commands":
133 mode=COMMAND_MODE
134
135 if mode==STATUS_MODE:
136 if len(args)<1:
137 usage()
138
139 message=" ".join(args)
140
141 settings["password"]=getpass.getpass()
142
143 set_status(settings, message)
144 elif mode==VIEW_MODE:
145 print view_status(settings)
146 elif mode==COMMAND_MODE:
147 print COMMANDS
148
149 if __name__=="__main__":
150 try:
151 main()
152 except KeyboardInterrupt, e:
153 pass