我在使用博客主题amaze设置外观时,需要设置背景图片地址,原本想直接用一张网上的图片,后来一想时间长了会厌倦,但是又不想总是去修改设置,所以想自己做个壁纸接口,自己刷新。

虽然搜索没用过必应,但是它的背景还是记忆深刻的。

查了查资料,发现有不少人用必应的接口,还有人已经做了一个壁纸类网站了必应每日高清壁纸;参考了这篇博客必应每日一图接口,博主最后贴了个接口地址,https://www.dujin.org/sys/bing/1920.php 可以直接得到今天必应的图片,但这不是我想要的。 结合这个思路,我按照生成验证码的设计方式改了改代码:

  1. 先调用必应壁纸的接口,把返回的图片路径拼接为一个完整的URL地址
  2. 根据图片URL地址,画图,返回到页面输出
  3. 扩展:
  • flag=true 获取今天图片 flag=false 获取随机一天图片(已经实现,不过没加参数)
  • 每天自动存到图片服务器,抓取图床图片

这里我就不放我的接口地址了,懂的自然能找到...

主要代码如下,如需完整代码请到隔壁下载

package com.example.demo;

import net.sf.json.JSONObject;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

@Controller
@EnableAutoConfiguration
public class HelloApi {

    //获取Bing壁纸URL,创建图片,返回到页面
    //类似获取验证码
    @RequestMapping("/")
    public ModelAndView handleRequest(HttpServletResponse response) throws Exception {
        response.setDateHeader("Expires", 0);
        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
        response.setHeader("Pragma", "no-cache");
        response.setContentType("image/jpeg");

        URL url = new URL(getBingImgUrl(false)); //声明url对象
        URLConnection connection = url.openConnection(); //打开连接
        connection.setDoOutput(true);
        BufferedImage src = ImageIO.read(connection.getInputStream()); //读取连接的流,赋值给BufferedImage对象
        //输出图象到页面
        ImageIO.write(src, "JPEG", response.getOutputStream());
        ServletOutputStream out = response.getOutputStream();
        try {
            out.flush();
        } finally {
            out.close();
        }
        return null;
    }

    //获取Bing壁纸URL
    //flag=true 获取今天图片  flag=false 获取随机一天图片
    //后期扩展  每天自动存到图片服务器,抓取图床图片
    @ResponseBody
    @RequestMapping("/getImgUrl")
    public String getBingImgUrl(boolean flag) {
        String imgSrc = "";
        try {
            String url = "https://cn.bing.com/HPImageArchive.aspx";
            Map params = new HashMap();//请求参数
            params.put("format", "js");
            int day = flag == true ? 0 : new Random().nextInt(10);//获取必应最近7天壁纸,必应限制只显示最近7天,随机获取,大于7,显示7的壁纸
            params.put("idx", day);
            params.put("n", "2");
            String res = DoRequest.httpGet(url, params);
            JSONObject object = JSONObject.fromObject(res);
            String imgObj = object.get("images").toString();
            if (imgObj.startsWith("[")) {
                imgObj = imgObj.substring(1, imgObj.length() - 1);
            }
            JSONObject images = JSONObject.fromObject(imgObj);
            String imgUrl = images.get("url").toString();
            imgSrc = "https://cn.bing.com" + imgUrl;
        } catch (Exception e) {//报错则返回今天的图片
            String url = "https://cn.bing.com/HPImageArchive.aspx";
            Map params = new HashMap();//请求参数
            params.put("format", "js");
            params.put("idx", "0");
            params.put("n", "1");
            String res = DoRequest.httpGet(url, params);
            JSONObject object = JSONObject.fromObject(res);
            String imgObj = object.get("images").toString();
            if (imgObj.startsWith("[")) {
                imgObj = imgObj.substring(1, imgObj.length() - 1);
            }
            JSONObject images = JSONObject.fromObject(imgObj);
            String imgUrl = images.get("url").toString();
            imgSrc = "https://cn.bing.com" + imgUrl;
        }
        return imgSrc;
    }


    //获取必应壁纸最近7天  返回到html页面
    //flag=true 获取今天图片  flag=false 获取随机一天图片
    //后期扩展  每天自动存到图片服务器,抓取图床图片
    @RequestMapping("/bing")
    public String getBingPicture(HttpServletRequest request, boolean flag) {
        //方法一:返回图片Base64
//        String imgSrc = ImageUtils.getBase64ByImgUrl(getBingImgUrl(flag));
//        request.setAttribute("imgSrc", "data:image/jpg;base64, " + imgSrc);

        //方法二:返回图片URL
        String imgSrc = getBingImgUrl(flag);
        request.setAttribute("imgSrc", imgSrc);
        return "/index";
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108

后话:

就在我写这篇博客的时候,竟然不能上传附件,百度了下,发现typecho有个检测服务器环境是不是SAE,BAE,ACE及是否是国内常见的虚拟主机,如果是则不让上传附件。尼玛坑啊,说多了都是泪,解决方案如下:找到文件typecho/var/Typecho/Common.php把下面的这段代码给它return false;然后再找到/typecho/usr/uploads文件夹,赋予777权限【chmod 777 uploads】

public static function isAppEngine()
{
	return false;
	/*
    return !empty($_SERVER['HTTP_APPNAME'])                     // SAE
    || !!getenv('HTTP_BAE_ENV_APPID')                       // BAE
    || !!getenv('SERVER_SOFTWARE')                          // BAE 3.0
    || (ini_get('acl.app_id') && class_exists('Alibaba'))   // ACE
    || (isset($_SERVER['SERVER_SOFTWARE']) && strpos($_SERVER['SERVER_SOFTWARE'],'Google App Engine') !== false) // GAE
     ;
	*/
}
1
2
3
4
5
6
7
8
9
10
11
12

~~ 收工!~~