Gunakan API OneDrive tanpa interaksi pengguna, seperti program batch (versi .NET C#) (tidak ada pustaka penggunaan tambahan)

Halaman Diperbarui :
Tanggal pembuatan halaman :

Lingkungan operasi

Visual Studio
  • Visual Studio 2022
.JARING
  • .NET 8
API Autentikasi Microsoft
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Jenis akun Microsoft
  • Akun kerja atau sekolah

Prasyarat

Visual Studio
  • Salah satu versi
.JARING
  • Salah satu versi
API Autentikasi Microsoft
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Jenis akun Microsoft
  • Akun kerja atau sekolah

Tentang tujuan acara ini

Sekarang Anda akan menggunakan API OneDrive untuk mempersiapkan Anda untuk mengunggah dan mengunduh file ke OneDrive secara terprogram. Pada artikel ini, kita akan membahas apa yang dapat Anda lakukan dengan API OneDrive, jadi kami tidak akan membahas apa yang dapat Anda lakukan dengan API OneDrive. Namun, selama Anda dapat terhubung, Anda dapat membaca dokumentasi API dan menerapkannya setelah itu.

Cara menjalankan program

Akses ke OneDrive tidak bergantung pada bentuk program, seperti aplikasi web, aplikasi desktop, atau aplikasi konsol, dan dapat dijalankan oleh berbagai program. Dalam hal ini, kami akan membuat aplikasi konsol dan menjalankannya secara otomatis tanpa operasi pengguna.

Apa saja jenis akun Microsoft yang berbeda?

Jika Anda pernah membuat akun Microsoft, Anda mungkin pernah melihatnya. Ada dua jenis utama akun Microsoft: akun Microsoft pribadi dan akun kerja atau sekolah. OneDrive terkait dengan akun Microsoft, tetapi jenis OneDrive sedikit berbeda tergantung pada jenis akun yang tercantum di atas.

Untuk saat ini, API OneDrive dapat digunakan dengan kedua jenis akun di atas. Dalam program ini dalam bentuk "dibuat sebagai aplikasi konsol dan dijalankan tanpa operasi pengguna", Harap dicatat bahwa ini hanya dapat digunakan dengan akun Microsoft di akun "Akun kerja atau sekolah". Hal ini disebabkan oleh perbedaan metode otentikasi.

Tentang metode autentikasi

Pertama, Anda harus mengautentikasi untuk mengakses OneDrive secara terprogram. Seperti disebutkan di atas, program apa pun dapat mengakses OneDrive, tetapi otentikasi untuk terhubung ke API tergantung pada bagaimana program berjalan. Aplikasi web dan aplikasi desktop dapat diautentikasi melalui interaksi pengguna. Karena pengguna tidak dapat mengoperasikannya di aplikasi konsol yang berjalan di latar belakang, metode otentikasi juga berbeda dari di atas.

Saya tidak tahu alasannya secara rinci karena saya belum bisa mencarinya, tetapi jika terlintas dalam pikiran, sepertinya karena keamanan dan manajemen akun. Saya hanya dapat mengatakan bahwa ini sudah menjadi spesifikasi, jadi jika Anda ingin mengakses OneDrive secara terprogram yang terkait dengan "akun Microsoft pribadi", Saya pikir tidak ada pilihan selain menggunakan program selain program yang berjalan di latar belakang, atau menjalankan aplikasi konsol dengan metode otentikasi yang mencakup operasi pengguna.

Kami tidak akan menggunakan pustaka untuk mengakses API OneDrive saat ini

Akses ke API OneDrive relatif mudah ditangani menggunakan pustaka yang disebut "Microsoft Graph". Dalam hal ini, kita akan menggunakan metode mengakses URL API secara langsung dan menjalankannya. Ini agak rumit, tetapi karena tidak menggunakan perpustakaan, ia memiliki keuntungan bahwa program non-.NET dapat mengakses API OneDrive dengan cara yang sama. Ini juga mencegah kerugian bahwa kode berubah karena versi pustaka yang berbeda.

Kami akan menunjukkan cara menggunakan Microsoft Graph di tip lain.

Prasyarat

  • Anda memiliki akun Microsoft untuk akun kerja atau sekolah
  • Anda dapat menggunakan OneDrive yang terkait dengan akun Microsoft yang tercantum di atas (misalnya, OneDrive Business)
  • Visual Studio 2022 diinstal

Siapkan aplikasi Anda untuk mengakses akun Microsoft atau OneDrive di Azure

Masuk ke Azure di URL berikut:

Dari kolom pencarian di atas, ketik "pendaftaran aplikasi" dan pilih.

Klik Pendaftaran Baru.

Isi "Nama" sewenang-wenang. Masukkan nama deskriptif.

Pilih "Jenis akun yang didukung" selain "Hanya akun Microsoft pribadi". Ini karena, seperti disebutkan di atas, otentikasi ini hanya dapat digunakan dengan akun milik organisasi. Dalam hal ini, kami telah memilih "Akun di direktori organisasi apa pun (penyewa ID Microsoft Entra - multi-penyewa) dan akun Microsoft pribadi (Skype, Xbox, dll.)".

Anda tidak perlu memasukkan "URI Pengalihan" karena tidak akan digunakan kali ini.

Setelah selesai, klik tombol "Daftar".

Anda akan dibawa ke halaman ringkasan pendaftaran aplikasi yang Anda buat, jadi salin ID Aplikasi (klien) dan ID Direktori (penyewa). Anda akan menggunakan nilai ini nanti.

Pilih "Sertifikat & rahasia" dari kategori manajemen di menu kiri, dan pastikan "Rahasia klien" dipilih di tab tengah. Klik Rahasia Klien Baru.

Memasukkan Deskripsi bersifat opsional. Jika Anda ingin terus menggunakannya, harap sertakan penjelasan yang menjelaskan dengan jelas tujuan penggunaan.

"Tanggal kedaluwarsa" adalah periode waktu rahasia klien ini valid. Karena kali ini untuk tujuan pengujian, ini adalah 90 hari, tetapi harap atur sesuai dengan tujuan penggunaan.

Saat Anda membuat rahasia klien, rahasia klien akan ditambahkan ke daftar. Dalam hal ini, kita akan menggunakan nilai di kolom "Nilai", jadi salin. Perhatikan bahwa nilai ini tidak dapat disalin nanti.

Selanjutnya, pilih "API Permissions" dari kategori Administrasi di menu kiri dan klik "Add Permissions" di tengah.

Dalam permintaan izin API, klik Microsoft Graph.

Klik Izinkan Aplikasi. Opsi ini tidak tersedia untuk akun Microsoft pribadi.

Daftar izin akan ditampilkan di bawah ini, jadi gunakan bidang pencarian untuk memeriksa item berikut.

  • File.ReadWrite.Semua

Itu sudah cukup jika Anda hanya ingin menggunakan OneDrive, tetapi jika Anda ingin mengakses apa pun, tambahkan izin. Izin yang diperlukan untuk mengakses OneDrive dapat ditemukan di halaman resmi di bawah ini.

Setelah Anda membuat pilihan, klik tombol Tambahkan Izin.

Yang ditambahkan ditambahkan ke daftar, dan "Jenis" adalah "Aplikasi". Namun, karena "Status" adalah "Tidak diberikan kepada XXXX", klik "Berikan persetujuan administrator untuk XXXX". (XXXX adalah nama organisasi Anda)

Klik Ya.

Ini berubah ke status yang diberikan.

Ngomong-ngomong, Anda dapat menghapus "User.Read yang didelegasikan" yang ada di sana dari awal karena kami tidak akan menggunakannya kali ini. Jika Anda menambahkan "User.Read" sebagai aplikasi, gunakanlah.

Memverifikasi ID Pengguna

Karena Anda akan mengakses OneDrive yang dimiliki pengguna target, periksa ID pengguna terlebih dahulu.

Microsoft Entra ID dan buka.

Pilih Pengguna dari menu di sebelah kiri.

Daftar pengguna akan ditampilkan, jadi klik pengguna target.

Catat "ID Objek" karena itu akan menjadi ID pengguna.

Membuat aplikasi konsol

Mulai Visual Studio dan buat proyek untuk aplikasi konsol Anda. Anda dapat membuatnya di luar Visual Studio, tetapi saya akan menggunakan Visual Studio untuk saat ini.

Lokasi dan nama proyek bersifat opsional. Dalam hal ini, nama proyeknya adalah OneDriveApiDotNetClientCredentialsHttpClient .

Kali ini, kami tidak akan membagi kode, tetapi Program.cs akan menulisnya secara terhuyung-huyung dari atas, jadi jika Anda dapat memeriksa gerakannya, silakan tulis ulang dengan membagi kode seperlunya.

using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.Json;
using System.Web;
using System.Xml;

Jelaskan namespace yang ingin Anda gunakan.

// 認証結果を格納するクラスです
public record TokenResponse(string token_type, int expires_in, int ext_expires_in, string access_token);

Kelas ini digunakan untuk menerima informasi token setelah autentikasi. Program.cs , silakan tulis di akhir kode. Anda dapat memisahkan kelas ini ke dalam file lain.

// 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());
}

