自动抓取必应首页壁纸

优质壁纸

必应搜索(bing.com)作为一个较为大型的搜索引擎,一直是一个最佳的壁纸网站,每天0点准时更新壁纸,并且图片质量非常不错。
本站一直抓取bing的首页图片,作为首页的封面,使用301跳转,意味着这张壁纸可能很大,但是不占用本站流量,使用的是bing.com的流量。同时还新增了返回https链接,便于HTTPS的网站能够显示小绿锁。
使用了memcache,每8个小时内,仅请求一次,减低延时,降低请求次数,没有安装memcache的情形下,可以先删除memcache相关代码。
其中,1920x1080.jpg可以修改为360x480.jpg1366x768.jpg等多种分辨率。

php代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?
/*
* 获取Bing每日壁纸 YateSun 2016.02.25
*/
$memcache = new Memcache();
//$memcache->addServer("127.0.0.1", 11211);//memcached
$memcache->connect('127.0.0.1', 11211);
$url = $memcache->get('imgurl');
if(!$url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$re = curl_exec($ch);
curl_close($ch);
$re = json_decode($re,1);//电脑版返回内容
$url=$re['images'][0]['url'];
//$url=str_replace("http://s.cn.bing.net","https://www.bing.com",$url);
$url="https://www.bing.com".$url;
$memcache->set('imgurl',$url,0,8*60*60);
}
//Header( "HTTP/1.1 301 Moved Permanently" ) ;
Header( "Location: ".$url );
?>

在所有需要用到壁纸的页面,只需要将图片的url地址改为/get.php即可。

HTTPS下部署多说评论

经过短暂的使用,多说对HTTPS提供了简单的支持,但并不全面,暂时发现还有以下三种情况没有得到解决:
1.默认的头像地址
2.评论中的表情图片地址
3.输入框的表情选择框中的图片地址
下面将逐步解决以上3种情况。

修改多说公共JS代码

找到如下这一行:

1
ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';

替换为:

1
ds.src = '/js/embed.js';

本地化embed.js

在embed.js中找到:

1
'+_(Z.avatarUrl(e,t))+'

替换为

1
/cdncache.php?url='+_(Z.avatarUrl(e,t))+'

HTTP转HTTPS的php代码

在source目录添加文件cdncache.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?
//HTTP图片转HTTPS(防盗链) YateSun 2016.03.16
if(!(isset($_SERVER['HTTP_REFERER'])&&parse_url($_SERVER['HTTP_REFERER'])['hosts']='yatesun.com')){
die();
}
$url=urldecode($_REQUEST['url']);
if(preg_match("/^http/",$url)){
$opts = array('http'=>array('method'=>'GET','timeout'=>10));
$result = file_get_contents($url,FALSE,stream_context_create($opts));
if($result){
header("Cache-Control:public;maxage=604800");
header('Content-type: image/png');
echo $result;
}else{
header("HTTP/1.1 404 Not Found");
}
}else{
header("HTTP/1.1 403 Forbidden");
}
?>

不显示多说版权信息

http://yatesun.duoshuo.com/admin/settings/中,选择自定义CSS,加入:

1
#ds-thread .ds-powered-by{display:none !important;}

评论内容中表情及图片

http://yatesun.duoshuo.com/admin/settings/中,选择评论框选项,取消勾选:
1.允许插入表情
2.允许插入图片(需要同时开启下面的解析html代码)

关于

个人介绍

孙亚特,Yate Sun,2015 年毕业于佛山大学数学专业,Go / PHP / Python 开发。

工作经历

2017年9月,有米科技股份有限公司

教育经历

2015年6月,本科毕业于佛山大学(Foshan University)数学与大数据学院,数学与应用数学专业,理学学士学位

获奖经历

2015年4月,美国大学生数学建模竞赛国际三等奖
2014年9月,全国大学生数学建模竞赛广东二等奖
2014年5月,五一数学建模联赛二等奖(省级)
2013年9月,全国大学生数学建模竞赛广东三等奖
2008年6月,湛江市三好学生

联系方式

Email(Personal):yatesun@gmail.com
广州大学城(510000)

Node.js及Hexo静态博客的使用(CentOS7)

