OneDrive API'sini toplu iş programı (.NET C# sürümü) gibi kullanıcı etkileşimi olmadan kullanın (ek kullanım kitaplığı yok)

Sayfa güncel :
Sayfa oluşturma tarihi :

Çalışma ortamı

Görsel Stüdyo
  • Görsel Studio 2022
.NET
  • .NET 8
Microsoft Kimlik Doğrulama API'si
  • 2.0 OAuth 2
Microsoft OneDrive API'sı
  • 1.0
Microsoft hesabı türleri
  • İş veya okul hesabı

Önkoşullar

Görsel Stüdyo
  • Sürümlerden biri
.NET
  • Sürümlerden biri
Microsoft Kimlik Doğrulama API'si
  • 2.0 OAuth 2
Microsoft OneDrive API'sı
  • 1.0
Microsoft hesabı türleri
  • İş veya okul hesabı

Bu etkinliğin amacı hakkında

Artık OneDrive API'lerini kullanarak OneDrive'a program aracılığıyla dosya yüklemeye ve indirmeye hazırlanacaksınız. Bu makalede, OneDrive API ile neler yapabileceğinize değineceğiz, bu nedenle OneDrive API ile neler yapabileceğinize girmeyeceğiz. Ancak, bağlanabildiğiniz sürece API belgelerini okuyabilir ve bundan sonra uygulayabilirsiniz.

Program nasıl çalıştırılır

OneDrive'a erişim, web uygulaması, masaüstü uygulaması veya konsol uygulaması gibi programın biçimine bağlı değildir ve çeşitli programlar tarafından çalıştırılabilir. Bu durumda, bir konsol uygulaması oluşturacağız ve herhangi bir kullanıcı işlemi olmadan otomatik olarak çalıştıracağız.

Farklı Microsoft hesabı türleri nelerdir?

Daha önce bir Microsoft hesabı oluşturduysanız, muhtemelen görmüşsünüzdür. İki ana Microsoft hesabı türü vardır: kişisel Microsoft hesapları ve iş veya okul hesapları. OneDrive bir Microsoft hesabına bağlıdır, ancak OneDrive türü yukarıda listelenen hesap türüne bağlı olarak biraz farklılık gösterir.

Şimdilik, OneDrive API yukarıdaki hesap türlerinin her ikisiyle de kullanılabilir. Bu programda "konsol uygulaması olarak oluşturulmuş ve kullanıcı işlemi yapılmadan çalıştırılmış" şeklinde, Lütfen yalnızca "İş veya okul hesabı" hesabındaki bir Microsoft hesabıyla kullanılabileceğini unutmayın. Bu, kimlik doğrulama yöntemlerindeki farklılıklardan kaynaklanmaktadır.

Kimlik doğrulama yöntemi hakkında

İlk olarak, OneDrive'a program aracılığıyla erişmek için kimlik doğrulaması yapmanız gerekir. Yukarıda belirtildiği gibi, herhangi bir program OneDrive'a erişebilir, ancak API'ye bağlanmak için kimlik doğrulaması programın nasıl çalıştığına bağlıdır. Web uygulamaları ve masaüstü uygulamaları kullanıcı etkileşimi ile doğrulanabilir. Kullanıcı bunu arka planda çalışan bir konsol uygulamasında çalıştıramayacağı için kimlik doğrulama yöntemi de yukarıdakinden farklıdır.

Bakamadığım için detaylı sebebini bilmiyorum ama aklıma gelirse güvenlik ve hesap yönetiminden kaynaklanıyor gibi görünüyor. Sadece bunun zaten bir özellik olduğunu söyleyebilirim, bu nedenle "kişisel bir Microsoft hesabı" ile ilişkili OneDrive'a programlı olarak erişmek istiyorsanız, Arka planda çalışan bir program dışında bir program kullanmak ya da kullanıcı işlemlerini içeren bir kimlik doğrulama yöntemi ile bir konsol uygulaması çalıştırmaktan başka çare olmadığını düşünüyorum.

Şu anda OneDrive API'sine erişmek için kitaplığı kullanmayacağız

OneDrive API'sine erişim, "Microsoft Graph" adlı bir kitaplık kullanılarak ele alınması nispeten kolaydır. Bu durumda, API'nin URL'sine doğrudan erişme ve onu yürütme yöntemini kullanacağız. Biraz hantaldır, ancak bir kitaplık kullanmadığı için non-.NET programın OneDrive API'sine aynı şekilde erişebilmesi avantajına sahiptir. Ayrıca, kütüphanenin farklı sürümleri nedeniyle kodun değişmesi dezavantajını da önler.

Başka bir ipucunda Microsoft Graph'ı nasıl kullanacağınızı göstereceğiz.

önkoşul

  • Bir iş veya okul hesabı için Microsoft hesabınız var
  • Yukarıda listelenen Microsoft hesabıyla ilişkili OneDrive'ı kullanabilirsiniz (ör. OneDrive Business)
  • Visual Studio 2022 yüklendi