Ini adalah metode ajaib yang memformat teks JSON yang diterima dari API dengan lekukan. Karena ini adalah kode yang diambil dari Internet, saya tidak akan menjelaskan isinya secara rinci.

// 各種 ID などの定義
var clientId = "XXXXXXXX";      // クライアント ID
var tenantId = "XXXXXXXX";      // テナント ID
var clientSecret = "XXXXXXXX";  // クライアント シークレット
var userId = "XXXXXXXX";        // ユーザー ID
var accessToken = "";           // アクセストークン

Atur ID yang diperoleh di Azure untuk masing-masing. accessToken adalah token sementara untuk mengakses OneDrive, sehingga diatur saat runtime.

// 各種 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";

URL API untuk otentikasi dan URL API untuk mendapatkan daftar folder di root OneDvie. Ini adalah deskripsi tentang cara memeriksa akses ke API OneDrive, jadi saya tidak akan menjelaskan isi API OneDrive. Jika Anda memiliki akses ke API OneDrive, mengunggah dan mengunduh adalah aplikasi, jadi menurut saya itu tidak terlalu sulit.

// 使いまわすので最初に定義しておく
HttpClient httpClient = new();

Anda telah membuat a untuk membuat permintaan ke HttpClient URL yang ditentukan.

// 「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}");

