Sử dụng API OneDrive mà không cần tương tác với người dùng, chẳng hạn như chương trình hàng loạt (phiên bản .NET C#) (không có thư viện sử dụng bổ sung)

Trang Cập Nhật :
Ngày tạo trang :

Môi trường hoạt động

Visual Studio
  • Visual Studio 2022
.MẠNG
  • .NET 8
API xác thực Microsoft
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Các loại tài khoản Microsoft
  • Tài khoản cơ quan hoặc trường học

Điều kiện tiên quyết

Visual Studio
  • Một trong những phiên bản
.MẠNG
  • Một trong những phiên bản
API xác thực Microsoft
  • 2.0 OAuth 2
Microsoft OneDrive API
  • 1.0
Các loại tài khoản Microsoft
  • Tài khoản cơ quan hoặc trường học

Về mục đích của sự kiện này

Bây giờ bạn sẽ sử dụng API OneDrive để chuẩn bị cho việc tải lên và tải tệp xuống OneDrive theo chương trình. Trong bài viết này, chúng ta sẽ đi vào những gì bạn có thể làm với API OneDrive, vì vậy chúng ta sẽ không đi sâu vào những gì bạn có thể làm với API OneDrive. Tuy nhiên, miễn là bạn có thể kết nối, bạn có thể đọc tài liệu API và áp dụng nó sau đó.

Cách chạy chương trình

Quyền truy cập vào OneDrive không phụ thuộc vào hình thức của chương trình, chẳng hạn như ứng dụng web, ứng dụng máy tính để bàn hoặc ứng dụng bảng điều khiển và có thể được chạy bởi nhiều chương trình khác nhau. Trong trường hợp này, chúng tôi sẽ tạo một ứng dụng console và thực thi nó tự động mà không cần bất kỳ thao tác nào của người dùng.

Các loại tài khoản Microsoft khác nhau là gì?

Nếu bạn đã từng tạo tài khoản Microsoft, có lẽ bạn đã thấy tài khoản đó. Có hai loại tài khoản Microsoft chính: tài khoản Microsoft cá nhân và tài khoản cơ quan hoặc trường học. OneDrive được liên kết với tài khoản Microsoft, nhưng loại OneDrive thay đổi một chút tùy thuộc vào loại tài khoản được liệt kê ở trên.

Hiện tại, API OneDrive có thể được sử dụng với cả hai loại tài khoản trên. Trong chương trình này dưới dạng "được tạo dưới dạng ứng dụng bảng điều khiển và được thực thi mà không cần người dùng thao tác", Xin lưu ý rằng nó chỉ có thể được sử dụng với tài khoản Microsoft trong tài khoản "Tài khoản cơ quan hoặc trường học". Điều này là do sự khác biệt trong phương pháp xác thực.

Giới thiệu về phương thức xác thực

Trước tiên, bạn phải xác thực để truy cập OneDrive theo chương trình. Như đã đề cập ở trên, bất kỳ chương trình nào cũng có thể truy cập OneDrive, nhưng việc xác thực để kết nối với API phụ thuộc vào cách chương trình đang chạy. Các ứng dụng web và ứng dụng máy tính để bàn có thể được xác thực bằng cách tương tác của người dùng. Vì người dùng không thể vận hành nó trong một ứng dụng console chạy trong nền nên phương thức xác thực cũng khác với phương pháp trên.

Tôi không biết lý do chi tiết vì tôi chưa thể tra cứu, nhưng nếu nghĩ đến thì có vẻ là do bảo mật và quản lý tài khoản. Tôi chỉ có thể nói rằng đây đã là một đặc tả kỹ thuật, vì vậy nếu bạn muốn truy cập OneDrive theo chương trình được liên kết với "tài khoản Microsoft cá nhân", Tôi nghĩ rằng không có lựa chọn nào khác ngoài việc sử dụng một chương trình khác ngoài một chương trình chạy trong nền hoặc chạy một ứng dụng console với phương pháp xác thực bao gồm các hoạt động của người dùng.

Chúng tôi sẽ không sử dụng thư viện để truy cập API OneDrive tại thời điểm này

Truy cập vào API OneDrive tương đối dễ xử lý bằng cách sử dụng thư viện có tên là "Microsoft Graph". Trong trường hợp này, chúng ta sẽ sử dụng phương pháp truy cập trực tiếp vào URL của API và thực thi nó. Nó hơi rườm rà, nhưng vì nó không sử dụng thư viện nên nó có ưu điểm là các chương trình non-.NET có thể truy cập API OneDrive theo cách tương tự. Nó cũng ngăn ngừa nhược điểm là mã thay đổi do các phiên bản khác nhau của thư viện.

Chúng tôi sẽ chỉ cho bạn cách sử dụng Microsoft Graph trong một mẹo khác.

Điều kiện tiên quyết

  • Bạn có tài khoản Microsoft cho tài khoản cơ quan hoặc trường học
  • Bạn có thể sử dụng OneDrive được liên kết với tài khoản Microsoft được liệt kê ở trên (ví dụ: OneDrive Business)
  • Visual Studio 2022 đã được cài đặt

Thiết lập ứng dụng của bạn để truy nhập tài khoản Microsoft hoặc OneDrive của bạn trong Azure

Đăng nhập vào Azure tại URL sau:

Từ trường tìm kiếm ở trên, nhập "đăng ký ứng dụng" và chọn nó.

Nhấp vào Đăng ký mới.

Nội dung của "Tên" là tùy tiện. Vui lòng nhập tên mô tả.

Chọn "Loại tài khoản được hỗ trợ" khác với "Chỉ tài khoản Microsoft cá nhân". Điều này là do, như đã đề cập ở trên, xác thực này chỉ có thể được sử dụng với các tài khoản thuộc về một tổ chức. Trong trường hợp này, chúng tôi đã chọn "Tài khoản trong bất kỳ thư mục tổ chức nào (bất kỳ đối tượng thuê ID Microsoft Entra nào - nhiều đối tượng thuê) và tài khoản Microsoft cá nhân (Skype, Xbox, v.v.)".

Bạn không cần phải nhập "URI chuyển hướng" vì nó sẽ không được sử dụng lần này.

Khi bạn hoàn tất, hãy nhấp vào nút "Đăng ký".

Bạn sẽ được đưa đến trang tóm tắt của đăng ký ứng dụng mà bạn đã tạo, vì vậy hãy sao chép ID Ứng dụng (máy khách) và ID Thư mục (đối thuê). Bạn sẽ sử dụng giá trị này sau.

Chọn "Chứng chỉ & bí mật" từ danh mục quản lý ở menu bên trái và đảm bảo rằng "Bí mật khách hàng" được chọn ở tab giữa. Nhấp vào Bí mật khách hàng mới.

Nhập Mô tả là tùy chọn. Nếu bạn muốn tiếp tục sử dụng nó, vui lòng kèm theo lời giải thích giải thích rõ ràng mục đích sử dụng.

"Ngày hết hạn" là khoảng thời gian mà bí mật máy khách này có hiệu lực. Vì lần này dành cho mục đích thử nghiệm nên là 90 ngày, nhưng vui lòng đặt nó theo mục đích sử dụng.

Khi bạn tạo bí mật máy khách, nó sẽ được thêm vào danh sách. Trong đó, chúng ta sẽ sử dụng giá trị trong cột "Giá trị", vì vậy hãy sao chép nó. Lưu ý rằng giá trị này không thể được sao chép sau này.

Tiếp theo, chọn "Quyền API" từ danh mục Quản trị ở menu bên trái và nhấp vào "Thêm quyền" ở giữa.

Trong yêu cầu quyền API, bấm vào Microsoft Graph.

Nhấp vào Cho phép ứng dụng. Tùy chọn này không khả dụng cho tài khoản Microsoft cá nhân.

Danh sách các quyền sẽ được hiển thị bên dưới, vì vậy hãy sử dụng trường tìm kiếm để kiểm tra các mục sau.

  • Files.ReadWrite.Tất cả

Như vậy là đủ nếu bạn chỉ muốn sử dụng OneDrive, nhưng nếu bạn muốn truy cập bất kỳ thứ gì khác, hãy thêm quyền. Các quyền cần thiết để truy cập OneDrive có thể được tìm thấy trên trang chính thức bên dưới.

Khi bạn đã thực hiện lựa chọn của mình, hãy nhấp vào nút Thêm quyền.

Cái được thêm vào danh sách và "Loại" là "Ứng dụng". Tuy nhiên, vì "Trạng thái" là "Không được cấp cho XXXX", hãy nhấp vào "Cung cấp sự đồng ý của quản trị viên cho XXXX". (XXXX là tên tổ chức của bạn)

Nhấp vào Có.

Nó thay đổi thành trạng thái được cấp.

Nhân tiện, bạn có thể xóa "User.Read được ủy quyền" ở đó ngay từ đầu vì chúng tôi sẽ không sử dụng nó lần này. Nếu bạn đã thêm "User.Read" làm ứng dụng, hãy sử dụng nó.

Xác minh ID người dùng

Vì bạn sẽ truy cập OneDrive mà người dùng mục tiêu có, hãy kiểm tra trước ID người dùng.

Microsoft Entra ID và mở nó.

Chọn Người dùng từ menu bên trái.

Danh sách người dùng sẽ được hiển thị, vì vậy hãy nhấp vào người dùng mục tiêu.

Ghi lại "ID đối tượng" vì nó sẽ là ID người dùng.

Tạo ứng dụng bảng điều khiển

Khởi động Visual Studio và tạo một dự án cho ứng dụng bảng điều khiển của bạn. Bạn có thể tạo nó bên ngoài Visual Studio, nhưng bây giờ tôi sẽ sử dụng Visual Studio.

Vị trí và tên dự án là tùy chọn. Trong trường hợp này, tên dự án là OneDriveApiDotNetClientCredentialsHttpClient .

Lần này, chúng tôi sẽ không chia mã mà sẽ Program.cs viết so le từ trên xuống, vì vậy nếu bạn có thể kiểm tra chuyển động, vui lòng viết lại bằng cách chia mã nếu cần.

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

Mô tả không gian tên bạn muốn sử dụng.

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

Lớp này được sử dụng để nhận thông tin mã thông báo sau khi xác thực. Program.cs , vui lòng viết nó ở cuối mã. Bạn có thể tách lớp này thành các tệp khác.

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

Đây là một phương pháp kỳ diệu định dạng văn bản JSON nhận được từ API với thụt lề. Vì nó là một mã được lấy từ Internet nên tôi sẽ không giải thích chi tiết nội dung.

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

Đặt ID nhận được trên Azure cho từng loại. accessToken là mã thông báo tạm thời để truy cập OneDrive, vì vậy nó được đặt trong thời gian chạy.

// 各種 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 để xác thực và URL API để lấy danh sách các thư mục ở thư mục gốc của OneDvie. Đây là mô tả về cách kiểm tra quyền truy cập vào API OneDrive, vì vậy tôi sẽ không mô tả nội dung của API OneDrive. Nếu bạn có quyền truy cập vào API OneDrive, tải lên và tải xuống là một ứng dụng, vì vậy tôi không nghĩ nó khó lắm.

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

Bạn đã tạo một để thực hiện một yêu cầu đến HttpClient URL được chỉ định.

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

Đầu tiên, bạn sẽ thực hiện yêu cầu đến API xác thực với dữ liệu, vì vậy hãy chuẩn bị dữ liệu đó. Định dạng của dữ liệu được gửi là một chuỗi tham số truy vấn ở định dạng "Name1=Value1&Name2=Value2...", vì vậy nó được tạo trong từ điển và sau đó được chuyển đổi thành chuỗi tham số truy vấn.

Có bốn thông số sẽ được gửi:

Ví dụ về
giá trị tên tham số
client_id Đặt ID ứng dụng mà bạn đã nhận được trong quá trình đăng ký ứng dụng.
phạm vi Xác thực với bí mật máy khách được cố định https://graph.microsoft.com/.default .
client_secret Đặt giá trị của bí mật máy khách mà bạn có được trong quá trình đăng ký ứng dụng.
grant_type Vì nó là xác thực bằng bí mật máy khách, nó client_credentials sẽ là

Để biết thêm thông tin, vui lòng tham khảo trang web chính thức sau.

// 認証処理
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 để thực hiện yêu cầu đến API xác thực. HttpClient Đó là một cách sử dụng phổ biến, vì vậy tôi không nghĩ có nhiều điều cần chú ý.

Dữ liệu được gửi phải được mã hóa UTF8 và Content-Type phải là application/x-www-form-urlencoded . Phương pháp là POST .

Nếu phản IsSuccessStatusCode hồi được kiểm tra và xử lý thành công, bạn sẽ nhận được kết quả dưới dạng chuỗi JSON. JSON bạn nhận được có các tham số sau:

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

Trong đó, access_token chúng tôi sẽ sử dụng . Sử dụng giá trị này với API OneDrive. Bạn có thể bỏ qua các tham số khác, nhưngaccess_token nếu bạn muốn biết ngày hết hạn của , hãy sử dụng expires_in .

Rất khó để sử dụng như một chuỗi JSON, vì vậy JsonSerializer.Deserialize chúng ta giải tuần tự nó với và sau đó access_token nhận được .

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

Cuối cùng, sử dụng mã thông báo truy cập để thực hiện yêu cầu đến API OneDrive. Phương thức chỉ định GET , nhưng nó phụ thuộc vào loại API, vì vậy hãy kiểm tra tài liệu API OneDrive.

Thêm mã truy cập vào tiêu đề. Đặt khóa là và Authorization giá trị trong định Bearer {アクセストークン} dạng .

Tất cả những gì bạn phải làm là đưa ra yêu cầu và nhận kết quả dưới dạng chuỗi JSON. Bây giờ chúng ta chỉ đảm bảo rằng chúng ta có quyền truy cập vào API OneDrive, chúng ta chỉ định dạng chuỗi JSON và in nó vào bảng điều khiển. Trên thực tế, nó giải tuần tự hóa JSON nhận được và xử lý nó cho phù hợp.

Lần này tôi đã nhận được một danh sách các thư mục, nhưng tôi nghĩ JSON như sau.

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

Tôi không nghĩ bạn cần tất cả thông tin, vì vậy nếu bạn chỉ muốn lấy tên thư mục, ví dụ, bạn value chỉ có thể lấy các tham số từ name mảng trong .

Tóm tắt

Nếu nó hoạt động tốt cho đến nay, bạn sẽ có thể truy cập OneDrive bằng một chương trình hàng loạt. Tôi không biết các mẹo có tóm tắt các phương pháp tải lên và tải xuống hay không, nhưng về cơ bản nó sẽ hoạt động nếu bạn áp dụng danh sách các thư mục trong root được mô tả ở trên. Các loại API được tóm tắt trên trang web chính thức bên dưới, vì vậy hãy tìm API bạn muốn sử dụng và triển khai nó.

Cảm ơn

Lần này tôi có một số câu hỏi về việc sử dụng API OneDrive, vì vậy tôi đã đặt một câu hỏi.