Uygulamanızı Azure'da Microsoft hesabınıza veya OneDrive'a erişecek şekilde ayarlayın

Aşağıdaki URL'den Azure'da oturum açın:

Yukarıdaki arama alanına "uygulama kayıtları" yazın ve seçin.

Yeni Kayıt'a tıklayın.

"Ad" ın içeriği keyfidir. Lütfen açıklayıcı bir ad girin.

"Yalnızca kişisel Microsoft hesapları" dışında bir "Desteklenen hesap türü" seçin. Bunun nedeni, yukarıda belirtildiği gibi, bu kimlik doğrulamasının yalnızca bir kuruluşa ait hesaplarla kullanılabilmesidir. Bu durumda, "Herhangi bir kuruluş dizinindeki hesaplar (herhangi bir Microsoft Entra ID kiracısı - çok kiracılı) ve kişisel Microsoft hesapları (Skype, Xbox vb.)" seçeneğini seçtik.

Bu sefer kullanılmayacağı için "Yönlendirme URI'si" ni girmenize gerek yok.

İşiniz bittiğinde, "Kayıt Ol" düğmesini tıklayın.

Oluşturduğunuz uygulama kaydının özet sayfasına yönlendirilirsiniz, bu nedenle Uygulama (istemci) kimliğini ve Dizin (kiracı) kimliğini kopyalayın. Bu değeri daha sonra kullanacaksınız.

Soldaki menüdeki yönetim kategorisinden "Sertifikalar ve gizli diziler" i seçin ve orta sekmede "İstemci gizli dizileri" nin seçili olduğundan emin olun. Yeni İstemci Gizli Anahtarı'na tıklayın.

Açıklama girmek isteğe bağlıdır. Kullanmaya devam etmek istiyorsanız, lütfen kullanım amacını açıkça açıklayan bir açıklama ekleyin.

"Sona erme tarihi", bu istemci parolasının geçerli olduğu süredir. Bu sefer test amaçlı olduğu için 90 gün ancak lütfen kullanım amacına göre ayarlayınız.

Bir istemci gizli anahtarı oluşturduğunuzda, bu anahtar anahtar listeye eklenir. Bunda, "Değer" sütunundaki değeri kullanacağız, bu yüzden kopyalayın. Bu değerin daha sonra kopyalanamayacağını unutmayın.

Ardından, soldaki menüden Yönetim kategorisinden "API İzinleri"ni seçin ve ortadaki "İzin Ekle"ye tıklayın.

API izin isteğinde Microsoft Graph'a tıklayın.

Uygulamaya İzin Ver'e tıklayın. Bu seçenek kişisel Microsoft hesapları için kullanılamaz.

Aşağıda bir izin listesi görüntülenecektir, bu nedenle aşağıdaki öğeleri kontrol etmek için arama alanını kullanın.

  • Files.ReadWrite.All

Yalnızca OneDrive'ı kullanmak istiyorsanız, ancak başka bir şeye erişmek istiyorsanız izinler eklemek istiyorsanız bu yeterlidir. OneDrive'a erişmek için gereken izinler aşağıdaki resmi sayfada bulunabilir.

Seçimlerinizi yaptıktan sonra İzin Ekle düğmesini tıklayın.

Eklenen listeye eklenir ve "Tür" "Uygulama" dır. Ancak, "Durum" "XXXX'e verilmedi" olduğundan, "XXXX'e yönetici onayı ver" seçeneğini tıklayın. (XXXX kuruluşunuzun adıdır)

Evet'e tıklayın.

Verilen duruma geçer.

Bu arada, bu sefer kullanmayacağımız için baştan orada olan "delegated User.Read" i silebilirsiniz. "User.Read"i bir uygulama olarak eklediyseniz, onu kullanın.

Kullanıcı Kimliklerini Doğrulama

Hedef kullanıcının sahip olduğu OneDrive'a erişeceğiniz için, kullanıcı kimliğini önceden kontrol edin.

Microsoft Entra ID ve açın.

Soldaki menüden Kullanıcılar'ı seçin.

Bir kullanıcı listesi görüntülenecektir, bu nedenle hedef kullanıcıya tıklayın.

Kullanıcı kimliği olacağı için "Nesne Kimliği" ni not edin.

Konsol uygulaması oluşturma

Visual Studio'yu başlatın ve konsol uygulamanız için bir proje oluşturun. Visual Studio dışında oluşturabilirsiniz, ancak şimdilik Visual Studio'yu kullanacağım.

Konum ve proje adı isteğe bağlıdır. Bu durumda, proje adı .OneDriveApiDotNetClientCredentialsHttpClient

Bu sefer kodu bölmeyeceğiz, üstten Program.cs kademeli olarak yazacağız, bu yüzden hareketi kontrol edebiliyorsanız, lütfen kodu gerektiği gibi bölerek yeniden yazın.

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

Kullanmak istediğiniz ad alanını açıklayın.

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

