.Net6/C# 百度網盤下載實例

来源:https://www.cnblogs.com/fkcxy/archive/2023/03/31/17277175.html
-Advertisement-
Play Games

前置要求:有百度賬號,實名認證以及開發者認證,創建應用並獲取到關鍵憑證:Appid、Appkey、Secretkeyk和Signkey 平臺上入門十分清楚,直接對著逐步操作即可,個人開發者審核也很快 百度網盤開放平臺地址如下:https://pan.baidu.com/union/doc/nksg0 ...


前置要求:有百度賬號,實名認證以及開發者認證,創建應用並獲取到關鍵憑證:Appid、Appkey、Secretkeyk和Signkey

                  平臺上入門十分清楚,直接對著逐步操作即可,個人開發者審核也很快

百度網盤開放平臺地址如下:https://pan.baidu.com/union/doc/nksg0sbfs

因為平臺代碼例子竟然沒有C# ,這裡主要是放授權以及下載部分代碼實例

第一步:獲取AuthorizeCode

string authorizeURL = @"http://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=你的AppKey&redirect_uri=oob&scope=basic,netdisk&device_id=你的AppID";

其中那個redirect_uri=oob的oob是一個預設返回l,如果有確切的返回鏈接可以寫進去,如果沒有就用oob

這裡APIDemo類型的例子,直接把上面的代碼粘進瀏覽器,會出一個固定的百度授權頁面,授權一次既可,授權後就能拿到授權碼,後續只要這個連接,就直接是授權碼頁面,具體如下:

 

 

第二步:通過授權碼AuthorizeCode獲取真正後續使用的AccessToken憑證

using (HttpClient client = new HttpClient())
{
   //換取AccessToken憑證
   string tokenURL = @"https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code=上一個步驟拿到的授權碼&client_id=你的AppKey&client_secret=你的SecretKey&redirect_uri=oob";

   HttpResponseMessage result = client.GetAsync(tokenURL).Result;
   string responseResult = result.Content.ReadAsStringAsync().Result;
client.Dispose();

}

其中responseResult即為帶有access_token(接收令牌)的Json字元串,

其中還有兩個重要的返回數據refresh_token(刷新令牌)以及expires_in(Access Token有效期(秒))

換算一下具體數據 ,access_token為12小時有效期,refresh_token有效期返回數據里沒有,但從官網可知為10年

當天後續測試既可一直使用該access_token,

如果第二天開發再使用,用refresh_token通過刷新方法獲取一下新的access_token以及refresh_token既可

刷新AccessToken的方法如下:

using (HttpClient client = new HttpClient())
{
   //刷新AccessToken憑證
   string refreshURL = @"https://openapi.baidu.com/oauth/2.0/token?grant_type=refresh_token&refresh_token=你的刷新令牌&client_id=你的AppKey&client_secret=你的SecretKey";

   HttpResponseMessage result = client.GetAsync(tokenURL).Result;
   string responseResult = result.Content.ReadAsStringAsync().Result;
client.Dispose(); }

responseResult即為帶有新access_token的Json字元串

 

第三步:已有access_token,獲取文件列表

using (HttpClient client = new HttpClient())
{
  string filelistURL = @"http://pan.baidu.com/rest/2.0/xpan/multimedia?method=listall&path=/BaiduCloudDiskDemo&access_token=你的接收令牌&web=1&recursion=1&start=0&limit=5";
  HttpResponseMessage result = client.GetAsync(filelistURL).Result;
  string responseResult = result.Content.ReadAsStringAsync().Result;
  FileList fileList = JsonConvert.DeserializeObject<FileList>(responseResult);
  client.Dispose();
}

FileList是根據返回的JSon字元串里的具體數據自定義實體類

filelist即為總的文件信息列表

web為是否返回縮略圖地址,1為返回,0為不返回

recursion為是否遞歸,1為遞歸,0為不遞歸

start為查詢起點,預設為0

limit為查詢數量,預設為1000

 

第四步:文件列表成功,獲取帶有下載地址DLink的具體文件信息

