美高梅4858官方网站|美高梅4858mgm博客-分享、记录生活的点滴 / zh-CN Sun, 24 May 2020 11:23:00 +0800 Sun, 24 May 2020 11:23:00 +0800 MySQL 分别统计 男女数量 /mysql/969.html /mysql/969.html Sun, 24 May 2020 11:23:00 +0800 Chuwen SELECT uSex, COUNT(*) FROM `Users ` WHERE `uSex` IN ( '男', '女' ) GROUP BY `uSex`; ]]> 0 /mysql/969.html#comments /feed/mysql/969.html MySQL GROUP BY 不会对 NULL 进行分组统计解决办法(表述可能不正确,具体看内容...) /mysql/968.html /mysql/968.html Sat, 23 May 2020 12:03:40 +0800 Chuwen 数据表结构

goods (商品信息)表结构

+------------+--------------+------+-----+-------------------+----------------+
| Field      | Type         | Null | Key | Default           | Extra          |
+------------+--------------+------+-----+-------------------+----------------+
| gdID       | int(11)      | NO   | PRI | NULL              | auto_increment |
| tID        | int(11)      | YES  | MUL | NULL              |                |
| gdCode     | varchar(50)  | YES  |     | NULL              |                |
| gdName     | varchar(100) | NO   |     | NULL              |                |
| gdPrice    | float        | YES  |     | 0                 |                |
| gdQuantity | int(11)      | YES  |     | 0                 |                |
| gdSaleQty  | int(11)      | YES  |     | 0                 |                |
| gdCity     | varchar(50)  | YES  |     | 长沙              |                |
| gdInfo     | longtext     | NO   |     | NULL              |                |
| gdAddTime  | timestamp    | YES  |     | CURRENT_TIMESTAMP |                |
| gdHot      | tinyint(11)  | YES  |     | 0                 |                |
| gdImage    | varchar(255) | YES  |     | NULL              |                |
+------------+--------------+------+-----+-------------------+----------------+

orderdetail (商品订单信息、评论)表结构

+------------+---------------+------+-----+---------+----------------+
| Field      | Type          | Null | Key | Default | Extra          |
+------------+---------------+------+-----+---------+----------------+
| odID       | int(11)       | NO   | PRI | NULL    | auto_increment |
| oID        | int(11)       | YES  |     | NULL    |                |
| gdID       | int(11)       | YES  |     | NULL    |                |
| odNum      | int(11)       | YES  |     | NULL    |                |
| dEvalution | varchar(8000) | YES  |     | NULL    |                |
| odTime     | datetime      | YES  |     | NULL    |                |
+------------+---------------+------+-----+---------+----------------+

需求

需要列出商品信息及评价数量

当时想到的解题思路是,通过查询 OrderDetail 表,通过外连接(RIGHT JOIN) goods 表,然后进行分组查询,然后就有了以下语句

SELECT
    Goods.gdID,
    Goods.gdName,
    Goods.gdPrice,
    Goods.gdSaleQty,
    Goods.gdImage,
    COUNT( OrderDetail.gdID ) AS noe 
FROM
    `OrderDetail`
    RIGHT JOIN `Goods` ON `Goods`.`gdID` = `OrderDetail`.`gdID` 
GROUP BY
    `OrderDetail`.`gdID` 
ORDER BY
    noe DESC;

运行结果:

发现,当商品没有评价的,不会列出来
+------+-------------+---------+-----------+--------------------------------------------------------------------------------------------------------------------+-----+
| gdID | gdName      | gdPrice | gdSaleQty | gdImage                                                                                                            | noe |
+------+-------------+---------+-----------+--------------------------------------------------------------------------------------------------------------------+-----+
|   10 | HUAWEIP9_PLUS |    3980 |         7 | 【HUAWEI官方买就送Type C 转接头】Huawei/HUAWEI P9 plus全网通手机                                                       |   5 |
|    3 | 牛肉干      |      94 |        61 | 牛肉干一般是用黄牛肉和其他调料一起腌制而成的肉干。牛肉干中的风干牛肉源于蒙古铁骑的战粮,携带方便,并且有丰富的营养 |   2 |
|    5 | 运动鞋      |     400 |       200 | 运动,健康等                                                                                                       |   1 |
|    6 | 咖啡壶      |      50 |        45 | 一种冲煮咖啡的器具。咖啡壶是欧洲最早的发明之一,约在1685年于法国问世,在路易十五时期在各地广为流传。               |   1 |
|    8 | A字裙       |     128 |       200 | 2016秋季新品韩版高腰显瘦圆环拉链a字半身裙双口袋包臀短裙子女                                                        |   1 |
|    1 | 迷彩帽      |      63 |        29 | 透气夏天棒球帽男女鸭舌帽网帽迷彩帽子太阳帽防晒韩版休闲遮阳帽                                                       |   0 |
+------+-------------+---------+-----------+--------------------------------------------------------------------------------------------------------------------+-----+