Bu sınıf, kimlik doğrulamasından sonra belirteç bilgilerini almak için kullanılır. Program.cs , lütfen kodun sonuna yazın. Bu sınıfı diğer dosyalara ayırabilirsiniz.

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

Bu, API'den alınan JSON metnini girintili olarak biçimlendiren sihirli bir yöntemdir. İnternetten alınan bir kod olduğu için içeriğini detaylı olarak anlatmayacağım.

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

Her biri için Azure'da elde edilen kimliği ayarlayın. accessToken OneDrive'a erişmek için geçici bir belirteçtir, bu nedenle çalışma zamanında ayarlanır.

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

Kimlik doğrulaması için API URL'si ve OneDvie'nin kökündeki klasörlerin listesini almak için API URL'si. Bu, OneDrive API'sine erişimin nasıl kontrol edileceğinin bir açıklamasıdır, bu nedenle OneDrive API'sinin içeriğini açıklamayacağım. OneDrive API'sine erişiminiz varsa, yükleme ve indirme bir uygulamadır, bu yüzden o kadar da zor olduğunu düşünmüyorum.

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

Belirtilen URL'ye bir istekte bulunmak için HttpClient bir tane oluşturdunuz.

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

İlk olarak, kimlik doğrulama API'sine verilerle bir istekte bulunacaksınız, bu nedenle bu verileri hazırlayın. Gönderilecek verilerin biçimi, "Ad1=Değer1&Ad2=Değer2...", bu nedenle bir sözlükte oluşturulur ve ardından bir sorgu parametresi dizesine dönüştürülür.

Gönderilecek dört parametre vardır:

Örnek
Parametre Adı Değerleri
client_id Uygulama kaydında edindiğiniz istemci kimliğini ayarlayın.
kapsam İstemci gizli anahtarı ile kimlik doğrulama düzeltildi https://graph.microsoft.com/.default .
client_secret Uygulama kaydında edindiğiniz istemci gizli dizisinin değerini ayarlayın.
grant_type İstemci gizli anahtarı ile kimlik doğrulaması olduğundan, client_credentials

Daha fazla bilgi için lütfen aşağıdaki resmi web sitesine bakın.

// 認証処理
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 kimlik doğrulama API'sine bir istekte bulunmak için. HttpClient Bu yaygın bir kullanım, bu yüzden dikkat edilmesi gereken pek bir şey olduğunu düşünmüyorum.

Gönderilecek veri UTF8 kodlu olmalı ve Content-Type olmalıdır application/x-www-form-urlencoded . Yöntem .POST

IsSuccessStatusCode Yanıt başarıyla denetlenir ve işlenirse, sonucu bir JSON dizesi olarak alırsınız. Aldığınız JSON aşağıdaki parametrelere sahiptir:

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

Bunda access_token kullanacağız . OneDrive API'si ile bu değeri kullanın. Diğer parametreleri yoksayabilirsiniz, ancakaccess_token son kullanma tarihini öğrenmek istiyorsanız, kullanın expires_in .

JSON dizesi olarak kullanmak zordur, bu yüzden JsonSerializer.Deserialize ile seri durumdan çıkarırız ve sonra 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)}");
}

Son olarak, OneDrive API'sine istekte bulunmak için erişim belirtecini kullanın. Yöntem belirtir GET , ancak API'nin türüne bağlıdır, bu nedenle OneDrive API belgelerine bakın.

Erişim belirtecini üst bilgiye ekleyin. Anahtarı olarak ve biçimdeki Bearer {アクセストークン} değeri ayarlayınAuthorization.

Tek yapmanız gereken bir istekte bulunmak ve sonucu bir JSON dizesi olarak almak. Artık OneDrive API'sine erişimimiz olduğundan emin olduğumuza göre, JSON dizesini biçimlendiriyor ve konsola yazdırıyoruz. Aslında, alınan JSON'u seri durumdan çıkarır ve buna göre işler.

Bu sefer bir klasör listesi aldım ama JSON'un aşağıdaki gibi olduğunu düşünüyorum.

{
  "@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üm bilgilere ihtiyacınız olduğunu düşünmüyorum, bu nedenle yalnızca klasör adını almak istiyorsanız, örneğin, value içindeki diziden name yalnızca parametreleri alabilirsiniz.

Özet

Şimdiye kadar iyi çalışıyorsa, OneDrive'a bir toplu iş programıyla erişebilmelisiniz. İpuçlarının yükleme ve indirme yöntemlerini özetleyip özetlemediğini bilmiyorum, ancak temel olarak yukarıda açıklanan kökteki klasör listesini uygularsanız çalışması gerekir. API türleri aşağıdaki resmi web sitesinde özetlenmiştir, bu nedenle lütfen kullanmak istediğiniz API'yi bulun ve uygulayın.

teşekkürler

Bu sefer OneDrive API'sini kullanma hakkında bazı sorularım vardı, bu yüzden bir soru sordum.