分类 技术 下的文章

$ wget https://tar.goaccess.io/goaccess-1.4.6.tar.gz
$ tar -xzvf goaccess-1.4.6.tar.gz
$ cd goaccess-1.4.6/
$ ./configure --enable-utf8 --enable-geoip=mmdb
$ ./configure
$ make
$ make install

安装完成后,运行

$ goaccess

会提示配置文件目录,在最后添加:

time-format %T
date-format %d/%b/%Y
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"

转到日志所在目录,运行

goaccess -f 日志名.log -a > report.html

下载该 HTML 打开即可看到报表。

一、在表格中以“地区”为列标题,依次写出城市名称。

选中这些单元格(不要选中整个A列),点击插入 - 三维地图 - 打开三维地图(O)

第一步

二、找到右边“数据”折叠卡,将“位置”字段中的地理类型设置为“城市”(不要设置为县/市),在上方选择合适的展示类型(点状图、热力图等)。

第二步

三、调整主题图层选项等美化外观。

第三步

应在不瞒报的前提下使用自动化健康打卡程序。

您应当知晓使用自动化程序可能造成学校处分等后果。

流程概览

抓包流程

抓包

使用软件 Fiddler 4 进行抓包。

前期具体步骤:

Android 用户可参考:使用fiddler实现手机抓包 - 简书

iOS 用户可参考:fiddler抓苹果手机上app包的方法... - CSDN

值得注意的是,许多浏览器已不支持 TLS1.0/1.1,因此需要手动在 Tools - Options - HTTPS 中修改 Protocols

<client>;ssl3;tls1.2

HTTPS-ver.png

配置好后,试着进行打卡,发现向服务器传送了数据。

POST https: //▇▇▇.▇▇▇.edu.cn/v1/temperatures/ HTTP/1.1
Host: ▇▇▇.▇▇▇.edu.cn
Content-Type: application/json; charset=utf-8
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Accept: application/json
User-Agent: ▇▇▇
Authorization: JWT ▇▇▇▇
Referer: https: //servicewechat.com/▇▇▇/▇▇/▇▇▇.html
Content-Length: 234

{
    "value": "36",
    "condition": "A",
    "home_condition": "A",
    "watched": false,
    "watched_location": "",
    "stayed": false,
    "stayed_contacted": false,
    "family_conditions": "",
    "is_contacted": false,
    "contacted_health": "",
    "personid": "",
    "notes": "",
    "location": {}
}

我们可以看到,关键的信息是 Header 中的 Authorization 和 JSON。

JSON 当中是填报的表单,其中 value 是体温值(摄氏度)。

试着退出打卡系统重新登录,发现向服务器传送数据如下。

POST https://▇▇▇.▇▇▇.edu.cn/▇▇▇/▇▇▇/login/ HTTP/1.1
Host: ▇▇▇.▇▇▇.edu.cn
Content-Type: application/json; charset=utf-8
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Accept: application/json
User-Agent: ▇▇▇
Referer: https://servicewechat.com/▇▇▇/▇▇/▇▇▇.html
Content-Length: 59
Accept-Language: zh-cn

{"username":"▇▇▇▇▇▇","password":"▇▇▇▇▇▇","type":""}

其中 usernamepassword 均为明文,不需要做改动。

响应后返回的 JSON 为

{
    "token": "▇▇▇",
    "token_expiration_datetime": "2021-07-09 21:12:38"
}

这里的 token 加上前缀 JWT 即为上文中 header 内的 Authorization 的值。

至此,抓包部分结束。

程序设计

由于之前没有学过 Python ,但是觉得 Python 应该可以简单实现并在服务器上部署,决定用 Python 试一试。

在网上查阅资料后,相关设计步骤如下。

需要引用 requestsjson 包,用于发送 POST 请求和解析 JSON 数据。

程序如下。

import requests
import json
url = 'https://▇▇▇.▇▇▇.edu.cn/v1/temperatures/'
datas = {
    "value": "36",
    "condition": "A",
    "home_condition": "A",
    "watched": 0,
    "watched_location": "",
    "stayed": 0,
    "stayed_contacted": 0,
    "family_conditions": "",
    "is_contacted": 0,
    "contacted_health": "",
    "personid": "",
    "notes": "",
    "location": {}
}
headers={"Authorization": "JWT ▇▇▇"}
morning =requests.post(url,data=datas,headers=headers)
print(morning)
print(morning.text)

也可以设计成填入账号密码就可以自动获取 token 打卡的形式。

import requests
import json
url_morning = 'https://▇▇▇.▇▇▇.edu.cn/v1/temperatures/'
url_login = 'https://▇▇▇.▇▇▇.edu.cn/▇▇▇/▇▇▇/login/'

