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

历史上的今天 免费API 开发文档

关于本 API

数据库已开源,详细请访问:/php/922.html

? API 字段说明

? 请求

使用 GET 方法请求 https://api.nowtime.cc/v1/today_in_history

例子,获取1月1日,降序排序:https://api.nowtime.cc/v1/today_in_history?month=1&day=1&order=asc

字段说明
month月份。默认值是本月,你可以输入 1~12 之间的数字
day日期。默认值是今天,你可以输入 1~31 之间的数字
order排序方式。根据 年份排序,默认值是 desc 降序(从大到小),你可以输入 descasc

? 返回

字段类型说明
codeint[必有] 状态码,正常返回 200,其它包括数据不存在都返回如 500、-1
msgstring[必有] 信息,正常返回 ok,非 200 状态码返回错误原因
countint历史上的今天返回数量
disclaimerstring[必有] 免责声明,可以自己在 api.php 第82行 进行修改
dataarray历史上的今天 数据,字段说明请看下方
yearint[必有] 年份,如果前面带有有负号 -,则代表是公元前
monthint[必有] 月份
typeint[必有] 事件类型,1:大事件,2:出生,3:逝世
datastring[必有] 事件信息,如果当天有多个事件,将以 ${{delimiter}} 作为分隔符进行分割。PHP 可以使用 explode() 函数进行分割,美高梅4858mgm 可以使用 split 方法进行分割
请注意,以下是我进行了修改的,实际返回条数不止 2条
{
    "code": 200,
    "msg": "ok",
    "count": 2,
    "disclaimer": "数据源于“维基百科”,经过加工后为您呈现本数据,数据采集于 2020\/04\/12 12:00,在此之后一些数据可能发生了改变,请以事实为准!美高梅4858不承担任何因数据改变而造成的任何责任",
    "data": [{
        "year": 2020,
        "month": 1,
        "day": 1,
        "type": 3,
        "data": "大卫·斯特恩,前任美国国家篮球协会总裁(1942年出生)"
    }, {
        "year": 2019,
        "month": 1,
        "day": 1,
        "type": 1,
        "data": "中华民国实施大型餐饮业如连锁速食店等,内用将禁止提供塑胶吸管的规定[3][4];中华民国依法届期终止第三代行动通讯(3G)业务。"
    }]
}

Nginx 暴力解决使用 CDN/负载均衡后日志里记录的 IP 不是用户真实 IP | Nginx 获取真实用户 IP

暴力配置

修改 nginx.confvhost.conf 之类的文件,将以下配置放在 http 里或 server 里,实现的效果请继续往下看
set_real_ip_from   0.0.0.0/0;
real_ip_header     X-Forwarded-For;
real_ip_recursive on;

1. 放在 http 里,放到这里是全局的,一劳永逸

注意:我测试并没有什么异常,即使是加了 CDN 和没加 CDN,Nginx 日志都一样正确记录 IP(前提是你像我这样配置了)

放在 <code>http</code> 里,放到这里是全局的,一劳永逸

2. 放在 server 里,每个网站单独配置

放在 <code>server</code> 里,每个网站单独配置

效果

效果

搜题库(so.NowTool.cn), 大学生的好助手 支撑超星、智慧树、学习强国 答案搜索

搜题库 #支撑超星、智慧树、*学习强国 答案搜索

网址:https://so.nowtool.cn/

主要面向的是大学生、学习强国用户,建议用使用空格分割关键字,查询内容尽量简短(虽然模糊查找准确率很高)。目前题库量在 94855 题,今天更新了学习强国 挑战题库

*学习强国:题库仅包含挑战答题

欢迎反馈不能查找的题目,或提交题库,感谢你的使用!

搜题库 so.NowTool.cn #支撑超星、智慧树、*学习强国 答案搜索

蝶恋花 搜索结果 —— 搜题库 so.NowTool.cn

用到的技术 & 优缺点

  • ThinkPHP 框架
  • Bootstrap V3
  • PHP
  • MySQL
  • 专门为搜索进行优化,基本保证模糊搜索准确率高、查找速度快(从九万多条数据中匹配,传统搜索需要耗费一两秒,美高梅4858mgm优化后只需要几毫秒至十几毫秒)

TodayInHistory | 历史上的今天数据库 PHP版API

如果你只是想要 API 接口,请访问:历史上的今天 免费API 开发文档

? TodayInHistory | 历史上的今天

历史上的今天数据库,数据源于“维基百科”,演示地址:https://api.nowtime.cc/today_in_history.html

GitHub 项目地址:https://github.com/PrintNow/TodayInHistory

对你有用别忘了点个 Start?

? 说一下爬虫思路

  1. 先下载 https://zh.wikipedia.org/wiki/1月1日

https://zh.wikipedia.org/wiki/12月31日 366天的页面(我用了 3分钟 左右全部下载完成)

  1. 然后写代码(用的世界上最好的语言 PHP)进行数据清洗,这步我花了好久,大概两三个小时(惭愧惭愧,水平有限?)
  2. 清洗完成后导出为 history_in_today.json 文件
  3. 然后写代码(用的世界上最好的语言 PHP)将其批量插入 MySQL数据库
  4. 写 API 逻辑代码,我用的 ThinkPHP 框架,接口地址:https://api.nowtime.cc/v1/today_in_history
  5. 然后根据我之前写的 PrintNow/TimeLine 时间线,修改成了 index.html
  6. 然后你就看到了本项目

? 使用方法

我准备了两份数据 history_in_today.sqlhistory_in_today.json
你可以随意发挥,或使用我写好的,如下?
  1. ? 准备一个 PHP 环境
  2. 下载源码,解压后放置网站根目录
  3. history_in_today.sql 导入 MySQL 数据库
  4. 配置好数据库信息,在 api.php 第 14~17 行
  5. 修改 [static/script.js]() 第3行,将 https://api.nowtime.cc/v1/today_in_history 替换成 http://你的域名/api.php
  6. 打开 http://你的域名/index.html
  7. enjoy ?

? 截图

- 阅读剩余部分 -

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)));
    }
}
XML 地图 | Sitemap 地图