ใช้ OneDrive API โดยไม่ต้องมีการโต้ตอบกับผู้ใช้ เช่น โปรแกรมแบตช์ (เวอร์ชัน .NET C#) (ไม่มีไลบรารีการใช้งานเพิ่มเติม)

ปรับปรุงหน้า :
วันที่สร้างเพจ :

สภาพแวดล้อมในการทํางาน

วิชวลสตูดิโอ
  • วิชวลสตูดิโอ 2022
ตาข่าย
  • .NET 8
API การรับรองความถูกต้องของ Microsoft
  • 2.0 โอ๊ทัยวต์ 2
Microsoft OneDrive API
  • 1.0
ชนิดของบัญชี Microsoft
  • บัญชีที่ทํางานหรือโรงเรียน

ข้อกําหนดเบื้องต้น

วิชวลสตูดิโอ
  • หนึ่งในเวอร์ชัน
ตาข่าย
  • หนึ่งในเวอร์ชัน
API การรับรองความถูกต้องของ Microsoft
  • 2.0 โอ๊ทัยวต์ 2
Microsoft OneDrive API
  • 1.0
ชนิดของบัญชี Microsoft
  • บัญชีที่ทํางานหรือโรงเรียน

เกี่ยวกับวัตถุประสงค์ของงานนี้

ตอนนี้ คุณจะใช้ OneDrive API เพื่อเตรียมคุณสําหรับการอัปโหลดและดาวน์โหลดไฟล์ไปยัง OneDrive โดยทางโปรแกรม ในบทความนี้ เราจะพูดถึงสิ่งที่คุณสามารถทําได้ด้วย OneDrive API ดังนั้นเราจะไม่พูดถึงสิ่งที่คุณสามารถทําได้ด้วย OneDrive API อย่างไรก็ตาม ตราบใดที่คุณสามารถเชื่อมต่อได้ คุณสามารถอ่านเอกสารประกอบ API และนําไปใช้หลังจากนั้นได้

วิธีเรียกใช้โปรแกรม

การเข้าถึง OneDrive ไม่ได้ขึ้นอยู่กับรูปแบบของโปรแกรม เช่น เว็บแอปพลิเคชัน แอปพลิเคชันเดสก์ท็อป หรือแอปพลิเคชันคอนโซล และสามารถเรียกใช้โดยโปรแกรมต่างๆ ในกรณีนี้เราจะสร้างแอปพลิเคชันคอนโซลและดําเนินการโดยอัตโนมัติโดยไม่ต้องดําเนินการใด ๆ ของผู้ใช้

บัญชี Microsoft ประเภทต่าง ๆ มีอะไรบ้าง

หากคุณเคยสร้างบัญชี Microsoft คุณอาจเคยเห็น บัญชี Microsoft มีสองประเภทหลัก ได้แก่ บัญชี Microsoft ส่วนบุคคลและบัญชีที่ทํางานหรือโรงเรียน OneDrive เชื่อมโยงกับบัญชี Microsoft แต่ชนิดของ OneDrive จะแตกต่างกันเล็กน้อยขึ้นอยู่กับชนิดบัญชีที่ระบุไว้ข้างต้น

ในขณะนี้ OneDrive API สามารถใช้กับบัญชีทั้งสองประเภทข้างต้นได้ ในโปรแกรมนี้ในรูปแบบของ "สร้างเป็นแอปพลิเคชันคอนโซลและดําเนินการโดยไม่ต้องดําเนินการโดยผู้ใช้" โปรดทราบว่าสามารถใช้ได้กับบัญชี Microsoft ในบัญชี "บัญชีที่ทํางานหรือโรงเรียน" เท่านั้น นี่เป็นเพราะความแตกต่างในวิธีการตรวจสอบสิทธิ์

เกี่ยวกับวิธีการรับรองความถูกต้อง

ขั้นแรก คุณต้องรับรองความถูกต้องเพื่อเข้าถึง OneDrive โดยทางโปรแกรม โปรแกรมใด ๆ สามารถเข้าถึง OneDrive ได้ แต่การรับรองความถูกต้องเพื่อเชื่อมต่อกับ API ขึ้นอยู่กับวิธีการทํางานของโปรแกรม เว็บแอปพลิเคชันและแอปพลิเคชันเดสก์ท็อปสามารถตรวจสอบสิทธิ์ได้โดยการโต้ตอบของผู้ใช้ เนื่องจากผู้ใช้ไม่สามารถใช้งานในแอปพลิเคชันคอนโซลที่ทํางานในพื้นหลังวิธีการตรวจสอบสิทธิ์จึงแตกต่างจากข้างต้นเช่นกัน

ไม่ทราบเหตุผลโดยละเอียดเพราะไม่สามารถค้นหาได้ แต่ถ้านึกถึงก็ดูเหมือนว่าจะเป็นเพราะความปลอดภัยและการจัดการบัญชี ฉันสามารถพูดได้ว่านี่เป็นข้อกําหนดอยู่แล้วดังนั้นหากคุณต้องการเข้าถึง OneDrive โดยทางโปรแกรมที่เชื่อมโยงกับ "บัญชี Microsoft ส่วนบุคคล" ฉันคิดว่าไม่มีทางเลือกอื่นนอกจากใช้โปรแกรมอื่นนอกเหนือจากโปรแกรมที่ทํางานในพื้นหลัง หรือเรียกใช้แอปพลิเคชันคอนโซลด้วยวิธีการรับรองความถูกต้องที่มีการดําเนินการของผู้ใช้

เราจะไม่ใช้ไลบรารีเพื่อเข้าถึง OneDrive API ในขณะนี้

การเข้าถึง OneDrive API นั้นค่อนข้างง่ายในการจัดการโดยใช้ไลบรารีที่เรียกว่า "Microsoft Graph" ในกรณีนี้ เราจะใช้วิธีการเข้าถึง URL ของ API โดยตรงและดําเนินการ มันค่อนข้างยุ่งยาก แต่เนื่องจากไม่ได้ใช้ไลบรารีจึงมีข้อดีที่โปรแกรม non-.NET สามารถเข้าถึง OneDrive API ในลักษณะเดียวกัน นอกจากนี้ยังป้องกันข้อเสียที่โค้ดเปลี่ยนแปลงเนื่องจากไลบรารีเวอร์ชันต่างๆ

เราจะแสดงวิธีใช้ Microsoft Graph ในเคล็ดลับอื่น

เงื่อนไขเบื้องต้น

  • คุณมีบัญชี Microsoft สําหรับบัญชีที่ทํางานหรือโรงเรียน
  • คุณสามารถใช้ OneDrive ที่เชื่อมโยงกับบัญชี Microsoft ที่ระบุไว้ข้างต้น (เช่น OneDrive Business)
  • ติดตั้ง Visual Studio 2022 แล้ว

ตั้งค่าแอปพลิเคชันของคุณเพื่อเข้าถึงบัญชี Microsoft หรือ OneDrive ใน Azure

เข้าสู่ระบบ Azure ที่ URL ต่อไปนี้:

จากช่องค้นหาด้านบน ให้พิมพ์ "การลงทะเบียนแอป" แล้วเลือก

คลิก "การลงทะเบียนใหม่"

เนื้อหาของ "ชื่อ" เป็นไปโดยพลการ โปรดป้อนชื่อที่สื่อความหมาย

เลือก "ประเภทบัญชีที่รองรับ" นอกเหนือจาก "บัญชี Microsoft ส่วนบุคคลเท่านั้น" เนื่องจากตามที่ได้กล่าวไว้ข้างต้นการรับรองความถูกต้องนี้สามารถใช้ได้กับบัญชีที่เป็นขององค์กรเท่านั้น ในกรณีนี้ เราได้เลือก "บัญชีในไดเรกทอรีขององค์กรใดๆ (ผู้เช่า Microsoft Entra ID - ผู้เช่าหลายราย) และบัญชี Microsoft ส่วนบุคคล (Skype, Xbox ฯลฯ)"

คุณไม่จําเป็นต้องป้อน "เปลี่ยนเส้นทาง URI" เพราะจะไม่ถูกใช้ในครั้งนี้

เมื่อเสร็จแล้ว ให้คลิกปุ่ม "ลงทะเบียน"

คุณจะถูกนําไปยังหน้าสรุปของการลงทะเบียนแอปที่คุณสร้างขึ้น ดังนั้นให้คัดลอกรหัสแอปพลิเคชัน (ไคลเอ็นต์) และรหัสไดเรกทอรี (ผู้เช่า) คุณจะใช้ค่านี้ในภายหลัง

เลือก "ใบรับรองและข้อมูลลับ" จากหมวดหมู่การจัดการในเมนูด้านซ้าย และตรวจสอบให้แน่ใจว่าได้เลือก "ความลับของไคลเอ็นต์" ในแท็บตรงกลาง คลิก ข้อมูลลัดไคลเอ็นต์ใหม่

การป้อนคําอธิบายเป็นทางเลือก หากคุณต้องการใช้งานต่อไป โปรดระบุคําอธิบายที่อธิบายวัตถุประสงค์การใช้งานอย่างชัดเจน

"วันหมดอายุ" คือระยะเวลาที่ข้อมูลส่วนตัวของไคลเอ็นต์นี้ถูกต้อง เนื่องจากมีวัตถุประสงค์ในการทดสอบในครั้งนี้ จึงมีอายุ 90 วัน แต่โปรดตั้งค่าตามวัตถุประสงค์ในการใช้งาน

เมื่อคุณสร้างข้อมูลลับไคลเอ็นต์ ระบบจะเพิ่มข้อมูลดังกล่าวลงในรายการ ในนี้เราจะใช้ค่าในคอลัมน์ "ค่า" ดังนั้นคัดลอก โปรดสังเกตว่าค่านี้ไม่สามารถคัดลอกได้ในภายหลัง

จากนั้นเลือก "สิทธิ์ API" จากหมวดหมู่การดูแลระบบในเมนูด้านซ้าย แล้วคลิก "เพิ่มสิทธิ์" ตรงกลาง

ในคําขอสิทธิ์ API ให้คลิก Microsoft Graph

คลิก อนุญาตแอปพลิเคชัน ตัวเลือกนี้ไม่พร้อมใช้งานสําหรับบัญชี Microsoft ส่วนบุคคล

รายการสิทธิ์จะแสดงด้านล่าง ดังนั้นให้ใช้ช่องค้นหาเพื่อตรวจสอบรายการต่อไปนี้

  • ไฟล์.ReadWrite.All

แค่นี้ก็เพียงพอแล้วหากคุณต้องการใช้ OneDrive เท่านั้น แต่ถ้าคุณต้องการเข้าถึงอย่างอื่นให้เพิ่มสิทธิ์ สิทธิ์ที่จําเป็นในการเข้าถึง OneDrive สามารถพบได้ในหน้าอย่างเป็นทางการด้านล่าง

เมื่อคุณเลือกแล้ว ให้คลิกปุ่มเพิ่มสิทธิ์

สิ่งที่เพิ่มจะถูกเพิ่มลงในรายการ และ "ประเภท" คือ "แอปพลิเคชัน" อย่างไรก็ตาม เนื่องจาก "สถานะ" คือ "ไม่ได้มอบให้กับ XXXX" ให้คลิก "ให้ความยินยอมแก่ผู้ดูแลระบบกับ XXXX" (XXXX คือชื่อองค์กรของคุณ)

คลิก ใช่

มันเปลี่ยนเป็นสถานะที่ได้รับ

อย่างไรก็ตาม คุณสามารถลบ "User.Read ที่ได้รับมอบหมาย" ที่มีอยู่ตั้งแต่ต้นเพราะเราจะไม่ใช้ในครั้งนี้ ถ้าคุณเพิ่ม "User.Read" เป็นแอปพลิเคชัน ให้ใช้

การยืนยัน ID ผู้ใช้

เนื่องจากคุณจะเข้าถึง OneDrive ที่ผู้ใช้เป้าหมายมี ให้ตรวจสอบ ID ผู้ใช้ล่วงหน้า

Microsoft Entra ID และเปิดมัน

เลือก ผู้ใช้ จากเมนูทางด้านซ้าย

รายชื่อผู้ใช้จะปรากฏขึ้น ดังนั้นคลิกที่ผู้ใช้เป้าหมาย

จดบันทึก "ID อ็อบเจ็กต์" เนื่องจากจะเป็น ID ผู้ใช้

สร้างแอปพลิเคชันคอนโซล

เริ่ม Visual Studio และสร้างโครงการสําหรับแอปพลิเคชันคอนโซลของคุณ คุณสามารถสร้างมันนอก Visual Studio ได้ แต่ฉันจะใช้ Visual Studio ในตอนนี้

สถานที่และชื่อโครงการเป็นทางเลือก ในกรณีนี้ ชื่อโครงการคือ OneDriveApiDotNetClientCredentialsHttpClient .

คราวนี้เราจะไม่แบ่งโค้ด แต่ Program.cs จะเขียนเซจากด้านบนดังนั้นหากคุณสามารถตรวจสอบการเคลื่อนไหวได้โปรดเขียนใหม่โดยแบ่งโค้ดตามความจําเป็น

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

อธิบายเนมสเปซที่คุณต้องการใช้

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

คลาสนี้ใช้เพื่อรับข้อมูลโทเค็นหลังจากการรับรองความถูกต้อง Program.cs โปรดเขียนไว้ท้ายรหัส คุณสามารถแยกคลาสนี้ออกเป็นไฟล์อื่นได้

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

นี่เป็นวิธีการมหัศจรรย์ที่จัดรูปแบบข้อความ JSON ที่ได้รับจาก API ด้วยการเยื้อง เนื่องจากเป็นรหัสที่หยิบมาจากอินเทอร์เน็ต ฉันจะไม่อธิบายเนื้อหาโดยละเอียด

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

ตั้งค่า ID ที่ได้รับบน Azure สําหรับแต่ละรายการ accessToken เป็นโทเค็นชั่วคราวสําหรับการเข้าถึง OneDrive ดังนั้นจึงมีการตั้งค่าในขณะรันไทม์

// 各種 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 สําหรับการรับรองความถูกต้องและ URL API เพื่อรับรายการโฟลเดอร์ที่รากของ OneDvie นี่คือคําอธิบายเกี่ยวกับวิธีการตรวจสอบการเข้าถึง OneDrive API ดังนั้นฉันจะไม่อธิบายเนื้อหาของ OneDrive API หากคุณสามารถเข้าถึง OneDrive API การอัปโหลดและดาวน์โหลดเป็นแอปพลิเคชัน ดังนั้นฉันจึงไม่คิดว่ามันยากขนาดนั้น

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

คุณได้สร้างคําขอไปยัง HttpClient URL ที่ระบุแล้ว

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

ขั้นแรก คุณจะต้องส่งคําขอไปยัง API การตรวจสอบสิทธิ์พร้อมข้อมูล ดังนั้นให้เตรียมข้อมูลนั้น รูปแบบของข้อมูลที่จะส่งคือสตริงพารามิเตอร์แบบสอบถามในรูปแบบ "Name1=Value1&Name2=Value2..." ดังนั้นจึงถูกสร้างขึ้นในพจนานุกรม แล้วแปลงเป็นสตริงพารามิเตอร์แบบสอบถาม

มีพารามิเตอร์สี่ตัวที่จะส่ง:

ตัวอย่าง
ค่าชื่อพารามิเตอร์
client_id ตั้งค่ารหัสไคลเอ็นต์ที่คุณได้รับในการลงทะเบียนแอป
ขอบเขต การรับรองความถูกต้องด้วยความลับของไคลเอ็นต์ได้รับการแก้ไขhttps://graph.microsoft.com/.default
client_secret ตั้งค่าของข้อมูลลัดไคลเอ็นต์ที่คุณได้รับในการลงทะเบียนแอป
grant_type เนื่องจากเป็นการรับรองความถูกต้องด้วยความลับของ client_credentials ไคลเอ็นต์

สําหรับข้อมูลเพิ่มเติม โปรดดูที่เว็บไซต์อย่างเป็นทางการต่อไปนี้

// 認証処理
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 เพื่อส่งคําขอไปยัง API การตรวจสอบสิทธิ์ HttpClient มันเป็นการใช้งานทั่วไป ดังนั้นฉันจึงไม่คิดว่ามีอะไรให้ความสนใจมากนัก

ข้อมูลที่จะส่งจะต้องเข้ารหัส UTF8 และ Content-Type ควรเป็น application/x-www-form-urlencoded . วิธีการคือ POST .

หาก IsSuccessStatusCode การตอบกลับได้รับการตรวจสอบและประมวลผลสําเร็จ คุณจะได้รับผลลัพธ์เป็นสตริง JSON JSON ที่คุณได้รับมีพารามิเตอร์ต่อไปนี้:

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

ในนี้เราจะ access_token ใช้ . ใช้ค่านี้กับ OneDrive API คุณสามารถละเว้นพารามิเตอร์อื่น ๆ ได้ แต่access_token ถ้าคุณต้องการทราบวันหมดอายุของ ให้ใช้ expires_in .

มันยากที่จะใช้เป็นสตริง JSON ดังนั้น JsonSerializer.Deserialize เราจึง deserialize ด้วย แล้วรับ access_token .

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

สุดท้าย ให้ใช้โทเค็นการเข้าถึงเพื่อส่งคําขอไปยัง OneDrive API วิธีการระบุ GET แต่ขึ้นอยู่กับชนิดของ API ดังนั้นโปรดตรวจสอบเอกสารประกอบ OneDrive API

เพิ่มโทเค็นการเข้าถึงไปยังส่วนหัว ตั้งค่าคีย์เป็น Authorization และค่าในรูปแบบBearer {アクセストークン}

สิ่งที่คุณต้องทําคือส่งคําขอและรับผลลัพธ์เป็นสตริง JSON ตอนนี้เราเพิ่งตรวจสอบให้แน่ใจว่าเราสามารถเข้าถึง OneDrive API เราได้จัดรูปแบบสตริง JSON และพิมพ์ลงในคอนโซล ในความเป็นจริงมัน deserialize JSON ที่ได้รับและประมวลผลตามนั้น

ฉันได้รับรายการโฟลเดอร์ในครั้งนี้ แต่ฉันคิดว่า JSON มีดังนี้

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

ฉันไม่คิดว่าคุณต้องการข้อมูลทั้งหมดดังนั้นหากคุณต้องการรับเฉพาะชื่อโฟลเดอร์ตัวอย่างเช่นคุณสามารถ value รับเฉพาะพารามิเตอร์จาก name อาร์เรย์ใน

สรุป

หากใช้งานได้ดีคุณควรจะสามารถเข้าถึง OneDrive ด้วยโปรแกรมแบทช์ได้ ฉันไม่รู้ว่าเคล็ดลับสรุปวิธีการอัปโหลดและดาวน์โหลดหรือไม่ แต่โดยพื้นฐานแล้วควรใช้ได้หากคุณใช้รายการโฟลเดอร์ในรูทที่อธิบายไว้ข้างต้น ประเภทของ API สรุปไว้ในเว็บไซต์ทางการด้านล่าง ดังนั้นโปรดค้นหา API ที่คุณต้องการใช้และนําไปใช้

ขอบคุณ

ฉันมีคําถามเกี่ยวกับการใช้ OneDrive API ในครั้งนี้ ดังนั้นฉันจึงถามคําถาม