一不小心,又开始“码代码”了,在此,Young Free 得特别声明:哥真不是学计算机的,也不是搞网络工程的!所有代码都来自网络,哥只是根据自己需要,拼接调整了一下。感谢开源源码的大神们,虽然,Young Free 也不知道大神们叫什么名字。
需求
嗯,码代码前,都是要先分析需求的。
Young Free 主题使用的云落的 Git 主题,这款主题,在文章也右上角,提供了扫二维码在手机上阅读博客的功能。之前 Young Free 一直在调用百度网盘的二维码生成 API,但前几日,百度突然关闭了这个功能,导致 Young Free 博客上的这个二维码功能失效了。
方案
利用第三方服务
几经百度,找到了多个替代解决方案,可大多数都不支持 https 调用,这里就不提及了,唯有搜狐快站支持 https 调用,调用地址如下
1 |
https://www.kuaizhan.com/common/encode-png?large=true&data=https://www.ucwz.net |
自行搭建
虽然免费服务也好用,但保不准那天也会关闭服务,于是,Young Free 就有了搭建一个自己专用的二维码生成服务的想法。既然要搭建,选用构架和脚本语言的问题就来了。
构架
根本谈不上构架,这么个简单的服务,选择一个脚本就行了。百度出来结果一大堆,对于 Young Free 来说可行的有 JAVA, Python, PHP 三种语言编写的方案。Java 和 Python 需要更新 哥的阿里云 ESC 环境,这个工程有点大,所以 PHP 是最适合的。接下来就开始继续度娘可用代码。
算法
PHP 生成二维码的方法一大堆,Young Free 要的是最简单的,所以,算法什么的也是浮云。利用 PHP QR Code 源码,2个文件就能搞定所有需求。
注意事项:PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
下载下来的一大堆文件,我们只取 phpqrcode.php 一个就行,另外一个 PHP 文件需要我们自己手动写一写。因为不需要在自己服务器上保存二维码,也没有美化的需求,Young Free 百度到了如下可用代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<? //生成原始的二维码(不生成图片文件) function yfqr($url=''){ require_once 'phpqrcode.php'; $value = $url; //二维码内容 $errorCorrectionLevel = 'L'; //容错级别 $matrixPointSize = 5; //生成图片大小 //生成二维码图片 $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2); } //调用查看结果 yfqr('https://www.ucwz.net'); //在这个 ()括号里写需要生成二维码的网址或文字 ?> |
不需要美化的终极原因是因为搞不定 QAQ.
问题
这个代码,只能生成源代码里面写好的网址或文字内容的二维码,Young Free 需要的是直接通过 URL 来调用,显然需要改造一下。
既然源码中网址那里是 定量,那可不可以变换成 变量 啊?开干才知道。Young Free 一直在用一个站外链接跳转的中间页,里面就用到了获取 URL 中 跳转目标 URL 的函数。拿过来用用吧。
1 |
<?php $url=$_GET['url']; echo htmlspecialchars($url);?> // 核心为 $_GET['url'] 这个函数 |
完善代码
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<? function yfqr($url=''){ require_once 'phpqrcode.php'; $value = $url; //二维码内容 $errorCorrectionLevel = 'L'; //容错级别 $matrixPointSize = 5; //生成图片大小 //生成二维码图片 $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2); } //调用查看结果 yfqr($_GET['url'],''); //获取目标网址的URL ?> |
到这里,大功就告成了。其实在 获取目标网址 URL 这个变量这里,折腾了好久,不懂 PHP 的结果就是不知道怎么“打印”获取到的变量为常量,尴尬。
加限制
可 Young Free 并不满足,这个调用地址是可以随随便便手动打开的,没有任何验证,Young Free 的博客可是经常遭到攻击的,不做点限制,VPS 的这点点资源岂不是扛不住。加点限制,非本站站内,不能打开。整个源码如下
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 |
<?php $home = "https://www.ucwz.net"; $name = "Young Free | 年轻人 无拘束"; function wp_die($home,$name) { echo '<!DOCTYPE html PUBLIC "-//W3C//Dtd XHTML 1.0 transitional//EN" "http://www.w3.org/tr/xhtml1/Dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><head><meta charset="UTF-8" /><meta http-equiv=Content-Type content="text/html;charset=utf-8"> <title>无效地址</title></head> <body><br/><br/><br/><br/><br/><br/><br/> <center> 此URL不允许直接复制打开....<br/> ---来自<a href="'.$home.'/">'.$name.'</a> </center> </body> </html>'; exit(); } if(empty($_SERVER['HTTP_REFERER']) || strpos(strtoupper($_SERVER['HTTP_REFERER']),strtoupper($home)) === false) wp_die($home,$name); ?> <? function yfqr($url=''){ require_once 'phpqrcode.php'; $value = $url; //二维码内容 $errorCorrectionLevel = 'L'; //容错级别 $matrixPointSize = 5; //生成图片大小 //生成二维码图片 $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2); } //调用查看结果 yfqr($_GET['url'],''); //获取目标网址的URL ?> |
调用方式
哦,说了这么多,怎么调用呢?
1 |
<img src="https://www.ucwz.net/qrcode/?url=https://www.ucwz.net/seo/2214.html"> //替换 url= 后面的网址就可以了 |
前台效果
啦啦啦啦~~~如下图,也可以把鼠标移动到文章右上角的 扫描二维码 试试。
源码下载
想搭建自己的二维码生成服务?Young Free 已经把制作好的源码打包好了,下载后,只需替换 Young Free 的网址然后上传到服务器就行了。整个代码只有 121KB。
百度云下载参考文档:https://blog.csdn.net/sinat_35861727/article/details/73862991