获取Bing每日壁纸用作首屏大图
获取Bing每日壁纸用作首屏大图
Bing 搜索每天都会更换一张精美的图片作为壁纸,除了特殊时候不太好看外(比如春节那几天),没多大问题。移动端还有上每日故事,与图片现配。现在我的博客首屏图片就是Bing每日壁纸,有没有感觉B格满满^_^。本文将介绍如何把Bing每日壁纸和故事扒到自己博客。
获取API接口
首先我们进入Bing首页,会发现自动转到中国版。不过这没关系,中国版更符合国情,速度也比国际版快一些。
通过抓包,可以发现http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1
这里可以获取到无水印的图片。
那每日故事呢?通过模拟UA,访问移动版。同样发现了API接口http://cn.bing.com/cnhp/coverstory/
。不过这里的图片是有水印的。
接口已经得到了,接下来就是写代码了。因为我既想使用无水印的图片,也想获取每日故事,所以我把两个接口结合起来使用。
代码
<?php/** * 获取Bing每日壁纸和故事 * @author giuem */function bingImgFetch(){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1'); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'User-Agent: Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36' )); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $re = curl_exec($ch); curl_close($ch); $re = json_decode($re,1);//电脑版返回内容 $re2 = json_decode(file_get_contents('http://cn.bing.com/cnhp/coverstory/'),1);//移动版返回内容 return array( /* 更改图片尺寸,减小体积 */ 'url' => str_replace('1920x1080','1366x768',$re['images'][0]['url']), /* 结束日期 */ 'date' => date('j',strtotime($re['images'][0]['enddate'])), /* 故事标题 */ 'title' => $re2['title'], /* 内容 */ 'd' => $re2['para1'] );}?> |
使用示例
如果是wordpress,可以把上面的代码丢进function.php
,然后该怎么用就怎么用。
$bingimg= bingImgFetch();echo $bingimg['url'];//输出图片地址echo $bingimg['title'];echo $bingimg['d']; |
我的使用方法
因为我用的是静态博客,不能在后端完成这些操作,所以只能通过js获取。同时把代码放在国内访问较快的SAE
中,使用Memcache
缓存内容。而且我在获取后还把数据储存在localStorage
中,这样可以减少请求次数。
为什么要缓存?因为不缓存的话,别人每访问一次你都要获取一次,IP可能会被被Bing ban了。
当然,你也可以缓存到数据库中,这些你都可以结合实际情况修改代码。
PHP in SAE
<?phpheader('Access-Control-Allow-Origin: *');$mmc=memcache_init();if($mmc==false){ /* 如果memcache启动失败,直接获取 */ $bingimg = json_encode(bingImgFetch());}else { $bingimg = memcache_get($mmc,'bing_url'); $date = memcache_get($mmc,'bing_url_date'); /* 判断日期进行更新 */ if(date('j') != $date || !$bingimg || !$date){ $bingimg = json_encode(bingImgFetch()); /* 写入 */ memcache_set($mmc,"bing_url",$bingimg); memcache_set($mmc,"bing_url_date",date('j')); }}echo $bingimg;function bingImgFetch(){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1'); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'User-Agent: Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36' )); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $re = curl_exec($ch); curl_close($ch); $re = json_decode($re,1); $re2 = json_decode(file_get_contents('http://cn.bing.com/cnhp/coverstory/'),1); return array( 'url' => str_replace('1920x1080','1366x768',$re['images'][0]['url']), 'date' => date('j',strtotime($re['images'][0]['enddate'])), 'title' => $re2['title'], 'd' => $re2['para1'] );} |
HTML
<section id="hero"> <div class="hero-warp"> <p id="hero-title"></p> <p id="hero-d"></p> </div></section> |
CSS
html,body { height: 100%;}#hero { position: relative; height: 100%; background-color: rgba(0,0,0,0.6); background-position: center center; background-repeat: no-repeat; background-size: cover; background-attachment: fixed; width: 100%; text-align: center; color: #fff; display: table;}.hero-warp { display: table-cell; vertical-align: middle; text-align: center;}#hero-title { font-size: 28px; margin-bottom: 8px;}#hero-d { width: 80%; margin: 0 auto;} |
JS
如果你使用jQuery
,可以把这里的ajax换成$.ajax()实现。
(function() { //bing pic load var $data = { title: localStorage.getItem('bing_title') ? localStorage.getItem('bing_title') : '', d: localStorage.getItem('bing_d') ? localStorage.getItem('bing_d') : '', url: localStorage.getItem('bing_url') ? localStorage.getItem('bing_url') : '', date: localStorage.getItem('bing_date') ? localStorage.getItem('bing_date') : '' }; if (new Date().getDate() != $data.date || $data.title == '' || $data.d == '' || $data.url == '') { ajax('GET', '//giuem.sinaapp.com/bing/', function($data) { localStorage.setItem('bing_title', $data.title); localStorage.setItem('bing_d', $data.d); localStorage.setItem('bing_url', $data.url); localStorage.setItem('bing_date', new Date().getDate()); setHero($data); }); } else { setHero($data); }})();function setHero($data) { var $hero = document.getElementById('hero'); if (!$hero) {return ;} if ($data) { $hero.style.cssText += 'background-image:url(' + $data.url + ')'; document.getElementById('hero-title').innerHTML = $data.title; document.getElementById('hero-d').innerHTML = $data.d; }}function ajax(type, url, opts, callback) { var xhr = new XMLHttpRequest(); if (typeof opts === 'function') { callback = opts; opts = null; } xhr.open(type, url); var fd = new FormData(); if (type === 'POST' && opts) { for (var key in opts) { fd.append(key, JSON.stringify(opts[key])); } } xhr.onload = function() { callback(JSON.parse(xhr.response)); }; xhr.send(opts ? fd : null);} |
获取Bing每日壁纸用作首屏大图的更多相关文章
- 如何获取 bing 每日壁纸(超高清版)
目录 需求描述 实现方式 简单粗暴 如何下载 如何更高清 排坑指南 初级 优点 给有好奇心的孩子 进阶 接口 自动保存 网站集成 爬虫 需求描述 必应作为一个在壁纸圈做搜索引擎最优秀的站点,其每日壁纸 ...
- 【开源小软件 】Bing每日壁纸 让桌面壁纸保持更新
发布一个开源小软件,Bing每日壁纸. 该小软件可以自动获取Bing的精美图片设置为壁纸,并且支持随机切换历史壁纸,查看壁纸故事. 欢迎大家下载使用,点star!有问题请留言或者提issue. 开源地 ...
- 【开源小软件 】Bing每日壁纸 V1.2.1
Bing每日壁纸发布V1.2版本,下载地址Release V1.2.1 该小软件可以自动获取Bing的精美图片设置为壁纸,并且支持随机切换历史壁纸,查看壁纸故事. 本次新增国际化支持,以及桌面widg ...
- 上班从换一张桌面壁纸开始——开源小工具Bing每日壁纸
发布一个自用的开源小软件,Bing每日壁纸,使用c# winform开发.该小软件可以自动获取Bing的精美图片设置为壁纸,并且支持随机切换历史壁纸,查看壁纸故事. 功能特性 自动获取Bing最新图片 ...
- DzzOffice添加动态壁纸例子-Bing每日壁纸
Bing每日壁纸介绍:bing网站每天会更新一张不同的精选图片. 此压缩包内的程序,可以自动同步更新cn.bing.com网站每天更新的图片,作为dzzoffice的壁纸使用.实现自动每天更换不同的云 ...
- 获取Bing每日图片API接口
bing图片每日更新,对于这一点感觉挺不错的,如果能够把bing每日图片作为博客背景是不是很不错呢?首先我们进入Bing首页,会发现自动转到中国版.不过这没关系,中国版更符合国情,速度也比国际版快一些 ...
- Bing每日壁纸API
懒人直接出图 https://www.shadow-forum.com/api/bing/bing.php API API地址: https://bing.biturl.top 调用方式: HTTP ...
- 获取bing每日图片
http://global.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=en-US 其中idx表示倒数第几张图片 ...
- Shell脚本 curl获取必应每日壁纸(Mac OS)
Mac上Safari不能下载壁纸,遇到好看的很想用作壁纸.写了一小段脚本用来拉取网页图片. curl: -sS 参数用来取消下载状态显示 grep 首先把含有图片网址的行提取了出来,针对这一行再做se ...
随机推荐
- spring data之JDBCTemplate学习笔记
一.spring 数据访问哲学 1.为避免持久化的逻辑分散在程序的各个组件中,数据访问的功能应到放到一个或多个专注于此的组件中,一般称之为数据访问对象(data access object,DAO). ...
- ELK系列(5) - Logstash怎么分割字符串并添加新的字段到Elasticsearch
问题 有时候我们想要在Logstash里对收集到的日志等信息进行分割,并且将分割后的字符作为新的字符来index到Elasticsearch里.假定需求如下: Logstash收集到的日志字段mess ...
- win10系统添加照片查看器(win7版)
很多人不习惯win10的照片查看器,还是比较怀念win7版本的照片查看器,通过以下两种方法可以在win10图片上点击右键时,"打开方式"中重现"Windows照片查看器& ...
- (转)rename命令详解
rename命令详解: 原文:http://www.cnblogs.com/amosli/p/3491649.html 对文件重命名是常用的操作之一,一般对单个文件的重命名用mv命令,如: amosl ...
- datagrid 里面的formatter方法
A.{field:'station_staus',title:'工位状态',width:250,align:'center',formatter: function(value,row,index){ ...
- PHP面试题基础问题
1.对于大流量的网站,您采用什么样的方法来解决访问量问题? 首先,确认服务器硬件是否足够支持当前的流量 其次,优化数据库访问. 第三,禁止外部的盗链. 第四,控制大文件的下载. 第五,使用不同主机分流 ...
- spring mvc 注解扫描问题 ,扫描不到controller, use-default-filters="false"
今天搭了个spring mvc项目,怎么也扫描不到controller,最后发现问题在use-default-filters="false"上面,乱copy出的问题 (默认值是tr ...
- GridView相同内容合并单元格
using System;using System.Data;using System.Configuration;using System.Collections;using System.Web; ...
- es6声明对象以及作用域与es5对比
es6声明变量: let x=1;//声明一个变量 const y=2;//声明一个只读常量,声明时必须赋值,之后值不可修改 es5声明变量: var z=3;//声明一个变量 区别: let不存在变 ...
- vue-resource的使用
之前使用axios post请求不能向后台发送数据,然后使用了vue-resource这个插件 import Vue from 'vue' import VueResource from 'vue- ...