Java 基于七牛云实现随机图库 API

需求

项目源代码地址(欢迎star) https://github.com/studychen/SeeNewsV2

本文链接 http://www.alijava.com/random-image/ 转载请注明出处

在实现APP 过程中,有些文章没有图片,想随机获取一张图片作为封面。

网上找到一个 API,访问 https://unsplash.it/300/200/?random 可以获取一张随机产生的图片。

后面笔者为了方便国内网络访问,把图片转移到了七牛云,共享给大家。

方案一

把图片的 src 设为 https://unsplash.it/300/200/?random ,图片是随机的了,但是两张随机图片是一模一样的,参加下面的代码和效果图。

1
2
3
<img src="https://unsplash.it/300/200/?random" alt="blog.csdn.net/never_cxb" title="">
<img src="https://unsplash.it/300/200/?random" alt="blog.csdn.net/never_cxb" title="">

你可以刷新本博客文章,两张图会随机变化,但是两张图依然保持一样。

不知道这是不是和浏览器缓存有关系,请大神赐教。

blog.csdn.net/never_cxb

blog.csdn.net/never_cxb

方案二

该网站也提供了根据 id 来获取图片,使用方法在 url 后面加上 ?image参数。

https://unsplash.it/200/200?image=100 的图片内容为:

blog.csdn.net/never_cxb

笔者使用下面的代码来随机产生 id,从而获取随机图片

1
2
Random randrom = new Random(47);
String url = "https://unsplash.it/640/427/?image=" +randrom.nextInt(1000);

但是测试发现,一小部分id对应的图片不存在,比如 https://unsplash.it/200/300?image=86https://unsplash.it/200/300?image=105 等等。

抓取图片

笔者把该 API 提供的图片抓取到了七牛云上,保证图片的 id 是连续的

可以通过我的邀请链接 https://portal.qiniu.com/signup?code=3lpzf1unpyr0y 注册七牛,享受优惠及免费空间。

代码

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
public class UploadRandomImage {
private static final String RANDOM_URL = "https://unsplash.it/640/427/?image=";
private static final String ACCESS_KEY = "*****"; // 你的access_key
private static final String SECRET_KEY = "*****"; // 你的secret_key
private static final String BUCKET_NAME = "*****"; // 你的空间名称
public static void main(String[] args) throws InterruptedException, IOException {
Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
// 获取空间管理
BucketManager bucketManager = new BucketManager(auth);
int key = 0;
for (int i = 0; i < 1025; i++) {
// 如果 i 对应的图片存在,上传七牛
if (exists(i)) {
bucketManager.fetch(RANDOM_URL + i, BUCKET_NAME, key + "");
// 只有上传了七牛,key 才+1,保证七牛的 key 连续
key++;
// sleep一段时间,免得对网站负载过大
Thread.sleep(1000 * 10 + new Random().nextInt(1000 * 10));
} else {
System.out.println(i + "不存在");
}
}
System.out.println(key + "最终图片数目");
}
/**
* 判断地址对于的图片是否存在
* @param id
* @return
*/
public static boolean exists(int id) {
try {
HttpURLConnection.setFollowRedirects(false);
HttpURLConnection con = (HttpURLConnection) new URL(RANDOM_URL + id).openConnection();
con.setRequestMethod("HEAD");
return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}

总结

可以访问 http://7xr4g8.com1.z0.glb.clouddn.com/671 获取图片,后面数字671是图片编号

blog.csdn.net/never_cxb

目前有效图标编号的是 0 到 964,可以通过随机产生 id 来获取随机图片

1
2
Random randrom = new Random(47);
String url = "http://7xr4g8.com1.z0.glb.clouddn.com/" +randrom.nextInt(964+1);

项目源代码地址(欢迎star) https://github.com/studychen/SeeNewsV2