0

Python を使用して facebook api をテストするアプリケーションを作成し、アプリケーションでそのGroupを作成しましたが、この Group が自分が誰であるかがわからないという問題。それが管理者であることを示していますが、Tornado を使用して何かを公開しようとすると、エラーが発生します

GraphAPIError: (#210) User not visible

これは、グループのプロファイルを使用しているときに、誰が認証されているかわからないため、GraphAPI が表示されないため、Cookie が削除されているように見えるためです。

コードは次のとおりです。

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 エラーは権限エラーです。この場合、どこかに投稿する権限がありません。
  • トークンには主に、ユーザー トークンとページ トークンの 2 種類があります。
  • アプリケーションのロールにグループを追加できますhttp://developers.facebook.com/blog/post/531/
  • 私の知る限り、アプリケーションをグループに追加する方法はありません

だから私はあなたが与えられたFacebook IDに基づいて2つのことをしたいと思います

  • アプリケーションのタイムラインに投稿する
  • アプリケーション経由でグループに投稿する

アプリケーションのタイムラインへの投稿

これには、およびパーミッション/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 に答える