简介

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

原创声明

作者:落水的月亮

出处:博客园

转载:可以转载,转载必须注明出处。必须在文章中给出原文连接。


必应主页

必应每日壁纸API封装的更多相关文章

  1. 必应每日壁纸API

    必应官网每天会更新不同的高质量背景图 我们可以通过 F12 开发者工具手动下载当天的壁纸,网上也有很多网站提供必应壁纸下载.如果我们想每天应用最新的壁纸到我们的网站上就需要手动下载再设置壁纸,比较麻烦 ...

  2. Bing Test -必应每日壁纸自动换

    今天向大家推荐一个桌面美化类的工具,没错就是自动更换壁纸,而且是精美的必应每日壁纸哦!绿色小巧,开机自启动,设置后每日自动更新你的桌面~ 软件名称:Bing Test 链接: http://pan.b ...

  3. Bing每日壁纸API

    懒人直接出图 https://www.shadow-forum.com/api/bing/bing.php API API地址: https://bing.biturl.top 调用方式: HTTP ...

  4. Shell脚本 curl获取必应每日壁纸(Mac OS)

    Mac上Safari不能下载壁纸,遇到好看的很想用作壁纸.写了一小段脚本用来拉取网页图片. curl: -sS 参数用来取消下载状态显示 grep 首先把含有图片网址的行提取了出来,针对这一行再做se ...

  5. 必应每日图片api

    https://cn.bing.com/HPImageArchive.aspx?format=xml&cc=jp&idx=0&n=1 format   = 'xml' | 'j ...

  6. 获取Bing每日图片API接口

    bing图片每日更新,对于这一点感觉挺不错的,如果能够把bing每日图片作为博客背景是不是很不错呢?首先我们进入Bing首页,会发现自动转到中国版.不过这没关系,中国版更符合国情,速度也比国际版快一些 ...

  7. 获取Bing每日壁纸用作首屏大图

    获取Bing每日壁纸用作首屏大图 Bing 搜索每天都会更换一张精美的图片作为壁纸,除了特殊时候不太好看外(比如春节那几天),没多大问题.移动端还有上每日故事,与图片现配.现在我的博客首屏图片就是Bi ...

  8. 使用C#正则表达式获取必应每日图片地址

    微软的Bing搜索引擎首页每天都会提供了一些有趣的图片,下面使用正则表达式获取图片的地址,不管是在手机app还是在网站上都是很好的图片素材,而且每天更新,非常不错. 首先访问微软的API,该地址返回的 ...

  9. 如何获取 bing 每日壁纸(超高清版)

    目录 需求描述 实现方式 简单粗暴 如何下载 如何更高清 排坑指南 初级 优点 给有好奇心的孩子 进阶 接口 自动保存 网站集成 爬虫 需求描述 必应作为一个在壁纸圈做搜索引擎最优秀的站点,其每日壁纸 ...

  10. C#开发微信门户及应用(32)--微信支付接入和API封装使用

    在微信的应用上,微信支付是一个比较有用的部分,但也是比较复杂的技术要点,在微商大行其道的年代,自己的商店没有增加微信支付好像也说不过去,微信支付旨在为广大微信用户及商户提供更优质的支付服务,微信的支付 ...

随机推荐

  1. yb课堂 实战之路由拦截和订单模块 《四十二》

    前置守护 路由拦截功能开发 文档:https://router.vuejs.org/zh/guide/advanced/navigation-guards.html router里面配置需要登陆的路由 ...

  2. 记一次 .NET某酒业业务系统 崩溃分析

    一:背景 1. 讲故事 前些天有位朋友找到我,说他的程序每次关闭时就会自动崩溃,一直找不到原因让我帮忙看一下怎么回事,这位朋友应该是第二次找我了,分析了下 dump 还是挺经典的,拿出来给大家分享一下 ...

  3. 记一次使用python的selenium库爬取动态页面内容的经历

    安装与配置selenium 安装selenium库 pip install selenium 配置浏览器驱动(本次使用Google Chrome) 打开Chrome,在浏览器的地址栏,输入chrome ...

  4. 常用IDE(开发工具)

    一.开发工具 Visual Studio Microsoft Visual Studio(简称VS)是微软公司提供的IDE,可以在VS上编写C.C++.C#等多种语言的项目,所写的代码适用于微软支持的 ...

  5. Asp .Net Core 系列:基于 T4 模板生成代码

    目录 简介 组成部分 分类 Visual Studio 中使用T4模板 创建T4模板文件 2. 编写T4模板 3. 转换模板 中心控制Manager 根据 MySQL 数据生成 实体 简介 T4模板, ...

  6. TokenObtainPairSerialize

    TokenObtainPairSerializer是Django REST framework的SimpleJWT库提供的序列化器.它用于对用户凭据(如用户名和密码)进行序列化和验证,并在成功的身份验 ...

  7. [oeasy]python0041_teletype历史_博多码_shift_capslock_字符数字切换_gear

    teletypewriter 历史 回忆上次内容 上次见到了一个真的机械打字机 感受到了蒸汽朋克的时代背景 上上次区分了一些概念 terminal终端,电脑连线最终的端点 TeleTYpewriter ...

  8. linux date格式化获取时间

    转载请注明出处: 在编写shell脚本时,需要在shell脚本中格式化时间,特此整理下date命令相关参数的应用 root@controller1:~# date --help 用法:date [选项 ...

  9. Oracle 序列学习与使用总结

    Oracle序列学习与使用总结 by:授客 QQ:1033553122 简述 序列是oracle提供的用于生成一系列数字的数据库对象,序列会自动生成顺序递增的序列号,可用于提供唯一的自动递增主键.序列 ...

  10. JVM系列(一) -浅谈虚拟机的成长史

    一.摘要 众所周知,Java 经过多年的发展,已经从一门单纯的计算机编程语言,发展成了一套成熟的软件解决方案.从互联网到企业平台,Java 是目前使用最广泛的编程语言. 以下这段内容是来自 Java ...