#下文中的学号和密码自行修改
datas_login = {"username":"▇▇▇▇▇▇","password":"▇▇▇▇▇▇","type":""}

datas_morning = {
    "value": "36",
    "condition": "A",
    "home_condition": "A",
    "watched": 0,
    "watched_location": "",
    "stayed": 0,
    "stayed_contacted": 0,
    "family_conditions": "",
    "is_contacted": 0,
    "contacted_health": "",
    "personid": "",
    "notes": "",
    "location": {}
}
login = requests.post(url_login,data=datas_login)
print("登录状态",login)
dic = json.loads(login.text)
token = "JWT "+dic['token']
headers={"Authorization": token}
morning = requests.post(url_morning,data=datas_morning,headers=headers)
print("---------------------")
print("晨报状态",morning)
print("晨报返回值",morning.text)

自动运行

对于服务器,可以配置好 Python 后设置定时任务。注意安装对应的包。

个人电脑来讲,每天手动运行或者用其他方法令其自动运行即可。

代码参考:windows .bat批处理实现进程监控确保程序运行 - 百度经验

程序预期

可以自动检测某程序是否运行并予以打击制裁。

代码

@echo off 

rem 下面的AppName是进程名字,AppPath是路径,修改等号后面的内容就行

set AppName=swap.exe

set AppPath=D:\code\cpp

title 进程监控

cls

echo.

echo 进程监控开始……

echo.

:startjc

   rem 从进程列表中查找指定进程

   rem  下面语句也可写成 qprocess %AppName% >nul (经验发布后补充)

   qprocess|findstr /i %AppName% >nul

   rem 变量errorlevel的值等于0表示查找到进程,否则没有查找到进程

   if %errorlevel%==0 (

         echo ^>%date:~0,10% %time:~0,8% 发现进程,正在制裁
         
         taskkill /f /im %AppName%

         exit

    )else (

           echo ^>%date:~0,10% %time:~0,8% 没有发现程序进程
    )

   rem 用ping命令来实现延时运行,下方(1,1,4)中的4可以修改为想要的秒数

   for /l %%i in (1,1,4) do ping -n 1 -w 1000 168.20.0.1>nul

   goto startjc

echo on

自 PHP 7.2.0 开始,函数 creat_function() 由于安全原因被弃用。而在一些老版本的插件中仍在使用此函数,我们只需对其进行稍微改动即可正常使用。

例如

creat_function(__A__ , __B__);

只需将其更改为

function(__A__){
   __B__;
}

即可。

NADH

NADH 在细胞的有氧呼吸中起作用。
在中学阶段,我们把细胞的有氧呼吸笼统概括为三个阶段:

第一阶段,1 分子葡萄糖分解为 2 分子丙酮酸,此时还剩余 4 个氢原子。这些氢原子和 NAD+ 结合形成了 NADH 。

C6H12O6→2C3H4O3(丙酮酸)+4[H]+少量能量

第二阶段,2 分子的丙酮酸和 6 分子的水结合,形成 6 分子的二氧化碳和 20 个氢原子。同样地,这些氢原子和 NAD+ 结合形成了 NADH 。

2C3H4O3+6H2O→6CO2+20[H]+少量能量

第三阶段,前两阶段结合成的 24 个 NADH 全部又脱氢重新变成 NAD+ ,这些氢原子和氧气结合释放出大量能量。

24[H]+6O2→12H2O+大量能量

NADH叫做还原性辅酶 I ,也叫线粒体素。NAD+ 叫做辅酶 I 。在这个过程的开始与结束,NAD+ 没有发生变化,类似于催化剂一样。而由于 NADH 获得了氢原子,具有了还原性。

NADPH

NADPH 在光合作用中起作用。

NADP+ 是 NAD+ 接受了磷酸基团的产物。

在光合作用中:

光反应阶段,叶绿体中的色素捕捉光能,使得水分解成氧气和氢原子,这些氢原子和 NADP+ 结合形成了 NADPH(即课本中所说 [H] ,但与上文提到的 [H] 不同,上文中的是 NADH )。

暗反应阶段,NADPH 提供氢原子和三碳化合物(C3)结合,形成了 CH2O(糖类),同时 NADPH 又变回了 NADP+

光合作用过程图解

NADPH 叫还原型辅酶Ⅱ,NADP+ 叫做辅酶Ⅱ。

本文介绍的是使用 PC 端 iTunes 将照片导入 iPhone 设备不同相册的方法。

在开始前,将欲导入的照片按照相册分为不同的文件夹,文件夹名称即为相册的名称。接着,将所有的文件夹放在一个文件夹中,即下文所提到的“上级文件夹”。

