必應每日壁紙API封裝

来源:https://www.cnblogs.com/lsdyl/p/18401036
-Advertisement-
Play Games

本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...


簡介

這個類封裝了必應首頁的每日壁紙查看功能,提供了查看、保存壁紙的方法,最大支持查看近8天的壁紙

使用方法

async Task Main()
{
	try
	{
		var bing = BingWallpaperAPI.CreateInstance(8); //初始化,參數8表示一共會載入8張圖片
		var task = await bing.Current();
		task.Wallpaper.Dump();  //載入壁紙
		Console.WriteLine("日期\t" + task.EndDate);
		Console.WriteLine("標題\t" + task.Title);  //載入相關信息
		Console.WriteLine("版權\t" + task.Copyright);
		Console.WriteLine("鏈接\t" + task.CopyrightLink);
		if (await bing.SaveCurrentWallpaper(@"D:\bing.jpg"))	//保存當前的壁紙
		{
			Console.WriteLine("保存成功");
		};
		var task1 = await bing.Next();  //載入下一張壁紙
		task1.Wallpaper.Dump(); //列印壁紙
		var task2 = await bing.Previous();  //載入上一張壁紙
		task2.Wallpaper.Dump(); //列印壁紙
	}
	catch (Exception ex)
	{
		Console.WriteLine(ex.Message);
	}
}

效果預覽


API封裝

