美高梅4858-美高梅4858mgm-[官方网站]

分类 PHP 下的文章

Typecho 使用 CommentToDingtalk (评论推送至钉钉)插件遇到的问题

CommentToDingtalk 项目地址:https://github.com/MoLeft/CommentToDingtalk

运行报以下错误

Using $this when not in object context
Error: Using $this when not in object context in //nowtime.cc/usr/plugins/CommentToDingtalk/Plugin.php:123
Stack trace:
#0 /nowtime.cc/usr/plugins/CommentToDingtalk/Plugin.php(87): CommentToDingtalk_Plugin::getWebhook('https://oapi.di...', 'SECca000000000...')
#1 /nowtime.cc/var/Typecho/Plugin.php(489): CommentToDingtalk_Plugin::send(Object(Widget_Feedback), NULL)
#2 /nowtime.cc/var/Widget/Feedback.php(146): Typecho_Plugin->__call('Widget_Feedback...', Array)
#3 /nowtime.cc/var/Widget/Feedback.php(336): Widget_Feedback->comment()
#4 /nowtime.cc/var/Typecho/Router.php(138): Widget_Feedback->action()
#5 /nowtime.cc/index.php(30): Typecho_Router::dispatch()
#6 {main}

原因

在静态方法中调用非静态方法,导致其报错

解决方法

静态方法 中调用 非静态方法 $this-> 改成 (new self())-> 即可

以下是修改后的 Plugin.php,你可以直接复制以下代码进行替换:

<?php
if (!defined('__TYPECHO_ROOT_DIR__')) {
    exit;
}

/**
 * Typecho评论推送到钉钉插件
 *
 * @package CommentToDingtalk
 * @author MoLeft
 * @version 1.0
 * @link http://www.moleft.cn/
 */
class CommentToDingtalk_Plugin implements Typecho_Plugin_Interface
{
    /* 激活插件方法 */
    public static function activate()
    {
        //挂载评论接口
        Typecho_Plugin::factory('Widget_Feedback')->finishComment = array('CommentToDingtalk_Plugin', 'send');

        return '插件已激活,请设置相关信息';
    }

    /* 禁用插件方法 */
    public static function deactivate()
    {
        return '插件已禁用';
    }

    /* 插件配置方法 */
    public static function config(Typecho_Widget_Helper_Form $form)
    {
        $webhook = new Typecho_Widget_Helper_Form_Element_Text('webhook', null, '', 'Webhook地址', '请将钉钉中的webhook地址填到此处');
        $secret  = new Typecho_Widget_Helper_Form_Element_Text('secret', null, '', 'Secret密钥', '请将钉钉中的Secret密钥填到此处');
        $form->addInput($webhook);
        $form->addInput($secret);
    }

    /**
     * 个人用户的配置面板
     *
     * @access public
     * @param Typecho_Widget_Helper_Form $form
     * @return void
     */
    public static function personalConfig(Typecho_Widget_Helper_Form $form)
    {

    }

    /* 插件实现方法 */
    public static function render()
    {

    }

    /* 推送通知方法 */
    public static function send($post)
    {
        //获取系统配置
        $options = Helper::options();
        //判断是否配置webhook地址
        if (is_null($options->plugin('CommentToDingtalk')->webhook)) {
            throw new Typecho_Plugin_Exception(_t('Webhook地址未配置'));
        }
        //判断是否配置secret密钥
        if (is_null($options->plugin('CommentToDingtalk')->secret)) {
            throw new Typecho_Plugin_Exception(_t('Secret密钥未配置'));
        }
        $webhook = $options->plugin('CommentToDingtalk')->webhook;
        $secret  = $options->plugin('CommentToDingtalk')->secret;
        $text = "###您收到了一条新评论\n文章标题:{$post->title}\n评论编辑:{$post->author}\n评论内容:{$post->text}";
        $data = [
            'msgtype' => 'actionCard',
            'actionCard' => [
                'title' => '您收到了一条新评论',
                'text' => $text,
                'btnOrientation' => 1,
                'hideAvatar' => 0,
                'singleTitle' => '查看详情',
                'singleURL' =>$post->permalink
            ]
        ];
        
        //我修改了这里
        //我修改了这里
        //我修改了这里
        $response = (new self())->request((new self())->getWebhook($webhook,$secret), json_encode($data));
        //我修改了这里
        //我修改了这里
        //我修改了这里

        if($response['errcode'] !== 0){
            //发送失败,记录日志
            $log = @file_get_contents('./error.log');
            file_put_contents('./error.log','['.date("Y-m-d H:i:s").']'.$response['errmsg']);
        }
    }