将 iPhone 用数据线缆连接到 PC ,在 iTunes 主界面菜单栏下方找到 iPhone 图标并点击。

第一步

在左侧“设置”栏目中点击“照片”,勾选“同步照片”前的复选框,并在“复制照片来源”选择所有文件夹的上级文件夹。在下面的区域选择“所选文件夹”,并在“文件夹”菜单勾选你需要导入的文件夹(相册)。点击“应用”。

第二步

紧接着,观察上方状态栏。进行到2/6时,点击左侧跳过按钮以跳过备份环节。

第三步

第四步

耐心等待同步完成,你就可以在 iPhone 中找到归属于“来自我的 Mac ”的这些相册。

第五步

完成

最近在捣鼓服务器,记录一些常用命令。
https://www.cnblogs.com/heqiuyong/p/10460150.html

服务器端口

1、开放端口

firewall-cmd --zone=public --add-port=5672/tcp --permanent   # 开放5672端口

firewall-cmd --zone=public --remove-port=5672/tcp --permanent  #关闭5672端口

firewall-cmd --reload   # 配置立即生效

2、查看防火墙所有开放的端口

firewall-cmd --zone=public --list-ports

3.、关闭防火墙

如果要开放的端口太多,嫌麻烦,可以关闭防火墙,安全性自行评估

systemctl stop firewalld.service

4、查看防火墙状态

firewall-cmd --state

5、查看监听的端口

netstat -lnpt

PS:centos7默认没有 netstat 命令,需要安装 net-tools 工具,yum install -y net-tools

6、检查端口被哪个进程占用

netstat -lnpt |grep 5672

7、查看进程的详细信息

ps 6832

8、中止进程

kill -9 6832
本文代码来自 知乎 / Daotin : 3分钟搞定图片懒加载

之前找到许多懒加载的源码都需要手动定义图片大小,这对于一部分页面来讲很困难。以下的代码则可以绕过这一步骤,从而更加容易添加到网站上。

首先需要将图片调整为 data-src 属性进行加载,并根据自己需要添加 class

<img data-src="./images/1.jpg">

在网页末尾,引用 jQuery 和相关代码

<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<script>
    $(function () {
        // 第一次需要先加载一次
        lazyLoad();

        $(window).scroll(lazyLoad);

        function isInSight(el) {
            const bound = el.getBoundingClientRect();
            const clientHeight = $(window).height(); // 可视区高度
            return bound.top <= clientHeight + 100; // 这里有个+100是为了提前加载。(推荐数值大于一个屏幕高度 px ,只 +100px 在实践中略显滞后。——摘者按)
        }
        function lazyLoad() {
            $.each($('img'), (index,item)=>{ //选择器这里可以加入自己设置的 class(摘者按)
                if(isInSight(item)) {
                    $(item).attr('src', $(item).attr('data-src'));
                }
            });
        }
    });
</script>
本文中代码援引 CSDN 用户@天际的海浪
原文地址 https://bbs.csdn.net/topics/392184885

代码

<script type="text/javascript">
if (screen.width<640)
    document.write('<script type="text/javascript" src="1.js"><\/script>');
else
    document.write('<script type="text/javascript" src="2.js"><\/script>');
</script>

原理

依据 JavaScript 的 Screen 对象之 Width 属性读取屏幕宽度。

相关阅读

  1. Screen 对象 | 菜鸟教程 - https://www.runoob.com/jsref/obj-screen.html
  2. Screen width 属性 | 菜鸟教程 - https://www.runoob.com/jsref/prop-screen-width.html

供自己查阅使用,不定期更新。

自定义 MediaWiki CSS 样式

MediaWiki定制化改动 - 亚楠老猎人

在搜索栏输入 MediaWiki:Timeless.css 后回车,即可进行快捷编辑。

顶部/底部/侧边栏 内容投放

Displaying Google Adsense in MediaWiki - Guy Rutenberg

顶部

$wgHooks['SiteNoticeAfter'][] = function(&$siteNotice, $skin) {
        $siteNotice .= <<< EOT
        <p>HTML 内容插入至此</p>
EOT;
        return true;
};

底部

$wgHooks['SkinAfterContent'][] = function(&$data, $skin) {
        global $myAdCode;
        $data .= '<div style="text-align:center;">';
        $data .= <<< EOT
         <p>HTML 内容插入至此</p>
EOT;

        $data .= '</div>';
        return true;
};

侧边栏

$wgHooks['SkinBuildSidebar'][] = function($skin, &$bar) {
        $out = <<< EOT
        <p>HTML 内容插入至此</p>
EOT;
        $out .= "<script>$('#p-Ads').addClass('persistent');</script>";
        $bar['Ads'] = $out;
        return true;
};