首页 > 其他分享 >必应每日壁纸API封装

必应每日壁纸API封装

时间:2024-09-06 23:14:28浏览次数:3  
标签:index set 封装 string get API 壁纸 public

简介

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

原创声明

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


必应主页

标签:index,set,封装,string,get,API,壁纸,public
From: https://www.cnblogs.com/lsdyl/p/18401036

相关文章

  • 数据库上云有多轻松?华为云技术专家带你玩转云数据库API
    本文分享自华为云开发者联盟微信公众号《DTSETechTalk|第65期:智能数据底座使能千行百业,华为云数据库服务API揭秘与实践探索》华为云GaussDB是一款软硬全栈协同的企业级原生分布式数据库,支持x86和Kunpeng硬件架构,基于Share-nothing架构,具备高可用、高安全、高性能、......
  • 使用“天聚数行”藏头诗生成API:轻松创作个性化诗词
    在日常生活中,有时我们需要一些创意的方式来表达情感或增加趣味性。“天聚数行”提供的藏头诗生成API就是一个很好的工具,可以帮助我们轻松创作个性化的诗词。以下是关于如何使用这一API的详细介绍。API概述“天聚数行”的藏头诗生成API是上海觉克信息科技有限公司团队开发......
  • API 网关 OpenID Connect 实战:单点登录(SSO)如此简单
    作者:戴靖泽,阿里云API网关研发,Higress开源社区Member前言随着企业的发展,所使用的系统数量逐渐增多,用户在使用不同系统时需要频繁登录,导致用户体验较差。单点登录(SingleSign-On,简称SSO)正是为了解决这一问题。当用户登录一次后,即可获取所有系统的访问权限,不需要对每个单一系统逐......
  • API 网关 OpenID Connect 实战:单点登录(SSO)如此简单
    作者:戴靖泽,阿里云API网关研发,Higress开源社区Member前言随着企业的发展,所使用的系统数量逐渐增多,用户在使用不同系统时需要频繁登录,导致用户体验较差。单点登录(SingleSign-On,简称SSO)正是为了解决这一问题。当用户登录一次后,即可获取所有系统的访问权限,不需要对每个单一系......
  • API接口不稳定问题诊断与解决方案,看这一篇你就知道怎么做了!!
    一、问题分析API接口不稳定可能由多种因素引起,以下是对可能原因的详细分析:网络问题:网络延迟:网络拥塞或传输距离过长导致的延迟。网络丢包:由于网络不稳定或设备故障导致的数据包丢失。DNS解析问题:DNS服务器响应慢或解析错误。服务器负载:高并发:大量请求同时访问服务器,超过服务器处理......
  • 【c#】使用Win32API控制台程序的显示和隐藏
    大家好,又见面了,我是你们的朋友全栈君。在项目开发的过程中,为了方便调试,利用控制台打印出一些提示信息,当安装到现场的时候,我们担心工作人员手误关掉了程序,所以将控制台隐藏,让程序在后台跑。下面是具体的显示和隐藏的代码:代码语言:C#复制///<summary>......
  • 电商数据API:人工智能的影响分析
    一、技术、应用场景及潜在影响技术转变:数据接口标准化:电商数据API为人工智能系统提供了标准化的数据访问方式,使得AI模型能够高效地获取和处理电商平台的交易、用户行为、商品信息等数据。大数据处理能力:AI技术,特别是机器学习和深度学习,依赖于大规模数据的处理和分析能力。电......
  • 抖音关键词视频列表 API 的使用方法和技巧
    抖音关键词视频列表API是一个强大的工具,可以帮助开发者根据特定关键词检索并获取相关的抖音视频信息。以下是关于如何使用这个API的一些方法和技巧:一、获取API访问权限注册开发者账号:首先,你需要在抖音开放平台(或相应的开发者平台)上注册一个开发者账号。创建应用:在开发......
  • 身份证识别及信息核验 API 对接说明
    身份证识别及信息核验API对接说明本文将介绍一种身份证识别及信息核验API对接说明,它可以通过输入身份证图片或姓名和身份证号码,来校验姓名和身份证号的真实性和一致性。本接口用于校验姓名和身份证号的真实性和一致性,您可以通过输入姓名和身份证号或传入身份证人像......
  • AI大模型接口封装
    在当今的AI应用场景中,许多企业和开发者面临一个共同的挑战:如何在不修改代码的情况下灵活调用不同的大模型(如OpenAI的GPT和Google的Bard),并且让这些调用尽可能简洁、可维护。这篇博客将介绍如何使用SpringBoot结合多种设计模式,实现一个屏蔽大模型差异的统一接口,从而使大模型应用更加......