using (HttpClient client = new HttpClient())
{
     //文件列表的fs_id組成的數組,再進行後續操作
     string arr = "";
     foreach (ListItem item in filelist.list)
     {
         arr = arr + item.fs_id.ToString() + ",";
     }
     arr = arr.TrimEnd(',');
string filedlinkURL = @"http://pan.baidu.com/rest/2.0/xpan/multimedia?method=filemetas&access_token=你的接收令牌&fsids=[" + arr + "]&thumb=1&dlink=1&extra=1"; HttpResponseMessage result = client.GetAsync(filedlinkURL).Result; string responseResult = result.Content.ReadAsStringAsync().Result; FileList_DLink fileList_dlink = JsonConvert.DeserializeObject<FileList_DLink>(responseResult); client.Dispose(); }

FileList_DLink是根據返回的JSon字元串里的具體數據自定義實體類

filelist_dlink為帶有下載地址的文件信息

thumb為是否需要縮略圖地址 0為否,1為是,預設為0

dlink為是否需要下載地址,0為否,1為是,預設為0

extra為是否需要拍攝時間、原圖解析度等其他信息,0 否、1 是,預設0

 

第五步,具體文件信息下載成功,通過dlink下載地址下載文件到本地

HttpClientHandler hander = new HttpClientHandler();
hander.AllowAutoRedirect = true;
using (HttpClient client = new HttpClient(hander))
{
    if (filelist_dlink != null)//獲取文件下載地址列表成功  下載文件
    {
         foreach (ListItem_Dlink item in filelist_dlink.list)
         {
              string filedownloadURL = @"" + item.dlink + "&access_token=你的接收令牌";
              HttpResponseMessage result = client.GetAsync(filedownloadURL).Result;
              if (result.StatusCode == HttpStatusCode.OK)
               {
                   string responseResult = result.Content.ReadAsStringAsync().Result;
               }
               else if (result.StatusCode == HttpStatusCode.Redirect)
               {
                    string AbsoluteUri = result.Headers.Location.AbsoluteUri;
                    result = client.GetAsync(AbsoluteUri).Result;
                    byte[] urlContents = client.GetByteArrayAsync(AbsoluteUri).Result;
                    string path = Environment.CurrentDirectory + "\\DownloadImg\\";
                    if (!Directory.Exists(path))
                    {
                        Directory.CreateDirectory(path);
                     }
                     path = path + item.filename;
                     using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
                     {
                          fs.Write(urlContents, 0, urlContents.Length);
                     }
                }
           }
      }
}

這裡面做了一個重定向判斷,

當時測試的時候一直返回302,後面是在判斷為重定向的情況下將圖片下載到本地的,可根據實際情況自行調整

