首页
留言板
统计
Search
1
阿里云国际OSS使用CloudFlare免流量
2,289 阅读
2
PP.UA免费域名注册
2,175 阅读
3
Adobe Photoshop CS2经典版 中文原版
2,158 阅读
4
7-Zip中文美化版
2,029 阅读
5
获取免费的 Microsoft 365 E5 开发人员订阅
1,944 阅读
软件分享
网络资源
网络代码
生活情感
免费主机
Search
标签搜索
代码
工具软件
Android
教程
Emlog
办公软件
图形图像
免费空间
Web
情感
PHP
视频
系统工具
Windows
上传下载
建站
PDF
网盘
学习
Typecho
ZJ
累计撰写
803
篇文章
累计收到
105
条评论
首页
栏目
软件分享
网络资源
网络代码
生活情感
免费主机
页面
留言板
统计
搜索到
98
篇与
的结果
2019-12-13
EMLOG详细目录结构功能
一般来说,一个模板都会包含以下几个部分:images文件夹:存放模板所需图片。 echo_log.php:显示日志内容。 footer.php:页面底部。 header.php:页面头部。 log_list.php:显示日志列表内容。 main.css:模板的css文件。 module.php:模板公共代码,包含侧边widgets、评论、引用、编辑等,该文件是模板最核心的模块。 page.php:自定义的页面内容的模板。 preview.jpg:在后台模板选择界面显示的模板预览图,300×225 jpg格式。 side.php:模板侧边栏文件,如制作单栏模板则该文件不是必须的。 t.php:显示emlog系统自带的微博(碎语)内容。 404.php:自定义404页面未找到时的报错页面 在一般的emlog模板开发中,以上提及的部分中echo_log.php、log_list.php、module.php、page.php、t.php、header.php以及preview.jpg是不可或缺的,一旦缺省,模板将无法运行。此外的side.php、footer.php、main.css、images文件夹等,只需要对模板代码做小部分更改,那么它们都是可以改名、移动、甚至删除的。公共代码分析 通过预览整个模板中的各个文件,你会发现以下代码同时存在于多个文件中,这些代码分别有以下用途:if(!defined('EMLOG_ROOT')) {exit('error!');} 此行代码存在于模板目录下的每个php文件起始部分(事实上为了安全起见,该行代码也在admin目录下的几乎所有php文件起始部分存在),其作用是防止代码所在的php脚本被直接访问执行。 require_once View::getView('side'); require_once View::getView('footer'); 这两行代码存在于log_list.php、echo_log.php、page.php、t.php里面,其作用是调用模板文件夹下的side.php和footer.php的代码到当前文件的当前位置。View是emlog的模板视图控制器,View::getView('文件名','文件后缀')将返回当前模板安装路径下对应的文件。getView函数的第二个参数为缺省参数,在不传入值的情况下,将默认作为.php文件后缀返回文件路径。$curpage:当前页面表示,常用判断tag如下: $curpage== CURPAGE_HOME:首页 $curpage == CURPAGE_TW:碎语页 $curpage == CURPAGE_LOG:日志、page页 ROLE:当前访问者身份 ROLE == 'admin':管理员 ROLE == 'writer':联合撰写人 ROLE == 'vistor':未登录用户通用代码<?php if(!defined('EMLOG_ROOT')) {exit('error!');} ?>存在每个php文件头部,防止非法访问 <?php include getViews('XXXX');; ?>: 调用当前模板目录下XXXX.php文件 <?php echo EMLOG_VERSION;?>:显示当前emlog版本 <?php echo TEMPLATE_URL; ?>: 显示模板文件路径 <?php echo BLOG_URL; ?>: 显示博客Url <?php echo $blogtitle; ?>: 显示博客标题(会根据当前页面变化) <?php echo $blogname; ?>: 显示博客名称 <?php echo $bloginfo; ?>:显示博客描述 <?php echo $icp; ?>:显示备案号 <?php endforeach; ?>: 循环结束,需和<?php foreach(xxxx): ?>配对 <?php endif;?>:结束if标签,需和<?php if(xxxx): ?>配对header头部<?php /* Template Name:(模板名称 ) Description:(模板描述 ) Author:(模板作者 ) Author Url:(作者主页 ) Sidebar Amount:1(侧边栏数目,最大4 ) */ if(!defined('EMLOG_ROOT')) {exit('error!');} require_once View::getView('module'); ?>每个php文件的头部,防止非法访问<?php /* * 注释位置信息 */ if(!defined('EMLOG_ROOT')) {exit('error!');} ?>以下为通用标签<?php echo $blogtitle; ?> 标题 <?php echo $site_key; ?>关键字 <?php echo $description; ?>副标题(描叙) <?php echo BLOG_URL; ?>网站地址(路径) <?php echo TEMPLATE_URL; ?>模板地址(路径) <?php doAction('index_head'); ?>头部插件挂载点(用在<head>标签之间,如加载JS,css等) <?php echo $blogname; ?>博客名字(使用带网站连接方法如:<a href="<?php echo BLOG_URL; ?>"><?php echo $blogname; ?></a>) <?php echo $bloginfo; ?>博客副标题 <?php echo BLOG_URL.Option::get('topimg'); ?>头部图片使用方法:<img src="<?php echo BLOG_URL.Option::get('topimg'); ?>" 134" 960" />首页连接class选取<?php echo $curpage == CURPAGE_HOME ? 'current' : 'common';?>使用方法:<li class="<?php echo $curpage == CURPAGE_HOME ? 'current' : 'common';?>"><a href="<?php echo BLOG_URL; ?>">首页</a></li>说明:<?php if($istwitter == 'y'):?>函数变量开始,‘Y’决定后台是否开启,开启则显示,这里为加载碎语。<?php endif;?>为函数变量结束 <?php if($istwitter == 'y'):?><li class="<?php echo $curpage == CURPAGE_TW ? 'current' : 'common';?>"><a href="<?php echo BLOG_URL; ?>t/"> <?php echo Option::get('twnavi');?></a></li> <?php endif;?>下为header.php头部常用标签<?php foreach ($navibar as $key => $val): if ($val['hide'] == 'y'){continue;} if (empty($val['url'])){$val['url'] = Url::log($key);} ?>开始导航循环 <li class="<?php echo isset($logid) && $key == $logid ? 'current' : 'common';?>"><a href="<?php echo $val['url']; ?>" target="<?php echo $val['is_blank']; ?>"><?php echo $val['title']; ?></a></li> <?php endforeach;?>导航循环结束 <?php doAction('navbar', '左标签', '右标签'); ?>插件挂载点,用于导航栏,左右为html标签,用以控制样式,可为空(如:<?php doAction('navbar', '<li class="common">', '</li>'); ?>) <?php if(ROLE == 'admin' || ROLE == 'writer'): ?> 判断是否登陆(登陆则显示下面内容) <li class="common"><a href="<?php echo BLOG_URL; ?>admin/write_log.php">写日志</a></li> <li class="common"><a href="<?php echo BLOG_URL; ?>admin/">管理中心</a></li> <li class="common"><a href="<?php echo BLOG_URL; ?>admin/?action=logout">退出</a></li> <?php else: ?>(判断如果没有登陆则显示下面内容) <li class="common"><a href="<?php echo BLOG_URL; ?>admin/">登录</a></li> <?php endif; ?>(判断结束)footer.php<?php echo Option::EMLOG_VERSION;?>程序版本号 <?php echo $icp; ?>显示备案号 <?php doAction('index_footer'); ?>底部插件挂载点(用于统计代码等)log_list.php<?php doAction('index_loglist_top'); ?>插件挂载点,存在于首页日志列表顶部(用于公告等) <?php foreach($logs as $value): ?>开始循环输出日志列表 下面所有标签仅存在于<?php foreach($logs as $value): ?>和<?php endforeach; ?>之间 <?php topflg($value['top']); ?>置顶标志,函数存在于module.php <?php echo $value['log_title']; ?>显示日志标题 <?php echo $value['log_url']; ?>显示日志标题到正文连接 以上3个标签使用方法:<?php topflg($value['top']); ?><a href="<?php echo $value['log_url']; ?>"><?php echo $value['log_title']; ?></a> <?php blog_author($value['author']); ?> 作者,函数存在于module.php <?php echo gmdate('Y-n-j G:i l', $value['date']); ?>发布时间,格式是2010-12-11 19:05 30,格式可自行修改 <?php blog_sort($value['logid']); ?>分类,该函数存在于module.php <?php editflg($value['logid'],$value['author']); ?>显示编辑链接,函数存在于module.php <?php echo $value['log_description']; ?>显示日志摘要 <?php blog_att($value['logid']); ?>显示日志附件(图片附件不显示),函数存在于module.php <?php blog_tag($value['logid']); ?>显示日志标签,函数存在于module.php <?php echo $value['comnum']; ?>评论数,使用方法<a href="<?php echo $value['log_url']; ?>#comments">评论(<?php echo $value['comnum']; ?>)</a> <?php echo $value['tbcount']; ?>引用数,使用方法<a href="<?php echo $value['log_url']; ?>#tb">引用(<?php echo $value['tbcount']; ?>)</a> <?php echo $value['views']; ?>浏览数,使用方法<a href="<?php echo $value['log_url']; ?>">浏览(<?php echo $value['views']; ?>)</a> 以上仅存在于<?php foreach($logs as $value): ?>和<?php endforeach; ?>之间 <?php endforeach; ?>循环输出日志列表结束 <?php echo $page_url;?>显示分页 <?php include View::getView('side'); ?>调用边栏 <?php include View::getView('footer'); ?>调用底部 也可以写成 <?php include View::getView('side'); include View::getView('footer'); ?> 上为 log_list.php 首页日志列表部分常用标签echo_log.php 下为echo_log.php 阅读日志页面(内容页)常用标签<?php topflg($top); ?>置顶标志,函数存在于module.php <?php echo $log_title; ?>显示日志、page标题 <?php blog_author($author); ?>作者 <?php echo gmdate('Y-n-j G:i l', $date); ?> 发布时间 <?php blog_sort($logid); ?>分类,该函数存在于module.php <?php editflg($logid,$author); ?>显示编辑链接,函数存在于module.php <?php echo $log_content; ?>显示日志内容 <?php blog_att($logid); ?>显示日志附件(图片附件不显示),函数存在于module.php <?php blog_tag($logid); ?>显示日志标签,函数存在于module.php <?php doAction('log_related', $logData); ?>插件挂载点(用于相关日志等) <?php neighbor_log($neighborLog); ?>显示相邻日志(上一篇下一篇),函数存在于module.php <?php blog_trackback($tb, $tb_url, $allow_tb); ?>显示引用通告地址及引用,函数存在于module.php <?php blog_comments($comments); ?>显示日志评论,函数存在于module.php <?php blog_comments_post($logid,$ckname,$ckmail,$ckurl,$verifyCode,$allow_remark); ?>加载评论 page.php 下为page.php 自定义页面常用标签<?php echo $log_title; ?>页面名字 <?php echo $log_content; ?>内容 <?php blog_att($logid); ?>附件 <?php blog_comments($comments); ?>显示评论 <?php blog_comments_post($logid,$ckname,$ckmail,$ckurl,$verifyCode,$allow_remark); ?>加载评论 下为 page.php加载独立页面模板实例 <?php if($log_title =="标签" || $log_title =="标签云"):?> <?php include View::getView('tags');?> <?php elseif($log_title =="链接列表" || $log_title =="友情链接"):?> <?php include View::getView('links');?> <?php elseif($log_title =="读者排行" || $log_title =="读者墙"):?> <?php include View::getView('readers');?> <?php elseif($log_title =="文章归档" || $log_title =="文章存档"):?> <?php include View::getView('archives');?> <?php elseif($log_title =="相关服务"):?> <?php include View::getView('service');?> <?php elseif($log_title =="模版开发" || $log_title =="Emlog模版开发"):?> <?php include View::getView('tpl');?> <?php elseif($log_title =="留言板"):?> <?php include View::getView('contact');?> <?php elseif($log_title =="点赞墙" || $log_title =="点赞榜"):?> <?php include View::getView('likes');?> <?php elseif($log_title =="7天热门文章" || $log_title =="7天热门文章排行"):?> <?php include View::getView('week');?> <?php elseif($log_title =="30天热门文章" || $log_title =="30天热门文章"):?> <?php include View::getView('month');?> <?php elseif($log_title =="30天热门评论" || $log_title =="30天热门评论排行"):?> <?php include View::getView('comnum');?> <?php if ($allow_remark == 'y'){blog_comments($comments,$params);blog_comments_post($logid,$ckname,$ckmail,$ckurl,$verifyCode,$allow_remark);} ?> 根据是否允许评论显示评论和评论表单,函数存在于module.phpt.php<?php if(ROLE == 'admin' || ROLE == 'writer'): ?>判断是否登陆,登陆显示下面内容 <a href="<?php echo BLOG_URL . 'admin/twitter.php' ?>">发布碎语</a> <?php endif; ?>判断结束 <?php foreach($tws as $val): $author = $user_cache[$val['author']]['name']; $avatar = empty($user_cache[$val['author']]['avatar']) ? BLOG_URL . 'admin/views/images/avatar.jpg' : BLOG_URL . $user_cache[$val['author']]['avatar']; $tid = (int)$val['id']; ?> 开始循环输出碎语,下面为默认模板代码(循环的是<li>标签里的内容) <li class="li"> <div class="main_img"><img src="<?php echo $avatar; ?>" 32px" 32px" /></div> <p class="post1"><span><?php echo $author; ?></span><br /><?php echo $val['t'];?></p> <div class="clear"></div> <div class="bttome"> <p class="post"><a href="javascript:loadr('<?php echo DYNAMIC_BLOGURL; ?>?action=getr&tid=<?php echo $tid;?>','<?php echo $tid;?>');">回复(<span id="rn_<?php echo $tid;?>"><?php echo $val['replynum'];?></span>)</a></p> <p class="time"><?php echo $val['date'];?> </p> </div> <div class="clear"></div> <ul id="r_<?php echo $tid;?>" class="r"></ul> <div class="huifu" id="rp_<?php echo $tid;?>"> <textarea id="rtext_<?php echo $tid; ?>"></textarea> <div class="tbutton"> <div class="tinfo" style="display:<?php if(ROLE == 'admin' || ROLE == 'writer'){echo 'none';}?>"> 昵称:<input type="text" id="rname_<?php echo $tid; ?>" value="" /> <span style="display:<?php if($reply_code == 'n'){echo 'none';}?>">验证码:<input type="text" id="rcode_<?php echo $tid; ?>" value="" /><?php echo $rcode; ?></span> </div> <input class="button_p" type="button" onclick="reply('<?php echo DYNAMIC_BLOGURL; ?>index.php?action=reply',<?php echo $tid;?>);" value="回复" /> <div class="msg"><span id="rmsg_<?php echo $tid; ?>" style="color:#FF0000"></span></div> </div> </div> </li> <?php endforeach;?>循环输出碎语结束如上代码说明:<?php echo $avatar; ?>显示作者头像,使用方法: <img src="<?php echo $avatar; ?>" 32px" 32px" />这里设置了图片的高宽为32象素 <?php echo $author; ?>显示碎语发布者 <?php echo $val['t'];?>显示碎语内容 <a href="javascript:loadr('<?php echo DYNAMIC_BLOGURL; ?>?action=getr&tid=<?php echo $tid;?>','<?php echo $tid;?>');">回复(<span id="rn_<?php echo $tid;?>"><?php echo $val['replynum'];?></span>)</a>回复碎语连接使用方法 <?php echo $val['date'];?>发布碎语时间 <?php echo $tid;?>碎语ID数使用方法<ul id="r_<?php echo $tid;?>" class="r"></ul> 这里参考了官方模板 举例:如碎语ID为3(发布的第3条碎语),原代码显示结果为 <ul id="r_3" class="r"></ul> <?php echo $pageurl;?> 显示碎语分页 <?php echo $twnum; ?> 显示碎语数目 上为 t.php 碎语部分常用标签side.php<?php $widgets = !empty($options_cache['widgets1']) ? unserialize($options_cache['widgets1']) : array(); ?> 该页面要加载的widgets,中间红色1为数字,不超过header.php里设置的侧边栏数目 <?php doAction('diff_side'); ?> 插件挂载点 <?php foreach ($widgets as $val) { $widget_title = @unserialize($options_cache['widget_title']); $custom_widget = @unserialize($options_cache['custom_widget']); if(strpos($val, 'custom_wg_') === 0) { $callback = 'widget_custom_text'; if(function_exists($callback)) { call_user_func($callback, htmlspecialchars($custom_widget[$val]['title']), $custom_widget[$val]['content']); } }else{ $callback = 'widget_'.$val; if(function_exists($callback)) { preg_match("/^.*\s\((.*)\)/", $widget_title[$val], $matchs); $wgTitle = isset($matchs[1]) ? $matchs[1] : $widget_title[$val]; call_user_func($callback, htmlspecialchars($wgTitle)); } } } ?>上这一长串用于显示widgets<a href="<?php echo BLOG_URL; ?>rss.php" title="RSS订阅"> <img src="<?php echo TEMPLATE_URL; ?>images/rss.gif" alt="订阅Rss"/></a>上为RSS 订阅使用方法 module.phpfunction widget_xxxx($title)显示widgets函数,如widget_blogger($title)显示博主信息
2019年12月13日
244 阅读
0 评论
0 点赞
2019-12-10
PHP实现随机选取图像代码
创建images文件夹,把需要选取的图片复制到这个文件夹下,并随机挑选出一张显示出来。<?php $img_array = glob('images/*.{gif,jpg,png,jpeg,webp,bmp}', GLOB_BRACE); if(count($img_array) == 0) die('没找到图片文件。请先上传一些图片到 '.dirname(__FILE__).'/images/ 文件夹'); header('Content-Type: image/png'); echo(file_get_contents($img_array[array_rand($img_array)])); ?>
2019年12月10日
336 阅读
0 评论
0 点赞
2019-12-10
美化Emlog的文章访问密码页面
Emlog美化只能通过直接修改代码来实现,具体的位置在include/model/log_model.php文件末尾的authPassword代码。找到以下代码: if ($pwd !== addslashes($logPwd)) { echo <<<EOT <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>emlog message</title> <style type="text/css"> <!-- body{background-color:#F7F7F7;font-family: Arial;font-size: 12px;line-height:150%;} .main{background-color:#FFFFFF;margin-top:20px;font-size: 12px;color: #666666;width:580px;margin:10px 200px;padding:10px;list-style:none;border:#DFDFDF 1px solid;} --> </style> </head> <body> <div class="main"> <form action="" method="post"> 请输入该文章的访问密码<br> <input type="password" name="logpwd" /><input type="submit" value="进入.." /> <br /><br /><a href="$url">«返回首页</a> </form> </div> </body> </html> EOT; if ($cookiePwd) { setcookie('em_logpwd_' . $logid, ' ', time() - 31536000); }替换为如下代码: if ($pwd !== addslashes($logPwd)) { ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="renderer" content="webkit"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>该文章已被加密</title> </head> <body> <div class="main"> <img class="alert" alt="文章已被加密" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIoAAACACAMAAADjwgEwAAAAOVBMVEUAAAD5dBr7dRj4dBn/cBD5cxr4cxn6chj7dBj/cBj5cxr5dBn6cxn4dBn5cxr6dRX5cxr5cxr5dBoQJfbPAAAAEnRSTlMAgD/AEPDgYEAgoLCQcFAw0J/MNdW8AAADg0lEQVR42s3b7W7iMBSEYWftxA75At//xW7VZRWnQ3WkvOKE+VmJMtjxg8Ek4Iy5e8zdmsLFSXmoz8QSrsw61CZxDJdlrsf0OVyUR5WALrDJh3SZ68uswT1rfZ3e/dpNff0lMTjnVr/yEVO01SZdWae6Z/CFNzYXxxa+kttqwTHl2ORHl95zWBrvl/BMM0e34JZ8XC+6phwWtD7ptv95uWBBdzIVMm0luGTshVYB+B5ccvt12Ubnt8Xt91Vb3JyzX/rk5Jy+cr2M3Jyzl8nMnOO6Bewc103TMee4btw5rpsmA+e4bm7O2boh57huS9twyaODc7Zu43fBR3J1bni1q0/Pv0bgHNNNl3cGzgHdyouhmqBzXLf9SZ2c01HXKsA5pptWcXJOV6hWAc5R3bQKcI7qplUcnLs3uhlV1Ln5bboZVd7rXGqdMKuoQ9ObdDOqAOeAbkYVY0fOdTOqAOeAblLFEOAdutlVbOe4bmYV4BzQzahiOId104DPrVw3uwp3zv5fdhXgHNDNqAKcs3Sbw4kqhnNAN7vK25yLhlFGFcM5pJtdBTtn65ZPVDGcY7rZVbhzpgmgitgEdQNV5DUx3UAV5pxebaCKOMd0A1WYcyoTqKJWIt1AFeSczi6rou+rQDdQBTmnEoAqzLn9cfvjYBXdmQLdQBXgnOrGq+j7PNANVAHOiW6gCnBO2idQBTunuvEqtnPoxE2rgJXJdNMqyCt8OqsnH8A5NoZ6HgScoyf5+ykZ+raGr7f97PCWwD4I6iYnquCbPa4b/0aA6OZwgo9/NwV2IEC3950YeP7GTp1DuhkBzpkDx2M7x3XTAOfMRWZn7OJwn5YETjCQbjqtw8qc47o95GHAOaTbUptswDmkm/6aPwLnsG65HpKQc/rqtvP3fRTgHNUt1kM67tx49u6RqR6SgXNIt30097mlzpXT5G+1zQD2c3zvFmV+kHM6aedgieDBz2GZyN5t2+87TGQ/131PGdu7pa7/Hs/M9nPDD2i3cCqllA3s5/bnjqKbY4bDDLXFQOiwxJaGe/BP2gcihCLQuiZKlV1f58zNDmr9lNtLSyg+C8jeKrSXbX/pCqqHxdyvwTO6j53qnvu8/nFLfgz1uGXJ9SMy/sP3A3J7fhq7Pv34f21fnkUWt3eUtDTVSzPL1u6SKGfjrV6TvtM98bhccMlMOYWXSWXpHJNLaPMXZ8oyOMxlLIsAAAAASUVORK5CYII="> <form action="" method="post" class="mk-side-form"> <h2 class="pw-tip">该文章已被加密</h2> <input type="password" name="logpwd" placeholder="请输入访问密码查看" required><button type="submit">提交</button> <?php if($postPwd): ?> <p id="pw-error">Oops!密码不对哦~</p> <script>setTimeout(function() {document.getElementById("pw-error").style.display = "none"}, 2000);</script> <?php endif; ?> </form> <a href="<?php echo $url; ?>" class="return-home" title="点击回到网站首页">- 返回首页 - </a> </div> <style type="text/css"> *{font-family:"Microsoft Yahei",微软雅黑,"Helvetica Neue",Helvetica,"Hiragino Sans GB","WenQuanYi Micro Hei",sans-serif;box-sizing:border-box;margin:0px;padding:0px;font-size:14px;-webkit-transition:.2s;-moz-transition:.2s;-ms-transition:.2s;-o-transition:.2s;transition:.2s} html,body{width:100%;height:100%} body{background-color:#F4F6F9;color:#768093} input,button{font-size:1em;border-radius:3px;-webkit-appearance:none} input{width:100%;padding:5px;box-sizing:border-box;border:1px solid #e5e9ef;background-color:#f4f5f7;resize:vertical} input:focus{background-color:#fff;outline:none} button{border:0;background:#6abd09;color:#fff;cursor:pointer;opacity:1;user-select:none} button:hover,button:focus{opacity:.9} button:active{opacity:1} .main{width:100%;max-width:500px;height:300px;padding:30px;background-color:#fff;border-radius:2px;box-shadow:0 10px 60px 0 rgba(29,29,31,0.09);transition:all .12s ease-out;position:absolute;left:0;top:0;bottom:0;right:0;margin:auto;text-align:center} .alert{width:80px} .mk-side-form{margin-bottom:28px} .mk-side-form input{float:left;padding:2px 10px;width:77%;height:37px;border:1px solid #ebebeb;border-right-color:transparent;border-radius:2px 0 0 2px;line-height:37px} .mk-side-form button{position:relative;overflow:visible;width:23%;height:37px;border-radius:0 2px 2px 0;text-transform:uppercase} .pw-tip{font-weight:normal;font-size:26px;text-align:center;margin:25px auto} #pw-error {color: red;margin-top: 15px;margin-bottom: -20px;} .return-home{text-decoration:none;color:#b1b1b1;font-size:16px} .return-home:hover{color:#1E9FFF;letter-spacing:5px} </style> </body> </html> <?php if ($cookiePwd) { setcookie('em_logpwd_' . $logid, ' ', time() - 31536000); }
2019年12月10日
283 阅读
0 评论
0 点赞
2019-12-10
基于本地数据库的IP地址查询
今天来分享一个基于本地数据库的IP地址查询PHP源码:<?php /** * 纯真 IP 数据库查询 * * 参考资料: * - 纯真 IP 数据库 http://www.cz88.net/ip/ * - PHP 读取纯真IP地址数据库 http://ju.outofmemory.cn/entry/42500 * - 纯真 IP 数据库自动更新文件教程 https://www.22vd.com/40035.html * - IpLocation https://github.com/nauxliu/IpLocation/ * - 基于本地数据库的 IP 地址查询 PHP 源码 https://mkblog.cn/?p=1951 * * 使用示例: * $ip = new IPQuery(); * $addr = $ip->query('IP地址'); * print_r($addr); */ class IPQuery { private $fh; // IP数据库文件句柄 private $first; // 第一条索引 private $last; // 最后一条索引 private $total; // 索引总数 private $dbFile = __DIR__ . DIRECTORY_SEPARATOR . 'qqwry.dat'; // 纯真 IP 数据库文件存放路径 private $dbExpires = 86400 * 10; // 数据库文件有效期(10天)如无需自动更新 IP 数据库,请将此值改为 0 // 构造函数 function __construct() { // IP 数据库文件不存在或已过期,则自动获取 if(!file_exists($this->dbFile) || ($this->dbExpires && ((time() - filemtime($this->dbFile)) > $this->dbExpires))) { $this->update(); } } // 忽略超时 private function ignore_timeout() { @ignore_user_abort(true); @ini_set('max_execution_time', 48 * 60 * 60); @set_time_limit(48 * 60 * 60); // set_time_limit(0) 2day @ini_set('memory_limit', '4000M');// 4G; } // 读取little-endian编码的4个字节转化为长整型数 private function getLong4() { $result = unpack('Vlong', fread($this->fh, 4)); return $result['long']; } // 读取little-endian编码的3个字节转化为长整型数 private function getLong3() { $result = unpack('Vlong', fread($this->fh, 3).chr(0)); return $result['long']; } // 查询位置信息 private function getPos($data = '') { $char = fread($this->fh, 1); while (ord($char) != 0) { // 地区信息以 0 结束 $data .= $char; $char = fread($this->fh, 1); } return $data; } // 查询运营商 private function getISP() { $byte = fread($this->fh, 1); // 标志字节 switch (ord($byte)) { case 0: $area = ''; break; // 没有相关信息 case 1: // 被重定向 fseek($this->fh, $this->getLong3()); $area = $this->getPos(); break; case 2: // 被重定向 fseek($this->fh, $this->getLong3()); $area = $this->getPos(); break; default: $area = $this->getPos($byte); break; // 没有被重定向 } return $area; } // 检查 IP 格式是否正确 public function checkIp($ip) { $arr = explode('.', $ip); if(count($arr) != 4) return false; for ($i = 0; $i < 4; $i++) { if ($arr[$i] < '0' || $arr[$i] > '255') { return false; } } return true; } // 查询 IP 地址 public function query($ip) { if(!$this->checkIp($ip)) { return false; } $this->fh = fopen($this->dbFile, 'rb'); $this->first = $this->getLong4(); $this->last = $this->getLong4(); $this->total = ($this->last - $this->first) / 7; // 每条索引7字节 $ip = pack('N', intval(ip2long($ip))); // 二分查找 IP 位置 $l = 0; $r = $this->total; while($l <= $r) { $m = floor(($l + $r) / 2); // 计算中间索引 fseek($this->fh, $this->first + $m * 7); $beginip = strrev(fread($this->fh, 4)); // 中间索引的开始IP地址 fseek($this->fh, $this->getLong3()); $endip = strrev(fread($this->fh, 4)); // 中间索引的结束IP地址 if ($ip < $beginip) { // 用户的IP小于中间索引的开始IP地址时 $r = $m - 1; } else { if ($ip > $endip) { // 用户的IP大于中间索引的结束IP地址时 $l = $m + 1; } else { // 用户IP在中间索引的IP范围内时 $findip = $this->first + $m * 7; break; } } } // 查找 IP 地址段 fseek($this->fh, $findip); $location['beginip'] = long2ip($this->getLong4()); // 用户IP所在范围的开始地址 $offset = $this->getlong3(); fseek($this->fh, $offset); $location['endip'] = long2ip($this->getLong4()); // 用户IP所在范围的结束地址 // 查找 IP 信息 $byte = fread($this->fh, 1); // 标志字节 switch (ord($byte)) { case 1: // 都被重定向 $countryOffset = $this->getLong3(); // 重定向地址 fseek($this->fh, $countryOffset); $byte = fread($this->fh, 1); // 标志字节 switch (ord($byte)) { case 2: // 信息被二次重定向 fseek($this->fh, $this->getLong3()); $location['pos'] = $this->getPos(); fseek($this->fh, $countryOffset + 4); $location['isp'] = $this->getISP(); break; default: // 信息没有被二次重定向 $location['pos'] = $this->getPos($byte); $location['isp'] = $this->getISP(); break; } break; case 2: // 信息被重定向 fseek($this->fh, $this->getLong3()); $location['pos'] = $this->getPos(); fseek($this->fh, $offset + 8); $location['isp'] = $this->getISP(); break; default: // 信息没有被重定向 $location['pos'] = $this->getPos($byte); $location['isp'] = $this->getISP(); break; } // 信息转码处理 foreach ($location as $k => $v) { $location[$k] = iconv('gb2312', 'utf-8', $v); $location[$k] = preg_replace(array('/^.*CZ88\.NET.*$/isU', '/^.*纯真.*$/isU', '/^.*日IP数据/'), '', $location[$k]); $location[$k] = htmlspecialchars($location[$k]); } return $location; } // 更新数据库 https://www.22vd.com/40035.html public function update() { $this->ignore_timeout(); $copywrite = file_get_contents('http://update.cz88.net/ip/copywrite.rar'); $qqwry = file_get_contents('http://update.cz88.net/ip/qqwry.rar'); $key = unpack('V6', $copywrite)[6]; for($i = 0; $i < 0x200; $i++) { $key *= 0x805; $key ++; $key = $key & 0xFF; $qqwry[$i] = chr(ord($qqwry[$i]) ^ $key); } $qqwry = gzuncompress($qqwry); file_put_contents($this->dbFile, $qqwry); } // 析构函数 function __destruct() { if($this->fh) { fclose($this->fh); } $this->fp = null; } }使用方法将上面的模块代码保存为 IPQuery.class.php,然后按照如下方法调用即可:<?php require_once('IPQuery.class.php'); $ip = new IPQuery(); $addr = $ip->query('123.233.233.233'); echo "<pre> IP起始段:{$addr['beginip']} IP结束段:{$addr['endip']} 实际地址:{$addr['pos']} 运 营 商:{$addr['isp']} </pre>";注:本模块会在第一次被调用时自动从纯真网下载最新的 IP 数据库到本地,因此第一次进行查询时会有点慢。
2019年12月10日
301 阅读
0 评论
0 点赞
2019-12-10
PHP简单实现一言随机一句功能
首先新建一个php文件,命名为api.php,再新建一个文件,命名为data.dat(两个文件均需采用 UTF-8 编码,否则会乱码)。打开 data.dat,在里面贴入要随机显示出来的文本,一行一条。将下列代码复制并粘贴到api.php中保存,你的专属“一言” API就搭建完成了!fopen + fgets 函数实现代码<?php // 存储数据的文件 $filename = 'data.dat'; // 指定页面编码 header('Content-type: text/html; charset=utf-8'); if(!file_exists($filename)) { die($filename . ' 数据文件不存在'); } $data = array(); // 打开文档 $fh = fopen($filename, 'r'); // 逐行读取并存入数组中 while (!feof($fh)) { $data[] = fgets($fh); } // 关闭文档 fclose($fh); // 随机获取一行索引 $result = $data[array_rand($data)]; echo $result;file_get_contents 函数实现代码<?php // 存储数据的文件 $filename = 'data.dat'; // 指定页面编码 header('Content-type: text/html; charset=utf-8'); if(!file_exists($filename)) { die($filename . ' 数据文件不存在'); } // 读取整个数据文件 $data = file_get_contents($filename); // 按换行符分割成数组 $data = explode(PHP_EOL, $data); // 随机获取一行索引 $result = $data[array_rand($data)]; // 去除多余的换行符(保险起见) $result = str_replace(array("\r","\n","\r\n"), '', $result); echo $result;如何在静态页面中引用上面的代码都是直接在页面中就输出了随机的句子。如果想像一言那样在静态的网页中引用这个api,将最后那一行的 echo $result; 换成:echo 'document.write("'.htmlspecialchars($result).'");';然后在需要的位置进行调用即可。代码:<script src="http://你的网址/api.php"></script>
2019年12月10日
270 阅读
0 评论
0 点赞
2019-12-09
域名防红代码
今天分享一段QQ内打开网址提示跳转到浏览器的代码,可以域名防红。将以下代码放在网站根目录下index.php文件的顶端。 <?php $conf['qqjump']=1; if(strpos($_SERVER['HTTP_USER_AGENT'], 'QQ/')!==false && $conf['qqjump']==1){$a='http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; echo '<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>请使用浏览器打开</title> <script src="https://open.mobile.qq.com/sdk/qqapi.js?_bid=152"></script> <script type="text/javascript"> mqq.ui.openUrl({ target: 2,url: "'.$a.'"}); </script> </head> <body>请使用浏览器打开</body> </html>';exit;} ?>
2019年12月09日
360 阅读
0 评论
0 点赞
2019-12-09
Emlog通过不同域名使用不同的模板
只在Emlog根目录的 index.php 简单修改就能实现,也可以做多用户二级域名调用不同的模板。当然也可以修改模板不同域名显示不同用户的文章。$templet=Option::get('nonce_templet'); $the_host = $_SERVER['HTTP_HOST']; if ($the_host=='abc.123.cn') {////判断域名或者浏览器 UA 使用不同的前台模板 $templet='abc';//前台模板名 } define('TEMPLATE_URL', TPLS_URL.$templet.'/'); define('TEMPLATE_PATH', TPLS_PATH.$templet.'/'); //define('TEMPLATE_PATH', TPLS_PATH.Option::get('nonce_templet').'/');//前台模板路径
2019年12月09日
249 阅读
0 评论
0 点赞
2019-12-01
批量查询域名是否被注册 (Python脚本)
批量查询域名是否被注册,用来注册自己心仪的域名。Python脚本如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*- # @Time : 2019/10/21 3:46 PM # @Author : w8ay # @File : domain.py.py import requests from bs4 import BeautifulSoup import time from itertools import combinations, permutations # 查询是否注册 def check(domain): url = "http://panda.www.net.cn/cgi-bin/check.cgi?area_domain=%s" % domain html = requests.get(url) bsj = BeautifulSoup(html.text, "lxml") onum = bsj.find("original") if onum != None: num = onum.get_text()[:3] if num == '210': print("%s可以注册" % domain) elif num == "213": print("查询超时,请重新查询") elif num == "211": print("[x] %s" % domain) elif num == "212": print(f"{domain} 无效域名") else: print(html.text) print("出现未知问题") return num else: print("让我哭一会,ip可能被封了") return None def search(name, suffix): domain = name + '.' + suffix num = check(domain) if num != None: if num == '210': return domain return False if __name__ == '__main__': namepart = ['micro', 'hacking', 'scan'] qians = ['micro', 'hack', 'sec', 'vul', 'vuln', 'pwn', 'bug', 'i', 'poc','src','exp'] hous = ['scan', 'scanner', 'sec', 'hub','con','hunter','sploit','exp'] suffixes = ['com'] domains = [] for suffix in suffixes: # names = permutations(namepart, 2) names = [] for qian in qians: for hou in hous: names.append(qian + hou) for name in names: domains.append((name, suffix)) for domain in domains: oklist = search(domain[0], domain[1]) time.sleep(0.1)
2019年12月01日
458 阅读
0 评论
0 点赞
1
...
7
8
9
...
13