必应每日壁纸API封装

news/2024/9/20 5:25:38/文章来源:https://www.cnblogs.com/lsdyl/p/18401036

简介

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

原创声明

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


必应主页

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/793311.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第17篇 RabbitMQ安装详细步骤

一.RabbitMQ是什么? RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。 ​ AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。…

How to create the Gold gold using RGB color values All In One

How to create the Gold gold using RGB color values All In OneHow to create the Gold gold using RGB color values All In One如何使用 RGB 颜色值创建金色Gold (Golden) Color Color Name: Gold (Golden) Hex Color Code: #FFD700 RGB Color Code: RGB(255, 215, 0) CMYK…

代码整洁之道--读书笔记(3)

代码整洁之道简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更…

谈谈Spring中的BeanPostProcessor接口(转)

原文:谈谈Spring中的BeanPostProcessor接口 作者:特务依昂一. 前言这几天正在复习Spring的相关内容,在了解bean的生命周期的时候,发现其中涉及到一个特殊的接口——BeanPostProcessor接口。由于网上没有找到比较好的博客,所有最后花了好几个小时,通过Spring的官方文档对它…

【python】打包神器--pyinstaller

1:简介pyinstaller是一个python的第三方库,它能够在Windows、Linux、 Mac OS 等操作系统下将 Python 源文件打包,通过对源文件打包, Python 程序可以在没有安装 Python 的环境中运行,也可以作为一个独立文件方便传递和管理。在Windows上使用就打包成.exe文件。在Mac上使用…

MYSQL的安装与配置流程

MYSQL的安装与配置流程 1.下载安装包 mysql官方下载链接2.解压并配置文件用管理员身份打开命令提示符进入解压的地址中使用一下命令安装MySQL服务mysqld install MySQL80 若显示下面失败的提示可以使用该指令卸载该服务后再重新安装 mysqld -remove MySQL80//此处为直接修改的服…

eyoucms易优网站后台密码忘记了怎么办?

如果你忘记了易优CMS(EyouCMS)网站后台的登录密码,可以按照以下步骤来重置密码: 方法一:使用官方提供的重置工具下载官方重置工具:访问易优CMS官网提供的重置工具下载链接:https://www.eyoucms.com/uploads/soft/200319/1-2003191Q000.zip。 下载并解压缩该工具包。上传…

eyoucms后台如何更换后台登录logo

扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、BUG修复、问题处理、二次开发、PSD转HTML、网站被黑、网站漏洞修复等。专业解决各种疑难杂症,您有任何网站问题都…

pbootcms后台可以打开前台打不开

问题:pbootcms后台可以打开前台打不开 原因:大概率是没有授权, 去申请授权添加后台就可以扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、BUG修复、问题处理、…

pbootcms提示:后端配置项没有正常加载,上传插件不能正常使用

打开PBootCMS程序下的core/extend/ueditor/php/controller.php文件, 将第四行的注释去掉,并且将 chongqing 修改为首字母大写 Chongqing , 修改结果如下:扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascrip…

pbootcms模板忘记后台密码怎么找回?

此工具用于忘记PbootCMS后台用户账号密码时进行重置。新建一个php文件,然后写入下面代码。稍后上传网站根目录, 访问文件就可以进入重置页面, 后续根据提示操作即可。 <?php /*** @copyright (C)2016-2099 Hnaoyun Inc.* @author XingMeng* @email hnxsh@foxmail.com*…