一、开发者后台账号设置
web site
sit url: http://apps.facebook.com/app_name/
facebook Integration
canvas url: http://your_real_domain/
iframe size: auto_resize
bookmark url: you_app_url
tab name: you_app_name
tab url: your_real_domain
advanced
sandbox mode: enable disable时,只有测试号可以登录app
Remove Deprecated Auth Methods:disabled
Stream post URL security: enabled
OAuth 2.0 for Canvas: enabled
Timezone-less events: enabled
Upgrade to Requests 2.0: disabled
Develop Using Deprecated FBML Canvas: disabled
二、验证和授权代码
def parse_signed_request(signed_request):
signed_request = str(signed_request)
encoded_sig, payload = signed_request.split(".", 2)
encoded_sig2 = str(encoded_sig) + "=="
payload2 = str(payload) + "=="
sig = base64.b64decode(encoded_sig2, "-_")
data = simplejson.loads(base64.b64decode(payload2, "-_"))
expected_sig = hmac.new(settings.SNS_SECRET_KEY, payload, hashlib.sha256).digest()
sig_ok = expected_sig == sig
return data, sig_ok
if request.POST.has_key('signed_request'):
signed_request = request.POST.get("signed_request", '')
data, sig_ok = parse_signed_request(signed_request)
if not sig_ok:
return HttpResponse("SIG_ERROR")
if not data.has_key('user_id') or not data.has_key('oauth_token'):
app_id = settings.SNS_APP_ID
sns_url = settings.SNS_URL
redirect_uri = urllib.quote_plus(sns_url)
redirect_url = "https://www.facebook.com/dialog/oauth?client_id=%s&redirect_uri=%s&scope=email,read_stream" %(app_id, redirect_uri)
return render_to_response('%s/freegift/redirect.html' % (settings.SNS), {'redirect_url': redirect_url})
access_token = data['oauth_token']
to_sns_id = data['user_id']
else:
return HttpResponse("")
三、REST API
def get_request_info(access_token, request_id):
try:
graph_url = "https://graph.facebook.com/%s?access_token=%s" % (request_id, access_token)
data = simplejson.loads( urllib2.urlopen(graph_url).read() )
return data['from']['id'], data['to']['id']
except:
return '', ''
def check_is_fan(access_token, sns_id):
try:
q = 'SELECT uid FROM page_fan WHERE page_id="%s" and uid=%s' % (settings.SNS_APP_ID , sns_id)
q = urllib2.quote(q)
graph_url = "https://api.facebook.com/method/fql.query?access_token=%s&query=%s&format=json" % (access_token, q)
fan = simplejson.loads( urllib2.urlopen(graph_url).read())
if len(fan)>0:
return True
return False
except:
return False
def convert_session_to_access_token(skey):
try:
service_url = 'https://graph.facebook.com/oauth/exchange_sessions'
params = {}
params['type'] = 'client_cred'
params['client_id'] = settings.SNS_APP_ID
params['client_secret'] = settings.SNS_SECRET_KEY
params['sessions'] = skey
data = urllib.urlencode(params)
req = urllib2.Request(service_url)
result = simplejson.loads( urllib2.urlopen(req, data).read() )
return result[0]['access_token']
except:
return 'CONVERT_FAILED'
def get_sns_id(access_token):
try:
graph_url = "https://graph.facebook.com/me?access_token=%s&fields=id" % access_token
profile = simplejson.loads( urllib2.urlopen(graph_url).read() )
return profile['id']
except:
return 'SNS_API_ERROR'
def get_sns_user(access_token, sns_id, fields='name,picture'):
try:
graph_url = "https://graph.facebook.com/me?access_token=%s&fields=id,name,picture" % access_token
user = simplejson.loads( urllib2.urlopen(graph_url).read() )
return user['name'],user['picture']
except:
return 'SNS_API_ERROR'
def get_third_party_id(access_token, sns_id):
try:
graph_url = "https://graph.facebook.com/me?access_token=%s&fields=third_party_id" % access_token
user = simplejson.loads( urllib2.urlopen(graph_url).read() )
return user['third_party_id']
except:
return 'SNS_API_ERROR'
def get_app_friends(access_token):
try:
graph_url = "https://api.facebook.com/method/friends.getAppUsers?access_token=%s&format=json" % access_token
friend_ids = simplejson.loads( urllib2.urlopen(graph_url).read() )
if type(friend_ids) == types.ListType:
return friend_ids
else:
return []
except:
return 'SNS_API_ERROR'
def get_all_friends(access_token):
try:
graph_url = "https://api.facebook.com/method/friends.get?access_token=%s&format=json" % access_token
friend_ids = simplejson.loads( urllib2.urlopen(graph_url).read() )
if type(friend_ids) == types.ListType:
return friend_ids
else:
return []
except:
return 'SNS_API_ERROR'
def get_are_friends(access_token, uids1, uids2):
try:
graph_url = "https://api.facebook.com/method/friends.areFriends?uids1=%s&uids2=%s&access_token=%s&format=json" % (uids1, uids2, access_token)
are_friends = simplejson.loads( urllib2.urlopen(graph_url).read() )
return are_friends[0]["are_friends"]
except:
return 'SNS_API_ERROR'
def get_fan_status(access_token, sns_id):
try:
q = 'SELECT uid FROM page_fan WHERE page_id="%s" and uid=%s' % (settings.SNS_APP_ID , sns_id)
q = urllib2.quote(q)
graph_url = "https://api.facebook.com/method/fql.query?access_token=%s&query=%s&format=json" % (access_token, q)
fan = simplejson.loads( urllib2.urlopen(graph_url).read())
if len(fan)>0:
return 1
return 0
except:
return 'SNS_API_ERROR'
def get_progressbar_status(access_token, sns_id):
try:
q = "SELECT bookmarked,email,publish_stream FROM permissions WHERE uid=%s" % sns_id
q = urllib2.quote(q)
graph_url = "https://api.facebook.com/method/fql.query?access_token=%s&query=%s&format=json" % (access_token, q)
bookmarked = simplejson.loads( urllib2.urlopen(graph_url).read())
return bookmarked[0]
except:
return 'SNS_API_ERROR'
浙公网安备 33010602011771号