解决

再网上找到了一个类似的问题:https://blog.csdn.net/u011277123/article/details/79883855
这篇文章参考的是:https://stackoverflow.com/questions/4588935/group-by-do-not-group-null

他是这么写的

增加一个 UUID(),把 b.name 的 NULL 的值都转化为具有专一性的 uuid,这样每个 b.name 都会不同, GROUP 就不会对他们进行分组
我也没怎么理解他说的,但是按照他的方法做,可以实现我想要的结果

SQL 语句:

SELECT
    Goods.gdID,
    Goods.gdName,
    Goods.gdPrice,
    Goods.gdSaleQty,
    Goods.gdImage,
    COUNT( OrderDetail.gdID ) AS noe 
FROM
    `OrderDetail`
    RIGHT JOIN `Goods` ON `Goods`.`gdID` = `OrderDetail`.`gdID` 
GROUP BY
    IFNULL(
        `OrderDetail`.`gdID`,
    UUID());
ORDER BY
    noe DESC;

运行结果:

评价数为 0 的结果也输出了,这正是我想要的结果
+------+-------------+---------+-----------+--------------------------------------------------------------------------------------------------------------------+-----+
| gdID | gdName      | gdPrice | gdSaleQty | gdImage                                                                                                            | noe |
+------+-------------+---------+-----------+--------------------------------------------------------------------------------------------------------------------+-----+
|   10 | HUAWEIP9_PLUS |    3980 |         7 | 【HUAWEI官方买就送Type C 转接头】Huawei/HUAWEI P9 plus全网通手机                                                       |   5 |
|    3 | 牛肉干      |      94 |        61 | 牛肉干一般是用黄牛肉和其他调料一起腌制而成的肉干。牛肉干中的风干牛肉源于蒙古铁骑的战粮,携带方便,并且有丰富的营养 |   2 |
|    5 | 运动鞋      |     400 |       200 | 运动,健康等                                                                                                       |   1 |
|    6 | 咖啡壶      |      50 |        45 | 一种冲煮咖啡的器具。咖啡壶是欧洲最早的发明之一,约在1685年于法国问世,在路易十五时期在各地广为流传。               |   1 |
|    8 | A字裙       |     128 |       200 | 2016秋季新品韩版高腰显瘦圆环拉链a字半身裙双口袋包臀短裙子女                                                        |   1 |
|    1 | 迷彩帽      |      63 |        29 | 透气夏天棒球帽男女鸭舌帽网帽迷彩帽子太阳帽防晒韩版休闲遮阳帽                                                       |   0 |
+------+-------------+---------+-----------+--------------------------------------------------------------------------------------------------------------------+-----+
]]>
0 /mysql/968.html#comments /feed/mysql/968.html
MySQL 计算每科成绩和并以降序排列 /mysql/966.html /mysql/966.html Fri, 08 May 2020 17:27:17 +0800 Chuwen 问题
查询各个学生总成绩,并按总分从高到底排序

也就是要将 ChineseMath...Biology 字段都加起来然后排列

有以下表

+----+--------+-----+------------------+---------+---------+------+---------+-----------+---------+
| ID | Name   | Age | Job              | Chinese | English | Math | Physics | Chemistry | Biology |
+----+--------+-----+------------------+---------+---------+------+---------+-----------+---------+
|  1 | 王建军 |  30 | Java讲师         |     100 |      98 |   99 |      96 |        97 |     100 |
|  2 | 常庆林 |  28 | Linux讲师        |     100 |     100 |   98 |      93 |        99 |      96 |
|  3 | 徐培成 |  35 | BigData讲师      |     100 |     100 |  100 |      98 |        96 |     100 |
|  4 | 李永强 |  30 | javaEE开发工程师 |     100 |      93 |   91 |      74 |        89 |     100 |
|  5 | 赵子昂 |  24 | python开发工程师 |      98 |      93 |   91 |      74 |        89 |     100 |
|  6 | 桂阳   |  25 | C++开发工程师    |     100 |      98 |   93 |      91 |        99 |      82 |
|  7 | 肖云龙 |  24 | Golang开发工程师 |      93 |      97 |   85 |     100 |        93 |      69 |
|  8 | 李洋   |  23 | C#开发工程师     |     100 |      98 |   99 |      96 |        97 |     100 |
|  9 | 卜孟龙 |  30 | BigData开发      |      98 |      93 |  100 |     100 |        73 |      92 |
| 10 | 罗大鹏 |  22 | Java开发工程师   |     100 |      84 |   91 |      87 |       100 |      93 |
| 11 | 尹正杰 |  18 | 高级运维工程师   |     100 |     100 |  100 |     100 |       100 |     100 |
+----+--------+-----+------------------+---------+---------+------+---------+-----------+---------+

