Use la API de OneDrive sin interacción del usuario, como un programa por lotes (versión de C# de .NET) (sin bibliotecas de uso adicionales)
Entorno operativo
- Estudio visual
-
- Visual Studio 2022
- .RED
-
- .NET 8
- API de autenticación de Microsoft
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- Tipos de cuentas de Microsoft
-
- Cuenta profesional o educativa
Prerrequisitos
- Estudio visual
-
- Una de las versiones
- .RED
-
- Una de las versiones
- API de autenticación de Microsoft
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- Tipos de cuentas de Microsoft
-
- Cuenta profesional o educativa
Sobre el propósito de este evento
Ahora usará las API de OneDrive para prepararse para cargar y descargar archivos mediante programación en OneDrive. En este artículo, analizaremos lo que puede hacer con la API de OneDrive, por lo que no entraremos en lo que puede hacer con la API de OneDrive. Sin embargo, siempre que pueda conectarse, puede leer la documentación de la API y aplicarla después de eso.
Cómo ejecutar el programa
El acceso a OneDrive no depende de la forma del programa, como una aplicación web, una aplicación de escritorio o una aplicación de consola, y puede ser ejecutado por una variedad de programas. En este caso, crearemos una aplicación de consola y la ejecutaremos automáticamente sin ninguna operación del usuario.
¿Cuáles son los diferentes tipos de cuentas de Microsoft?
Si alguna vez has creado una cuenta de Microsoft, probablemente la hayas visto. Hay dos tipos principales de cuentas de Microsoft: cuentas personales de Microsoft y cuentas profesionales o educativas. OneDrive está vinculado a una cuenta de Microsoft, pero el tipo de OneDrive varía ligeramente según el tipo de cuenta mencionado anteriormente.
Por el momento, la API de OneDrive se puede usar con los dos tipos de cuentas anteriores. En este programa en forma de "creado como una aplicación de consola y ejecutado sin operación de usuario", Tenga en cuenta que solo se puede usar con una cuenta de Microsoft en la cuenta "Cuenta profesional o educativa". Esto se debe a las diferencias en los métodos de autenticación.
Acerca del método de autenticación
En primer lugar, debe autenticarse para acceder a OneDrive mediante programación. Como se mencionó anteriormente, cualquier programa puede acceder a OneDrive, pero la autenticación para conectarse a la API depende de cómo se esté ejecutando el programa. Las aplicaciones web y las aplicaciones de escritorio se pueden autenticar mediante la interacción del usuario. Dado que el usuario no puede operarlo en una aplicación de consola que se ejecuta en segundo plano, el método de autenticación también es diferente del anterior.
No sé la razón detallada porque no he podido buscarla, pero si me viene a la mente, parece que se debe a la seguridad y la gestión de la cuenta. Solo puedo decir que esto ya es una especificación, por lo que si desea acceder mediante programación a OneDrive asociado con una "cuenta personal de Microsoft", Creo que no hay más remedio que usar un programa que no sea un programa que se ejecute en segundo plano, o ejecutar una aplicación de consola con un método de autenticación que incluya operaciones de usuario.
No usaremos la biblioteca para acceder a la API de OneDrive en este momento
El acceso a la API de OneDrive es relativamente fácil de manejar mediante una biblioteca llamada "Microsoft Graph". En este caso, utilizaremos el método de acceder directamente a la URL de la API y ejecutarla. Es un poco engorroso, pero como no usa una biblioteca, tiene la ventaja de que non-.NET programas pueden acceder a la API de OneDrive de la misma manera. También evita la desventaja de que el código cambie debido a diferentes versiones de la biblioteca.
Te mostraremos cómo usar Microsoft Graph en otro consejo.
precondición
- Tienes una cuenta de Microsoft para una cuenta profesional o educativa
- Puede usar el OneDrive asociado a la cuenta de Microsoft mencionada anteriormente (por ejemplo, OneDrive Business)
- Visual Studio 2022 instalado
Configurar la aplicación para acceder a su cuenta de Microsoft o OneDrive en Azure
Inicie sesión en Azure en la siguiente dirección URL:
En el campo de búsqueda de arriba, escriba "registros de aplicaciones" y selecciónelo.
Haga clic en Nuevo registro.
El contenido del "Nombre" es arbitrario. Introduzca un nombre descriptivo.
Selecciona un "Tipo de cuenta compatible" que no sea "Solo cuentas personales de Microsoft". Esto se debe a que, como se mencionó anteriormente, esta autenticación solo se puede usar con cuentas que pertenecen a una organización. En este caso, hemos seleccionado "Cuentas en cualquier directorio de la organización (cualquier inquilino de Microsoft Entra ID: multiinquilino) y cuentas personales de Microsoft (Skype, Xbox, etc.)".
No es necesario que ingrese el "URI de redireccionamiento" porque no se utilizará esta vez.
Cuando haya terminado, haga clic en el botón "Registrarse".
Accederá a la página de resumen del registro de la aplicación que creó, por lo que debe copiar el identificador de aplicación (cliente) y el identificador de directorio (inquilino). Usará este valor más adelante.
Seleccione "Certificados y secretos" en la categoría de administración en el menú de la izquierda y asegúrese de que "Secretos de cliente" esté seleccionado en la pestaña central. Haga clic en Nuevo secreto de cliente.
Introducir una descripción es opcional. Si desea seguir usándolo, incluya una explicación que explique claramente el propósito de uso.
La "fecha de expiración" es el período de tiempo durante el cual este secreto de cliente es válido. Dado que esta vez es para fines de prueba, es de 90 días, pero configúrelo de acuerdo con el propósito de uso.
Al crear un secreto de cliente, se agrega a la lista. En esto, usaremos el valor en la columna "Valor", así que cópialo. Tenga en cuenta que este valor no se puede copiar más adelante.
A continuación, seleccione "Permisos de API" en la categoría Administración en el menú de la izquierda y haga clic en "Agregar permisos" en el medio.
En la solicitud de permiso de API, haga clic en Microsoft Graph.
Haga clic en Permitir aplicación. Esta opción no está disponible para las cuentas personales de Microsoft.
A continuación se mostrará una lista de permisos, así que utilice el campo de búsqueda para comprobar los siguientes elementos.
- Archivos.ReadWrite.All
Eso es suficiente si solo desea usar OneDrive, pero si desea acceder a cualquier otra cosa, agregue permisos. Los permisos necesarios para acceder a OneDrive se pueden encontrar en la página oficial a continuación.
Una vez que hayas hecho tus selecciones, haz clic en el botón Agregar permisos.
El agregado se agrega a la lista y el "Tipo" es "Aplicación". Sin embargo, dado que el "Estado" es "No concedido a XXXX", haga clic en "Dar el consentimiento del administrador a XXXX". (XXXX es el nombre de su organización)
Haga clic en Sí.
Cambia al estado concedido.
Por cierto, puedes eliminar el "Usuario delegado.Leer" que está ahí desde el principio porque no lo usaremos esta vez. Si agregó "User.Read" como una aplicación, úsela.
Verificación de ID de usuario
Dado que accederá al OneDrive que tiene el usuario de destino, compruebe el ID de usuario con antelación.
Microsoft Entra ID
y ábrelo.
Seleccione Usuarios en el menú de la izquierda.
Se mostrará una lista de usuarios, así que haga clic en el usuario objetivo.
Anote el "ID de objeto", ya que será el ID de usuario.
Creación de una aplicación de consola
Inicie Visual Studio y cree un proyecto para la aplicación de consola. Puede crearlo fuera de Visual Studio, pero por ahora usaré Visual Studio.
La ubicación y el nombre del proyecto son opcionales. En este caso, el nombre del proyecto es OneDriveApiDotNetClientCredentialsHttpClient
.
Esta vez, no dividiremos el código, sino Program.cs
que lo escribiremos escalonado desde la parte superior, por lo que si puede verificar el movimiento, reescríbalo dividiendo el código según sea necesario.
using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.Json;
using System.Web;
using System.Xml;
Describa el espacio de nombres que desea utilizar.
// 認証結果を格納するクラスです
public record TokenResponse(string token_type, int expires_in, int ext_expires_in, string access_token);
Esta clase se utiliza para recibir información de token después de la autenticación.
Program.cs
, por favor escríbalo al final del código.
Puede separar esta clase en otros archivos.
// JSON 文字列を整形するメソッド
static string ConvertToIndentedJson(string json)
{
byte[] buffer = Encoding.UTF8.GetBytes(json);
using MemoryStream stream = new();
using XmlDictionaryWriter writer = JsonReaderWriterFactory.CreateJsonWriter(stream, Encoding.UTF8, true, true);
using XmlDictionaryReader reader = JsonReaderWriterFactory.CreateJsonReader(buffer, XmlDictionaryReaderQuotas.Max);
writer.WriteNode(reader, true);
writer.Flush();
return Encoding.UTF8.GetString(stream.ToArray());
}
Este es un método mágico que formatea el texto JSON recibido de la API con sangría. Dado que es un código recogido de Internet, no explicaré el contenido en detalle.
// 各種 ID などの定義
var clientId = "XXXXXXXX"; // クライアント ID
var tenantId = "XXXXXXXX"; // テナント ID
var clientSecret = "XXXXXXXX"; // クライアント シークレット
var userId = "XXXXXXXX"; // ユーザー ID
var accessToken = ""; // アクセストークン
Establezca el identificador obtenido en Azure para cada uno.
accessToken
es un token temporal para acceder a OneDrive, por lo que se establece en tiempo de ejecución.
// 各種 URL の定義
var urlToken = $"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token";
var urlOneDriveGetRootFolders = $"https://graph.microsoft.com/v1.0/users/{userId}/drive/root/children";
La URL de la API para la autenticación y la URL de la API para obtener la lista de carpetas en la raíz de OneDvie. Esta es una descripción de cómo comprobar el acceso a la API de OneDrive, por lo que no describiré el contenido de la API de OneDrive. Si tiene acceso a la API de OneDrive, cargar y descargar es una aplicación, así que no creo que sea tan difícil.
// 使いまわすので最初に定義しておく
HttpClient httpClient = new();
Ha generado un para realizar una solicitud a HttpClient
la URL especificada.
// 「Name1=Value1&Name2=Value2...」形式のクエリパラメータ文字列を作成する
var valueDict = new Dictionary<string, string>
{
{ "client_id", clientId },
{ "scope", "https://graph.microsoft.com/.default" },
{ "client_secret", clientSecret },
{ "grant_type", "client_credentials" },
};
var valueQS = string.Join("&", valueDict.Select(x => string.Format("{0}={1}", x.Key, HttpUtility.UrlEncode(x.Value))));
Console.WriteLine($"valueQS={valueQS}");
En primer lugar, realizará una solicitud a la API de autenticación con datos, por lo que debe preparar esos datos. El formato de los datos que se enviarán es una cadena de parámetro de consulta con el formato "Nombre1=Valor1&Nombre2=Valor2...", por lo que se crea en un diccionario y luego se convierte en una cadena de parámetro de consulta.
Hay cuatro parámetros a enviar:
Valores de ejemplode | nombre de parámetro |
---|---|
client_id | Establezca el ID de cliente que obtuvo en el registro de la aplicación. |
alcance | La autenticación con un secreto de cliente es fija.https://graph.microsoft.com/.default |
client_secret | Establezca el valor del secreto de cliente que obtuvo en el registro de la aplicación. |
grant_type | Dado que se trata de autenticación con un secreto de cliente, client_credentials será |
Para obtener más información, consulte el siguiente sitio web oficial.
// 認証処理
using (HttpRequestMessage request = new(HttpMethod.Post, urlToken))
{
request.Content = new StringContent(valueQS, Encoding.UTF8, "application/x-www-form-urlencoded");
// データを送信し結果を受け取る
using var response = httpClient.SendAsync(request).Result;
Console.WriteLine($"IsSuccessStatusCode={response.IsSuccessStatusCode}");
Console.WriteLine($"StatusCode={response.StatusCode}");
Console.WriteLine($"ReasonPhrase={response.ReasonPhrase}");
if (response.IsSuccessStatusCode == false)
{
Console.WriteLine("トークンの取得に失敗しました。");
return;
}
// レスポンスからアクセストークンを受け取る。
var tokenResultJson = response.Content.ReadAsStringAsync().Result;
Console.WriteLine($"tokenResultJson={ConvertToIndentedJson(tokenResultJson)}");
var tokenResult = JsonSerializer.Deserialize<TokenResponse>(tokenResultJson) ?? throw new Exception("JSON をデシリアライズできませんでした。");
accessToken = tokenResult.access_token;
}
HttpClient
para realizar una solicitud a la API de autenticación. HttpClient
Es un uso común, así que no creo que haya mucho a lo que prestar atención.
Los datos a enviar deben estar codificados en UTF8 y el tipo de contenido debe ser application/x-www-form-urlencoded
. El método es POST
.
Si la IsSuccessStatusCode
respuesta se comprueba y procesa correctamente, recibirá el resultado como una cadena JSON.
El JSON que recibe tiene los siguientes parámetros:
{
"token_type": "Bearer",
"expires_in": 3599,
"ext_expires_in": 3599,
"access_token": "XXXXXXXXXXXXXXX"
}
En esto, access_token
usaremos . Use este valor con la API de OneDrive.
Puede ignorar los otros parámetros, peroaccess_token
si desea conocer la fecha de vencimiento de , use expires_in
.
Es difícil de usar como una cadena JSON, por lo que JsonSerializer.Deserialize
lo deserializamos con y luego access_token
obtenemos .
// OneDrive 処理
using (HttpRequestMessage request = new(HttpMethod.Get, urlOneDriveGetRootFolders))
{
// アクセストークンをヘッダーに追加する
request.Headers.Add("Authorization", "Bearer " + accessToken);
// OneDrive API にリクエスト
using var response = httpClient.SendAsync(request).Result;
Console.WriteLine($"IsSuccessStatusCode={response.IsSuccessStatusCode}");
Console.WriteLine($"StatusCode={response.StatusCode}");
Console.WriteLine($"ReasonPhrase={response.ReasonPhrase}");
if (response.IsSuccessStatusCode == false)
{
Console.WriteLine("OneDrive へのアクセスに失敗しました。");
return;
}
// レスポンスからアクセストークンを受け取る。
var apiResultJson = response.Content.ReadAsStringAsync().Result;
Console.WriteLine($"apiResultJson={ConvertToIndentedJson(apiResultJson)}");
}
Por último, use el token de acceso para realizar una solicitud a la API de OneDrive.
El método especifica GET
, pero depende del tipo de API, así que consulte la documentación de la API de OneDrive.
Agregue el token de acceso al encabezado. Establezca la clave como Authorization
y el valor en el Bearer {アクセストークン}
formato .
Todo lo que tienes que hacer es hacer una solicitud y recibir el resultado como una cadena JSON. Ahora que nos estamos asegurando de que tenemos acceso a la API de OneDrive, simplemente estamos formateando la cadena JSON e imprimiéndola en la consola. De hecho, deserializa el JSON recibido y lo procesa en consecuencia.
Esta vez he recibido una lista de carpetas, pero creo que el JSON es el siguiente.
{
"@odata.context": "https:\/\/graph.microsoft.com\/v1.0\/$metadata#Collection(driveItem)",
"value": [
{
"@microsoft.graph.Decorator": "decorator has been deprecated. Refer to folder.decorator",
"createdBy": {
"フォルダ作成者の情報":""
},
"createdDateTime": "2017-06-20T04:31:24Z",
"eTag": "\"{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX},1\"",
"id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"lastModifiedBy": {
"フォルダ更新者の情報":""
},
"lastModifiedDateTime": "2017-06-20T04:31:24Z",
"name": "フォルダ名",
"parentReference": {
"親フォルダの情報":""
},
"webUrl": "フォルダにアクセスできる URL",
"cTag": "\"c:{5926E2DA-B7FF-4936-88A8-7908C378ECE2},0\"",
"fileSystemInfo": {
"createdDateTime": "2017-06-20T04:31:24Z",
"lastModifiedDateTime": "2017-06-20T04:31:24Z"
},
"folder": {
"childCount": 0
},
"size": 0,
"specialFolder": {
"name": "フォルダ名"
}
},
:
]
}
No creo que necesite toda la información, por lo que si desea obtener solo el nombre de la carpeta, por ejemplo, puede value
obtener solo los parámetros de name
la matriz en .
Resumen
Si funciona bien hasta ahora, debería poder acceder a OneDrive con un programa por lotes. No sé si los consejos resumen los métodos de carga y descarga, pero básicamente debería funcionar si aplica la lista de carpetas en la raíz descrita anteriormente. Los tipos de API se resumen en el sitio web oficial a continuación, así que busque la API que desea usar e impleméntela.
gracias
Esta vez tenía algunas preguntas sobre el uso de la API de OneDrive, así que hice una pregunta.