附上参考来源
原本我一直使用Linux+Nginx+MySQL+PHP+Memcache来搭建博客,因为工作的原因,对PHP相对非常熟悉,而且PHP7+Memcached的性能也足以应付大规模的商业软件。
当我想弄个自己的博客的时候,我就想,能不能换个工具呢。
大学期间就尝试过WordPress,那时候还用这个第三方CMS给大学开发过一些网站,但是WP给我的感觉就是漏洞多、性能差,当然,可能现在WP的性能并没有那么差,但使用WordPress会显得特别low,因此不适合我。
之前也用过GitBlog,也是一个基于MakeDown文的一个相对静态的博客,但是他还是需要经过index.php,并不是完全静态的博客。
由于我一直有看业内人士的博客的习惯,当看到他们写得内容特别好的时候,我也留意到他们使用的博客工具,Hexo确实吸引了我,这是一个基于Node.JS的全静态博客,能够满足我极简的需求,主题也不错,于是我开始研究如何搭建一个基于Hexo的博客。

一开始我并不了解Node.JS或者Hexo是如何运作,如何解析的,是使用何种Web服务器,于是只好慢慢研究。
我的服务器和自己的电脑都是Linux系统,PC是OpenSUSE,服务器是CentOS 7,CentOS上安装了nginx。

一、安装编译基础包

由于需要使用Git进行代码clone,故需要安装Git,安装Git之前需要安装编译基础包。

1
yum -y install gcc zlib-devel openssl-devel perl cpio expat-devel gettext-devel curl autoconf

二、安装Git

有时候git已经在服务器自带了,不需要下载源码安装。

1
yum install git

三、安装Node.js

由于Hexo是基于Node.js的,故还需要安装Node.JS。

1
2
3
4
5
6
wget http://nodejs.org/dist/node-latest.tar.gz
tar -zxf node-latest.tar.gz
cd node-v5.7.1/
./configure
make && make install
yum install npm

如果npm无法安装

1
2
ln -s /usr/local/bin/node /usr/bin/node
curl -L https://www.npmjs.com/install.sh | sudo sh

如果提示GCC编译器需要升级,可执行以下命令,升级GCC至最新版本:

1
2
3
4
5
6
7
8
wget http://gcc.skazkaforyou.com/releases/gcc-5.3.0/gcc-5.3.0.tar.gz
tar -zxf gcc-5.3.0.tar.gz
cd gcc-5.3.0/
./contrib/download_prerequisites
mkdir gcc_temp
cd gcc_temp
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
make & make install

四、安装Hexo

1
npm install -g hexo

五、建立hexo目录

新建对应博客目录,对hexo初始化,初始化完成之后,安装依赖包。

1
2
3
4
mkdir blog
cd blog
hexo init
npm install

执行

1
hexo generate

生成完全静态页面,页面默认为Public,在nginx上配置默认目录为Public,这样网站就可以访问了。

六、安装主题

在blog目录执行git命令,安装相应主题,并修改配置文件即可。

1
git clone https://github.com/xiangming/landscape-plus.git themes/landscape-plus

至此,一个完全静态页面的生成器就产生了。

七、安装RSS

1
npm install hexo-generator-feed --save

_config.yml中添加

1
2
plugins:
- hexo-generator-feed

再一次执行

1
npm update

将会每次生成新的RSS/atom.xml

八、添加百度站点地图

1
$ npm install hexo-generator-baidu-sitemap@0.1.1 --save

_config.yml中添加

1
2
baidusitemap:
path: baidusitemap.xml

九、增加TOC目录功能

修改layout/_partial/article.ejs的第21行,

1
2
3
<% } else { %>
<%- post.content %>
<% } %>

改为

1
2
3
4
5
6
7
8
<% } else { %>
<% if(post.toc !== false && toc(post.content)){ %>
<div id="toc" class="toc-article">
<%- toc(post.content)%>
</div>
<% } %>
<%- post.content %>
<% } %>

并在source/css/_partial/article.styl中加入toc相关样式,

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
//toc
#toc.toc-article
// background color-background
width 100%
border-radius 4px
margin 1.6em 0 1.6em 2em
line-height 1.5em
font-size 0.9em
-webkit-border-radius 4px

h2, ol
padding 0 0.4em
margin 0
h2
cursor pointer
@media mq-mobile
margin 1.6em 0
width 100%
@media mq-tablet
margin 1.6em 0
width 100%
#toc
line-height 1.3em
font-size 0.8em
float left
.toc
li
list-style-type none
a
&:hover
color color-font
text-decoration none !important
.toc-child
padding-left 1.5em

利用dnsmasq搭建一个可翻墙的DNS

