.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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...