解决思路

我当时就想着用

SELECT SUM(`Chinese`+`Math`+`English`+`Physics`+`Chemistry`+`Biology`) AS 'total' FROM `classmate` ORDER BY `total` DESC;

结果运行结果是:

这显然不是大家要的结果
mysql> SELECT SUM(`Chinese`+`Math`+`English`+`Physics`+`Chemistry`+`Biology`) AS 'total' FROM `classmate` ORDER BY `total` DESC;
+-------+
| total |
+-------+
| 6263  |
+-------+
1 row in set (0.02 sec)

然后我就 谷歌 搜啊搜,搜了很久很久(真的好久...)。终于找到了一个合适的结果,原文链接:https://segmentfault.com/q/1010000002894877

得知应该是这样的:

SELECT *,( Chinese + Math + English + Physics + Chemistry + Biology ) AS total 
FROM
    classmate 
ORDER BY
    `total` DESC

运行结果完美,是我想要的结果

mysql> SELECT *,( Chinese + Math + English + Physics + Chemistry + Biology ) AS total 
FROM
    classmate 
ORDER BY
    `total` DESC;
+----+--------+-----+------------------+---------+---------+------+---------+-----------+---------+-------+
| ID | Name   | Age | Job              | Chinese | English | Math | Physics | Chemistry | Biology | total |
+----+--------+-----+------------------+---------+---------+------+---------+-----------+---------+-------+
| 11 | 尹正杰 |  18 | 高级运维工程师   |     100 |     100 |  100 |     100 |       100 |     100 |   600 |
|  3 | 徐培成 |  35 | BigData讲师      |     100 |     100 |  100 |      98 |        96 |     100 |   594 |
|  8 | 李洋   |  23 | C#开发工程师     |     100 |      98 |   99 |      96 |        97 |     100 |   590 |
|  1 | 王建军 |  30 | Java讲师         |     100 |      98 |   99 |      96 |        97 |     100 |   590 |
|  2 | 常庆林 |  28 | Linux讲师        |     100 |     100 |   98 |      93 |        99 |      96 |   586 |
|  6 | 桂阳   |  25 | C++开发工程师    |     100 |      98 |   93 |      91 |        99 |      82 |   563 |
|  9 | 卜孟龙 |  30 | BigData开发      |      98 |      93 |  100 |     100 |        73 |      92 |   556 |
| 10 | 罗大鹏 |  22 | Java开发工程师   |     100 |      84 |   91 |      87 |       100 |      93 |   555 |
|  4 | 李永强 |  30 | javaEE开发工程师 |     100 |      93 |   91 |      74 |        89 |     100 |   547 |
|  5 | 赵子昂 |  24 | python开发工程师 |      98 |      93 |   91 |      74 |        89 |     100 |   545 |
|  7 | 肖云龙 |  24 | Golang开发工程师 |      93 |      97 |   85 |     100 |        93 |      69 |   537 |
+----+--------+-----+------------------+---------+---------+------+---------+-----------+---------+-------+
11 rows in set (0.05 sec)
]]>
0 /mysql/966.html#comments /feed/mysql/966.html
PHP 版超星学习通自动签到,支撑多用户签到、手势、二维码、位置签到、HTTP API 调用,二次开发便捷! /php/961.html /php/961.html Fri, 01 May 2020 21:30:00 +0800 Chuwen ? ChaoxingSign | 超星学习通签到

PHP 版超星学习用自动签到,支撑多用户签到,二次开发便捷!

PHP 7.3 测试通过,理应 PHP 5.4 及以上都能够使用

  • 登录方式:

支撑手机号码登录,暂时不支撑学号登陆!!!

  • 签到功能:

支撑普通签到,手势签到,二维码签到,位置签到,拍照签到

更新日志


2020/05/27

  • 修复 #1
  • 更改 获取课程、签到 API
  • 添加 手势、位置、二维码一键签到
  • 添加 Server酱 微信推送,需要配置 config.php 文件


2020/05/25

  • 更改 登录接口,原接口已经失效

TODO

  • [] 接入钉钉机器人 API

