Aqui está o que estou usando.
site_url = "https://mycompany.sharepoint.com/sites/mysite/"
clientid = "12345"
clientsecret = "67890"
clientcredentials = ClientCredential(clientid, clientsecret)
ctx = ClientContext(site_url).with_credentials(clientcredentials)
target_list = "ListIWant"
list_object = ctx.web.lists.get_by_title(target_list)
items = list_object.get_items()
ctx.load(items)
ctx.execute_query()
Tudo corre sem erros, mas no final meu list_object não tem nenhum item ou campo ... Quando eu olho para resource_url em list_object, não é o URL correto. Existem barras invertidas extras na frente e atrás do nome da lista. Remover as barras e copiar para a barra de endereço do Edge baixa um arquivo XML com informações sobre a lista, mas como está, não funcionará ... então presumo que seja isso o que está causando o erro ... mas não t como consertá-lo.
Sinto que estou tão perto ... Alguém pode ajudar?
Você está quase lá.
Seu objeto items
é do tipo ListItemCollection
.
Se você tentar len(items)
, ele deve retornar a quantidade de itens na coleção
E agora você pode enumerar esses itens:
for item in items:
print(item.properties)
cada item agora é do tipo ListItem
que você pode manipular
também, as barras invertidas extras são para escapar de '
na string python, elas são totalmente normais
Você está quase lá.
Seu objetoitems
é do tipoListItemCollection
.
Se você tentarlen(item)
, ele deve retornar a quantidade de itens na coleção
E agora você pode enumerar esses itens:for item in items: print(item.properties)
cada item agora é do tipo
ListItem
que você pode manipular
Obrigado pela sua ajuda, mas print (len (items)) retorna 0
Se não for um problema com resource_url. poderia haver algo errado com as permissões do aplicativo que defini para o site do SharePoint? Segui as instruções de https://docs.microsoft.com/en-us/sharepoint/dev/solution-guidance/security-apponly-azureacs (incluindo a configuração do XML de solicitação de permissão), mas quando volto para _layouts / 15 /appinv.aspx e olhe meu ID de cliente, o campo XML de solicitação de permissão está sempre vazio ... Esta é a primeira vez que faço isso, então não tenho certeza se é assim que deve funcionar ou não.
Tenho usado essas configurações para o xml (e seleciono confiar no aplicativo, obviamente).
<AppPermissionRequests AllowAppOnlyPolicy="true">
<AppPermissionRequest Scope="http://mycompany.sharepoint.com/sites/mysite" Right="FullControl" />
</AppPermissionRequests>
Isso é um pouco diferente do que estava nas instruções que encontrei em docs.microsoft.com, mas só posso conceder acesso ao meu site, não ao locatário. O aplicativo é listado em 'Permissões do aplicativo do conjunto de sites' posteriormente, então presumo que esteja funcionando ... mas o fato de não ver nenhuma permissão xml quando volto para appinv.aspx.
Boa pergunta, na minha memória, quando estava lidando com questões de permissão, era muito claro.
Seu aplicativo realmente aprovado estaria em _layouts/15/AppPrincipals.aspx
E é normal que você não veja o xml no appinv.
Se minha memória está correta, o escopo que usei foi http://sharepoint/site/sitecollection
embora
(Editar :) Aqui está uma folha de dicas: https://medium.com/ng-sp/sharepoint-add-in-permission-xml-cheat-sheet-64b87d8d7600
Você já tentou se conectar à api pelo carteiro?
Aqui está o que recebo do intérprete com minha conexão atual.
>>> items = ctx.web.lists.get_by_title('Events').items
>>> items
<office365.sharepoint.listitems.listItem_collection.ListItemCollection object at 0x10d064af0>
>>> len(items)
0
>>> ctx.load(items)
>>> ctx.execute_query()
>>> len(items)
2
Saudações,
Você está quase lá.
Seu objetoitems
é do tipoListItemCollection
.
Se você tentarlen(items)
, ele deve retornar a quantidade de itens na coleção
E agora você pode enumerar esses itens:for item in items: print(item.properties)
cada item agora é do tipo
ListItem
que você pode manipulartambém, as barras invertidas extras são para escapar de
'
na string python, elas são totalmente normais
concordar e, de fato, barras invertidas extras são obrigatórias para o caractere de apóstrofo de escape para tornar o URL OData válido
Este comentário parece lançar uma luz sobre a causa raiz:
Tenho usado essas configurações para o xml (e seleciono confiar no aplicativo, obviamente).
<AppPermissionRequests AllowAppOnlyPolicy="true"> <AppPermissionRequest Scope="http://mycompany.sharepoint.com/sites/mysite" Right="FullControl" /> </AppPermissionRequests>
Isso é um pouco diferente do que estava nas instruções que encontrei em docs.microsoft.com, mas só posso conceder acesso ao meu site, não ao locatário. O aplicativo é listado em 'Permissões do aplicativo do conjunto de sites' posteriormente, então presumo que esteja funcionando ... mas o fato de não ver nenhuma permissão xml quando volto para appinv.aspx.
o escopo fornecido parece _inválido_: http://mycompany.sharepoint.com/sites/mysite
mycompany
: deve ser sharepoint
espaço reservado predefinidosites/mysite
mesmo, precisa ser um marcador _válido_, por exemplo, content/sitecollection
ou content/sitecollection/web
Portanto, a solução seria conceder permissões de aplicativo fornecendo uma solicitação de permissões _válidas_, por exemplo:
por conjunto de sites :
<AppPermissionRequests AllowAppOnlyPolicy="true">
<AppPermissionRequest Scope="http://sharepoint/content/sitecollection" Right="FullControl" />
</AppPermissionRequests>
por web :
<AppPermissionRequests AllowAppOnlyPolicy="true">
<AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web" Right="FullControl" />
</AppPermissionRequests>
A lista de _escopos de permissão_ pode ser encontrada em Permissões de suplemento SharePoint
E por último, mas não menos importante, há uma página wiki que também fornece instruções passo a passo sobre como configurar o aplicativo principal e conceder permissões.
Obrigada! sim. O escopo da permissão XML parece ter sido a causa raiz do problema!
Pelo meu teste inicial, parece estar funcionando agora.
Isso é ótimo. Tenho usado scripts VBA no MS Access no ano passado para atualizar minhas listas do SharePoint. Ter essa parte resolvida me deixa um passo mais perto de portar tudo para Python.