首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

必应每日壁纸API封装

编程知识
2024年09月06日 22:09

简介

这个类封装了必应首页的每日壁纸查看功能,提供了查看、保存壁纸的方法,最大支持查看近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; }
   }

原创声明

作者:落水的月亮
出处:博客园
转载:可以转载,转载必须注明出处。必须在文章中给出原文连接。


必应主页

From:https://www.cnblogs.com/lsdyl/p/18401036
本文地址: http://shuzixingkong.net/article/1798
0评论
提交 加载更多评论
其他文章 代码整洁之道--读书笔记(3)
代码整洁之道 简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更高台阶。 本书适合所有程序员阅读,
代码整洁之道--读书笔记(3) 代码整洁之道--读书笔记(3)
受 LabelImg 启发的基于 web 的图像标注工具,基于 Vue 框架
受 LabelImg 启发的基于 web 的图像标注工具,基于 Vue 框架 哟,网友们好,年更鸽子终于想起了他的博客园密码。如标题所述,今天给大家带来的是一个基于 vue2 的图像标注工具。至于它诞生的契机呢,应该是我导 pass 掉了我的提议(让甲方使用 LabelImg 进行数据标注),说是要
受 LabelImg 启发的基于 web 的图像标注工具,基于 Vue 框架 受 LabelImg 启发的基于 web 的图像标注工具,基于 Vue 框架 受 LabelImg 启发的基于 web 的图像标注工具,基于 Vue 框架
.NET 压缩/解压文件
本文为大家介绍下.NET解压/压缩zip文件。虽然解压缩不是啥核心技术,但压缩性能以及进度处理还是需要关注下,针对使用较多的zip开源组件验证,给大家提供个技术选型参考 之前在《.NET WebSocket高并发通信阻塞问题 - 唐宋元明清2188 - 博客园 (cnblogs.com)》讲过,团队
.NET 压缩/解压文件 .NET 压缩/解压文件 .NET 压缩/解压文件
Git使用经验总结6-删除远端历史记录
删除远端的历史记录但是不影响最新的仓库内容是笔者一直想实现的功能,有两个很不错的用处: 有的历史提交不慎包含了比较敏感的信息,提交的时候没注意,过了一段时间才发现。这个时候已经有了很多新的历史提交,无法再回退了。 有时候会拿Git仓库存储代码文件以外的内容,比如美术资源、依赖库等等。这时除了少数提交
(零) React Native 项目开发拾遗
一位离职的前端同事,最近接了个 React Native 的活儿,遇到许多搞不定的问题,于是找到我帮忙“补课”(没有系统的学习 React Native,也不具备原生 Android 和 iOS 开发基础知识)。 此前带过另一位前端同事入门 React Native 开发,有段时间甚至一天得花一两个
JDBC,SQL注入,事务,C3P0于Druid连接池(最详细解析)
JDBC JDBC(Java DataBase Connectivty,Java数据库连接)API,是一种用于执行Sql语句的Java API,可以为关系型数据库提供统一的访问,其由一组Java编写的类和接口组成. JDBC驱动程序 起初,SUN公司推出JDBC API希望能适用于所有数据库,但实际
JDBC,SQL注入,事务,C3P0于Druid连接池(最详细解析) JDBC,SQL注入,事务,C3P0于Druid连接池(最详细解析) JDBC,SQL注入,事务,C3P0于Druid连接池(最详细解析)
musl libc 与 glibc 在 .NET 应用程序中的兼容性
musl Linux 和 glibc 是两种不同的 C 标准库实现,它们在多个方面存在显著差异。历史和使用情况:glibc 是较早且广泛使用的 C 标准库实现,具有较长的开发历史和广泛的社区支持。它被大多数 Linux 发行版采用,特别是在桌面和服务器环境中。 musl 是一个相对较新的实现,旨在提
五子棋AI:实现逻辑与相关背景探讨(上)
绪论 本合集将详细讲述如何实现基于群只能遗传算法的五子棋AI,采用C++作为底层编程语言 本篇将简要讨论实现思路,并在后续的文中逐一展开 了解五子棋 五子棋规则 五子棋是一种经典的棋类游戏,规则简单却充满策略性。游戏在一个19&#215;19的棋盘上进行(也可以使用13&#215;13或15&#21
五子棋AI:实现逻辑与相关背景探讨(上) 五子棋AI:实现逻辑与相关背景探讨(上) 五子棋AI:实现逻辑与相关背景探讨(上)