如何在群组中使用facebook api

时间:2012-10-09 14:35:49

标签: facebook api facebook-graph-api tornado

我创建了一个使用Python测试facebook api的应用程序,然后,在应用程序中,我创建了 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")
抱歉,因为我不熟悉用户令牌和群组令牌背后的逻辑?在这里我有一个用户令牌?因为我是管理员,我不能发帖!

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

picture 1 picture 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)

1 个答案:

答案 0 :(得分:2)

一些澄清:

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

所以我认为基于Facebook的ID,你要么做两件事

  • 发布到应用程序的时间表
  • 通过申请发布到论坛

发布到应用程序的时间表

这需要使用/me/accountsmanage_pages权限从publish_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(不处理重复发布)

可以看到完整的示例