前置要求:有百度賬號,實名認證以及開發者認證,創建應用並獲取到關鍵憑證: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,後面是在判斷為重定向的情況下將圖片下載到本地的,可根據實際情況自行調整
以上,整個下載流程結束。