0

我创建了一个应用程序来使用 Python 测试 facebook api,然后,在应用程序中,我创建了它的Group,但是,这个 Group 不知道我是谁的问题;它显示我是管理员,但是当我尝试使用 Tornado 发布某些内容时,我得到了错误

GraphAPIError: (#210) User not visible

这是因为它似乎删除了 cookie,因为当我使用该组的个人资料时,我看不到 GraphAPI,因为它不知道谁是经过身份验证的!

这是代码:

class MainHandler(BaseHandler, tornado.auth.FacebookGraphMixin):
    @tornado.web.authenticated
    @tornado.web.asynchronous
    def get(self):
        self.facebook_request("/me/home", self.print_callback,access_token=self.current_user["access_token"])
        a = self.current_user["access_token"]
        self.graph = GraphAPI(a)
    def print_callback(self, data):
        self.graph.post_wall(self, "heloooooooo")

抱歉,因为我不太了解用户令牌和组令牌背后的逻辑?在这里我有一个用户令牌?因为我是管理员,所以我不能发帖!

编辑:这是我从应用程序中拍摄的一些快照:

图 1 图 2

更新:我试过这个:

def print_callback(self, me):
    self.graph.post_wall(self, "helooooo", profile_id="267914489995838")

并得到错误:

self.graph.post_wall(self, "helooooo", profile_id="267914489995838")
TypeError: post_wall() got multiple values for keyword argument 'profile_id'

我使用了Tornado-Facebook-API中的内容

def post_wall(self, message, profile_id='me', body=None, **kwargs):
    #XXX move to separate User class?
    body = body or {}
    body['message'] = message
    self._make_request("{0}/feed".format(profile_id), method='POST',
            body=body, **kwargs)

update2:这是完整的代码

class BaseHandler(tornado.web.RequestHandler):
def get_current_user(self):
    user_json = self.get_secure_cookie("user")
    if not user_json: return None
    return tornado.escape.json_decode(user_json)

class MainHandler(BaseHandler, tornado.auth.FacebookGraphMixin):
@tornado.web.authenticated
@tornado.web.asynchronous
def get(self):
    self.facebook_request("/me/accounts", self._on_accounts, 
     access_token=self.current_user["access_token"])
    self.a = self.current_user["access_token"]
    self.graph = GraphAPI(self.a)

def _on_accounts(self, account):
    if account is None:
        # Session may have expired
        print "on accounts failed"
        return

    for acc in account["data"]:
        if acc["id"] == "267914489995838":
            print acc["access_token"]
            self.facebook_request("/PAGE_ID/feed", 
               post_args={"message": "Test"}, 
               access_token=acc["access_token"],     
               callback=self.async_callback(self._on_page_post))

def _on_page_post(self, post):
    if not post:
        # Post failed
        return



class AuthLoginHandler(BaseHandler, tornado.auth.FacebookGraphMixin):
@tornado.web.asynchronous
def get(self):
    my_url = (self.request.protocol + "://" + self.request.host +
              "/auth/login?next=" +
              tornado.escape.url_escape(self.get_argument("next", "/")))
    if self.get_argument("code", False):
        self.get_authenticated_user(
            redirect_uri=my_url,
            client_id=self.settings["facebook_api_key"],
            client_secret=self.settings["facebook_secret"],
            code=self.get_argument("code"),
            callback=self._on_auth)
        return
    self.authorize_redirect(redirect_uri=my_url,
                            client_id=self.settings["facebook_api_key"],
                            extra_params={"scope": "read_stream, publish_stream"})

def _on_auth(self, user):
    if not user:
        raise tornado.web.HTTPError(500, "Facebook auth failed")
    self.set_secure_cookie("user", tornado.escape.json_encode(user))
    self.redirect(self.get_argument("next", "/"))


class AuthLogoutHandler(BaseHandler, tornado.auth.FacebookGraphMixin):
def get(self):
    self.clear_cookie("user")
    self.redirect(self.get_argument("next", "/"))


class PostModule(tornado.web.UIModule):
def render(self, post):
    return self.render_string("modules/post.html", post=post)
4

1 回答 1

2

一些澄清:

  • #200 错误是权限错误。在这种情况下,您无权在某处发帖。
  • 令牌有两种主要类型:用户令牌和页面令牌
  • 您可以将组添加到应用程序的角色http://developers.facebook.com/blog/post/531/
  • 据我所知,没有办法应用程序添加到组中

所以我认为根据你想要做两件事的 Facebook id

  • 发布到应用程序的时间线
  • 通过应用程序发布到群组

发布到应用程序的时间线

这需要应用程序页面访问令牌,您可以/me/accounts使用 manage_pagespublish_stream权限获得该令牌

self.facebook_request("/me/accounts", self._on_accounts, 
         access_token=self.current_user["access_token"])

def _on_accounts(self, account):
        if account is None:
            # Session may have expired
            print "on accounts failed"
            return

        for acc in account["data"]:
            if acc["id"] == "PAGE_ID":
                print acc["access_token"]
                self.facebook_request("/PAGE_ID/feed", 
                   post_args={"message": "Test"}, 
                   access_token=acc["access_token"],     
                   callback=self.async_callback(self._on_page_post))

def _on_page_post(self, post):
        if not post:
            # Post failed
            return

有关更多信息,请参阅http://developers.facebook.com/docs/reference/api/application/

一个完整的例子可以在https://gist.github.com/3867203看到(它不处理重复发布)

于 2012-10-10T15:14:53.427 回答