उपयोगकर्ता सहभागिता के बिना OneDrive API का उपयोग करें, जैसे बैच प्रोग्राम (.NET C# संस्करण) (लाइब्रेरीज़ का अतिरिक्त उपयोग नहीं)
परिचालन का वातावरण
- विजुअल स्टूडियो
-
- विजुअल स्टूडियो 2022
- ।जाल
-
- .नेट 8
- Microsoft प्रमाणीकरण API
-
- 2.0 ओथ 2
- माइक्रोसॉफ्ट OneDrive API
-
- 1.0
- Microsoft खातों के प्रकार
-
- कार्यस्थल या विद्यालय खाता
आवश्यकताएँ
- विजुअल स्टूडियो
-
- संस्करणों में से एक
- ।जाल
-
- संस्करणों में से एक
- Microsoft प्रमाणीकरण API
-
- 2.0 ओथ 2
- माइक्रोसॉफ्ट OneDrive API
-
- 1.0
- Microsoft खातों के प्रकार
-
- कार्यस्थल या विद्यालय खाता
इस घटना के उद्देश्य के बारे में
अब आप OneDrive पर फ़ाइलों को प्रोग्रामेटिक रूप से अपलोड और डाउनलोड करने के लिए तैयार करने हेतु OneDrive API का उपयोग करेंगे. इस आलेख में, हम इस बात पर जाएंगे कि आप OneDrive API के साथ क्या कर सकते हैं, इसलिए हम इस बात पर नहीं जाएंगे कि आप OneDrive API के साथ क्या कर सकते हैं। हालाँकि, जब तक आप कनेक्ट कर सकते हैं, आप एपीआई दस्तावेज़ पढ़ सकते हैं और उसके बाद इसे लागू कर सकते हैं।
प्रोग्राम को कैसे चलाएं
OneDrive तक पहुँच प्रोग्राम के रूप, जैसे वेब अनुप्रयोग, डेस्कटॉप अनुप्रयोग, या कंसोल अनुप्रयोग पर निर्भर नहीं है और इसे विभिन्न प्रोग्राम्स द्वारा चलाया जा सकता है. इस मामले में, हम एक कंसोल एप्लिकेशन बनाएंगे और इसे बिना किसी उपयोगकर्ता ऑपरेशन के स्वचालित रूप से निष्पादित करेंगे।
Microsoft खातों के विभिन्न प्रकार क्या हैं?
यदि आपने कभी Microsoft खाता बनाया है, तो आपने शायद इसे देखा होगा। Microsoft खातों के दो मुख्य प्रकार होते हैं: व्यक्तिगत Microsoft खाते और कार्यालय या विद्यालय खाते. OneDrive एक Microsoft खाते से जुड़ा हुआ है, लेकिन OneDrive का प्रकार ऊपर सूचीबद्ध खाता प्रकार के आधार पर थोड़ा भिन्न होता है।
कुछ समय के लिए, OneDrive API का उपयोग उपरोक्त दोनों प्रकार के खातों के साथ किया जा सकता है। इस कार्यक्रम में "कंसोल एप्लिकेशन के रूप में बनाया गया और उपयोगकर्ता ऑपरेशन के बिना निष्पादित" के रूप में, कृपया ध्यान दें कि इसका उपयोग केवल "कार्य या स्कूल खाता" खाते में Microsoft खाते के साथ किया जा सकता है। यह प्रमाणीकरण विधियों में अंतर के कारण है।
प्रमाणीकरण विधि के बारे में
सबसे पहले, OneDrive को प्रोग्रामेटिक रूप से एक्सेस करने के लिए आपको प्रमाणित करना होगा। जैसा कि ऊपर उल्लेख किया गया है, कोई भी प्रोग्राम OneDrive तक पहुंच सकता है, लेकिन एपीआई से कनेक्ट करने का प्रमाणीकरण इस बात पर निर्भर करता है कि प्रोग्राम कैसे चल रहा है। वेब एप्लिकेशन और डेस्कटॉप एप्लिकेशन को उपयोगकर्ता इंटरैक्शन द्वारा प्रमाणित किया जा सकता है। चूंकि उपयोगकर्ता इसे पृष्ठभूमि में चलने वाले कंसोल एप्लिकेशन में संचालित नहीं कर सकता है, इसलिए प्रमाणीकरण विधि भी ऊपर से अलग है।
मुझे विस्तृत कारण नहीं पता क्योंकि मैं इसे देखने में सक्षम नहीं हूं, लेकिन अगर यह दिमाग में आता है, तो यह सुरक्षा और खाता प्रबंधन के कारण लगता है। मैं केवल यह कह सकता हूं कि यह पहले से ही एक विनिर्देश है, इसलिए यदि आप "व्यक्तिगत Microsoft खाते" से जुड़े OneDrive को प्रोग्रामेटिक रूप से एक्सेस करना चाहते हैं, मुझे लगता है कि पृष्ठभूमि में चलने वाले प्रोग्राम के अलावा किसी अन्य प्रोग्राम का उपयोग करने के अलावा, या प्रमाणीकरण विधि के साथ कंसोल एप्लिकेशन चलाने के अलावा कोई विकल्प नहीं है जिसमें उपयोगकर्ता संचालन शामिल है।
हम इस समय OneDrive API तक पहुँचने के लिए लायब्रेरी का उपयोग नहीं करेंगे
OneDrive API तक पहुंच "Microsoft ग्राफ़" नामक लाइब्रेरी का उपयोग करके संभालना अपेक्षाकृत आसान है। इस मामले में, हम एपीआई के यूआरएल को सीधे एक्सेस करने और इसे निष्पादित करने की विधि का उपयोग करेंगे। यह थोड़ा बोझिल है, लेकिन चूंकि यह लाइब्रेरी का उपयोग नहीं करता है, इसलिए इसका यह फायदा है कि non-.NET प्रोग्राम उसी तरह वनड्राइव एपीआई तक पहुंच सकते हैं। यह इस नुकसान को भी रोकता है कि लाइब्रेरी के विभिन्न संस्करणों के कारण कोड बदल जाता है।
हम आपको एक और टिप में माइक्रोसॉफ्ट ग्राफ का उपयोग करने का तरीका दिखाएंगे।
पूर्व शर्त
- आपके पास कार्यस्थल या विद्यालय खाते के लिए Microsoft खाता है
- आप ऊपर सूचीबद्ध Microsoft खाते से संबद्ध OneDrive का उपयोग कर सकते हैं (उदा., OneDrive Business)
- विजुअल स्टूडियो 2022 स्थापित
Azure में अपने Microsoft खाते या OneDrive तक पहुँचने के लिए अपना एप्लिकेशन सेट करें
Azure में निम्न URL पर लॉग इन करें:
ऊपर दिए गए खोज फ़ील्ड से, "ऐप पंजीकरण" टाइप करें और इसे चुनें।
नया पंजीकरण पर क्लिक करें.
"नाम" की सामग्री मनमानी है। कृपया कोई वर्णनात्मक नाम दर्ज करें.
"केवल व्यक्तिगत Microsoft खाते" के अलावा "समर्थित खाता प्रकार" चुनें. ऐसा इसलिए है, क्योंकि जैसा कि ऊपर उल्लेख किया गया है, इस प्रमाणीकरण का उपयोग केवल उन खातों के साथ किया जा सकता है जो किसी संगठन से संबंधित हैं। इस मामले में, हमने "किसी भी संगठनात्मक निर्देशिका (किसी भी Microsoft Entra ID टेनेंट - मल्टी-टेनेंट) और व्यक्तिगत Microsoft खातों (Skype, Xbox, आदि) में खाते" का चयन किया है।
आपको "रीडायरेक्ट यूआरआई" दर्ज करने की आवश्यकता नहीं है क्योंकि इस बार इसका उपयोग नहीं किया जाएगा।
जब आप कर लें, तो "रजिस्टर" बटन पर क्लिक करें।
आपको आपके द्वारा बनाए गए ऐप पंजीकरण के सारांश पृष्ठ पर ले जाया जाएगा, इसलिए एप्लिकेशन (क्लाइंट) आईडी और निर्देशिका (टैनेंट) आईडी कॉपी करें। आप इस मान का उपयोग बाद में करेंगे.
बाएं मेनू में प्रबंधन श्रेणी से "प्रमाणपत्र और रहस्य" चुनें, और सुनिश्चित करें कि मध्य टैब में "क्लाइंट रहस्य" चुना गया है। नया क्लाइंट सीक्रेट क्लिक करें.
विवरण दर्ज करना वैकल्पिक है. यदि आप इसका उपयोग जारी रखना चाहते हैं, तो कृपया एक स्पष्टीकरण शामिल करें जो स्पष्ट रूप से उपयोग के उद्देश्य की व्याख्या करता है।
"समाप्ति तिथि" उस समय की अवधि है जब यह ग्राहक रहस्य मान्य है। चूंकि यह इस बार परीक्षण उद्देश्यों के लिए है, इसलिए यह 90 दिन है, लेकिन कृपया इसे उपयोग के उद्देश्य के अनुसार सेट करें।
जब आप क्लाइंट सीक्रेट बनाते हैं, तो इसे सूची में जोड़ा जाता है। इसमें, हम "Value" कॉलम में वैल्यू का उपयोग करेंगे, इसलिए इसे कॉपी करें। ध्यान दें कि इस मान की बाद में प्रतिलिपि नहीं बनाई जा सकती.
अगला, बाएं मेनू में प्रशासन श्रेणी से "एपीआई अनुमतियां" चुनें और बीच में "अनुमतियां जोड़ें" पर क्लिक करें।
API अनुमति अनुरोध में, Microsoft Graph पर क्लिक करें.
एप्लिकेशन की अनुमति दें पर क्लिक करें। यह विकल्प व्यक्तिगत Microsoft खातों के लिए उपलब्ध नहीं है.
अनुमतियों की एक सूची नीचे प्रदर्शित की जाएगी, इसलिए निम्नलिखित मदों की जांच करने के लिए खोज फ़ील्ड का उपयोग करें।
- फ़ाइलें.ReadWrite.All
यदि आप केवल OneDrive का उपयोग करना चाहते हैं तो यह पर्याप्त है, लेकिन यदि आप किसी और चीज़ तक पहुँचना चाहते हैं, तो अनुमतियाँ जोड़ें। OneDrive तक पहुँचने के लिए आवश्यक अनुमतियाँ नीचे दिए गए आधिकारिक पृष्ठ पर पाई जा सकती हैं।
एक बार जब आप अपने चयन कर लेते हैं, तो क्लिक करें अनुमतियाँ जोड़ें बटन।
जोड़ा गया एक सूची में जोड़ा जाता है, और "प्रकार" "एप्लिकेशन" है। हालाँकि, चूंकि "स्थिति" "XXXX को प्रदान नहीं की गई है", "XXXX को व्यवस्थापक सहमति दें" पर क्लिक करें। (XXXX आपके संगठन का नाम है)
हाँ क्लिक करें.
यह दी गई स्थिति में बदल जाता है।
वैसे, आप "प्रत्यायोजित User.Read" को शुरू से ही हटा सकते हैं क्योंकि हम इस बार इसका उपयोग नहीं करेंगे। यदि आपने "User.Read" को एप्लिकेशन के रूप में जोड़ा है, तो इसका उपयोग करें।
उपयोगकर्ता ID सत्यापित करना
चूंकि आप उस OneDrive तक पहुंच रहे होंगे जो लक्षित उपयोगकर्ता के पास है, पहले से उपयोगकर्ता आईडी की जांच करें।
Microsoft Entra ID
और इसे खोलें।
बाईं ओर के मेनू से उपयोगकर्ता चुनें.
उपयोगकर्ताओं की एक सूची प्रदर्शित की जाएगी, इसलिए लक्ष्य उपयोगकर्ता पर क्लिक करें।
"ऑब्जेक्ट आईडी" पर ध्यान दें क्योंकि यह उपयोगकर्ता आईडी होगी।
कंसोल अनुप्रयोग बनाएँ
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 टेक्स्ट को प्रारूपित करता है। चूंकि यह इंटरनेट से उठाया गया कोड है, इसलिए मैं सामग्री को विस्तार से नहीं समझाऊंगा।
// 各種 ID などの定義
var clientId = "XXXXXXXX"; // クライアント ID
var tenantId = "XXXXXXXX"; // テナント ID
var clientSecret = "XXXXXXXX"; // クライアント シークレット
var userId = "XXXXXXXX"; // ユーザー ID
var accessToken = ""; // アクセストークン
Azure पर प्राप्त ID को प्रत्येक के लिए सेट करें.
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";
प्रमाणीकरण के लिए API URL और OneDvie के रूट पर फ़ोल्डरों की सूची प्राप्त करने के लिए API URL। यह वनड्राइव एपीआई तक पहुंच की जांच करने का विवरण है, इसलिए मैं वनड्राइव एपीआई की सामग्री का वर्णन नहीं करूंगा। यदि आपके पास वनड्राइव एपीआई तक पहुंच है, तो अपलोड करना और डाउनलोड करना एक एप्लिकेशन है, इसलिए मुझे नहीं लगता कि यह मुश्किल है।
// 使いまわすので最初に定義しておく
HttpClient httpClient = new();
आपने निर्दिष्ट URL के लिए अनुरोध करने के लिए HttpClient
एक जनरेट किया है।
// 「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}");
सबसे पहले, आप डेटा के साथ प्रमाणीकरण एपीआई के लिए एक अनुरोध करेंगे, इसलिए उस डेटा को तैयार करें। भेजे जाने वाले डेटा का प्रारूप "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
हम इसे 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
, लेकिन यह एपीआई के प्रकार पर निर्भर करती है, इसलिए वनड्राइव एपीआई दस्तावेज़ देखें।
हेडर में एक्सेस टोकन जोड़ें। प्रारूप में कुंजी के रूप Authorization
में और मान सेट करें Bearer {アクセストークン}
।
आपको बस एक अनुरोध करना है और JSON स्ट्रिंग के रूप में परिणाम प्राप्त करना है। अब जब हम केवल यह सुनिश्चित कर रहे हैं कि हमारे पास OneDrive API तक पहुंच है, तो हम केवल JSON स्ट्रिंग को स्वरूपित कर रहे हैं और इसे कंसोल पर प्रिंट कर रहे हैं। वास्तव में, यह प्राप्त JSON को deserializes करता है और तदनुसार इसे संसाधित करता है।
मुझे इस बार फ़ोल्डरों की एक सूची मिली है, लेकिन मुझे लगता है कि 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 तक पहुंचने में सक्षम होना चाहिए। मुझे नहीं पता कि युक्तियां अपलोड करने और डाउनलोड करने के तरीकों को सारांशित करती हैं, लेकिन मूल रूप से यह काम करना चाहिए यदि आप ऊपर वर्णित रूट में फ़ोल्डरों की सूची लागू करते हैं। एपीआई के प्रकारों को नीचे दी गई आधिकारिक वेबसाइट पर संक्षेप में प्रस्तुत किया गया है, इसलिए कृपया वह एपीआई ढूंढें जिसका आप उपयोग करना चाहते हैं और इसे लागू करें।
धन्यवाद
इस बार वनड्राइव एपीआई का उपयोग करने के बारे में मेरे कुछ प्रश्न थे, इसलिए मैंने एक प्रश्न पूछा।