Forum Discussion
Zawadowski
2 years agoNew Member
Get PowerBi Audience users via REST API?
Hi, I've got a report showing all applications and users having access to these applications. Some of the applications have multiple audiences with different users assigned. When querying PBI...
anwarbham
1 year agoFrequent Visitor
Well i managed to extract the audiance data via the API you have to set a timer after each rest call for 2.5 seconds to avoid the "Too Many requests error"
Code Below if anyone finds it usefull.
def GET_GROUPS(WorkspaceId):
Token = 'Bearer TOKEN HERE'
url = 'https://wabi-north-europe-l-primary-redirect.analysis.windows.net/metadata/appmodel/apps/'+WorkspaceId+'?requestDataType=7&access-control-allow-credentials=true';
headers = {"Accept":"application/json","Authorization":Token}
response = requests.get(url, headers = headers)
if response.status_code == 200:
return response.json()
else:
print("Error: ", response.status_code)
return response.json()then you have to ge the Audience data.
def Clean_Result(df,Group):
#Create empty dataframe
df_empty = pd.DataFrame(columns=['Group','providerId','AppId','AppDisplayName','AudienceName','reportId','Users','AdName'],dtype='string')
#fill the empty dataframe with the values from the json file
try:
for i in range(len(df['appViewDetails'][0])):
for j in range(len(df['appViewDetails'][0][i]['reportIds'])):
for k in range(len(df['appViewDetails'][0][i]['contentProviderPermissions']['adUserMetadataList'])):
new_row = pd.DataFrame({"Group": [Group],
"providerId": [df['providerId'][0]]
,"AppId": [df['providerKey'][0]]
,"AppDisplayName": [df['displayText'][0]]
,"AudienceName":[df['appViewDetails'][0][i]['viewName']]
,"reportId":[df['appViewDetails'][0][i]['reportIds'][j]]
,"Users":[df['appViewDetails'][0][i]['contentProviderPermissions']['adUserMetadataList'][k]['userPrincipalName']]
,"AdName":[df['appViewDetails'][0][i]['contentProviderPermissions']['adUserMetadataList'][k]['displayName']]})
df_empty = df_empty.append(new_row)
dfs['vw_Audience_tmp'] = pandas_to_spark(df_empty)
return dfs['vw_Audience_tmp']
except:
print("No data for this group")
return dfs['vw_Audience_tmp']
stick this in a loop
with a timer
for each in dfs['vw_Groups'].collect():
time.sleep(2.5)
df = pd.json_normalize(GET_GROUPS(each['Id']))
df2 = Clean_Result(df,each['Id'])
if not df2.isEmpty():
df3 = df3.union(df2)
dfs['vw_Audience2'] = df3
dfs['vw_Audience2'].createOrReplaceTempView('vw_Audience2')its not perfect but it does the job untill MS decide to get an official API