Как мне проанализировать массив JSON при попытке загрузить друзей из Facebook в пример Google App Engine facebook? - PullRequest
1 голос
/ 04 декабря 2010

Я только начинаю задумываться о приложении Google App Engine, которое взаимодействует с Facebook.Весь мой опыт написания кода - это обработка чисел в Matlab, который является настолько высоким уровнем, что многие настоящие кодеры даже не слышали об этом.Я пытаюсь расширить пример, предоставленный Facebook здесь .Пока что я пытался добавить только чтение списка друзей пользователя.Я поместил комментарии перед строками, которые я добавил в мою версию кода ниже.Код успешно загружается в пользователя из Facebook.Я могу получить доступ к различным пользовательским свойствам и отобразить их.Однако свойство друзей, которое я пытался добавить, - это всегда пустой список.Я думаю, что разница в том, что такие вещи, как name и id, являются строками JSON, которые могут обрабатываться как строки Python, но graph.get_connections возвращает массив объектов JSON в виде списка друзей.Я думаю, что я должен превратить этот массив JSON в словарь Python, но я не знаю, как.Конечно, я могу быть совершенно неправ в этом.

Я был бы очень признателен за подсказку о том, как я могу внести список друзей пользователя в какой-то список python, которым я могу манипулировать.

Спасибо,

Десси

#!/usr/bin/env python
#
# Copyright 2010 Facebook
#

"""A barebones AppEngine application that uses Facebook for login."""

FACEBOOK_APP_ID = "my_facebook_app_id"
FACEBOOK_APP_SECRET = "my_facebook_app_secret"

import facebook
import os.path
import wsgiref.handlers 
import logging
import platform

from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp import template


class User(db.Model):
    id = db.StringProperty(required=True)
    created = db.DateTimeProperty(auto_now_add=True)
    updated = db.DateTimeProperty(auto_now=True)
    name = db.StringProperty(required=True)
    profile_url = db.StringProperty(required=True)
    access_token = db.StringProperty(required=True)
    #Following line added by me 
    friends = db.StringListProperty()

class BaseHandler(webapp.RequestHandler):
    """Provides access to the active Facebook user in self.current_user

    The property is lazy-loaded on first access, using the cookie saved
    by the Facebook JavaScript SDK to determine the user ID of the active
    user. See http://developers.facebook.com/docs/authentication/ for
    more information.
    """

    @property
    def current_user(self):
        if not hasattr(self, "_current_user"):
            self._current_user = None
            cookie = facebook.get_user_from_cookie(
                self.request.cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET)
            if cookie:
                # Store a local instance of the user data so we don't need
                # a round-trip to Facebook on every request
                user = User.get_by_key_name(cookie["uid"])
                if not user:
                    graph = facebook.GraphAPI(cookie["access_token"])
                    profile = graph.get_object("me")
            id=str(profile["id"]
            #Following 2 lines added by me  
            fs=graph.get_connections("me","friends")
            logging.info(fs)    
                    user = User(key_name=str(profile["id"]),
                                id=str(profile["id"]),
                                name=profile["name"],
                                profile_url=profile["link"],
                                access_token=cookie["access_token"],
                #Following line added by me 
                friends=fs)
                    user.put()
                elif user.access_token != cookie["access_token"]:
                    user.access_token = cookie["access_token"]
                    user.put()
                self._current_user = user

        return self._current_user


class HomeHandler(BaseHandler):
    def get(self):
    #Following line added by me 
    logging.info(self.current_user.friends)
        path = os.path.join(os.path.dirname(__file__), "example.html")
        args = dict(current_user=self.current_user,
                    facebook_app_id=FACEBOOK_APP_ID)
        self.response.out.write(template.render(path, args))

def main():
    util.run_wsgi_app(webapp.WSGIApplication([(r"/", HomeHandler)]))


if __name__ == "__main__":
    main()

Ответы [ 3 ]

4 голосов
/ 04 декабря 2010

Я думаю, мне следует превратить этот массив JSON в словарь Python, но я не знаю как.

simplejson входит в состав app-engine, в пакет утилит django.

from django.utils import simplejson as json

def your_method(ars):
   # do what ever you are doing...
   dict_of_friends = json.loads(json_string)
0 голосов
/ 24 октября 2011

Вам не нужно явно конвертировать из json в библиотеке питона facebook.

просто начните с fs ["data"], например, если вы хотите посчитать количество друзей.

fs=graph.get_connections("me","friends")
friends_count = len(fs["data"])
0 голосов
/ 06 декабря 2010

Возникли проблемы с комментирующим инструментом, ограничение по времени выбивает меня из колеи.Ответ Роберта кажется правильным, но он не сработал в моем сценарии.Я наконец заставил его работать с другим подходом

import re
import urllib2

#after I created the user
url = "https://graph.facebook.com/" + user.id + "/friends?access_token=" + user.access_token
response = urllib2.urlopen(url)
fb_response = response.read()
x = re.findall(r'"\d+"',fb_response)
friend_list = [a.strip('"') for a in x]
user.friends = friend_list
user.put()  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...