前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >上班从换一张桌面壁纸开始——开源小工具Bing每日壁纸

上班从换一张桌面壁纸开始——开源小工具Bing每日壁纸

作者头像
JadePeng
发布2021-01-14 10:35:36
7320
发布2021-01-14 10:35:36
举报
文章被收录于专栏:JadePeng的技术博客

发布一个自用的开源小软件,Bing每日壁纸,使用c# winform开发。该小软件可以自动获取Bing的精美图片设置为壁纸,并且支持随机切换历史壁纸,查看壁纸故事。

功能特性

  • 自动获取Bing最新图片并设置为壁纸
  • 壁纸故事, 你还可以查看壁纸后面的故事
  • 历史壁纸,支持查看最近两年的壁纸
  • 随机切换,随机获取几年的壁纸,穿梭时光之中
  • 定时切换,开启后每一小时自动切换壁纸

支持中英文,提供桌面widget:

查看壁纸描述:

每日壁纸
每日壁纸

原理

获取最新壁纸

http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US可以获取最新的壁纸。

代码语言:javascript
复制
 using (var client = new HttpClient())
            {
                using (var jsonStream = await client.GetStreamAsync("http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US"))
                {
                    var ser = new DataContractJsonSerializer(typeof(Result));
                    var res = (Result)ser.ReadObject(jsonStream);

                    return new HistoryImage
                    {
                        Id = Guid.NewGuid().ToString(),
                        Title = res.images[0].Copyright,
                        Description = res.images[0].Copyright,
                        ImageUrl = "http://www.bing.com" + res.images[0].URL,
                        Date = DateTime.Now.ToString("yyyy-MM-dd"),
                        AddDateTime = DateTime.Now.ToString(),
                        Locate = res.images[0].Copyright.GetBetween(",", "(")
                    };
                }
            }

获取历史壁纸

Bing未提供历史壁纸获取接口,https://bing.ioliu.cn/提供了历史数据,我们可以爬取:

代码语言:javascript
复制
 public static List<HistoryImage> LoadLatestDaysImages()
        {
            var result = new List<HistoryImage>();
            try
            {
                var html = HttpHelper.SendGet("https://bing.ioliu.cn/");
                extractImages(result, html);
            }
            catch
            {

            }
            return result;
        }

        static string SelectTextNode(HtmlDocument htmlDocument,string xpath)
        {
            var node = htmlDocument.DocumentNode.SelectSingleNode(xpath);
            if(node !=null)
            {
                return node.InnerText.Trim();
            }
            return string.Empty;
        }

        private static void extractImages(List<HistoryImage> result, string indexPageHtml)
        {
            var doc = new HtmlDocument();
            doc.LoadHtml(indexPageHtml);
            var items = doc.DocumentNode.SelectNodes("//div[@class='item']");
            //HistoryImageProvider
            items.ToList().ForEach(node =>
            {
                var date = node.SelectSingleNode(".//em[1]").InnerText;
                if (!HistoryImageProvider.IsExist(date))
                {
                    try
                    {
                        var url = "https://bing.ioliu.cn" + node.SelectSingleNode(".//a[@class='mark']").Attributes["href"].Value;
                        result.Add(fetchSpecDayWallpaper(date, url));
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
            });
        }

        private static HistoryImage fetchSpecDayWallpaper(string date, string url)
        {
            var detailHtml = HttpHelper.SendGet(url);
            var detailDoc = new HtmlDocument();
            detailDoc.LoadHtml(detailHtml);
            var result =  new HistoryImage
            {
                Id = Guid.NewGuid().ToString(),
                ImageUrl = detailDoc.DocumentNode.SelectSingleNode("//a[@class='ctrl download']").Attributes["href"].Value,
                Title = SelectTextNode(detailDoc, "//p[@class='title']"),
                Description = SelectTextNode(detailDoc, "//p[@class='sub']"),
                Date = date,
                AddDateTime = DateTime.Now.ToLongDateString(),
                updateTime = DateTime.Now.ToLongDateString(),
                Url = url,
                Locate = SelectTextNode(detailDoc, "//p[@class='location']")
            };

            if(result.Locate.Length == 0)
            {
                result.Locate = result.Title.GetBetween(",", "(");
            }

            return result;
        }

桌面widget

创建一个窗体,设置透明色

之前显示的白色文字存在毛边,可以如下方式解决, 将背景颜色和TransparencyKey 设为和文字颜色不一样即可。

代码语言:javascript
复制
 // 灰色背景,解决白色背景字体毛边问题
 this.TransparencyKey = Color.Gray;
 this.BackColor = Color.Gray;

主form启动时,显示widget:

代码语言:javascript
复制
            if (_settings.ShowWidget)
            {
                // open Desk Widget
                ShowDeskWidget();
            }

        private void ShowDeskWidget()
        {
            if (deskWidget == null)
            {
                deskWidget = new DeskWidget(this);
            }

            deskWidget.Show();
        }

下载地址

https://github.com/jadepeng/bing-wallpaper

备注

该项目fork自kompiuter/bing-wallpaper,增加了定时切换、获取历史壁纸等功能。

相关推荐

使用IDEA的同学,这里有彩虹屁插件,写代码时可以疯狂夸你 https://github.com/jadepeng/idea-rainbow-fart

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-01-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 功能特性
  • 原理
    • 获取最新壁纸
      • 获取历史壁纸
        • 桌面widget
        • 下载地址
        • 备注
        • 相关推荐
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档