Pertama, Anda akan membuat permintaan ke API autentikasi dengan data, jadi siapkan data tersebut. Format data yang akan dikirim adalah string parameter kueri dalam format "Name1=Value1&Name2=Value2...", sehingga dibuat dalam kamus dan kemudian dikonversi menjadi string parameter kueri.

Ada empat parameter yang akan dikirim:

Contoh
Nilai Nama Parameter
client_id Tetapkan ID klien yang Anda peroleh dalam pendaftaran aplikasi.
ruang lingkup Autentikasi dengan rahasia klien diperbaiki https://graph.microsoft.com/.default .
client_secret Tetapkan nilai rahasia klien yang Anda peroleh dalam pendaftaran aplikasi.
grant_type Karena ini adalah otentikasi dengan rahasia klien, client_credentials itu akan menjadi

Untuk informasi lebih lanjut, silakan merujuk ke situs web resmi berikut.

// 認証処理
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 untuk membuat permintaan ke API autentikasi. HttpClient Ini adalah penggunaan umum, jadi saya pikir tidak banyak yang perlu diperhatikan.

Data yang akan dikirim harus dikodekan UTF8 dan Content-Type harus . application/x-www-form-urlencoded Metodenya adalah POST .

Jika IsSuccessStatusCode respons berhasil diperiksa dan diproses, Anda akan menerima hasilnya sebagai string JSON. JSON yang Anda terima memiliki parameter berikut:

{
  "token_type": "Bearer",
  "expires_in": 3599,
  "ext_expires_in": 3599,
  "access_token": "XXXXXXXXXXXXXXX"
}

Dalam hal ini, access_token kita akan menggunakan . Gunakan nilai ini dengan API OneDrive. Anda dapat mengabaikan parameter lainnya, tetapiaccess_token jika Anda ingin mengetahui tanggal kedaluwarsa , gunakan expires_in .

Sulit untuk digunakan sebagai string JSON, jadi JsonSerializer.Deserialize kami mendeserialisasinya dengan dan kemudian access_token mendapatkan .

// 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)}");
}

Terakhir, gunakan token akses untuk membuat permintaan ke API OneDrive. Metode ini menentukan GET , tetapi tergantung pada jenis API, jadi periksa dokumentasi API OneDrive.

Tambahkan token akses ke header. Tetapkan kunci sebagai dan Authorization nilai dalam Bearer {アクセストークン} format .

Yang harus Anda lakukan adalah membuat permintaan dan menerima hasilnya sebagai string JSON. Sekarang kita hanya memastikan bahwa kita memiliki akses ke API OneDrive, kita hanya memformat string JSON dan mencetaknya ke konsol. Bahkan, ini mendeserialisasi JSON yang diterima dan memprosesnya sesuai dengan itu.

Saya telah menerima daftar folder kali ini, tetapi menurut saya JSON-nya adalah sebagai berikut.

{
  "@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": "フォルダ名"
      }
    },
    :
  ]
}

Saya rasa Anda tidak membutuhkan semua informasi, jadi jika Anda hanya ingin mendapatkan nama folder, misalnya, Anda value hanya bisa mendapatkan parameter dari name array di .

Ringkasan

Jika sejauh ini berfungsi dengan baik, Anda seharusnya dapat mengakses OneDrive dengan program batch. Saya tidak tahu apakah tips merangkum metode pengunggahan dan pengunduhan, tetapi pada dasarnya itu akan berfungsi jika Anda menerapkan daftar folder di root yang dijelaskan di atas. Jenis-jenis API dirangkum pada situs resmi di bawah ini, jadi silahkan temukan API yang ingin Anda gunakan dan terapkan.

Terima kasih

Saya memiliki beberapa pertanyaan tentang penggunaan API OneDrive kali ini, jadi saya mengajukan pertanyaan.