以上,整個下載流程結束。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • React 備忘清單 IT寶庫整理適合初學者入門的React開發速查備忘清單,為開發人員分享快速參考備忘單。 React是用於構建用戶界面的JavaScript庫,起源於Facebook的內部項目,該公司對市場上所有 JavaScript MVC框架都不滿意,決定自行開發一套,用於架設Instagr ...
  • 一、延遲計算 RDD 代表的是分散式數據形態,因此,RDD 到 RDD 之間的轉換,本質上是數據形態上的轉換(Transformations) 在 RDD 的編程模型中,一共有兩種運算元,Transformations 類運算元和 Actions 類運算元。開發者需要使用 Transformations ...
  • 一 回顧trait使用 https://blog.csdn.net/bushuwei/article/details/103514174發現之前本人說明很模糊,自己居然不知道為什麼其實這裡的$c,就是class B再次回顧邏輯 二 分析 self和static區別說的沒毛病 Trait基類use t ...
  • 一、函數的定義 可以分為以下兩種: 1、函數聲明和函數定義分離 這種方法將函數聲明和函數定義分開,通常在頭文件中先聲明函數原型,然後在源文件中實現函數定義。 例如,頭文件 example.h 中聲明瞭一個函數 add: #ifndef EXAMPLE_H #define EXAMPLE_H int ...
  • 一.scoket基本介紹 1.scoket簡介(以下是來自chatgpt回答) 1)Socket(套接字)是電腦網路中用於描述主機之間通信的一種機制。它定義了一種標準的介面, 使得應用程式可以利用網路傳輸層提供的服務(如TCP或UDP)進行通信。 2)Socket的作用是在網路應用程式之間提供數據 ...
  • if __name__ == "__main__" 也就是說執行當前文件,不調用模塊的時候__name__=__main__ 調用模塊的時候,測試如下: 1、新建 test01.py 文件測試代碼如下 print("這條消息來自test01") def func(): print('hello, w ...
  • 數字常量 int: 一般的整數, long: 長整型,2.x版本需在數字後加 “L” 或 “l” ,表示長整型 如 100000000L; python3.x 版本後不分長整型,統一為int,不可加 “L” 或 “l” float: 浮點數,1.0 也為浮點數,float 可強制轉換為 int,取整 ...
  • 使用方法 安裝 Maven <dependency> <groupId>com.github.yulichang</groupId> <artifactId>mybatis-plus-join</artifactId> <version>1.2.4</version> </dependency> G ...
一周排行
    -Advertisement-
    Play Games
  • 在本篇教程中,我們學習瞭如何使用 Taurus.MVC WebMVC 框架創建一個簡單的頁面。 我們創建了一個控制器並編寫了一個用於呈現頁面的方法,然後創建了對應的視圖,並最終成功運行了應用程式。 在下一篇教程中,我們將繼續探索 Taurus.MVC WebMVC 框架的更多功能和用法。 ...
  • 一:背景 1. 講故事 很多.NET開發者在學習高級調試的時候,使用sos的命令輸出會發現這裡也看不懂那裡也看不懂,比如截圖中的這位朋友。 .NET高級調試屬於一個偏冷門的領域,國內可觀測的資料比較少,所以很多東西需要你自己去探究源代碼,然後用各種調試工具去驗證,相關源代碼如下: coreclr: ...
  • 我一直都以為c中除以2的n次方可以使用右移n位代替,然而在實際調試中發現並不都是這樣的。是在計算餘數是發現了異常 被除數:114325068 右移15計算結果:3488 除法取整計算結果:3489 右移操作計算餘數:33772 除法取整計算餘數:1005 顯然:這是不一樣的。 移位操作是一條cpu指 ...
  • 在上一篇文章中,我們介紹了ReentrantLock類的一些基本用法,今天我們重點來介紹一下ReentrantLock其它的常用方法,以便對ReentrantLock類的使用有更深入的理解。 ...
  • Excelize 是 Go 語言編寫的用於操作電子錶格辦公文檔的開源基礎庫,2024年2月26日,社區正式發佈了 2.8.1 版本,該版本包含了多項新增功能、錯誤修複和相容性提升優化。 ...
  • 雲採用框架(Cloud Adoption Framework,簡稱CAF)為企業上雲提供策略和技術的指導原則和最佳實踐,幫助企業上好雲、用好雲、管好雲,併成功實現業務目標。本雲採用框架是基於服務大量企業客戶的經驗總結,將企業雲採用分為四個階段,並詳細探討企業應在每個階段採取的業務和技術策略;同時,還 ...
  • 與TXT文本文件,PDF文件更加專業也更適合傳輸,常用於正式報告、簡歷、合同等場合。項目中如果有使用Java將TXT文本文件轉為PDF文件的需求,可以查看本文中介紹的免費實現方法。 免費Java PDF庫 本文介紹的方法需要用到Free Spire.PDF for Java,該免費庫支持多種操作、轉 ...
  • 指針和引用 當我們需要在程式中傳遞變數的地址時,可以使用指針或引用。它們都可以用來間接訪問變數,但它們之間有一些重要的區別。 指針是一個變數,它存儲另一個變數的地址。通過指針,我們可以訪問存儲在該地址中的變數。指針可以被重新分配,可以指向不同的變數,也可以為NULL。指針使用*運算符來訪問存儲在地址 ...
  • 即使再小再簡單的需求,作為研發開發完畢之後,我們可以直接上線麽?其實很多時候事故往往就是由於“不以為意”發生的。事故的發生往往也遵循“墨菲定律”,這就要求我們更要敬畏線上,再小的需求點都需要經過嚴格的測試驗證才能上線。 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、是什麼 許可權是對特定資源的訪問許可,所謂許可權控制,也就是確保用戶只能訪問到被分配的資源 而前端許可權歸根結底是請求的發起權,請求的發起可能有下麵兩種形式觸發 頁面載入觸發 頁面上的按鈕點擊觸發 總的來說,所有的請求發起都觸發自前端路由或 ...