在捣鼓github page的时候,学到了一个新的名词random image server api
, 页面可以利用这些服务随机的展示图片,丰富自己网站的表现形式。第一映像觉得很不现实,在网络上,流量费用是相当贵的,而对于一些高清的图片,费用更贵,不太可能会存在免费的提供图片下载的站点。不然就是做公益了。 基于这个问题,就想弄清楚这些网站的背后机制是什么?
分析了我自己在使用的这个随机图片api后,其原理大概已经清楚了,简单来说,这些随机图片api本身并不提供图片的展示服务,其只是将客户端的请求随机的302到一个图片的地址上,而图片的地址就是用网上大范围的图片服务提供的地址即可。比较简单的一个示例如下:
1 2 3 4 curl -s 'https://cn.bing.com/' | egrep 'preload" href="[^"]+"' -o | egrep 'https[^"]+' -o # 上述脚本会将bing首页展示的背景图片的地址扣出来,随机图片服务就利用这个原理,达到了图片随机的效果。 # https://s.cn.bing.net/th?id =OHR.HautBarr_ZH-CN8274813404_1920x1080.webp&qlt=50
对于网络上的图床,其效果也是类似的效果,比如某一个业务有图片上传能力,那么一个简单的图床就产生了,对这个业务的上传接口做包装,图片上传后的地址就作为可以外链访问的地址即可。
but… 实际尝试下来,不同的页面访问bing的首页,返回的页面格式存在差异,重新分析了下bing的返回内容以及接口,发现了一个比较合适的接口,简单的代码片段如下, 实际可以访问的地址为http://www.royjo.ltd/bing_img
1 2 3 4 5 6 7 8 9 10 11 12 13 if let Ok (client) = reqwest::ClientBuilder::new ().connect_timeout (Duration::from_secs (5 )).build (){ let t = client.get ("https://cn.bing.com/hp/api/v1/imagegallery?format=json" ).send ().await .unwrap ().json::<serde_json::Value>().await .unwrap (); let v :Vec <String > = t["data" ]["images" ].as_array ().unwrap ().iter ().map (|k|{ let m = &k["imageUrls" ]["landscape" ]["highDef" ]; format! ("https://cn.bing.com{}" , m.as_str ().unwrap ()) }).collect::<Vec <String >>(); let i = random::<usize >(); let index = i % v.len (); let rand_url = v.get (index).unwrap (); return Ok (Redirect::to (rand_url.clone ())); }