點擊查看代碼
using System;
using System.Diagnostics;
using System.Drawing.Imaging;
using System.Linq;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;

   /// <summary>
   /// 載入Bing壁紙,單例,使用CreateInstance方法創建類的實例
   /// </summary>
   public sealed class BingWallpaperAPI
   {
       private static BingWallpaperAPI _instance = null;
       private static readonly object _padlock = new Object();
       /// <summary>
       /// 創建類的實例
       /// </summary>
       /// <param name="imgnums">壁紙的張數,可以是1-8之間的數</param>
       /// <returns></returns>
       public static BingWallpaperAPI CreateInstance(byte imgnums = 3)
       {
           if (_instance is null)
           {
               lock (_padlock)
               {
                   if (_instance is null) _instance = new BingWallpaperAPI(imgnums);
               }
           }
           return _instance;
       }
       private BingWallpaperAPI(byte imgnums)
       {
           if (imgnums > 8 || imgnums <= 0)
           {
               _imgnums = 3;
               Debug.WriteLine($"僅支持1-8張圖片,你輸入的{imgnums}被重置為3");
           }
           else { _imgnums = imgnums; }
           GetWallpaperLink();
       }
       /// <summary>內置索引</summary>
       private int _index = -1;
       /// <summary>
       /// 載入Bing壁紙的數量,預設為3
       /// </summary>
       private static byte _imgnums;
       private BingApiModel _bingApiModel;
       /// <summary>
       /// 載入壁紙的JSON格式文件,文件中包含了壁紙的下載地址等關鍵信息
       /// </summary>
       /// <exception cref="Exception"></exception>
       private void GetWallpaperLink()
       {
           HttpClient client = new HttpClient();
           for (int i = 0; i < 3; i++) //這個步驟會嘗試3次
           {
               try
               {
                   var res = client.GetAsync($"https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n={_imgnums}&mkt=zh-CN").Result;
                   //參數n:1-8 返回請求數量,目前最多一次獲取8張
                   //參數format:js/xml
                   //參數idx:請求圖片截止天數 0 今天;1 截止至昨天,類推(目前最多獲取到7天前的圖片)
                   //參數mkt:地區
                   var json = res.Content.ReadAsStringAsync().Result;
                   BingApiModel bingApiModel = new BingApiModel();
                   _bingApiModel = JsonSerializer.Deserialize<BingApiModel>(json);
                   ImageCount = _bingApiModel.images.Count();
                   if (ImageCount == _imgnums)
                   {
                       break;  //載入成功時直接終止迴圈
                   }
               }
               catch (Exception ex)
               {
                   if (i == 2) { throw ex; } else Console.WriteLine(ex.Message);
               }
           }
       }
       /// <summary>
       /// 根據JSON數據下載壁紙
       /// </summary>
       /// <param name="index">_bingApiModel索引</param>
       /// <returns></returns>
       /// <exception cref="Exception"></exception>
       private async Task<BingWallpaper> GetWallpaper(int index)
       {
           try
           {
               using (HttpClient client = new HttpClient())
               {
                   var element = _bingApiModel.images[index];
                   var res = await client.GetAsync("https://cn.bing.com" + element.url);
                   //這個URL中的第一個1920x1080改成UHD是4k
                   var imgStream = await res.Content.ReadAsStreamAsync();
                   return (new BingWallpaper()
                   {
                       Wallpaper = System.Drawing.Image.FromStream(imgStream),
                       Title = element.title,
                       Copyright = element.copyright,
                       CopyrightLink = element.copyrightlink,
                       EndDate = element.enddate,
                   });
               }
           }
           catch (Exception ex)
           {
               throw ex;
           }
       }
       /// <summary>
       /// 載入JSON數據包含的URL數量
       /// </summary>
       public int ImageCount { get;private set; }
       /// <summary>
       /// 下一張壁紙
       /// </summary>
       /// <returns></returns>        
       /// <exception cref="Exception"></exception>
       public async Task<BingWallpaper> Next()
       {
           if (ImageCount == 0)
           {
               return null;
           }
           _index++;
           if (_index >= ImageCount)   //重置索引
           {
               _index = 0;
           }
           return await GetWallpaper(_index);
       }
       /// <summary>
       /// 上一張壁紙
       /// </summary>
       /// <returns></returns>
       /// <exception cref="Exception"></exception>
       public async Task<BingWallpaper> Previous()
       {
           if (ImageCount == 0)
           {
               return null;
           }
           _index--;
           if (_index < 0)
           {
               _index = ImageCount - 1;    //重置索引
           }
           return await GetWallpaper(_index);
       }

       /// <summary>
       /// 保存當前的壁紙到本地
       /// </summary>
       /// <param name="path">保存的路徑、含文件名(如c:\1.jpg),格式為JPEG</param>
       /// <returns>保存是否成功</returns>
       /// <exception cref="Exception"></exception>
       public async Task<bool> SaveCurrentWallpaper(string path)
       {
           try
           {
               var task = await Current();
               task.Wallpaper.Save(path, ImageFormat.Jpeg);
               return true;
           }
           catch (Exception ex)
           {
               throw ex;
           }
       }
       /// <summary>
       /// 當前壁紙
       /// </summary>
       /// <returns></returns>
       /// <exception cref="Exception"></exception>
       public async Task<BingWallpaper> Current()
       {
           if (ImageCount == 0)
           {
               return null;
           }
           if (_index == -1)
           {
               _index = 0;
           }
           return await GetWallpaper(_index);
       }
   }
   /// <summary>
   /// 用來保存壁紙信息的類模型
   /// </summary>
   public class BingWallpaper
   {
       /// <summary>壁紙</summary>
       public System.Drawing.Image Wallpaper { get; set; }
       /// <summary>標題</summary>
       public string Title { get; set; }
       /// <summary>版權</summary>
       public string Copyright { get; set; }
       /// <summary>版權鏈接</summary>
       public string CopyrightLink { get; set; }
       /// <summary>
       /// 壁紙所屬日期
       /// </summary>
       public string EndDate { get; set; }
   }
   /// <summary>
   /// 用來解析JSON數據的類模型
   /// </summary>
   public class BingApiModel
   {
       /// <summary>
       /// 返回圖片集合
       /// </summary>
       public Image[] images { get; set; }
   }
   public class Image
   {
       /// <summary>
       /// 每日壁紙的日期
       /// </summary>
       public string enddate { get; set; }
       /// <summary>
       /// 壁紙的地址
       /// </summary>
       public string url { get; set; }
       /// <summary>壁紙的簡述、拍攝地址(攝影人)</summary>
       public string copyright { get; set; }
       /// <summary>壁紙相關搜索鏈接</summary>
       public string copyrightlink { get; set; }
       /// <summary>壁紙的標題</summary>
       public string title { get; set; }
   }

原創聲明

作者:落水的月亮
出處:博客園
本文版權歸作者和博客園共有,歡迎轉載,轉載請務必在文章明顯位置標出作者及原文鏈接,謝謝。


必應主頁


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

-Advertisement-
Play Games
更多相關文章
  • 在Word中,分節符是一種強大的工具,用於將文檔分成不同的部分,每個部分可以有獨立的頁面設置,如頁邊距、紙張方向、頁眉和頁腳等。正確使用分節符可以極大地提升文檔的組織性和專業性,特別是在長文檔中,需要在不同部分應用不同的樣式時。本文將介紹如何使用一個免費的.NET庫通過C#實現插入或刪除Word分節 ...
  • 關說不練假把式,在上一,二篇中介紹了我心目中的CRUD的樣子 基於之前的理念,我開發了一個命名為PasteTemplate的項目,這個項目呢後續會轉化成項目模板,轉化成項目模板後,後續需要開發新的項目就可以基於這個模板創建,這樣就不要copy一個舊的項目,然後刪刪刪,改改改,重命名等操作了 強迫症, ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...