05月20, 2020

app.powerbi.cn 报告嵌入

github有比较多的资料介绍怎样将PowerBI嵌入在网页中,但是对于中国区powerbi的介绍较少。与Global PowerBI(powerbi.com),中国区powerbi(app.power.cn)由于服务器在国内,网页加载速度要快很多,并且对于敏感数据也符合国内的数据安全规范。

本文介绍具体的操作步骤:

注册和购买powerbi国内版(世纪互联)

世纪互联注册入口:https://www.21vbluecloud.com/powerbi/pricing/

如何注册和购买 Power BI Pro 国内版(世纪互联)、国际版

在azure.cn中注册app, 并完成权限设置

powerbi注册完成后,也会拥有访问azure.cn的权限

  1. 登陆https://portal.azure.cn/
  2. 点击Manage Azure Active Directory
  3. 点击App registrations, New registration
  4. 在API permissions中授予访问app访问powerbi的权限,并点击Grant admin consent 2020-05-20 10-04-13屏幕截图.png
  5. 记下Applicatin(client) ID

编写Powerbi嵌入程序

现在可以使用python调用azure API生成访问powerbi Embed Token了。

注意在代码中azure和powerbi API的访问地址已经替换成中国区,API的地址可以在azure.cn的API permissions上找到

import requests

clientId="you clientId"
username="Your powerBI username"
password="your password"
reportId="your reportId"
groupId="your groupId"

def getAccessToken(username=username, password=password, clientId=clientId):
    """
    获取Access Token,这是下一步获取EmbedTokken的前提条件
    :username Power BI Pro账户名称
    :password Power BI Pro账户密码
    :clientId 是在Azure中注册应用得到的"应用程序ID"
    :return 字符串格式的AccessToken
    """
    url = "https://login.partner.microsoftonline.cn/common/oauth2/token"
    headers = {"Content-Type": "application/x-www-form-urlencoded"}
    body = {
        "grant_type": "password",
        "client_id": clientId,
        "resource": "https://analysis.chinacloudapi.cn/powerbi/api",
        "scope": 'openid',
        "username": username,
        "password": password,
    }
    response = requests.post(url=url, headers=headers, data=body)
    print(response.json())
    return response.json()["access_token"]


def getEmbedToken(accessToken, groupId, reportId):
    """
    结合AccessToken,报表组ID,报表ID信息,获取EmbedToken
    :accessToken 上一步得到的访问令牌
    :groupId 报表组ID
    :reportId 报表ID
    :return 字符串格式的嵌入令牌
    """
    url = "https://api.powerbi.cn/v1.0/myorg/groups/{0}/reports/{1}/GenerateToken".format(groupId, reportId)
    headers = {
    'Content-Type' : 'application/x-www-form-urlencoded',
    'authorization' : "Bearer {0}".format(accessToken)
    }
    body = {'accessLevel':'View'}
    response = requests.post(url=url, headers=headers, data=body)
    return response.json()['token']

def getAllReports(accessToken, groupId):
    url = "https://api.powerbi.cn/v1.0/myorg/groups/{0}/reports".format(groupId, reportId)
    headers = {
    'Content-Type' : 'application/x-www-form-urlencoded',
    'authorization' : "Bearer {0}".format(accessToken)
    }
    response = requests.get(url=url, headers=headers)
    return response.json()['value']

def getPowerBIEmbedParam(username, password, clientId, groupId, reportId):
    accessToken = getAccessToken(username, password, clientId)
    embedToken = getEmbedToken(accessToken, groupId, reportId)
    embedURL = "https://app.powerbi.cn/reportEmbed?reportId={0}&groupId={1}".format(reportId, groupId)
    return accessToken,embedToken,embedURL

if __name__ == "__main__":
    # getPowerBIEmbedParam(username, password, clientId,groupId, reportId)
    accessToken = getAccessToken(username, password, clientId)
    ret=getAllReports(accessToken,groupId)
    print(ret)

本文链接:http://57km.cc/post/powerbireport embedding for china local azure.html

-- EOF --

Comments