2020年5月

FFmpeg 精准剪切视频

将-ss, -t 参数放在-i参数之前

对输入文件执行seek操作,会seek到-ss设置的时间点前面的关键帧上。
时间不精确,但是不会出现黑屏
ffmpeg -ss 10 -t 15 -i test.mp4 -codec copy cut.mp4

accurate_seek 剪切时间更加精确

accurate_seek必须放在-i参数之前
ffmpeg -ss 10 -t 15 -accurate_seek -i test.mp4 -codec copy cut.mp4

avoid_negative_ts

如果编码格式采用的copy 最好加上 -avoid_negative_ts 1参数
ffmpeg -ss 10 -t 15 -accurate_seek -i test.mp4 -codec copy -avoid_negative_ts 1 cut.mp4

想非常精确,就重新编码

ffmpeg -ss [start] -t [duration] -i [in].mp4 -c:v libx264 -c:a aac -strict experimental -b:a 180k [out].mp4

MySQL GROUP BY 不会对 NULL 进行分组统计解决办法(表述可能不正确,具体看内容...)

数据表结构

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 | 华为P9_PLUS |    3980 |         7 | 【华为官方买就送Type C 转接头】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 | 华为P9_PLUS |    3980 |         7 | 【华为官方买就送Type C 转接头】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 |
+------+-------------+---------+-----------+--------------------------------------------------------------------------------------------------------------------+-----+

MySQL 计算每科成绩和并以降序排列

问题

查询各个学生总成绩,并按总分从高到底排序

也就是要将 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)

然后我就 Google 搜啊搜,搜了很久很久(真的好久...)。终于找到了一个合适的结果,原文链接: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)

PHP 版超星学习通自动签到,支持多用户签到、手势、二维码、位置签到、HTTP API 调用,二次开发便捷!

⭐ ChaoxingSign | 超星学习通签到

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

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

  • 登录方式:

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

  • 签到功能:

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

🎨 更新日志


2020/06/13

  • 修复 #2 的问题,配置了 Server酱但不推送的问题
  • 更改 判断时间区间的方法
  • 添加 获取课程列表失败,重试2次以判断是API错误


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 * * * *`

√ 运行输出

签到成功:

正在签到:陈半仙@测试班级
[2020-06-13 11:44:14]签到成功

Server酱 消息推送成功

没有签到任务:

没有待签到的任务

❗ 注意

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

🙇‍ 感谢

本项目的实现参考了以下文章
本项目中使用到的 Selector.php 来自 PHPSpider

License

遵循 MIT License 协议

其它版本签到脚本推荐

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