我在使用博客主题amaze设置外观时,需要设置背景图片地址,原本想直接用一张网上的图片,后来一想时间长了会厌倦,但是又不想总是去修改设置,所以想自己做个壁纸接口,自己刷新。
虽然搜索没用过必应,但是它的背景还是记忆深刻的。
查了查资料,发现有不少人用必应的接口,还有人已经做了一个壁纸类网站了必应每日高清壁纸;参考了这篇博客必应每日一图接口,博主最后贴了个接口地址,https://www.dujin.org/sys/bing/1920.php 可以直接得到今天必应的图片,但这不是我想要的。 结合这个思路,我按照生成验证码的设计方式改了改代码:
- 先调用必应壁纸的接口,把返回的图片路径拼接为一个完整的URL地址
- 根据图片URL地址,画图,返回到页面输出
- 扩展:
- 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
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
2
3
4
5
6
7
8
9
10
11
12
~~ 收工!~~