def get(self, action="", account="", param=""): account = urllib.unquote_plus(account) param = urllib.unquote_plus(param) if action == "add_column": template_values = self.add_column() tmpl = os.path.join(os.path.dirname(__file__), "../view/cybozulive_add_column.html") return self.response.out.write(template.render(tmpl, template_values)) if action == "accounts": template_values = self.accounts() tmpl = os.path.join(os.path.dirname(__file__), "../view/cybozulive_accounts.html") return self.response.out.write(template.render(tmpl, template_values)) if action == "messages": type = self.request.get("type") if type == "": url = "https://api.cybozulive.com/api/notification/V2" template_values = self.get_messages(account, url) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) if type.startswith("board/"): url = "https://api.cybozulive.com/api/board/V2?group="+type.split("/")[1] template_values = self.get_messages(account, url) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) else: url = "https://api.cybozulive.com/api/notification/V2?category="+type template_values = self.get_messages(account, url) template_values["room_id"] = type self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) self.error(400)
def get(self, action="", account="", param=""): user = self.session.get_user() account = urllib.unquote_plus(account) param = urllib.unquote_plus(param) if action == "add_column": template_values = self.add_column() tmpl = os.path.join(os.path.dirname(__file__), "../view/youroom_add_column.html") return self.response.out.write(template.render(tmpl, template_values)) if action == "accounts": template_values = self.accounts() tmpl = os.path.join(os.path.dirname(__file__), "../view/youroom_accounts.html") return self.response.out.write(template.render(tmpl, template_values)) if action == "messages": type = self.request.get("type") if type == "": url = "https://www.youroom.in/?flat=true&format=json" if self.request.get("page"): url += "&page=" + self.request.get("page") template_values = self.get_messages(account, url) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) else: url = "https://www.youroom.in/r/" + type + "/?flat=true&format=json" if self.request.get("page"): url += "&page=" + self.request.get("page") template_values = self.get_messages(account, url, type) template_values["room_id"] = type self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) if action == "thread": room_id = self.request.get("room_id") url = "https://www.youroom.in/r/" + room_id + "/entries/" + self.request.get("id") + "?format=json" template_values = self.get_entries(account, url, room_id) template_values["room_id"] = room_id self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) if action == "attach": id = self.request.get("id") room_id = self.request.get("room_id") content_type = self.request.get("content-type") name = self.request.get("name") url = "https://www.youroom.in/r/" + room_id + "/entries/" + id + "/attachment" response, content = oauth.YouRoomHandler.request(user, account, url) if response["status"] != "200": raise Exception(response["status"] + " failed to get attachement. : " + content) content_type = content_type or mimetypes.guess_type(name)[0] or "application/octet-stream" self.response.headers["Content-Type"] = content_type if content_type.startswith("image/"): self.response.headers["Content-Disposition"] = 'inline; filename="%s"' % name else: self.response.headers["Content-Disposition"] = 'attachment; filename="%s"' % name return self.response.out.write(content) if action == "api": url = self.request.get("url") response, content = oauth.YouRoomHandler.request(user, account, url) self.response.headers["Content-Disposition"] = "inline;" return self.response.out.write(content) self.error(400)
def get(self, action=""): if action == "messages": type = self.request.get('type') query = {"key": settings.GOOGLEPLUS_API_KEY} pageToken = self.request.get('pageToken') if pageToken: query["pageToken"] = pageToken if type.startswith("search/"): url = "https://www.googleapis.com/plus/v1/activities" query["query"] = type.split('/', 1)[1] #url += "?" + urllib.urlencode(query)念のためコメントアウト url += "?" + utils.encoded_urlencode(query) json = memcache.get(url) if json is None: response = urlfetch.fetch(url) logging.info(response.content) json = simplejson.loads(response.content) # memcache.set(url, json, 2*60) #2分キャッシュ result_json = { 'service': 'googleplus', 'nextPageToken': json.get('nextPageToken'), 'messages': json.get("items") } self.response.headers["Cache-Control"] = "public, max-age=120" self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(result_json)) self.error(400) elif action == "add_column": tmpl = os.path.join(os.path.dirname(__file__), "../view/googleplus_add_column.html") return self.response.out.write(template.render(tmpl, {})) self.error(400)
def get(self, mode=""): if mode == 'yammerusers': csv = self.get_yammer_users() self.response.headers["Content-Type"] = "text/plain;charset=utf-8" return self.response.out.write(csv) tmpl = os.path.join(os.path.dirname(__file__), '../view/admin.html') return self.response.out.write(template.render(tmpl, {}))
def get(self, action=""): if action == "messages": url = self.request.get('type') d = memcache.get(url) if d is None: result = urllib.urlopen(url) d = feedparser.parse(result) memcache.set(url, d, 2*60) #2分キャッシュ #RSSの形式が規格外の場合 #if d.bozo == 1: # raise Exception("Can not parse given URL.") response = { "title": d.feed.get("title"), "link": d.feed.get("link"), "feed_url": url, "messages": [] } for entry in d.entries: response["messages"].append({ "title": entry.get("title"), "link": entry.get("link"), "updated": datetime.datetime(*entry.updated_parsed[:6]).strftime("%a %b %d %H:%M:%S %Y") }) feed_json = simplejson.dumps(response) self.response.headers["Cache-Control"] = "public, max-age=120" self.response.headers["Content-Type"] = "application/json" return self.response.out.write(feed_json) elif action == "add_column": tmpl = os.path.join(os.path.dirname(__file__), "../view/rss_add_column.html") return self.response.out.write(template.render(tmpl, {})) self.error(400)
def get(self, action=""): if action == "messages": type = self.request.get('type') query = {"key":settings.GOOGLEPLUS_API_KEY} pageToken = self.request.get('pageToken') if pageToken: query["pageToken"] = pageToken if type.startswith("search/"): url = "https://www.googleapis.com/plus/v1/activities" query["query"] = type.split('/',1)[1] #url += "?" + urllib.urlencode(query)念のためコメントアウト url += "?" + utils.encoded_urlencode(query) json = memcache.get(url) if json is None: response = urlfetch.fetch(url) logging.info(response.content) json = simplejson.loads(response.content) # memcache.set(url, json, 2*60) #2分キャッシュ result_json = { 'service': 'googleplus', 'nextPageToken': json.get('nextPageToken'), 'messages': json.get("items") } self.response.headers["Cache-Control"] = "public, max-age=120" self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(result_json)) self.error(400) elif action == "add_column": tmpl = os.path.join(os.path.dirname(__file__), "../view/googleplus_add_column.html") return self.response.out.write(template.render(tmpl, {})) self.error(400)
def get(self, action="", account="", param=""): account = urllib.unquote_plus(account) if action == "add_column": template_values = self.add_column() tmpl = os.path.join(os.path.dirname(__file__), "../view/linkedin_add_column.html") return self.response.out.write( template.render(tmpl, template_values)) if action == "accounts": template_values = self.accounts() tmpl = os.path.join(os.path.dirname(__file__), "../view/linkedin_accounts.html") return self.response.out.write( template.render(tmpl, template_values)) if action == "messages": #TODO STAT以外の対応 query = {"format": "json", "count": "20", "type": "SHAR"} type = self.request.get("type") if type == "updates": url = "http://api.linkedin.com/v1/people/~/network/updates" if type == "my": url = "http://api.linkedin.com/v1/people/~/network/updates" query["scope"] = "self" if self.request.get("before"): query["before"] = self.request.get("before") #if self.request.get("page"): # query["page"] = self.request.get("page") url += "?" + urllib.urlencode(query) template_values = self.get_messages(account, url) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) if action == "comments": id = self.request.get("id") start = self.request.get("start") count = self.request.get("count") query = {"format": "json", "start": start, "count": count} url = "http://api.linkedin.com/v1/people/~/network/updates/key=%s/update-comments" % urllib.quote( id) url += "?" + urllib.urlencode(query) template_values = self.get_messages(account, url) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) self.error(400)
def get(self, action="", account="", param=""): account = urllib.unquote_plus(account) if action == "add_column": template_values = self.add_column() tmpl = os.path.join(os.path.dirname(__file__), "../view/linkedin_add_column.html") return self.response.out.write(template.render(tmpl, template_values)) if action == "accounts": template_values = self.accounts() tmpl = os.path.join(os.path.dirname(__file__), "../view/linkedin_accounts.html") return self.response.out.write(template.render(tmpl, template_values)) if action == "messages": #TODO STAT以外の対応 query = {"format":"json", "count":"20", "type":"SHAR"} type = self.request.get("type") if type == "updates" : url = "http://api.linkedin.com/v1/people/~/network/updates" if type == "my": url = "http://api.linkedin.com/v1/people/~/network/updates" query["scope"] = "self" if self.request.get("before"): query["before"] = self.request.get("before") #if self.request.get("page"): # query["page"] = self.request.get("page") url += "?" + urllib.urlencode(query) template_values = self.get_messages(account, url) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) if action == "comments": id = self.request.get("id") start = self.request.get("start") count = self.request.get("count") query = {"format":"json", "start":start, "count":count} url = "http://api.linkedin.com/v1/people/~/network/updates/key=%s/update-comments" % urllib.quote(id) url += "?" + urllib.urlencode(query) template_values = self.get_messages(account, url) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) self.error(400)
def get(self, action="", account="", param=""): verification_code = self.request.get("code") args = dict(client_id=settings.FACEBOOK_APP_ID, redirect_uri=self.request.path_url) if verification_code: args["client_secret"] = settings.FACEBOOK_APP_SECRET args["code"] = verification_code response = cgi.parse_qs( urllib.urlopen( "https://graph.facebook.com/oauth/access_token?" + urllib.urlencode(args)).read()) access_token = response["access_token"][-1] profile_res = unicode( urllib.urlopen("https://graph.facebook.com/me?" + urllib.urlencode(dict( access_token=access_token))).read(), 'utf-8') profile = simplejson.loads(profile_res) user = None is_not_login = False try: self.check_login() user = self.session.get_user() except utils.NotLoginError: is_not_login = True user = User.gql("WHERE user_id=:1 and service=:2", str(profile["id"]), "facebook").get() if user is None: user = User(user_id=str(profile["id"]), name=str(profile["name"]), mail=str(profile["email"]), service='facebook', access_token=access_token, post_key='control', last_access_time=datetime.datetime.now()) user.put() session = Session(self.request, self.response) session.new(user) account = Account(user_ref=user, service="facebook", account_name=str(profile["id"]), display_name=str(profile["name"]), account_info=profile_res, scope=FACEBOOK_SCOPE, access_token=access_token) account.put() #既に同じアカウントが登録されていたら削除します saved_accounts = Account.gql( "WHERE service = :1 and user_ref = :2 and account_name = :3", "facebook", user.key(), account.account_name) for saved_account in saved_accounts: if saved_account.key() != account.key(): saved_account.delete() if is_not_login: if action == 'mlogin': self.redirect('/mhome?xoauth_requestor_id=' + user.user_id) return self.redirect('/') return #ウィンドウを閉じます tmpl = os.path.join(os.path.dirname(__file__), "../view/oauth_callback.html") return self.response.out.write( template.render(tmpl, {'account': account})) else: args["scope"] = FACEBOOK_SCOPE if action == 'oauth': args["display"] = 'popup' self.redirect("https://www.facebook.com/dialog/oauth?" + #"https://graph.facebook.com/oauth/authorize?" + urllib.urlencode(args)) return
def get(self, action="", account="", param=""): user = self.session.get_user() if action == "oauth": verification_code = self.request.get("code") args = dict(client_id=settings.CHATTER_CLIENT_ID, redirect_uri=self.request.path_url) if verification_code: args["client_secret"] = settings.CHATTER_CLIENT_SECRET args["code"] = verification_code args["grant_type"] = "authorization_code" account = self.get_token(args) # 既に同じアカウントが登録されていたら削除します saved_accounts = Account.gql( "WHERE service = :1 and user_ref = :2 and account_name = :3", "chatter", user.key(), account.account_name, ) for saved_account in saved_accounts: if saved_account.key() != account.key(): saved_account.delete() # ウィンドウを閉じます tmpl = os.path.join(os.path.dirname(__file__), "../view/oauth_callback.html") return self.response.out.write(template.render(tmpl, {"account": account})) else: args["response_type"] = "code" self.redirect("https://login.salesforce.com/services/oauth2/authorize?" + urllib.urlencode(args)) return if action == "add_column": template_values = self.accounts() tmpl = os.path.join(os.path.dirname(__file__), "../view/chatter_add_column.html") return self.response.out.write(template.render(tmpl, template_values)) if action == "accounts": template_values = self.accounts() tmpl = os.path.join(os.path.dirname(__file__), "../view/chatter_accounts.html") return self.response.out.write(template.render(tmpl, template_values)) if action == "messages": type = self.request.get("type") until = self.request.get("until") query = {} url = "query" query[ "q" ] = """SELECT Id, Type, CreatedById, CreatedBy.Name, InsertedBy.Profile.CreatedBy.SmallPhotoUrl, CreatedDate, LastModifiedDate, ParentId, Parent.Name, Parent.Type, RelatedRecordId, CommentCount, Body, Title, LinkUrl, ContentData, ContentFileName, (SELECT Id, FieldName, OldValue, NewValue FROM FeedTrackedChanges ORDER BY Id DESC), (SELECT Id, CommentBody, CreatedDate, CreatedBy.Name, InsertedBy.Profile.CreatedBy.SmallPhotoUrl FROM FeedComments ORDER BY CreatedDate DESC LIMIT 2), (SELECT CreatedBy.Name FROM FeedLikes) FROM NewsFeed""" if until: query["q"] += " WHERE LastModifiedDate <= %s " % until.replace("+0000", "z") query[ "q" ] += """ ORDER BY LastModifiedDate DESC, Id DESC LIMIT 20""" template_values = self.get_messages(account, url, query) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) if action == "comments": id = self.request.get("id") query = {} url = "query" query["q"] = ( """SELECT Id, (SELECT Id, CommentBody, CreatedDate, CreatedBy.Name, InsertedBy.Profile.CreatedBy.SmallPhotoUrl FROM FeedComments ORDER BY CreatedDate DESC LIMIT 200) FROM NewsFeed WHERE Id = '%s' LIMIT 20""" % id ) messages = self.get_messages(account, url, query).get("messages") try: template_values = messages[0]["FeedComments"]["records"] except: logging.error(simplejson.dumps(messages)) self.error(500) return self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) return self.error(400)
def get(self, action="", account="", param=""): try: account = urllib.unquote_plus(account) if action == "add_column": template_values = self.add_column() tmpl = os.path.join(os.path.dirname(__file__), "../view/twitter_add_column.html") return self.response.out.write(template.render(tmpl, template_values)) if action == "accounts": template_values = self.accounts() tmpl = os.path.join(os.path.dirname(__file__), "../view/twitter_accounts.html") return self.response.out.write(template.render(tmpl, template_values)) if action == "messages": query = {'include_rts':'true', 'include_entities':'true', 'include_extended_entities':'true'} type = self.request.get("type") #1.1で削除されたAPIにアクセスされた場合は空のリストを返却する if type in ("retweeted_by_me", "retweeted_to_me") : self.response.headers["Content-Type"] = "application/json" return self.response.out.write("[]") elif type.startswith("list/") : types = type.split("/") list_name = types[2] url = "https://api.twitter.com/1.1/lists/statuses.json" query["slug"] = list_name query["owner_screen_name"] = types[1] elif type.startswith("search/") : types = type.split("/", 1) url = "https://api.twitter.com/1.1/search/tweets.json" query["q"] = types[1] elif type.startswith("user/") : types = type.split("/", 1) url = "https://api.twitter.com/1.1/statuses/user_timeline.json" query["screen_name"] = types[1] elif type == "favorites" : url = "https://api.twitter.com/1.1/favorites/list.json" elif type.startswith("favorites/") : types = type.split("/", 1) url = "https://api.twitter.com/1.1/favorites/list.json" query["id"] = types[1] elif type == "mentions" : url = "https://api.twitter.com/1.1/statuses/mentions_timeline.json" elif type.startswith("mentions/") : types = type.split("/", 1) url = "https://api.twitter.com/1.1/search/tweets.json" query["q"] = "@"+types[1] elif type.startswith("direct_messages") : url = "https://api.twitter.com/1.1/"+type+".json" else: url = "https://api.twitter.com/1.1/statuses/"+type+".json" if self.request.get("max_id"): query["max_id"] = self.request.get("max_id") if self.request.get("page"): query["page"] = self.request.get("page") url += '?' for k, v in query.items(): url += k + '=' + v.encode('utf-8').replace('#','%23') + '&' template_values, status = self.get_messages(account, url) if status == "401" or status == "403": self.error(int(status)) return elif status != "200": logging.warn("url=%s, status=%s, content=%s", url, status, template_values) raise TwitterHttpException("failed to get messages from twitter", status) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) if action == "lists": url = "https://api.twitter.com/1.1/lists/list.json?screen_name=%s" % account result = self.call_method(account, url) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(result) if action == "status": id = self.request.get("id") if id == None: self.error(400) url = "https://api.twitter.com/1.1/statuses/show.json?id=%s&include_entities=true" % id result = self.call_method(account, url) status = simplejson.loads(result) status = self.convert_message(status) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(status)) if action == "api": path = self.request.get("path") if path == "": self.error(400) return response, content = oauth.TwitterHandler.request( self.session.get_user(), account, "https://api.twitter.com/1.1/%s" % path, method="GET") if response["status"] != "200": raise TwitterHttpException(response["status"] + ", path=" + path + ", content=" + content, response["status"]) return self.response.out.write(content) self.error(400) except TwitterHttpException as e: self.error(e.status) except Exception as e: self.error(500)
def get(self, action="", account="", param=""): user = self.session.get_user() if action == "add_column": accounts = self.accounts() template_values = {} if accounts and accounts.get('accounts'): user_accounts = [] for account in accounts['accounts']: if not account.account_name.startswith('page_'): user_accounts.append(account) template_values = {"accounts": user_accounts} tmpl = os.path.join(os.path.dirname(__file__), "../view/facebook_add_column.html") return self.response.out.write( template.render(tmpl, template_values)) if action == "accounts": template_values = self.accounts() tmpl = os.path.join(os.path.dirname(__file__), "../view/facebook_accounts.html") return self.response.out.write( template.render(tmpl, template_values)) if action == "messages": type = self.request.get("type") until = self.request.get("until") query = {} if until: query["until"] = until if type.startswith("page/") or type.startswith( "app/") or type.startswith('group/') or type.startswith( 'list'): types = type.split("/") page = types[1].encode('utf-8') url = "https://graph.facebook.com/" + page + "/feed" elif type == "wall" and account.startswith('page_'): url = "https://graph.facebook.com/" + account.split( '_', 1)[1] + "/feed" elif type.startswith("search"): url = "https://graph.facebook.com/search" query["q"] = type.split('/', 1)[1] else: url = "https://graph.facebook.com/" + type template_values, status = self.get_messages(account, url, query) if status == 400: #TODO 本当はレスポンスボディがOAuthExceptionだったら self.error(401) return elif status < 200 or status >= 300: logging.warn("%s : %s", url, status) raise Exception("failed to get messages from facebook") self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) if action == "thread": message_id = self.request.get("id") url = "https://graph.facebook.com/" + message_id response = call(user, account, url) if response.status_code != 200: raise Exception( str(response.status_code) + " failed to get messages.") content = unicode(response.content, 'utf-8') m = simplejson.loads(content) if m.get("comments") and m["comments"].get("data"): for c in m["comments"]["data"]: c = self.convert_message(c) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(m)) if action == "api": api = self.request.get("path") url = "https://graph.facebook.com/" + api response = call(user, account, url) if response.status_code != 200: raise Exception( str(response.status_code) + " failed to execute " + api + " : " + response.content) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(response.content) if action == "fql": query = self.request.get("query") url = "https://api.facebook.com/method/fql.query" params = {"query": query, "format": 'JSON'} response = call(user, account, url, params=params) if response.status_code != 200: raise Exception( str(response.status_code) + " failed to get pages.") self.response.headers["Content-Type"] = "application/json" return self.response.out.write(response.content) self.error(400)
def get(self, action="", account="", param=""): verification_code = self.request.get("code") args = dict(client_id=settings.FACEBOOK_APP_ID, redirect_uri=self.request.path_url) if verification_code: args["client_secret"] = settings.FACEBOOK_APP_SECRET args["code"] = verification_code response = cgi.parse_qs(urllib.urlopen( "https://graph.facebook.com/oauth/access_token?" + urllib.urlencode(args)).read()) access_token = response["access_token"][-1] profile_res = unicode(urllib.urlopen( "https://graph.facebook.com/me?" + urllib.urlencode(dict(access_token=access_token))).read(),'utf-8') profile = simplejson.loads(profile_res) user = None is_not_login = False try: self.check_login() user = self.session.get_user() except utils.NotLoginError: is_not_login = True user = User.gql("WHERE user_id=:1 and service=:2", str(profile["id"]), "facebook").get() if user is None: user = User( user_id=str(profile["id"]), name=str(profile["name"]), mail=str(profile["email"]), service='facebook', access_token=access_token, post_key='control', last_access_time=datetime.datetime.now() ) user.put() session = Session(self.request, self.response) session.new(user) account = Account( user_ref=user, service="facebook", account_name=str(profile["id"]), display_name=str(profile["name"]), account_info=profile_res, scope=FACEBOOK_SCOPE, access_token=access_token ) account.put() #既に同じアカウントが登録されていたら削除します saved_accounts = Account.gql( "WHERE service = :1 and user_ref = :2 and account_name = :3", "facebook", user.key(), account.account_name) for saved_account in saved_accounts: if saved_account.key() != account.key(): saved_account.delete() if is_not_login: if action == 'mlogin': self.redirect('/mhome?xoauth_requestor_id='+user.user_id) return self.redirect('/') return #ウィンドウを閉じます tmpl = os.path.join(os.path.dirname(__file__), "../view/oauth_callback.html") return self.response.out.write(template.render(tmpl, {'account':account})) else: args["scope"] = FACEBOOK_SCOPE if action == 'oauth': args["display"] = 'popup' self.redirect( "https://www.facebook.com/dialog/oauth?" + #"https://graph.facebook.com/oauth/authorize?" + urllib.urlencode(args)) return
def get(self, action="", account="", param=""): user = self.session.get_user() account = urllib.unquote_plus(account) if action == "authorize": tmpl = os.path.join(os.path.dirname(__file__), "../view/yammer_authorize.html") return self.response.out.write(template.render(tmpl, {})) if action == "add_column": template_values = self.add_column() tmpl = os.path.join(os.path.dirname(__file__), "../view/yammer_add_column.html") return self.response.out.write(template.render(tmpl, template_values)) if action == "accounts": template_values = self.accounts() tmpl = os.path.join(os.path.dirname(__file__), "../view/yammer_accounts.html") return self.response.out.write(template.render(tmpl, template_values)) if action == "messages": query = {"threaded":"extended"} type = self.request.get("type") if type == "all": url = "https://www.yammer.com/api/v1/messages.json" elif type == "favorites_of": url = "https://www.yammer.com/api/v1/messages/favorites_of/current.json" else: url = "https://www.yammer.com/api/v1/messages/"+type+".json" if self.request.get("older_than"): query['older_than'] = self.request.get("older_than") url += "?" + urllib.urlencode(query) template_values = self.get_messages(account, url) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) if action == "thread": id = self.request.get("id") url = "https://www.yammer.com/api/v1/messages/in_thread/%s.json" % id query = {"limit":self.request.get("limit") or 20} if self.request.get("older_than"): query["older_than"] = self.request.get("older_than") url += "?" + urllib.urlencode(query) template_values = self.get_messages(account, url) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) if action == "attach": url = self.request.get("url") content_type = self.request.get("content-type") name = self.request.get("name") response, content = oauth.YammerHandler.request(user, account, url) if response["status"] != "200": raise Exception(response["status"] + " failed to get attachement. : " + content) content_type = content_type or mimetypes.guess_type(name)[0] or "application/octet-stream" self.response.headers["Content-Type"] = content_type if content_type.startswith("image/"): self.response.headers["Content-Disposition"] = 'inline; filename="%s"' % name else: self.response.headers["Content-Disposition"] = 'attachment; filename="%s"' % name return self.response.out.write(content) if action == "api": path = self.request.get('path') url = "https://www.yammer.com/api/%s" % path response, content = oauth.YammerHandler.request(user, account, url) if response["status"] != "200": raise Exception(response["status"] + " failed to call %s. : %s" % (url,content)) return self.response.out.write(content) self.error(400)
def get(self, action="", account="", param=""): account = urllib.unquote_plus(account) if action == "add_column": template_values = self.add_column() tmpl = os.path.join(os.path.dirname(__file__), "../view/twitter_add_column.html") return self.response.out.write( template.render(tmpl, template_values)) if action == "accounts": template_values = self.accounts() tmpl = os.path.join(os.path.dirname(__file__), "../view/twitter_accounts.html") return self.response.out.write( template.render(tmpl, template_values)) if action == "messages": query = {'include_rts': 'true', 'include_entities': 'true'} type = self.request.get("type") #1.1で削除されたAPIにアクセスされた場合は空のリストを返却する if type in ("retweeted_by_me", "retweeted_to_me"): self.response.headers["Content-Type"] = "application/json" return self.response.out.write("[]") elif type.startswith("list/"): types = type.split("/") list_name = types[2] url = "https://api.twitter.com/1.1/lists/statuses.json" query["slug"] = list_name query["owner_screen_name"] = types[1] elif type.startswith("search/"): types = type.split("/", 1) url = "https://api.twitter.com/1.1/search/tweets.json" query["q"] = types[1] elif type.startswith("user/"): types = type.split("/", 1) url = "https://api.twitter.com/1.1/statuses/user_timeline.json" query["screen_name"] = types[1] elif type == "favorites": url = "https://api.twitter.com/1.1/favorites/list.json" elif type.startswith("favorites/"): types = type.split("/", 1) url = "https://api.twitter.com/1.1/favorites/list.json" query["id"] = types[1] elif type == "mentions": url = "https://api.twitter.com/1.1/statuses/mentions_timeline.json" elif type.startswith("mentions/"): types = type.split("/", 1) url = "https://api.twitter.com/1.1/search/tweets.json" query["q"] = "@" + types[1] elif type.startswith("direct_messages"): url = "https://api.twitter.com/1.1/" + type + ".json" else: url = "https://api.twitter.com/1.1/statuses/" + type + ".json" if self.request.get("max_id"): query["max_id"] = self.request.get("max_id") if self.request.get("page"): query["page"] = self.request.get("page") url += '?' for k, v in query.items(): url += k + '=' + v.encode('utf-8').replace('#', '%23') + '&' template_values, status = self.get_messages(account, url) if status == "401" or status == "403": self.error(int(status)) return elif status != "200": logging.warn("url=%s, status=%s, content=%s", url, status, template_values) raise Exception("failed to get messages from twitter") self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) if action == "lists": url = "https://api.twitter.com/1.1/lists/list.json?screen_name=%s" % account result = self.call_method(account, url) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(result) if action == "status": id = self.request.get("id") if id == None: self.error(400) url = "https://api.twitter.com/1.1/statuses/show.json?id=%s&include_entities=true" % id result = self.call_method(account, url) status = simplejson.loads(result) status = self.convert_message(status) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(status)) if action == "api": path = self.request.get("path") if path == "": self.error(400) return response, content = oauth.TwitterHandler.request( self.session.get_user(), account, "https://api.twitter.com/1.1/%s" % path, method="GET") if response["status"] != "200": raise Exception(response["status"] + ", path=" + path + ", content=" + content) return self.response.out.write(content) self.error(400)
def get(self, action="", account="", param=""): user = self.session.get_user() if action == "oauth": verification_code = self.request.get("code") args = dict(client_id=settings.CHATTER_CLIENT_ID, redirect_uri=self.request.path_url) if verification_code: args["client_secret"] = settings.CHATTER_CLIENT_SECRET args["code"] = verification_code args["grant_type"] = "authorization_code" account = self.get_token(args) #既に同じアカウントが登録されていたら削除します saved_accounts = Account.gql( "WHERE service = :1 and user_ref = :2 and account_name = :3", "chatter", user.key(), account.account_name) for saved_account in saved_accounts: if saved_account.key() != account.key(): saved_account.delete() #ウィンドウを閉じます tmpl = os.path.join(os.path.dirname(__file__), "../view/oauth_callback.html") return self.response.out.write( template.render(tmpl, {'account': account})) else: args["response_type"] = "code" self.redirect( "https://login.salesforce.com/services/oauth2/authorize?" + urllib.urlencode(args)) return if action == "add_column": template_values = self.accounts() tmpl = os.path.join(os.path.dirname(__file__), "../view/chatter_add_column.html") return self.response.out.write( template.render(tmpl, template_values)) if action == "accounts": template_values = self.accounts() tmpl = os.path.join(os.path.dirname(__file__), "../view/chatter_accounts.html") return self.response.out.write( template.render(tmpl, template_values)) if action == "messages": type = self.request.get("type") until = self.request.get("until") query = {} url = "query" query["q"] = '''SELECT Id, Type, CreatedById, CreatedBy.Name, InsertedBy.Profile.CreatedBy.SmallPhotoUrl, CreatedDate, LastModifiedDate, ParentId, Parent.Name, Parent.Type, RelatedRecordId, CommentCount, Body, Title, LinkUrl, ContentData, ContentFileName, (SELECT Id, FieldName, OldValue, NewValue FROM FeedTrackedChanges ORDER BY Id DESC), (SELECT Id, CommentBody, CreatedDate, CreatedBy.Name, InsertedBy.Profile.CreatedBy.SmallPhotoUrl FROM FeedComments ORDER BY CreatedDate DESC LIMIT 2), (SELECT CreatedBy.Name FROM FeedLikes) FROM NewsFeed''' if until: query["q"] += " WHERE LastModifiedDate <= %s " % until.replace( '+0000', 'z') query["q"] += ''' ORDER BY LastModifiedDate DESC, Id DESC LIMIT 20''' template_values = self.get_messages(account, url, query) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) if action == "comments": id = self.request.get("id") query = {} url = "query" query["q"] = '''SELECT Id, (SELECT Id, CommentBody, CreatedDate, CreatedBy.Name, InsertedBy.Profile.CreatedBy.SmallPhotoUrl FROM FeedComments ORDER BY CreatedDate DESC LIMIT 200) FROM NewsFeed WHERE Id = '%s' LIMIT 20''' % id messages = self.get_messages(account, url, query).get('messages') try: template_values = messages[0]["FeedComments"]["records"] except: logging.error(simplejson.dumps(messages)) self.error(500) return self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) return self.error(400)
def get(self, action="", account="", param=""): user = self.session.get_user() account = urllib.unquote_plus(account) param = urllib.unquote_plus(param) if action == "add_column": template_values = self.add_column() tmpl = os.path.join(os.path.dirname(__file__), "../view/youroom_add_column.html") return self.response.out.write( template.render(tmpl, template_values)) if action == "accounts": template_values = self.accounts() tmpl = os.path.join(os.path.dirname(__file__), "../view/youroom_accounts.html") return self.response.out.write( template.render(tmpl, template_values)) if action == "messages": type = self.request.get("type") if type == "": url = "https://www.youroom.in/?flat=true&format=json" if self.request.get("page"): url += "&page=" + self.request.get("page") template_values = self.get_messages(account, url) self.response.headers["Content-Type"] = "application/json" return self.response.out.write( simplejson.dumps(template_values)) else: url = "https://www.youroom.in/r/" + type + "/?flat=true&format=json" if self.request.get("page"): url += "&page=" + self.request.get("page") template_values = self.get_messages(account, url, type) template_values["room_id"] = type self.response.headers["Content-Type"] = "application/json" return self.response.out.write( simplejson.dumps(template_values)) if action == "thread": room_id = self.request.get("room_id") url = "https://www.youroom.in/r/" + room_id + "/entries/" + self.request.get( "id") + "?format=json" template_values = self.get_entries(account, url, room_id) template_values["room_id"] = room_id self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) if action == "attach": id = self.request.get("id") room_id = self.request.get("room_id") content_type = self.request.get("content-type") name = self.request.get("name") url = 'https://www.youroom.in/r/' + room_id + '/entries/' + id + '/attachment' response, content = oauth.YouRoomHandler.request( user, account, url) if response["status"] != "200": raise Exception(response["status"] + " failed to get attachement. : " + content) content_type = content_type or mimetypes.guess_type( name)[0] or "application/octet-stream" self.response.headers["Content-Type"] = content_type if content_type.startswith("image/"): self.response.headers[ "Content-Disposition"] = 'inline; filename="%s"' % name else: self.response.headers[ "Content-Disposition"] = 'attachment; filename="%s"' % name return self.response.out.write(content) if action == "api": url = self.request.get("url") response, content = oauth.YouRoomHandler.request( user, account, url) self.response.headers["Content-Disposition"] = 'inline;' return self.response.out.write(content) self.error(400)
def get(self, action="", account="", param=""): user = self.session.get_user() if action == "add_column": accounts = self.accounts() template_values = {} if accounts and accounts.get('accounts'): user_accounts = [] for account in accounts['accounts']: if not account.account_name.startswith('page_'): user_accounts.append(account) template_values = {"accounts":user_accounts} tmpl = os.path.join(os.path.dirname(__file__), "../view/facebook_add_column.html") return self.response.out.write(template.render(tmpl, template_values)) if action == "accounts": template_values = self.accounts() tmpl = os.path.join(os.path.dirname(__file__), "../view/facebook_accounts.html") return self.response.out.write(template.render(tmpl, template_values)) if action == "messages": type = self.request.get("type") until = self.request.get("until") query = {} if until : query["until"] = until if type.startswith("page/") or type.startswith("app/") or type.startswith('group/') or type.startswith('list'): types = type.split("/") page = types[1].encode('utf-8') url = "https://graph.facebook.com/"+page+"/feed" elif type == "wall" and account.startswith('page_'): url = "https://graph.facebook.com/"+account.split('_',1)[1]+"/feed" elif type.startswith("search"): url = "https://graph.facebook.com/search" query["q"] = type.split('/',1)[1] else: url = "https://graph.facebook.com/"+type template_values, status = self.get_messages(account, url, query) if status == 400:#TODO 本当はレスポンスボディがOAuthExceptionだったら self.error(401) return elif status < 200 or status >= 300: logging.warn("%s : %s", url, status) raise Exception("failed to get messages from facebook") self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(template_values)) if action == "thread": message_id = self.request.get("id") url = "https://graph.facebook.com/"+message_id response = call(user, account, url) if response.status_code != 200: raise Exception(str(response.status_code) + " failed to get messages.") content = unicode(response.content, 'utf-8') m = simplejson.loads(content) if m.get("comments") and m["comments"].get("data"): for c in m["comments"]["data"]: c = self.convert_message(c) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(simplejson.dumps(m)) if action == "api": api = self.request.get("path") url = "https://graph.facebook.com/" + api response = call(user, account, url) if response.status_code != 200: raise Exception(str(response.status_code) + " failed to execute " + api + " : " + response.content) self.response.headers["Content-Type"] = "application/json" return self.response.out.write(response.content) if action == "fql": query = self.request.get("query") url = "https://api.facebook.com/method/fql.query" params = {"query":query, "format":'JSON'} response = call(user, account, url, params=params) if response.status_code != 200: raise Exception(str(response.status_code) + " failed to get pages.") self.response.headers["Content-Type"] = "application/json" return self.response.out.write(response.content) self.error(400)
def get(self, action=""): user = self.session.get_user() if action == "callback": #key_nameが来たらそれを使う(現在callbackできないYammer用) oauth_key = self.request.cookies.get('oauth_key', None) if oauth_key == "": self.error(400) return account_key = db.Key(oauth_key) account = Account.get(account_key) try: token = oauth.Token(account.request_token, account.secret) oauth_verifier = self.request.get("oauth_verifier") client = self.newOAuthClient(token) resp, content = client.request(self.access_token_url, "POST", body="oauth_verifier=%s" % oauth_verifier) if resp['status'] != '200': raise Exception('Invalid response %s.' % resp['status']) access_token = dict(parse_qsl(content)) account.access_token = access_token['oauth_token'] account.secret = access_token['oauth_token_secret'] account.put() self.account = account account_name, display_name, group_image_url, account_info = self.get_account_info() account.account_name = account_name account.display_name = display_name account.group_image_url = group_image_url account.account_info = account_info if account.account_name == None or account.account_info == None: raise Exception('Cannot get account information.') account.put() #24時間アクセストークンをキャッシュ key = "oauth_token/"+user.user_id+"/"+self.service+"/"+account.account_name memcache.set(key, account, 24*60*60) #既に同じアカウントが登録されていたら削除します saved_accounts = Account.gql( "WHERE service = :1 and user_ref = :2 and account_name = :3", self.service, user.key(), account.account_name) for saved_account in saved_accounts: if saved_account.key() != account.key(): saved_account.delete() except: #どこかでエラーが発生したらゴミが残らないように削除する account.delete() logging.exception(sys.exc_info()) raise sys.exc_info() #ウィンドウを閉じます tmpl = os.path.join(os.path.dirname(__file__), "../view/oauth_callback.html") return self.response.out.write(template.render(tmpl, {'account':account})) if action == "request": client = self.newOAuthClient() account_key = Account( user_ref=user, service=self.service).put() params = { 'oauth_callback': self.request.relative_url('callback') } resp, content = client.request(self.request_token_url, 'POST', body=urllib.urlencode(params, True)) if resp['status'] != '200': raise Exception('Invalid response %s. : %s' % (resp['status'], content)) request_token = dict(parse_qsl(content)) account = Account.get(account_key) account.request_token = request_token['oauth_token'] account.secret = request_token['oauth_token_secret'] account.put() cookie_val = str('oauth_key=%s;' % str(account_key)) self.response.headers.add_header('Set-Cookie', cookie_val) self.redirect(self.authorize_url + "?oauth_token=" + request_token['oauth_token']) return self.error(400)