Esempio n. 1
0
 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)
Esempio n. 2
0
 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)
Esempio n. 3
0
    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)
Esempio n. 4
0
 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, {}))
Esempio n. 5
0
 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, {}))
Esempio n. 6
0
 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)
Esempio n. 7
0
    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)
Esempio n. 8
0
 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)
Esempio n. 9
0
 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)
Esempio n. 10
0
    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
Esempio n. 11
0
    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)
Esempio n. 12
0
    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)
Esempio n. 13
0
    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)
Esempio n. 14
0
 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
Esempio n. 15
0
 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)
Esempio n. 16
0
    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)
Esempio n. 17
0
    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)
Esempio n. 18
0
 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)
Esempio n. 19
0
 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)
Esempio n. 20
0
 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)