在捣鼓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 ())); }