استفاده از OneDrive API بدون تعامل کاربر، مانند یک برنامه دسته ای (نسخه .NET C#) (بدون استفاده از کتابخانه های اضافی)
محیط عملیاتی
- ویژوال استودیو
-
- ویژوال استودیو 2022
- .خالص
-
- دات نت 8
- API احراز هویت مایکروسافت
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- انواع حساب های مایکروسافت
-
- حساب کاری یا تحصیلی
پیش نیازها
- ویژوال استودیو
-
- یکی از نسخه ها
- .خالص
-
- یکی از نسخه ها
- API احراز هویت مایکروسافت
-
- 2.0 OAuth 2
- Microsoft OneDrive API
-
- 1.0
- انواع حساب های مایکروسافت
-
- حساب کاری یا تحصیلی
درباره هدف این رویداد
اکنون از API های OneDrive استفاده خواهید کرد تا شما را برای آپلود و دانلود برنامه نویسی فایل ها در OneDrive آماده کند. در این مقاله، به کارهایی که می توانید با OneDrive API انجام دهید می پردازیم، بنابراین به کارهایی که می توانید با OneDrive API انجام دهید نمی پردازیم. با این حال، تا زمانی که بتوانید متصل شوید، می توانید مستندات API را بخوانید و پس از آن آن را اعمال کنید.
نحوه اجرای برنامه
دسترسی به OneDrive به شکل برنامه مانند برنامه وب، برنامه دسکتاپ یا برنامه کنسول بستگی ندارد و می تواند توسط برنامه های مختلفی اجرا شود. در این حالت یک اپلیکیشن کنسول ایجاد می کنیم و آن را به صورت خودکار و بدون هیچ عملیات کاربری اجرا می کنیم.
انواع مختلف حساب های مایکروسافت چیست؟
اگر تا به حال یک حساب مایکروسافت ایجاد کرده اید، احتمالا آن را دیده اید. دو نوع اصلی از حساب های Microsoft وجود دارد: حساب های شخصی Microsoft و حساب های کاری یا تحصیلی. OneDrive به یک حساب مایکروسافت گره خورده است، اما نوع OneDrive بسته به نوع حساب ذکر شده در بالا کمی متفاوت است.
در حال حاضر، OneDrive API را می توان با هر دو نوع حساب فوق استفاده کرد. در این برنامه به صورت "ایجاد شده به عنوان یک برنامه کنسول و بدون عملیات کاربر" ، لطفا توجه داشته باشید که فقط با یک حساب Microsoft در حساب «حساب کاری یا تحصیلی» قابل استفاده است. این به دلیل تفاوت در روش های احراز هویت است.
درباره روش احراز هویت
ابتدا برای دسترسی برنامه نویسی به OneDrive باید احراز هویت کنید. همانطور که در بالا ذکر شد، هر برنامه ای می تواند به OneDrive دسترسی داشته باشد، اما احراز هویت برای اتصال به API به نحوه اجرای برنامه بستگی دارد. برنامه های وب و برنامه های دسکتاپ را می توان با تعامل کاربر احراز هویت کرد. از آنجایی که کاربر نمی تواند آن را در یک برنامه کنسولی که در پس زمینه اجرا می شود، کار کند، روش احراز هویت نیز با موارد فوق متفاوت است.
دلیل دقیق آن را نمی دانم زیرا نتوانسته ام آن را جستجو کنم، اما اگر به ذهنم خطور کند، به نظر می رسد به دلیل امنیت و مدیریت حساب باشد. من فقط می توانم بگویم که این در حال حاضر یک مشخصات است، بنابراین اگر می خواهید به صورت برنامه نویسی به OneDrive مرتبط با یک "حساب شخصی مایکروسافت" دسترسی داشته باشید، من فکر می کنم چاره ای جز استفاده از برنامه ای غیر از برنامه ای که در پس زمینه اجرا می شود یا اجرای یک برنامه کنسول با روش احراز هویت که شامل عملیات کاربر است وجود ندارد.
ما در حال حاضر از کتابخانه برای دسترسی به OneDrive API استفاده نخواهیم کرد
دسترسی به OneDrive API با استفاده از کتابخانه ای به نام "Microsoft Graph" نسبتا آسان است. در این حالت از روش دسترسی مستقیم به URL API و اجرای آن استفاده خواهیم کرد. کمی دست و پا گیر است، اما از آنجایی که از کتابخانه استفاده نمی کند، این مزیت را دارد که برنامه های non-.NET می توانند به همان روش به OneDrive API دسترسی داشته باشند. همچنین از آسیب تغییر کد به دلیل نسخه های مختلف کتابخانه جلوگیری می کند.
ما در نکته دیگری نحوه استفاده از Microsoft Graph را به شما نشان خواهیم داد.
پیش شرط
- شما یک حساب Microsoft برای یک حساب کاری یا تحصیلی دارید
- می توانید از OneDrive مرتبط با حساب مایکروسافت ذکر شده در بالا استفاده کنید (به عنوان مثال، OneDrive Business)
- ویژوال استودیو 2022 نصب شده است
برنامه خود را برای دسترسی به حساب مایکروسافت یا OneDrive خود در Azure راه اندازی کنید
با URL زیر وارد Azure شوید:
از قسمت جستجوی بالا، "ثبت برنامه ها" را تایپ کرده و آن را انتخاب کنید.
روی ثبت نام جدید کلیک کنید.
محتوای "نام" دلخواه است. لطفا یک نام توصیفی وارد کنید.
"نوع حساب پشتیبانی شده" را به غیر از "فقط حساب های Microsoft شخصی" انتخاب کنید. این به این دلیل است که همانطور که در بالا ذکر شد، این احراز هویت فقط با حساب هایی که متعلق به یک سازمان هستند قابل استفاده است. در این مورد، ما "حساب ها در هر دایرکتوری سازمانی (هر مستاجر Microsoft Entra ID - چند مستاجر) و حساب های شخصی مایکروسافت (اسکایپ، ایکس باکس و غیره)" را انتخاب کرده ایم.
نیازی به وارد کردن "Redirect URI" ندارید زیرا این بار از آن استفاده نخواهد شد.
وقتی کارتان تمام شد، روی دکمه "ثبت نام" کلیک کنید.
شما به صفحه خلاصه ثبت برنامه ای که ایجاد کرده اید هدایت خواهید شد، بنابراین شناسه برنامه (مشتری) و شناسه دایرکتوری (مستاجر) را کپی کنید. بعدا از این مقدار استفاده خواهید کرد.
"Certificates & secrets" را از دسته مدیریت در منوی سمت چپ انتخاب کنید و مطمئن شوید که "Client secrets" در برگه میانی انتخاب شده است. روی New Client Secret کلیک کنید.
وارد کردن توضیحات اختیاری است. اگر می خواهید به استفاده از آن ادامه دهید، لطفا توضیحی را ارائه دهید که هدف استفاده را به وضوح توضیح دهد.
"تاریخ انقضا" مدت زمانی است که این راز مشتری معتبر است. از آنجایی که این بار برای اهداف آزمایشی است، 90 روز است، اما لطفا آن را با توجه به هدف استفاده تنظیم کنید.
هنگامی که یک راز مشتری ایجاد می کنید، به لیست اضافه می شود. در این، ما از مقدار در ستون "Value" استفاده خواهیم کرد، بنابراین آن را کپی کنید. توجه داشته باشید که این مقدار را نمی توان بعدا کپی کرد.
در مرحله بعد، "مجوزهای API" را از دسته مدیریت در منوی سمت چپ انتخاب کنید و روی "افزودن مجوزها" در وسط کلیک کنید.
در درخواست مجوز API، روی Microsoft Graph کلیک کنید.
روی Allow Application کلیک کنید. این گزینه برای حساب های شخصی Microsoft در دسترس نیست.
لیستی از مجوزها در زیر نمایش داده می شود، بنابراین از قسمت جستجو برای بررسی موارد زیر استفاده کنید.
- Files.ReadWrite.All
اگر فقط می خواهید از OneDrive استفاده کنید، کافی است، اما اگر می خواهید به چیز دیگری دسترسی داشته باشید، مجوزها را اضافه کنید. مجوزهای مورد نیاز برای دسترسی به OneDrive را می توانید در صفحه رسمی زیر بیابید.
هنگامی که انتخاب های خود را انجام دادید، روی دکمه افزودن مجوزها کلیک کنید.
مورد اضافه شده به لیست اضافه می شود و "نوع" "برنامه" است. با این حال، از آنجایی که "وضعیت" "به XXXX اعطا نمی شود" است، روی "رضایت مدیر به XXXX" کلیک کنید. (XXXX نام سازمان شماست)
روی Yes کلیک کنید.
به حالت اعطا شده تغییر می کند.
به هر حال، می توانید "User.Read" را که از ابتدا وجود دارد حذف کنید زیرا ما این بار از آن استفاده نخواهیم کرد. اگر "User.Read" را به عنوان یک برنامه اضافه کردید، از آن استفاده کنید.
تأیید شناسه های کاربر
از آنجایی که به OneDrive که کاربر مورد نظر دارد دسترسی خواهید داشت، شناسه کاربری را از قبل بررسی کنید.
Microsoft Entra ID
و آن را باز کنید.
کاربران را از منوی سمت چپ انتخاب کنید.
لیستی از کاربران نمایش داده می شود، بنابراین روی کاربر مورد نظر کلیک کنید.
"شناسه شی" را یادداشت کنید زیرا شناسه کاربر خواهد بود.
ایجاد یک اپلیکیشن کنسول
ویژوال استودیو را راه اندازی کنید و یک پروژه برای اپلیکیشن کنسول خود ایجاد کنید. شما می توانید آن را خارج از ویژوال استودیو ایجاد کنید، اما من فعلا از ویژوال استودیو استفاده می کنم.
مکان و نام پروژه اختیاری است. در این حالت، نام پروژه است 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 = ""; // アクセストークン
شناسه به دست آمده در 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 و نوع محتوا باید باشد 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
ما آن را با سریال زدایی می کنیم و سپس 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 را قالب بندی کرده و آن را در کنسول چاپ می کنیم. در واقع، 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 سؤالاتی داشتم، بنابراین سوالی پرسیدم.