很多人想访问Google、Facebook、Twitter等等,但由于GFW的的高性能,无法达成。因此也会有很多人会问我,一般我是怎么翻墙的,而通常我会直接给他一个DNS,让他修改成这个DNS就好了,另外再加上一个正常的DNS作为备用。
首先需要安装dnsmasq,在多个系统上,直接执行安装命令,均可直接安装dnsmasq。这是一个本地搭建缓存的DNS服务,我的PC也一直使用他用于加快访问速度。

1
2
3
4
5
6
7
strict-order
no-resolv
no-poll
server=119.29.29.29
listen-address=127.0.0.1
#listen-address=0.0.0.0
cache-size=10240

另外就是修改hosts了,将可用的hosts下载后,复制到/etc/hosts即可,然后把DNS改成你的IP,就可以连上真正的互联网了。

1
wget https://raw.githubusercontent.com/racaljk/hosts/master/hosts -qO /tmp/hosts && sudo mv /tmp/hosts /etc/hosts

需编写代码,定期执行改代码,保证当前的hosts可用。

1
2
00 03 * * * root /data/cp_hosts.sh
02 03 * * * root service dnsmasq restart

MySQL部分错误及解决方法

MySQL错误

1、问题描述

1
2
3
4
[root@localhost mysql]# **/etc/rc.d/init.d/mysql status**
MySQL is not running, but lock file (/var/lock/subsys/mysql[FAILED]
[root@localhost mysql]# **/etc/rc.d/init.d/mysql start**
Starting MySQL...The server quit without updating PID file (/usr/local/mysql/data/localhost.localdomain.pid).[FAILED]

2、解决方案
导致这个问题的发送,主要是因为msyql或这mysqld进程没有正常关闭,故导致新的pid进程不能创建。无法初始化权限表。
极有可能是因为服务器储存空间被占满,此时,仅需清理硬盘空间,然后重启mysql即可,若依旧不可以,可参考以下做法。

3、解决代码

1
2
3
4
5
6
7
8
cd /usr/local/mysql/
chown -R mysql.mysql .
su - mysql
cd /usr/local/mysql/
scripts/mysql_install_db
/usr/local/mysql/bin/mysqld_safe --user=mysql &
/etc/rc.d/init.d/mysql status
/etc/rc.d/init.d/mysql status

HTTPS+HTTP/2+HSTS+Perfect-Forward-Secrecy相关配置

一. 简单设置

可以在nginx.conf中加入以下代码开启HTTP/2,同时设置常用的域名证书为default_server,这样设置的目的是防止客户端在不支持SNI的情况下,直接使用默认证书的时候,nginx依然能够通过HTTPS解析到你的服务器。防止由于多证书存在于同一台服务器而导致未知错误的可能性。开启HTTPS时,需同时指出openssl的密钥及其公钥,作为普通用户,千万不能像12306一样,自己给自己签发HTTPS证书。需要使用经过可信的第三方CA签发的证书,其中也有很多免费的。

1
2
3
4
5
6
7
listen 443 ssl http2 default_server;
server_name yatesun.com;
index index.html index.htm index.php;
error_page 404 https://yatesun.com;
root /path/to/root;
ssl_certificate /path/to/server.crt;
ssl_certificate_key /path/to/server.key;

二. 完美前向保密(Perfect Forward Secrecy)

完美前向保密可以确保“即便一个信息受危及,也不会拖累其他信息受危及;并确保没有一个秘密值会导致多个消息受危及。”参考

我们需要生成安全性足够强的Diffie-Hellman参数。一些人认为,4096比特过长了,会给系统的处理器带来不必要的负担,但是就现在的计算能力而言,这似乎值得一试。

1
openssl dhparam -out yate4096.pem 4096

编辑文件perfect-forward-secrecy.conf,参考

1
2
3
4
5
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
ssl_dhparam yate4096.pem;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";

编辑nginx.conf,在http{}最后加入参考

1
include perfect-forward-secrecy.conf;

三、开启HSTS(HTTP Strict Transport Security)

在nginx配置文件中,加入下面一行,便可以告知浏览器,我要强制客户端使用 HTTPS 访问页面。其中max-age为有效时间,只要这个时间未过期,浏览器请求时,将会307 Redirect Internel到HTTPS页面。与301和302重定向不同,307不允许跳过「证书错误」进行访问。

1
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";

有意思的是,开启了HSTS以后,在ssllab上便能得到A+了,而仅仅开启FS时,在ssllab上只可以得到A。

四、添加perload list

其中,在header的Strict-Transport-Security中加入preload后,还是有可能出现第一次无法访问的可能性,其次,像阿里云等国内云服务器对80端口访问的未备案域名查得很严。如果浏览器从未访问过该域名,那么依然有可能在第一次连接的时候就遭到阻断或SSL剥离攻击。
那么我们可以在HSTS preload list中,向Chrome提交域名,未来几个星期,新版Chrome发布的时候,域名将内置在preload list中,服务器将预先知道我的域名是有HTTPS的,会在发送请求前,自动将HTTP转换为HTTPS。
HSTS compatibility matrix中可以看到所有支持这个preload list的浏览器,其中还包括Firefox, Safari, IE 11 and Edge。
目前,yatesun.com已经加入了HSTS preload list,在transport_security_state_static.json的7672行中已经包括了如下数据:

1
{ "name": "yatesun.com", "include_subdomains": true, "mode": "force-https" },

在Google Chrome 50的正式版本中,yatesun.com已内置到浏览器的HSTS domain中,主流浏览器的用户在浏览器中输入http://yatesun.comyatesun.com*.yatesun.com时,将会直接发送HTTPS请求。这时候,即便关闭80端口,依然能访问到网站,从而解决了被阻断或SSL剥离攻击。

大学毕业

又是一年毕业季,终于等到你,还好没放弃。
大学门口自拍
虽然今天才真正毕业,但是早已工作了好长时间,工作之后,感觉一切事物与大学都不一样了。与同学聊起来,大家都觉得仅仅工作几个月,就有一种好几年工作经验的感觉了。
情人路留念
也终于可以再次回到大学,开完毕业典礼,领到了毕业证,4年间,陆陆续续交了2万多的学费,今天终于到了收获的时候了,感觉钱没白花呀。
校门口学士服
再见!

Linux服务器常用命令

搭建服务器

1.设置数据库可以外网连接(可选)

1
2
3
4
use mysql;
select host,user,password from user;
update user set host="%" where host="::1";
flush privileges;

2.修改nginx配置文件,并赋权限700

1
chmod 700 * -R

重置mysql密码

1
2
3
vim /etc/my.cnf
[mysqld]
skip-grant-tables

常用Shell脚本

1.建立时间戳文件

1
touch -t 11020000 timestamp1

2.查找两个指定时间内的全部文件

1
find ./ -newer timestamp1 ! -newer timestamp2 -exec cp -a {} /pic/ \;

3.备份全部数据库

1
mysqldump --all-databases -h127.0.0.1 -uroot -p > allbackupfile.sql

4.备份部分数据库

1
mysqldump -u root -p data >data.sql

5.自动备份

1
30 1 * * * root mysqldump -u root -ppassword --all-databases > /data/database_`date '+%m-%d-%Y'/`.sql

nmap命令

用nmap对局域网扫描一遍,然后查看arp缓存表就可以知道局域内ip对应的mac了。nmap比较强大也可以直接扫描mac地址和端口。执行扫描之后就可以 cat /proc/net/arp查看arp缓存表了。

进行ping扫描,打印出对扫描做出响应的主机:  

1
$ nmap -sP 192.168.1.0/24

仅列出指定网络上的每台主机,不发送任何报文到目标主机: 

1
$ nmap -sL 192.168.1.0/24

探测目标主机开放的端口,可以指定一个以逗号分隔的端口列表(如-PS 22,23,25,80):  

1
$ nmap -PS 192.168.1.234

使用UDP ping探测主机:

1
$ nmap -PU 192.168.1.0/24

使用频率最高的扫描选项(SYN扫描,又称为半开放扫描),它不打开一个完全的TCP连接,执行得很快: 

1
$ nmap -sS 192.168.1.0/24

挂载阿里云硬盘

1、查看未挂载的硬盘

1
fdisk -l

2、直接格式化

1
mkfs.ext4 /dev/xvdb

3、新建文件夹

1
mkdir /data

4、挂载硬盘

1
mount /data /mnt/xvdb

6、设置开机自动挂载

1
/dev/xvdb       /data           ext4    defaults            0       0

重启后生效

7、查找并替换文件内容

1
sed -i "s/charset=gb2312/charset=utf-8/g" `grep charset=gb2312 -rl ./

8、查找文件内容

1
find .|xargs grep gb

生成公钥

1
ssh-keygen -b 4096 -t rsa

删除乱码文件

1
2
ls -liaha
find . -inum 492311024 -exec rm {} -rf \;

安装ab

1
yum -y install httpd-tools

去掉^M

1
:%s/\r//g

系统时间矫正

1
ntpdate 210.72.145.39

匹配并替换

1
find -name '*.html' |xargs sed -i 's/2005-2010/2005-2017/g'

禁止openvpn拉取route

1
route-nopull