    /* Curl请求精简版 */
    private function request($url, $postData)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json;charset=utf-8'));
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        // 线下环境不用开启curl证书验证, 未调通情况可尝试添加该代码
        // curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
        // curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
        $data = curl_exec($ch);
        curl_close($ch);
        return json_decode($data, true);
    }

    /* webhook地址 */
    private function getWebhook($webhook, $secret)
    {
        list($msec, $sec) = explode(' ', microtime());
        $timestamp        = (float) sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
        $sign             = $this->signSecret($timestamp, $secret);
        $webhook_url      = "{$webhook}&timestamp={$timestamp}&sign={$sign}";
        return $webhook_url;
    }

    /* 计算签名 */
    private function signSecret($timestamp,$secret){
        $stringToSign = $timestamp."\n".$secret;
        return urlencode(base64_encode(hash_hmac('sha256', $stringToSign, $secret, true)));
    }
}

WordPress 设置私人站点,不登陆无法访问

前言

我专门搭建了属于 私人的博客,不想给没有拥有该站账号的人访问(或许到了某一天我会悄悄地开放)

开始

打开 /wp-blog-header.php 文件,在 require_once __DIR__ . '/wp-load.php'; 这一行后面加入以下代码:

<?php
/**
 * Loads the WordPress environment and template.
 *
 * @package WordPress
 */

if ( ! isset( $wp_did_header ) ) {

    $wp_did_header = true;

    // Load the WordPress library.
    require_once __DIR__ . '/wp-load.php';
    
        //加入这段代码即可
        //is_user_logged_in() 函数事判断用户是否登录
        //如果登陆了就返回 true,未登录返回 false
    if(!is_user_logged_in()){
        die("<h1>很抱歉,这是我的私人站点,我不想给任何人查看美高梅4858的内容!除非你拥有美高梅4858账号</h1>如果你要登录请点击:<a href='/wp-admin'>登录</a>");
    }

    // Set up the WordPress query.
    wp();

    // Load the theme template.
    require_once ABSPATH . WPINC . '/template-loader.php';

}

效果

未登录显示的页面:
未登录显示的页面

登录了显示的页面:
登录了显示的页面

Cloudreve 屏蔽 ThinkPHP 核心文件,防止被人恶意攻击

根据 ThinkPHP 的默认配置,index.php 入口文件本应在 public/index.php 的,但是 Cloudreve 直接将它移动到程序根目录,ThinkPHP 框架 的所有文件都暴露在公网下,如果 ThinkPHP 出现什么漏洞,攻击者可以直接对其进行攻击

为了避免这种,我想到了两种方法

一种是使用 Nginx URL重写(伪静态)进行屏蔽:

这里屏蔽掉了 ThinkPHP 核心文件及一些安装文件,保证其不会暴露在公网中
location ~ ^/(extend|application|thinkphp|CloudreveInstaller|vendor|extend)/*.*$
{
        return 404;
}

location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md|composer.lock|mysql.sql|deploy.sh|composer.json)
{
        return 404;
}

另一种是将 index.php 移动到 public 下

这个移动之后有许多地方需要更改,我嫌麻烦,没去弄

记一次 ThinkPHP6 环境变量定义文件配置

默认安装后的根目录有一个 .example.env 环境变量示例文件,你可以直接改成 .env 文件后进行修改。

我理解有误,我以为只要是 .env 后缀的文件系统就可以自动载入,结果就是将 .example.env 改成 .env 文件名,然后将它放到网站的根目录,与 think 文件同级,如图:
Snipaste_2020-01-24_08-04-28.png

然后可以通过 env 助手函数测试下 env('database.type') 看是否正常输出

ThinkPHP 5 命令行下实行控制器下的方法

假设有这样一个 URL:/v1/time_table/write_table

你想要再 命令行 下实行,你可以这样运行

1.转到 public 目录下

cd /www/wwwroot/nowtime.cc/public

2.实行控制器下的某一个方法

php index.php v1/time_table/write_table
对于 THinkPHP 5 以上版本都可以是用此方法
XML 地图 | Sitemap 地图