这是我的第一次网络编程经验,所以我希望我的问题听起来不是很愚蠢。我已经被困在这里很多天了。
我想了解示例代码: https://github.com/facebook/runwithfriends
但是我不太了解信息流如何工作以及如何修改该样本(即代码如何工作)。
例如,在代码的以下部分中:
class RecentRunsHandler(BaseHandler):
"""Show recent runs for the user and friends"""
def get(self):
if self.user:
friends = {}
for friend in select_random(
User.get_by_key_name(self.user.friends), 30):
friends[friend.user_id] = friend
self.render(u'runs',
friends=friends,
user_recent_runs=Run.find_by_user_ids(
[self.user.user_id], limit=5),
friends_runs=Run.find_by_user_ids(friends.keys()),
)
else:
self.render(u'welcome')
据我所知(以及HTML)对于展示使用相同应用的朋友很有用,如果我理解正确,这是必不可少的部分:
*的 friends_runs = Run.find_by_user_ids(friends.keys())*
但是如果我想展示任何给定的朋友呢?我该怎么办?
总结一下,我想知道:
1-代码流程如何工作? (我不完全理解解释here)
2-如何操作代码以便显示用户的朋友列表(不必使用相同的应用程序)? 此外,我可以展示按某些特征(例如性别)过滤的朋友吗?
非常感谢!
答案 0 :(得分:1)
我使用的python“SDK”我从https://gist.github.com/1190267获取 并将其与示例应用程序中的代码相结合,以实现我想要的画布应用程序和网站使用的功能。
这取决于您是否将facebook与网站或画布应用程序一起使用。对于一个画布应用程序,你可能可以很好地使用javascript SDK但是对于“使用facebook登录”我需要服务器端逻辑,这应该与javascript关闭,所以我已经完成了解决方案,你可能有帮助知道的细节。您可以尝试对特定应用“runwithfriends”进行小的更改,以了解哪些代码可以执行哪些操作。您正在查看的项目包含一些过时的做法:
获取和设置cookie可能更适合现在使用webapp2的内置函数而不是FB示例应用程序附带的代码
登录和退出现在使用OAuth 2.0完成,因此您正在查看的登录系统可能已过时,您需要使用描述为here的OAuth 2.0。我更喜欢登录/注销服务器端,所以我按照FB教程中提到的身份验证步骤,进行了登录/注销的OAuth 2.0纯python解决方案。我必须清除cookie以记录未记录的用户。
要升级到python 2.7,我还必须修改,以便HTTP标头不会转换为unicode。我不知道为什么,但否则它抱怨标题是“不是字符串”
更详细地回答您的具体问题:
1)您发布的requesthandler类是BaseHandler的子类,因此要完全理解它的作用,您可以查看BaseHandler类,因为您发布的是BAseHandler。 BaseHandler使用django模板进行渲染,如果你想将模板引擎切换到jinja2,这是推荐的。此外,代码访问从BaseHandler继承的用户对象,并对其执行一些操作并将其呈现为模板。您可以尝试创建自己的子类BaseHandler的requesthandler并执行您想要的操作。
2)我可以操纵代码,我不是专家,所以你也应该能够做到。我想要一个简单的FB应用程序来显示随机图像,我可以操纵它来通过blob选择随机图像并渲染到模板,同时保持facebook基本功能。用于使用Graph API获取用户的函数我这样做:
def parse_signed_request(signed_request, secret):
"""
Parse signed_request given by Facebook (usually via POST),
decrypt with app secret.
Arguments:
signed_request -- Facebook's signed request given through POST
secret -- Application's app_secret required to decrpyt signed_request
"""
if '.' in signed_request:
(esig, payload) = signed_request.split('.')
else:
return {}
sig = urlsafe_b64decode(str(esig))
data = _parse_json(urlsafe_b64decode(str(payload)))
if not isinstance(data, dict):
raise SignedRequestError('Pyload is not a json string!')
return {}
if data['algorithm'].upper() == 'HMAC-SHA256':
if hmac.new(secret, payload, hashlib.sha256).digest() == sig:
return data
else:
raise SignedRequestError('Not HMAC-SHA256 encrypted!')
return {}
def get_user_from_cookie(cookies, app_id, app_secret):
"""Parses the cookie set by the official Facebook JavaScript SDK.
cookies should be a dictionary-like object mapping cookie names to
cookie values.
If the user is logged in via Facebook, we return a dictionary with the
keys "uid" and "access_token". The former is the user's Facebook ID,
and the latter can be used to make authenticated requests to the Graph API.
If the user is not logged in, we return None.
Download the official Facebook JavaScript SDK at
http://github.com/facebook/connect-js/. Read more about Facebook
authentication at http://developers.facebook.com/docs/authentication/.
"""
cookie = cookies.get('fbsr_' + app_id, '')
if not cookie:
return None
response = parse_signed_request(cookie, app_secret)
if not response:
return None
args = dict(code=response['code'], client_id=app_id,
client_secret=app_secret, redirect_uri='')
file = \
urllib.urlopen('https://graph.facebook.com/oauth/access_token?'
+ urllib.urlencode(args))
try:
token_response = file.read()
finally:
file.close()
access_token = cgi.parse_qs(token_response)['access_token'][-1]
logging.debug('returning cookie')
return dict(uid=response['user_id'], access_token=access_token)
有关API的完整文档,请参阅http://developers.facebook.com/docs/api。您可以在http://github.com/facebook/connect-js/
获取官方Facebook JavaScript SDK我现在正在编写代码来与facebook同步webapp2_extras.auth帐户,以便自定义帐户和Facebook帐户可以共存,我们正在webapp2 groups和类别中讨论此问题的解决方案。我目前的做法是将推荐的current_user
添加到basehandler并将其用作FB身份,同时处理“合并”我的类FBUser,这是为用户验证我的网站和/或画布的自定义类应用程序与webapp2_extras.auth.models.User同步,这是一个expando模型,所以它只能添加它没有的属性,如facebookid,firstname,lastname等。
@property
def current_user(self):
if not hasattr(self, '_current_user'):
self._current_user = None
cookie = get_user_from_cookie(self.request.cookies,
facebookconf.FACEBOOK_APP_ID,
facebookconf.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 = FBUser.get_by_key_name(cookie['uid'])
if not user:
graph = GraphAPI(cookie['access_token'])
profile = graph.get_object('me')
user = FBUser(key_name=str(profile['id']),
id=str(profile['id']),
name=profile['name'],
profile_url=profile['link'],
access_token=cookie['access_token'])
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
您还可以使用会话对象解决身份验证,并围绕该身份构建身份验证系统。这就是我在使用自定义帐户和Facebook帐户时所做的事情,欢迎您在my repository获取更多代码示例,以便如何使用python 2.7将google app引入facebook。