调用API实现比官方更自由的动态邮件订阅
在24年1月份的时候微软就推出了Power BI的动态邮件订阅,这个功能最大的好处就是没有报表权限的人可以收到订阅邮件,这对于那些并非所有人都有Pro账号的企业来说是个消息。
这里有一点需要注意的是用来动态订阅的筛选表必须存在单独的语义模型中,在一开始测试时,没注意这点,写在了要动态订阅的模型中。。。
除此之外,动态订阅还有很多限制,
- 最大只支持50个邮箱来订阅,这是不打算让大企业用吗。。。未来可能随时变更。
- 世纪互联来不支持
具体的限制可以查看官方文档,创建 Power BI 报表的动态订阅(预览版) – Power BI | Microsoft Learn
创建服务主体
既然微软原生不给支持,那就自己动手来实现,微软最大的好处就是提供了丰富的API来调用,为了调用Power BI REST API,需要先建立一个服务主体,原先的Azure Active Directory已经改名为Entra,但是创建服务主体的过程是一样,不熟悉的可参考微软文档
Azure Active Directory 的新名稱 – Microsoft Entra | Microsoft Learn
在 Azure 中创建服务主体。 | Microsoft Learn
创建服务主体后记得授予相应的权限,因为这是测试账号,所以我授予的权限有些多,生产环境请以最小化为准。
登录门户,管理门户给予服务主体访问API的权限
并启用将报表导出为图像
最后,工作区管理权限中添加服务主体
[!tip]- 注意
服务主体并不是必须的,使用账号密码也行,只是相应对账号密码,服务主体相对更安全些
获取页面信息
因为我想邮件供用户订阅的是具体的某一页报表,而不是整个报表,所以需要先获取报表的页面ID,在门户中访问报表时,也可以在网址栏查看页面的ID,ID是以ReportSection开头的字符串
这里我们可以直接请求API, Reports – Get Pages In Group – REST API (Power BI Power BI REST APIs) | Microsoft Learn
在请求之前我们需要先获取token,在获取token时需要注意,国际版和国内版请求的终结点是有差异的,具体的可参见中国区 Azure 开发人员指南 | Microsoft Learn
本次用到如下
uris = {
"global": {
"login_uri": "https://login.windows.net",
"resource_uri": "https://analysis.windows.net/powerbi/api",
"api_uri": "https://api.powerbi.com"
},
"china": {
"login_uri": "https://login.chinacloudapi.cn",
"resource_uri": "https://analysis.chinacloudapi.cn/powerbi/api",
"api_uri": "https://api.powerbi.cn"
}
}
request请求获取token即可,这里要用到上面创建的服务主体的信息
有了token,就可以请求API来获取页面信息,返回结果如下所示
导出到文件
这一步是我踩坑最多的一步,一开始以为只要请求一个API,即可,后面发现需要请求3个。。。这里直接引用Power BI Devcamp PPT中的流程
所以这里我们要先请求Reports – Export To File In Group – REST API (Power BI Power BI REST APIs) | Microsoft Learn
因为报表中设置了RLS,所以body中必须传递角色信息,另外因为我只想导出某一页,pages属性也必填,如果要导出整个报表,可以不设置该属性
拿到这个id再去请求第二个来获取导出文件的状态,这里要注意,一定要等到请求状态为成功为止,Reports – Get Export To File Status In Group – REST API (Power BI Power BI REST APIs) | Microsoft Learn
最后,终于可以来获取文件的信息了,Reports – Get File Of Export To File In Group – REST API (Power BI Power BI REST APIs) | Microsoft Learn
可以看下效果,确实是我们报表页面
发送邮件
和官方的动态邮件订阅一样,我们需要有一张表来维护用户的权限,但这张表可以更自由,没有50行的限制,可以是包含具体的数据权限,或者直接包含报表角色,报表页面等。