? 使用方法

  1. 下载源码:

    直接下载:https://github.com/PrintNow/ChaoxingSign/archive/master.zip

    克隆源码:git clone https://github.com/PrintNow/ChaoxingSign

  2. ? 运行

    1. 上传到网站根目录运行

      然后访问 http://你的域名/main.php?account=你的超星账号&password=你的超星密码

    2. 或者使用命令行运行

      php main.php -A "你的超星账号" -P "你的超星密码"
  3. ? 实现自动签到

    推荐大于等于 10 分钟 实行一次,避免出现异常

    我已经硬编仅能在每天的 08:00 ~ 22:00 之间运行,
    如果要取消或修改这一限制,请删除或注释
    main.php 第 7~9 行

    1. 如果以网页方式运行,定时监控 http://你的域名/main.php?account=你的超星账号&password=你的超星密码 即可
    2. 如果使用命令行方式运行,添加 crontab 任务即可,具体添加 crontab 任务 方法可以网上搜。
每天 早上8点到晚上22点之间,每10分钟签到一次 crontab 表达式:`0 */10 8-22 * * * *`

√ 运行输出

签到成功:

正在签到:卡路里与健康:教你如......应该签到成功

正在签到:数据库管理与应用...应该签到成功

没有签到任务:

没有待签到的任务

? 注意

超星屏蔽了如 阿里云、Tencent云、百度云... 等 IDC IP 地址,故有可能出现未知的错误(我没测试,我仅在家庭宽带中测试成功)

?? 感谢

本项目的实现参考了以下文章
  • https://www.z2blog.com/index.php/learn/423.html
  • https://www.z2blog.com/index.php/default/459.html
本项目中使用到的 Selector.php 来自 PHPSpider

License

遵循 MIT License 协议

其他签到脚本推荐

排名部分先后
项目地址开发语言备注
https://github.com/Wzb3422/auto-sign-chaoxingTypeScript超星学习通自动签到,梦中刷网课
https://github.com/Huangyan0804/AutoCheckinPython学习通自动签到,支撑手势,二维码,位置,拍照等
https://github.com/mkdir700/chaoxing_auto_signPython超星学习通自动签到脚本&多用户多任务&API
https://github.com/aihuahua-522/chaoxing-testforAndroidJava学习通(超星)自动签到
https://github.com/yuban10703/chaoxingsignPython超星学习通自动签到

License

遵循 MIT License 协议

]]>
2 /php/961.html#comments /feed/php/961.html
历史上的今天 免费API 开发文档 /chat/949.html /chat/949.html Sat, 18 Apr 2020 11:26:00 +0800 Chuwen 关于本 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)业务。"
    }]
}
]]>
0 /chat/949.html#comments /feed/chat/949.html
Nginx 暴力解决使用 CDN/负载均衡后日志里记录的 IP 不是用户真实 IP | Nginx 获取真实用户 IP /nginx/931.html /nginx/931.html Fri, 17 Apr 2020 17:46:00 +0800 Chuwen 暴力配置
修改 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> 里,每个网站单独配置

效果

效果

]]>
0 /nginx/931.html#comments /feed/nginx/931.html
搜题库(so.NowTool.cn), 大学生的好助手 支撑超星、智慧树、学习强国 答案搜索 /php/924.html /php/924.html Thu, 16 Apr 2020 17:14:00 +0800 Chuwen 搜题库 #支撑超星、智慧树、*学习强国 答案搜索

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

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

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

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

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

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

用到的技术 & 优缺点

  • ThinkPHP 框架
  • Bootstrap V3
  • PHP
  • MySQL
  • 专门为搜索进行优化,基本保证模糊搜索准确率高、查找速度快(从九万多条数据中匹配,传统搜索需要耗费一两秒,美高梅4858mgm优化后只需要几毫秒至十几毫秒)
]]>
0 /php/924.html#comments /feed/php/924.html
TodayInHistory | 历史上的今天数据库 PHP版API /php/922.html /php/922.html Sun, 12 Apr 2020 22:23:00 +0800 Chuwen 如果你只是想要 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 ?

? 截图

[...]

]]>
0 /php/922.html#comments /feed/php/922.html
Typecho 使用 CommentToDingtalk (评论推送至钉钉)插件遇到的问题 /php/921.html /php/921.html Mon, 06 Apr 2020 20:25:07 +0800 Chuwen 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)));
    }
}
]]>
3 /php/921.html#comments /feed/php/921.html
WordPress 设置私人站点,不登陆无法访问 /php/916.html /php/916.html Mon, 06 Apr 2020 19:56:00 +0800 Chuwen 前言

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

开始

打开 /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';

}

效果

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

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

]]>
7 /php/916.html#comments /feed/php/916.html