使用新浪微博开放平台api同步微博内容至自己网站(新浪微博会创建站内应用/irunning的常量定义)
优采云 发布时间: 2021-11-27 18:22使用新浪微博开放平台api同步微博内容至自己网站(新浪微博会创建站内应用/irunning的常量定义)
现场应用是直接嵌入新浪微博的应用。在使用现场应用时,用户仍然访问新浪微博的网站,而具体的现场应用作为iframe嵌入页面。由于本应用不同于第三方网站,无法通过新浪微博授权页面进行授权,因此获取用户授权略有不同。
创建现场申请时,首先需要申请现场申请。除了App ID和App Secret之外,还有新浪微博分配的现场应用地址和应用的实际地址,即iframe加载的网站地址。以下代码为站点中应用/运行的常量定义。代码显示如下:
_APP_ID = '12345'
_APP_SECRET = 'abc123xyz'
_APP_URL = 'http://apps.weibo.com/irunning'
_SERVER_URL = 'http://weiborun.sinaapp.com/'
当用户访问新浪微博网站时,新浪微博会向内嵌的iframe发送POST请求。因此,我们的后台服务将接收 POST 请求并获取 signed_request 参数。我们需要从signed_request 中获取signed_request 参数。获取加密参数。代码如下:
@post('/')
def index():
data = _parse_signed_request(ctx.request['signed_request']))
if data is None:
# 用户未授权,返回授权页:
raise seeother('/auth.html')
# 用户已授权,获取OAuth token:
access_token = data['oauth_token']
expires = data['expires']
client = _create_client()
client.set_access_token(access_token, expires)
def _parse_signed_request(sr):
def _b64_normalize(s):
' 还原Base64编码字符串 '
appendix = '=' * (4 - len(s) % 4)
return s.replace('-', '+').replace('_', '/') + appendix
sr = str(signed_request)
logging.info('parse signed request: %s' % sr)
enc_sig, enc_payload = sr.split('.', 1)
# 获得Digest:
sig = base64.b64decode(_b64_normalize(enc_sig))
# 获得JSON数据:
data = _parse_json(base64.b64decode(_b64_normalize(enc_payload)))
if data['algorithm'] != u'HMAC-SHA256':
return None
# 计算Digest:
expected_sig = hmac.new(self.client_secret, enc_payload, hashlib.sha256).digest();
# 与新浪微博发送的Digest对比是否一致:
if expected_sig==sig:
if data.get('oauth_token', None) is None:
return None
return data
return None
对新浪微博传递的signed_request字符串参数进行解码,得到HMAC-SHA256签名和原创JSON数据。这时候我们需要根据App Secret计算出签名,并与新浪微博传递过来的签名进行比较。如果一致,则表示JSON数据有效,否则表示数据是第三方伪造的。由于 App Secret 仅由我们的现场应用和新浪微博持有,第三方无法伪造签名。
签名验证后,可以从JSON数据中获取oauth_token参数。如果oauth_token参数为空,则表示用户没有被授权,我们会向用户展示授权页面auth.html。授权页面的源码如下,通过JavaScript调用向用户弹出授权框。
未授权时的页面
function authLoad() {
App.AuthDialog.show({
client_id: '12345',
redirect_uri: 'http://apps.weibo.com/irunning',
height: 40
});
}
弹窗的JavaScript代码由新浪微博提供,效果如下:
用户可以在弹出的授权框中进行授权,然后新浪微博会再次向站点申请中的网站发送POST请求。这时候可以从signed_request参数中获取oauth_token。通过oauth_token,我们可以使用SDK调用任意API,包括获取当前授权用户的用户信息,判断用户是否是第一次访问。后续的API调用与普通Web网站相同,这里不再赘述。
本文申请地址:
本文源代码可从GitHub下载: