使用新浪微博开放平台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下载:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线