1
+ #!/usr/bin/env python
2
+
3
+ import os
4
+ import logging
5
+ import urllib
6
+ from time import time
7
+ from random import getrandbits
8
+ from google .appengine .api import urlfetch
9
+ from google .appengine .ext .webapp import RequestHandler , WSGIApplication , template , wsgiref
10
+ from django .utils import simplejson
11
+
12
+ from yammerConfig import CONSUMER_KEY , CONSUMER_SECRET
13
+
14
+ REQUEST_TOKEN_URL = 'https://www.yammer.com/oauth/request_token'
15
+ ACCESS_TOKEN_URL = 'https://www.yammer.com/oauth/access_token'
16
+ USER_AUTH_URL = 'https://www.yammer.com/oauth/authorize'
17
+ DEFAULT_API_PREFIX = 'https://www.yammer.com/api/v1/'
18
+ DEFAULT_API_SUFFIX = '.json'
19
+
20
+ HEADERS = {
21
+ 'Content-Type' : 'application/x-www-form-urlencoded' ,
22
+ 'Accept' : '*/*' ,
23
+ 'Accept-Language' : 'en-us' ,
24
+ 'Accept-Encoding' : 'gzip, deflate' ,
25
+ 'Connection' : 'keep-alive' ,
26
+ }
27
+
28
+ def getOAuthHeaders (token = None , token_secret = '' , verifier = None ):
29
+ OAuthHeaders = 'OAuth realm=""'
30
+ OAuthHeaders += ', oauth_consumer_key="%s"' % CONSUMER_KEY
31
+
32
+ if token :
33
+ OAuthHeaders += ', oauth_token="%s"' % token
34
+
35
+ OAuthHeaders += ', oauth_signature_method="PLAINTEXT"'
36
+ OAuthHeaders += ', oauth_signature="%s%%26%s"' % (CONSUMER_SECRET , token_secret )
37
+ currentTime = int (time ())
38
+ OAuthHeaders += ', oauth_timestamp="%s"' % currentTime
39
+ OAuthHeaders += ', oauth_nonce="%s"' % currentTime
40
+
41
+ if verifier :
42
+ OAuthHeaders += ', oauth_verifier="%s"' % verifier
43
+
44
+ OAuthHeaders += ', oauth_version="1.0"'
45
+ return str (OAuthHeaders )
46
+
47
+ class MainHandler (RequestHandler ):
48
+
49
+ def get_cookie (self ):
50
+ return self .request .cookies .get ('oauth.yammerfall' , '' )
51
+
52
+ def set_cookie (self , value , path = '/' ):
53
+ self .response .headers .add_header (
54
+ 'Set-Cookie' ,
55
+ '%s=%s; path=%s; expires="Fri, 31-Dec-2021 23:59:59 GMT"' %
56
+ ('oauth.yammerfall' , value , path )
57
+ )
58
+
59
+ def expire_cookie (self , path = '/' ):
60
+ self .response .headers .add_header (
61
+ 'Set-Cookie' ,
62
+ '%s=; path=%s; expires="Fri, 31-Dec-1999 23:59:59 GMT"' %
63
+ ('oauth.yammerfall' , path )
64
+ )
65
+
66
+ def get (self ):
67
+
68
+ if self .request .get ('expire_cookie' , None ) == 'now' :
69
+ logging .debug ('EXPIRING COOKIE' )
70
+ self .expire_cookie ()
71
+ self .redirect ('/' )
72
+ return
73
+
74
+ if self .get_cookie ():
75
+ logging .debug ('GOT COOKIE! %s' % self .get_cookie ())
76
+ template_values = {
77
+ 'messagesUrl' : '/messages?%s' % self .get_cookie (),
78
+ }
79
+ path = os .path .join (os .path .dirname (__file__ ), "templates/home.html" )
80
+ self .response .out .write (template .render (path , template_values ))
81
+ return
82
+
83
+ logging .debug ('NO COOKIE!' )
84
+
85
+ HEADERS ['Authorization' ] = getOAuthHeaders ()
86
+ result = urlfetch .fetch (
87
+ url = REQUEST_TOKEN_URL ,
88
+ payload = '' ,
89
+ method = urlfetch .POST ,
90
+ headers = HEADERS ,
91
+ )
92
+
93
+ data = {}
94
+ for nv in result .content .split ('&' ):
95
+ (n , v ) = nv .split ('=' )
96
+ data [n ] = v
97
+
98
+ template_values = {
99
+ 'user_auth_url' : USER_AUTH_URL ,
100
+ 'oauth_token' : data ['oauth_token' ],
101
+ 'oauth_token_secret' : data ['oauth_token_secret' ],
102
+ }
103
+ path = os .path .join (os .path .dirname (__file__ ), "templates/login.html" )
104
+ self .response .out .write (template .render (path , template_values ))
105
+ return
106
+
107
+
108
+
109
+ def post (self ):
110
+
111
+ logging .debug ('AUTHORIZE WITH VERIFY CODE: %s' % self .request .get ('oauth_verifier' ))
112
+
113
+ HEADERS ['Authorization' ] = getOAuthHeaders (
114
+ token = self .request .get ('oauth_token' ),
115
+ token_secret = self .request .get ('oauth_token_secret' ),
116
+ verifier = self .request .get ('oauth_verifier' ))
117
+
118
+ result = urlfetch .fetch (
119
+ url = ACCESS_TOKEN_URL ,
120
+ method = urlfetch .POST ,
121
+ headers = HEADERS ,
122
+ )
123
+
124
+ logging .debug ('AUTHORIZED: %s' % result .content )
125
+
126
+ self .set_cookie (result .content )
127
+ self .redirect ('/' )
128
+
129
+
130
+ class MessagesHandler (RequestHandler ):
131
+ def get (self ):
132
+
133
+ HEADERS ['Authorization' ] = getOAuthHeaders (
134
+ token = self .request .get ('oauth_token' ),
135
+ token_secret = self .request .get ('oauth_token_secret' ))
136
+ MSGS_URL = '%smessages%s' % (DEFAULT_API_PREFIX , DEFAULT_API_SUFFIX )
137
+
138
+ result = urlfetch .fetch (
139
+ url = MSGS_URL ,
140
+ method = urlfetch .GET ,
141
+ headers = HEADERS ,
142
+ )
143
+
144
+ data = simplejson .loads (result .content )
145
+
146
+ #self.response.out.write(data)
147
+
148
+ users = {}
149
+ ref_msgs = {}
150
+ for r in data ['references' ]:
151
+ if r ['type' ] == 'user' :
152
+ users [r ['id' ]] = r
153
+ users [r ['name' ]] = r
154
+ elif r ['type' ] == 'message' :
155
+ ref_msgs [r ['id' ]] = r
156
+
157
+ for m in data ['messages' ]:
158
+ m ['mugshot_url' ] = users [m ['sender_id' ]]['mugshot_url' ]
159
+ m ['full_name' ] = users [m ['sender_id' ]]['full_name' ]
160
+ m ['like_list' ] = []
161
+ if m ['liked_by' ]['count' ] > 0 :
162
+ for liked_by_name in m ['liked_by' ]['names' ]:
163
+ try :
164
+ m ['like_list' ].append ((liked_by_name ['full_name' ], users [liked_by_name ['permalink' ]]['mugshot_url' ]))
165
+ except :
166
+ pass
167
+ if m ['replied_to_id' ]:
168
+ in_reply_to = users [ref_msgs [m ['replied_to_id' ]]['sender_id' ]]
169
+ m ['in_reply_to' ] = (in_reply_to ['full_name' ], in_reply_to ['mugshot_url' ])
170
+
171
+ template_values = {
172
+ 'messages' : data ['messages' ],
173
+ }
174
+ path = os .path .join (os .path .dirname (__file__ ), "templates/messagelist.html" )
175
+ self .response .out .write (template .render (path , template_values ))
176
+
177
+
178
+ # ------------------------------------------------------------------------------
179
+ # self runner -- gae cached main() function
180
+ # ------------------------------------------------------------------------------
181
+
182
+ def main ():
183
+ logging .getLogger ().setLevel (logging .DEBUG )
184
+ application = WSGIApplication ([
185
+ ('/' , MainHandler ),
186
+ ('/messages' , MessagesHandler ),
187
+ ], debug = True )
188
+
189
+ wsgiref .handlers .CGIHandler ().run (application )
190
+
191
+ if __name__ == '__main__' :
192
+ main ()
0 commit comments