Logo

site iconwanghanyue | 寒星皓月

90后,坐标杭州,喜欢的话:每个人都要对得起他曾经遭受的磨难!
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

wanghanyue | 寒星皓月 RSS 预览

分享2款漂亮的外链go跳转

2024-09-24 09:43:45

给​​网站添加外链​​go跳转,可以给外链添加跳转过渡的动画效果,既美观还能避免权重流失。分享以下两款示例和代码。

第一款:

代码如下:

<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">


<meta name="viewport" content="width=device-width,height=device-height, initial-scale=1.0, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes"> 
<meta name="robots" content="noindex,follow">
<title>加载中</title>
<meta http-equiv="refresh" content="3;url=">
<style>
body{font-weight:100;margin:0}body{-webkit-tap-highlight-color:transparent;background-color:#222428;font-size:100%;font-family:Open Sans;height:100%}.loader{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-mos-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-align:center;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;width:80%;overflow:visible}.loader,.loader div{position:absolute;height:36px}.loader div{width:30px;margin:0 10px;opacity:0;animation:move 2s linear infinite;-o-animation:move 2s linear infinite;-moz-animation:move 2s linear infinite;-webkit-animation:move 2s linear infinite;transform:rotate(180deg);-o-transform:rotate(180deg);-moz-transform:rotate(180deg);-webkit-transform:rotate(180deg);color:#fff;font-size:3em}.loader div:nth-child(8):before{background:#db2f00}.loader div:nth-child(8):before,.loader div:nth-child(9):before{content:'';position:absolute;bottom:-15px;left:0;width:30px;height:30px;border-radius:100%}.loader div:nth-child(9):before{background:#f2f2f2}.loader div:nth-child(10):before{bottom:-15px;height:30px;background:#13a3a5}.loader div:after,.loader div:nth-child(10):before{content:'';position:absolute;left:0;width:30px;border-radius:100%}.loader div:after{bottom:-40px;height:5px;background:#39312d}.loader div:nth-child(2){animation-delay:.2s;-o-animation-delay:.2s;-moz-animation-delay:.2s;-webkit-animation-delay:.2s}.loader div:nth-child(3){animation-delay:.4s;-o-animation-delay:.4s;-webkit-animation-delay:.4s}.loader div:nth-child(4){animation-delay:.6s;-o-animation-delay:.6s;-moz-animation-delay:.6s;-webkit-animation-delay:.6s}.loader div:nth-child(5){animation-delay:.8s;-o-animation-delay:.8s;-moz-animation-delay:.8s;-webkit-animation-delay:.8s}.loader div:nth-child(6){animation-delay:1s;-o-animation-delay:1s;-moz-animation-delay:1s;-webkit-animation-delay:1s}.loader div:nth-child(7){animation-delay:1.2s;-o-animation-delay:1.2s;-moz-animation-delay:1.2s;-webkit-animation-delay:1.2s}.loader div:nth-child(8){animation-delay:1.4s;-o-animation-delay:1.4s;-moz-animation-delay:1.4s;-webkit-animation-delay:1.4s}.loader div:nth-child(9){animation-delay:1.6s;-o-animation-delay:1.6s;-moz-animation-delay:1.6s;-webkit-animation-delay:1.6s}.loader div:nth-child(10){animation-delay:1.8s;-o-animation-delay:1.8s;-moz-animation-delay:1.8s;-webkit-animation-delay:1.8s}@keyframes move{0%{right:0;opacity:0}35%{right:41%}35%,65%{-webkit-transform:rotate(0);transform:rotate(0);opacity:1}65%{right:59%}to{right:100%;-webkit-transform:rotate(-180deg);transform:rotate(-180deg)}}@-webkit-keyframes move{0%,to{opacity:0}0%{right:0}35%{right:41%}35%,75%{-webkit-transform:rotate(0);transform:rotate(0);opacity:1}75%{right:59%}to{right:100%;-webkit-transform:rotate(-180deg);transform:rotate(-180deg);opacity:0}}
</style>
</head>
<body class="ie8">
    <div class="loader">
        <div> L </div>
        <div> O </div>
        <div> A </div>
        <div> D </div>
        <div> I </div>
        <div> N </div>
        <div> G </div>
        <div> </div>
        <div> </div>
        <div> </div>
    </div>

</body></html>

 

第二款:

代码如下:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="refresh" content="1;url=">
<title><?php echo $title;?></title>
<style>
body{background:#000}.loading{-webkit-animation:fadein 2s;-moz-animation:fadein 2s;-o-animation:fadein 2s;animation:fadein 2s}@-moz-keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@-o-keyframes fadein{from{opacity:0}to{opacity:1}}@keyframes fadein{from{opacity:0}to{opacity:1}}.spinner-wrapper{position:absolute;top:0;left:0;z-index:300;height:100%;min-width:100%;min-height:100%;background:rgba(255,255,255,0.93)}.spinner-text{position:absolute;top:50%;left:50%;margin-left:-90px;margin-top: 2px;color:#BBB;letter-spacing:1px;font-weight:700;font-size:36px;font-family:Arial}.spinner{position:absolute;top:50%;left:50%;display:block;margin-left:-160px;width:1px;height:1px;border:25px solid rgba(100,100,100,0.2);-webkit-border-radius:50px;-moz-border-radius:50px;border-radius:50px;border-left-color:transparent;border-right-color:transparent;-webkit-animation:spin 1.5s infinite;-moz-animation:spin 1.5s infinite;animation:spin 1.5s infinite}@-webkit-keyframes spin{0%,100%{-webkit-transform:rotate(0deg) scale(1)}50%{-webkit-transform:rotate(720deg) scale(0.6)}}@-moz-keyframes spin{0%,100%{-moz-transform:rotate(0deg) scale(1)}50%{-moz-transform:rotate(720deg) scale(0.6)}}@-o-keyframes spin{0%,100%{-o-transform:rotate(0deg) scale(1)}50%{-o-transform:rotate(720deg) scale(0.6)}}@keyframes spin{0%,100%{transform:rotate(0deg) scale(1)}50%{transform:rotate(720deg) scale(0.6)}}
</style>
</head>
<body>
<div class="loading">
  <div class="spinner-wrapper">
    <span class="spinner-text">页面加载中,请稍候...</span>
    <span class="spinner"></span>
  </div>
</div>
</body>
</html>

修复Emlog6.0.1版本自带的邮箱通知

2024-08-28 16:05:15

目前一直使用的是插件kl_sendmail邮箱通知功能,emlog6.0.1自带的本身有"邮件通知"功能,奈何不能使用。此前看到网上的一个emlog6.0.1修复邮件通知最新版,修复了该功能,特此记录下。

推荐使用qq邮箱:

  • smtp服务器:smtp.qq.com
  • smtp端口:465
  • 发信密码: 注意是获取qq邮箱授权码,qq邮箱-设置-账号-POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务里获取
  • 发送方式: SMTP方式

步骤:

  1. 将邮件环境“PHPMailer”文件夹上传至目录include/lib中,见附件下载文件。
  2. 在根目录中修改init.php文件,修改配置,完整示例:
    //评论邮件通知配置
    require_once EMLOG_ROOT.'/include/lib/PHPMailer/PHPMailerAutoload.php';
    define('MAIL_SMTP', Option::get("MAIL_SMTP")); 
    define('MAIL_PORT', Option::get('MAIL_PORT')); //smtp端口
    define('MAIL_SENDEMAIL', Option::get('MAIL_SENDEMAIL')); //发信邮箱
    define('MAIL_PASSWORD',Option::get('MAIL_PASSWORD')); //发信密码
    define('MAIL_TOEMAIL', Option::get('MAIL_TOEMAIL')); //收信邮箱
    define('MAIL_SENDTYPE', Option::get('MAIL_SENDTYPE'));
    define('SEND_MAIL', Option::get('SEND_MAIL'));
    define('REPLY_MAIL', Option::get('REPLY_MAIL'));
  3. 在include/lib/function.base.php文件中,修改文件:
    /**
     * 发送邮件
     */
    function sendmail_do($mailserver, $port, $mailuser, $mailpass, $mailto, $subject,  $content,$fromname){
    	$phpMailer = new PHPMailer();
    	$phpMailer->isSMTP();
    	$phpMailer->SMTPAuth = true;
    	$phpMailer->Host = $mailserver;
    	$phpMailer->Port = $port;
    	$phpMailer->Username = $mailuser;
    	$phpMailer->Password = $mailpass;
    	$phpMailer->isHTML(true);
    	if ('none' != "ssl") {
    		$phpMailer->SMTPSecure = "ssl";
    	}
    	$phpMailer->setFrom($mailuser, $mailuser);
    	$phpMailer->addAddress($mailto, $mailto);
    	$phpMailer->Subject = $subject;
    	$phpMailer->Body    = $content;
    	if(!$phpMailer->send()) {
    		return false;
    	} else {
    		return true;
    	}
    }
  4. 下面内容,修改替换掉include/controller/comment_controller.php里内容,也可以自主修改邮件模版通知样式。
    分享个泽泽的邮箱通知模版,可以适用样式,支持自适应。
    <?php
    /**
    * 发表评论
    *
    * @copyright (c) Emlog All Rights Reserved
    */
    
    class Comment_Controller {
    function addComment($params) {
    	$name = isset($_POST['comname']) ? addslashes(trim($_POST['comname'])) : '';
    	$content = isset($_POST['comment']) ? addslashes(trim($_POST['comment'])) : '';
    	$mail = isset($_POST['commail']) ? addslashes(trim($_POST['commail'])) : '';
    	$url = isset($_POST['comurl']) ? addslashes(trim($_POST['comurl'])) : '';
    	$imgcode = isset($_POST['imgcode']) ? addslashes(trim(strtoupper($_POST['imgcode']))) : '';
    	$blogId = isset($_POST['gid']) ? intval($_POST['gid']) : -1;
    	$pid = isset($_POST['pid']) ? intval($_POST['pid']) : 0;
    	
    	$send = isset($_POST['send']) ? addslashes(trim($_POST['send'])) : 'y';
    
    	if (ISLOGIN === true) {
    		$CACHE = Cache::getInstance();
    		$user_cache = $CACHE->readCache('user');
    		$name = addslashes($user_cache[UID]['name_orig']);
    		$mail = addslashes($user_cache[UID]['mail']);
    		$url = addslashes(BLOG_URL);
    	}
    
    	if ($url && strncasecmp($url,'http',4)) {
    		$url = 'http://'.$url;
    	}
    
    	doAction('comment_post');
    
    	$Comment_Model = new Comment_Model();
    	$Comment_Model->setCommentCookie($name,$mail,$url);
    	if($Comment_Model->isLogCanComment($blogId) === false) {
    		emMsg('评论失败:该文章已关闭评论');
    	} elseif ($Comment_Model->isCommentExist($blogId, $name, $content) === true) {
    		emMsg('评论失败:已存在相同内容评论');
    	} elseif (ROLE == ROLE_VISITOR && $Comment_Model->isCommentTooFast() === true) {
    		emMsg('评论失败:您提交评论的速度太快了,请稍后再发表评论');
    	} elseif (empty($name)) {
    		emMsg('评论失败:请填写姓名');
    	} elseif (strlen($name) > 20) {
    		emMsg('评论失败:姓名不符合规范');
    	} elseif ($mail != '' && !checkMail($mail)) {
    		emMsg('评论失败:邮件地址不符合规范');
    	} elseif (ISLOGIN == false && $Comment_Model->isNameAndMailValid($name, $mail) === false) {
    		emMsg('评论失败:禁止使用管理员昵称或邮箱评论');
    	} elseif (!empty($url) && preg_match("/^(http|https)\:\/\/[^<>'\"]*$/", $url) == false) {
    		emMsg('评论失败:主页地址不符合规范','javascript:history.back(-1);');
    	} elseif (empty($content)) {
    		emMsg('评论失败:请填写评论内容');
    	} elseif (strlen($content) > 8000) {
    		emMsg('评论失败:内容不符合规范');
    	} elseif (ROLE == ROLE_VISITOR && Option::get('comment_needchinese') == 'y' && !preg_match('/[\x{4e00}-\x{9fa5}]/iu', $content)) {
    		emMsg('评论失败:评论内容需包含中文');
    	} elseif (ISLOGIN == false && Option::get('comment_code') == 'y' && session_start() && (empty($imgcode) || $imgcode !== $_SESSION['code'])) {
    		emMsg('评论失败:验证码错误');
    	} else {
    		$_SESSION['code'] = null;
    		
    		if($send=='y') {
    			if(SEND_MAIL == 'Y' || REPLY_MAIL == 'Y'){
    				$comname = isset($_POST['comname']) ? addslashes(trim($_POST['comname'])) : '';
    				$comment = isset($_POST['comment']) ? addslashes(trim($_POST['comment'])) : '';
    				$commail = isset($_POST['commail']) ? addslashes(trim($_POST['commail'])) : '';
    				$comurl = isset($_POST['comurl']) ? addslashes(trim($_POST['comurl'])) : '';
    				$gid = isset($_POST['gid']) ? intval($_POST['gid']) : (isset($_GET['gid']) ? intval($_GET['gid']) : -1);
    				$pid = isset($_POST['pid']) ? intval($_POST['pid']) : 0;
    				$http_referer = empty($_SERVER['HTTP_REFERER']) ? BLOG_URL : $_SERVER['HTTP_REFERER'];
    
    				$blogname = Option::get('blogname');
    				$Log_Model = new Log_Model();
    				$logData = $Log_Model->getOneLogForHome($gid);
    				$log_title = $logData['log_title'];
    				$subject = "文章《{$log_title}》收到了新的评论";
    				if(!empty($commail)){$commail = $commail;}else{$commail = '未填写';};
    				if(!empty($comurl)){$comurl = $comurl;}else{$comurl = '未填写';};
    				if(strpos(MAIL_TOEMAIL, '@139.com') === false){
    					$comment = '<style type="text/css">.qmbox{margin:0;padding:0;font-family:微软雅黑;background-color:#fff}.qmbox a{text-decoration:none;}.qmbox .box{position:relative;width:780px;padding:0;margin:0 auto;border:1px solid #ccc;font-size:13px;color:#333;}.qmbox .header{width:100%;padding-top:50px;}.qmbox .logo{float:right;padding-right:50px;}.qmbox .clear{clear:both;}.qmbox .content{width:585px;padding:0 50px;}
    		.qmbox .content p{line-height:40px;word-break:break-all;}.qmbox .content ul{padding-left:40px;}
    		.qmbox .xiugai{height:50px;line-height:30px;font-size:16px;}.qmbox .xiugai a{color:#0099ff;}
    		.qmbox .fuzhi{word-break:break-all;color:#b0b0b0;}.qmbox .table{border:1px solid #ccc;border-left:0;border-top:0;border-collapse:collapse;}
    		.qmbox .table td{border:1px solid #ccc;border-right:0;border-bottom:0;padding:6px;min-width:160px;}.qmbox .gray{background:#f5f5f5;}
    		.qmbox .no_indent{font-weight:bold;height:40px;line-height:40px;color:#737171}.qmbox .no_indent a{text-decoration:none !important;color:#737171}.qmbox .no_indent span{padding-right:20px;}.qmbox .no_after{height:40px;line-height:40px; text-align:right;font-weight:bold}
    		.qmbox .btnn{padding:50px 0 0 0;font-weight:bold}.qmbox .btnn a{padding-right:20px;text-decoration:none !important;color:#000;}.qmbox .need{background:#fa9d00;}
    		.qmbox .noneed{background:#3784e0;}.qmbox .footer{width:100%;height:10px;padding-top:20px;}</style><div class="qmbox"><div class="box"><div class="header"></div><div class="content"><p class="no_indent" style="color:#383838">文章《'.$log_title.'》最新评论内容:</p><p style="line-height:25px;padding:10px;background:#5C96BE;border-radius:4px;color:#fff;">'.$comment.'</p
    		>
    		<p class="no_indent"><span>评论作者:'.$comname.'</span></p>
    		<p>时间:'.date("Y-m-d",time()).'</p>
    		<p>状态:通过</p>
    		<p>本邮件为'.$blogname.'自动发送,请勿直接回复</p>
    		<table cellspacing="0" class="table">	</table><div class="btnn"><a href="'.Url::log($gid).'" target="_blank">查看该文章</a></div></div><div class="footer clear"></div></div></div>';
    				}else{
    					$comment = $comment;
    				}
    				if(SEND_MAIL == 'Y'){
    					if(ROLE == 'visitor'){
    						sendmail_do(MAIL_SMTP, MAIL_PORT, MAIL_SENDEMAIL, MAIL_PASSWORD, MAIL_TOEMAIL, $subject, $comment,$blogname);
    					}
    				}
    				
    				if(REPLY_MAIL == 'Y'){
    					if($pid > 0){
    						$DB = Option::EMLOG_VERSION >= '5.3.0' ? Database::getInstance() : MySql::getInstance();
    						$Comment_Model = new Comment_Model();
    						$pinfo = $Comment_Model->getOneComment($pid);
    				$custom=empty($comname) ? '博主':$comname;
    						if(!empty($pinfo['mail'])){
    							$subject = "您在【{$blogname}】发表的评论收到了回复";
    							$reply = '<style type="text/css">.qmbox{margin:0;padding:0;font-family:微软雅黑;background-color:#fff}.qmbox a{text-decoration:none;}.qmbox .box{position:relative;width:780px;padding:0;margin:0 auto;border:1px solid #ccc;font-size:13px;color:#333;}.qmbox .header{width:100%;padding-top:50px;}.qmbox .logo{float:right;padding-right:50px;}.qmbox .clear{clear:both;}.qmbox .content{width:585px;padding:0 50px;}
    		.qmbox .content p{line-height:40px;word-break:break-all;}.qmbox .content ul{padding-left:40px;}
    		.qmbox .xiugai{height:50px;line-height:30px;font-size:16px;}.qmbox .xiugai a{color:#0099ff;}
    		.qmbox .fuzhi{word-break:break-all;color:#b0b0b0;}.qmbox .table{border:1px solid #ccc;border-left:0;border-top:0;border-collapse:collapse;}
    		.qmbox .table td{border:1px solid #ccc;border-right:0;border-bottom:0;padding:6px;min-width:160px;}.qmbox .gray{background:#f5f5f5;}
    		.qmbox .no_indent{font-weight:bold;height:40px;line-height:40px;}.qmbox .no_after{height:40px;line-height:40px; text-align:right;font-weight:bold}
    		.qmbox .btnn{padding:50px 0 0 0;font-weight:bold}.qmbox .btnn a{padding-right:20px;text-decoration:none !important;color:#000;}.qmbox .need{background:#fa9d00;}
    		.qmbox .noneed{background:#3784e0;}.qmbox .footer{width:100%;height:10px;padding-top:20px;}</style><div class="qmbox"><div class="box"><div class="header"></div><div class="content"><p class="no_indent">'.$pinfo['poster'].' 您好,您之前在《'.$log_title.'》发表的的评论:</p><p style="line-height:25px;padding:10px;background:#EDECF2;border-radius:4px;">'.$pinfo['comment'].'</p><p class="no_indent">'. $custom.' 给您的回复:</p><p style="line-height:25px;padding:10px;background:#5C96BE;border-radius:4px;color:#fff;">'.$content.'</p> <p>时间:'.date("Y-m-d",time()).'</p>
    		<p>状态:通过</p>
    		<p>本邮件为'.$blogname.'自动发送,请勿直接回复.</p> <table cellspacing="0" class="table">	</table><div class="btnn"><a href="'.Url::log($gid).'#'.$pid.'" target="_blank">查看该文章</a></div></div><div class="footer clear"></div></div></div>';
    							sendmail_do(MAIL_SMTP, MAIL_PORT, MAIL_SENDEMAIL, MAIL_PASSWORD, $pinfo['mail'], $subject, $reply,$blogname);
    						}
    					}
    				}
    			}else{
    				//return;
    			}
    		}
    		
    		$Comment_Model->addComment($name, $content, $mail, $url, $imgcode, $blogId, $pid);
    	}
    }
    }
    

表哥突然离世

2024-08-26 00:28:16

周五晚上7:20左右,家里群里二姐的一则消息,打破了群里的平静,说 表哥赵云 不在了。

看到消息的第一反应就是很无厘头,为什么突然说这话?是打错字了?一开始我并没有联想,是我大姨家赵云表哥。说我大姨给我妈打电话了,深圳派出所通知让去的,说14号(8.14)人就不在了。可为什么今天8.23号才通知呢,“没了的” 原因也不知晓,意外?疾病?也不敢贸然猜测。我很难把赵云 和“亖”联系在一起,至少这几十年内我不会把他们联系到一起,直到现在我都不愿意把那个字打出来,很震惊,错愕,不敢相信,久久不能平静。

表哥身体健康肯定没疾病,且他正值青壮年才30多岁,还未结婚,怎么人生就是戛然而止了呢?我更多的是想不通。大姨家有四个男孩子,他是老大 是我大表哥 ,基本每年春节我们总会相聚在一起的,无论是去我们舅舅家,还是到他们家。和大表哥真正交流不多,但毕竟认识相处了几十年了,他的性格很好 稳重、热情。我又对我大姨家感情亲近,小时候他们家是开饭店的,所以爱去他们家,还有 刘见(四表哥)小时候在我们家寄宿上小学所以感情比较深厚,对几个表哥们印象都比较好。

这些年赵云一直未结婚,也面对家里面的压力,最后一次听家里讲起他,是去年五一要结婚的,不会最后一些原因也没结成。之前在我大姐未结婚的时候,家里人都催我姐,她就会以赵云为挡箭牌,说那个“焖冬瓜”还没结婚呢,彼时我妈就会笑骂我姐,当然大姐只是打趣调侃罢了,并无恶意。去年春节没有见到他,在外工作没有回来,至于原因大概是我上面说到的,未曾想 前年那次相见竟是人生中的最后一次见到他。不由得感叹,人生无常,不知道什么时候见到的人就是最后一面了。

昨天早上听我二姐说 姨夫已和四舅去深圳那边了,应该很快就会有个结果了,无论什么原因结果都太沉重了。今天听我大姐说 我妈有问我姐夫 手机可以在不知道密码情况解锁并且保留手机数据不,结果不行 如果恢复出厂设置就会没有任何数据了,我姐夫是在小米工作的,可能是帮我大姨家那边问的,也是想获得我表哥他手机里面的信息吧,看网上抖音里有那种手机可以解锁且可以保留手机数据的,不知道真的假的。

感觉人生危机四伏,一辈子好好活着,能平静地过完一生,已是很难的了。其实我 们普通人平安健康已是最大的幸福了,也祝愿所有人。

R.I.P. 赵云

      去年五一 还讲起表哥结婚的事

改造emlog支持emoji表情符

2024-08-07 22:16:33

Emlog6.0.1是不支持emoji???表情符,需要改造数据库将字符集设置为 utf8mb4 ,网上找了下教程。
使用方法:这是一个为 Emlog 提供 emoji 表情支持的升级补丁,创建PHP文件将其放置在 Emlog 根目录下执行一次,注意 MySQL 版本不低于 5.5 。
<?php
/**
 * Emlog emoji表情支持 升级补丁
 * 
 * 将此文件放到Emlog根目录下执行一次即可
 * 需要MySQL版本 >= 5.5
 * 
 */
 
require 'config.php';
define('DS', DIRECTORY_SEPARATOR);
 
$db = new mysqli(DB_HOST, DB_USER, DB_PASSWD, DB_NAME);
$db->set_charset('utf8');
 
$sql = "SELECT VERSION()";
$query = $db->query($sql)->fetch_array(MYSQLI_NUM);
$version = $query[0];
 
if (version_compare($version, '5.5.0') < 0) {
    echo "Need mysql >= 5.5.0";
    exit();
}
 
$column_list = array(
    'blog' => array(
        array('title', 'varchar(255)'),
        array('content', 'longtext'),
        array('excerpt', 'longtext')
    ),
    'comment' => array(
        array('poster', 'varchar(20)'),
        array('comment', 'text')
    ),
    'twitter' => array(
        array('content', 'text')
    ),
    'reply' => array(
        array('name', 'varchar(20)'),
        array('content', 'text')
    ),
    /* 如果使用 YXMarkDown插件可去除注释
    'yxmd' => array(
        array('content','text')    
    )
    */
);
 
foreach ($column_list as $key => $value) {
    $table_name = DB_PREFIX . $key;
 
    foreach ($value as $column) {
        $sql = "ALTER TABLE `{$table_name}` MODIFY `{$column[0]}` {$column[1]} CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci";
        $db->query($sql);
        echo "Update {$table_name} -> {$column[0]}<br />\r\n";
    }
}
 
$mysql_lib = dirname(__FILE__) . DS . 'include' . DS . 'lib' . DS. 'mysql.php';
$mysql_content = file_get_contents($mysql_lib);
$mysql_content = str_replace("SET NAMES 'utf8'", "SET NAMES 'utf8mb4'", $mysql_content);
file_put_contents($mysql_lib, $mysql_content);
echo "Update mysql lib<br />\r\n";
 
$mysqli_lib = dirname(__FILE__) . DS . 'include' . DS . 'lib' . DS. 'mysqlii.php';
$mysqli_content = file_get_contents($mysqli_lib);
$mysqli_content = str_replace("set_charset('utf8')", "set_charset('utf8mb4')", $mysqli_content);
file_put_contents($mysqli_lib, $mysqli_content);
echo "Update mysqli lib<br />\r\n";
 
echo "Done";
?>

写了个用于TinyMCE 编辑器的emoji表情符插件:

tinymce.PluginManager.add("emoji", function(editor, url) {  
    // 定义一个包含emoji的数组  
    var emojis = [  
        "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", 
	"?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
        "?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
        "?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
	"?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
	"?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
	"?", "?", "?", "?", "?", "?", "?", "?", "✊", "?",
	"?", "?", "✌️", "?", "?", "?", "?", "?", "?", "☝️",
	"✋", "?", "?", "?", "?", "?", "?", "?", "✍️", "?" 
    ];  
  
    // 表情符号表格生成函数  
    function generateEmojiTable() {  
        var html = '<table role="list" class="mce-grid">';  
        var rowCount = Math.ceil(emojis.length / 8); // 每行8个emoji  
        var emojiTooltips = [  
        "嘿嘿", "哈哈", "大笑", "嘻嘻", "斜眼笑", "苦笑", "笑哭了", "笑得满地打滚",
        "羞涩微笑", "微笑天使", "呵呵", "倒脸", "眨眼", "松了口气", "花痴", "飞吻",
        "亲亲", "微笑亲亲", "羞涩亲亲", "好吃", "吐舌", "眯眼吐舌", "单眼吐舌", "书呆子脸",
	"墨镜笑脸", "得意", "不高兴", "失望", "沉思", "担心", "困扰", "微微不满",
        "痛苦", "困惑", "累", "累死了", "哭", "放声大哭", "傲慢", "生气",
        "怒火中烧", "红脸", "吓死了", "害怕", "抱抱", "想一想", "沉默", "无语",
        "龇牙咧嘴", "翻白眼", "缄默", "睡着了", "感冒", "发财", "恶魔微笑", "小丑脸", 
        "大便", "鬼", "头骨", "双眼", "脚印", "双手张开", "举双手", "鼓掌",
        "握手", "拇指向上", "拇指向下", "出拳", "举起拳头", "朝左的拳头", "朝右的拳头", "交叉的手指",  
        "胜利手势", "摇滚", "OK", "反手食指向左指", "反手食指向右指", "反手食指向上指", "反手食指向下指", "食指向上指",
        "举起手", "立起的手背", "手掌", "瓦肯举手礼", "挥手", "给我打电话", "肌肉", "竖中指",
        "写字", "双手合十",
        ]; 
	
        for (var i = 0; i < rowCount; i++) {  
            html += '<tr>';  
            for (var j = 0; j < 8 && i * 8 + j < emojis.length; j++) {  
                var emoji = emojis[i * 8 + j];
                var tooltip = emojiTooltips[i * 8 + j] || ''; // 使用相应的提示文本,如果没有则默认为空字符串				
		        html += '<td class="emoji-cell"><a href="#" data-mce-content="' + emoji + '" tabindex="-1" role="option" aria-label="' + emoji + '" title="' + (emojiTooltips[i * 8 + j] || emoji) + '" style="font-size: 20px; display:inline-block; text-align:center; vertical-align:middle;">' + emoji + '</a></td>';  
            }  
            html += '</tr>';  
        }  
  
        html += '</table>';  
        return html;  
    }
	
    // 添加按钮  
    editor.addButton('emoji', {
        image: url + '/emoji.svg',		
        type: 'panelbutton',  
        panel: {  
            role: 'application',  
            autohide: true,  
            html: generateEmojiTable(),  
            onclick: function(e) {  
                var target = editor.dom.getParent(e.target, 'a');  
                if (target) {  
                    editor.insertContent(target.getAttribute('data-mce-content'));  
                    this.hide();  
                }  
            }  
        },  
        tooltip: 'emoji'  
    });
	
// css式  
var style = document.createElement('style');  
style.type = 'text/css';  
style.innerHTML = '.mce-container .emoji-cell a:hover {text-decoration: none; background-color: #f0f0f0;}';  
document.head.appendChild(style);
	
});

突然收到了腾讯云内容分发网络 CDN欠费账单

2024-07-06 00:13:48

晚上突然收到了腾讯云的欠费账单,有点疑惑,记得前几天刚充值了费用。

点开看了一下,是腾讯云内容分发网络CDNCOS对象存储的欠费账单,有好几条账单,一共总应该欠了78元 。此前每个月腾讯CDN账单也就是一两块钱左右,登上腾讯云后台看了监控和日志,在7.5号晚上20点-23点时间段,流量异常的高。

中国境内:CDN 带宽峰值105.85Mbps、CDN总流量114.9GB、CDN总请求数5.33万次

我网站一般CDN带宽峰值不超过2M 通常400Kbps上下,一天CDN流量在200~300MB上下,一个月CDN用量流量在7~8GB左右,这几个小时用了我一年多的CDN流量了。我还是高估了人性,网站有好多年了 一直平安无事,我这小破站没什么内容,流量更是少的可怜,“大佬们 ”平时也看不上我这小破站 ,就没有考虑到恶意攻击或流量盗刷此类的风险,没想到还是被搞了,最后不得不做了一些防护。


2024.7.6 又被搞了,真顶不住了,腾讯云CDN和COS储存都是先计量后收费,CDN和对象存储COS 又欠费了83元,这样搞有意思么 ,rnmmp ......

中国境内:CDN 带宽峰值58.8Mbps、CDN总流量13.55GB、CDN总请求数50.81万次

已经设置了CDN的域名控制管理:防盗链设置 referer白名单、用量封顶配置,不知是不是我设置不对,怎么还是被刷了呢 


2024.7.5-2024.7.8 被刷的量:

2024.7.5-2024.7.8 被刷流量

2024.7.5-2024.7.8 对象存储COS:


我总共内容存储才63M 可谓是很少了吧,正常上个月才用了126M外网下行流量,mmp这次给我刷了281GB12

产生费用:

我一年CDN加上COS最多十几元,这下好了用了我几年的费用了?。害人之心不可有,防人之心不可无,做了以下防护策略:

内容分发网络CDN:

  1. 管理-基础设置-源站信息 开启COS回源(COS设置私有读写 然后CDN访问COS权限放开)
  2. 访问控制-防盗链设置 白名单:referer白名单 (勾选“)
  3. 访问控制- 开启IP访问限频配置-0QPS
  4. 高级配置-用量封顶配置:瞬间用量 流量 100MB 每5分钟 、累计用量 流量 300MB 当天24点前

对象存储COS:

  1. 储存桶设置为私有读写
  2. 关闭 储存桶防盗链(COS不需要防盗链,全部走CDN,前提是要私有读写)

反正,最近每天晚上时间一到就被刷,换着IP刷,这家伙真是在作死的边缘徘徊,不知道自己在犯罪么,看有的站长已经包报网警了。现在我即便是做了防护策略也有被刷,肯定是不能完全避免的。

目前GitHub的项目ban-pcdn-ip来收集这些恶意IP段。


一些补充 访问控制策略,避免是不可能的,减少盗刷风险:

访问控制:

在控制台为域名针对性的开启访问控制功能(免费),以避免产生不必要的流量带宽消耗。

访问控制项
功能说明
通过对用户 HTTP Request Header 中 referer 字段的值设置访问控制策略,从而限制访问来源,避免恶意用户盗刷。
通过对用户请求端 IP 配置访问控制策略,可以有效限制访问来源,阻拦恶意 IP 盗刷、攻击等问题。
通过对用户端 IP 在每一个节点每一秒钟访问次数进行限制,可进行高频 CC 攻击抵御、防恶意用户盗刷等。
配置后,客户端在发起请求时需要按照配置计算签名并携带至服务端,CDN 节点进行服务端校验,校验通过后才继续放行。
通过对用户 HTTP 请求投中的 User-Agent 进行规则判断,按需放行或拒绝用户访问。
腾讯云 CDN 为您提供了下行限速配置,对服务端单链接下行最大吞吐速度进行设置。

 

流量管理:

开启流量/带宽管理的相关配置(免费),监控域名流量或带宽的消耗情况并接收告警,及时了解流量消耗的相关信息。

流量管理项
功能说明
如果您想要限制域名的流量/带宽使用上限,可以使用用量封顶配置功能。 当统计周期(5分钟)产生的流量/带宽超出所设置阈值时,关闭 CDN 服务(全部请求返回404),以避免产生过高的账单。
您可以使用腾讯云可观测平台的监控功能,设置对 CDN 产品下指定域名或项目的流量带宽使用情况监控,达到设定的峰值后将会给用户发送告警(短信、邮件和微信),便于更加及时地发现潜在风险。
如果您是流量计费用户,可以在控制台-流量包管理处设置告警策略,当所有有效流量包余额不足设定的比例时发送告警。