0%

1. 准备

  1. 文本编辑器:VSCode
    去(官网)[https://code.visualstudio.com/]下载 vscode,安装时一路点 next,最后在应用商店选择下载一个 javascript 的插件,需要中文界面的话可以搜索安装”Chinese”插件。

  2. 浏览器:Firefox 浏览器(或者 Chrome)。

  3. js 的位置:Html 的文档里的<script>标签里,或者是别起一个后缀名为”.js”的文件,再在<script>标签的src属性引用它。

    1
    <script src="example.js"></script>
  4. 运行,打开浏览器的开发者模式,进入控制台,然后把代码放在输入框中,再点上面的运行即可运行代码,如图所示。
    Image

2. 语法

  1. 语句结尾不需加上分号,但建议在末尾加上分号,这是一种良好的习惯。

  2. 注释:

    • 单句的注释是在语句前加上//,如// console.log("Test");
    • 一段代码的注释是在代码前加上/*,在代码后加上 /*,如:
      1
      2
      3
      4
      /*
      alert("document");
      console.log("Daoli");
      */
  3. 变量(variable)

    • 变量不需要提前声明,不过提前声明是个良好的编程习惯。下面的语句是声明。
    1
    var num;

    亦可直接声明赋值

    1
    var num = 1;
    • 变量区分大小写;
    • 变量名不允许包含空格或标点符号(除了美元符号$)。
  4. 数据类型

    • js 是一种弱类型语言,可以在任何时候改变变量的数据类型。
    1
    2
    var num = 1;
    num = "jinl";
    • 字符串:由零个或多个字符构成,字符包括但不限于字母、数字、标点符号和空格,字符串必需包括在引号里;
    • 数值:数值不限于是整数,js 可以使用带小数点的数值;
    • 布尔值:只有两种取值:true 或者 false
  5. 数组

    • 声明:可选给定数组的长度;
    1
    2
    var array_0 = Array(4);
    var array_1 = Array();
    • 赋值:直接array_0[index] = "str",或者:var array_0 = new("str1", "str2", "str3", "str4")
  6. 对象

    • 与数组类似,对象也使用一个名字表示一组值。每个值是对象的一个属性。前面代表键,冒号后面代表值。
    • 创建方法:使用花括号语法:
    1
    2
    3
    4
    5
    test_obj = {
    name: "apple",
    year: 1999,
    eat_or_not: true,
    };

    访问属性:取对象里的键。

    1
    var name = test_obj("name");

3. 操作

  1. 加减乘除的符咒分别是+-*/,用法与其它的语言一样。
  2. 可以使用i++以用i += 1这种方式。
  3. js 的+可以将字符串与数值相连接,连接后是一个更长的字符串,如
    1
    2
    var str = "101" + 11;
    // str === "10111"

4. 条件语句

  1. 与 C 语的中的用法一致,基本语法为:

    1
    2
    3
    if (condition) {
    statement;
    }
  2. 比较操作符包括:大于(>)、小于(<)、大于等于(>=)、小于等于(<=)以及等于(==)与不等于(!=)。
    其中要注意的是==不表示一定相等,比如下面的例子中,ab是相等的。

    1
    2
    3
    4
    5
    6
    var a = false;
    var b = "";

    if (a == b) {
    alert("true");
    }

    这个时候就需要另一种等号(===),这个等号会进行严格的比较,同理,不相等要比较需要使用(!==)来比较。
    我个人的建议是,一律使用===!==

  3. 逻辑操作符
    &&,或||,非

5. 循环

  1. while 循环。
    1
    2
    3
    while(condition){
    statement;
    }
  2. do-while 循环。
    1
    2
    3
    do {
    statement;
    } while (condition);
  3. for 循环
    1
    2
    3
    for (initial condition; test condition; alter condition) {
    statement;
    }
    实例:
    1
    2
    3
    for (let index = 0; index < 10; index++) {
    console.log(index);
    }

6. 函数

  1. 定义示例函数:
    1
    2
    3
    4
    5
    // test是函数名,params是参数,true是返回值。
    function test(params) {
    alert(params);
    return true;
    }
  2. 调用示例:
    1
    bool = test("Test!");
  3. 变量作用域:如果函数内使用了 var 对象,那么就被视为局部变量,否则为全局变量。

7. 对象

  1. 对象是自包含的数据集合,包含在对象的数组可以通过属性(property)和方法(method)来访问。
    js 里,属性和方法都使用“点”语法来访问。

    1
    2
    object.property;
    object.method();
  2. 内建对象:一般使用new的关键字去新建一个对象的实例。如新建一个数组对象:

    1
    var array = new Array();

欢迎访问我的个人博客

最近下载《Death Note》漫画,只是只有图片,想了想还转为 PDF 比较好看,经过一番查找,找到了几种方法。

1. 系统自带的打印为 PDF 文件

具体操作:选择好图片 -> 右键 -> 打印 -> 选择大小为 A4 纸 -> 打印。
优点:简单,并且不用安装任何软件。
缺点:图片的大小会改变,不能展示原来的图片。

2. SanPDF

一个专业搞 PDF、WORD、EXCEL 之间转换以及操作的软件。
具体操作:去官网下载安装,可以把安装目录放在 C 盘以外的盘。安装后打开,选择图片转 PDF,然后添加文件,再点击右上角的生成 pdf 即可在图片所在目录找到 PDF 文件。
Image
生成的 pdf 如图所示:
Image
优点:图片是原生大小,亦是原生质量,比较清晰。此软件还可以操作其它诸如 word 与 pdf 互转、pdf 转图片等操作,是个难得的好软件。
缺点:是付费软件,不过可以绿色软件下载。

3. 使用 python 里的 reportlab 生成 pdf

  • 首先需要安装reportlab库,如果你的电脑已经安装了 pip,那么只需一条pip install reportlab命令即可。
  • 以下是 python 图片转为 pdf 的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from reportlab.lib.pagesizes import A4, portrait, landscape
from reportlab.pdfgen import canvas
import os


def convert_images_to_pdf(img_path, pdf_path):
pages = 0
(w, h) = portrait(A4)
c = canvas.Canvas(pdf_path, pagesize=portrait(A4))
l = os.listdir(img_path)
l.sort(key=lambda x: int(x[:-4]))
for i in l:
f = img_path + os.sep + str(i)
c.drawImage(f, 0, 0, w, h)
c.showPage()
pages = pages + 1
c.save()


path = r"D://web//script//pxtt-118"
pdf_path = r"D://web//script//pdf//pxtt-118.pdf"

convert_images_to_pdf(path, pdf_path)

将上面的 path 改为图片的目录路径,pdf_path 改为具体到文件名的路径。注意图片目录路径不能包含除图片外的文件,否则会报错。

优点:同上面系统操作 pdf。
缺点:很麻烦。

欢迎访问我的博客网站

起因

最近闲来无事,想来做一个自动填写的问卷星 JS 脚本。

配置

此脚本目前仅支持单选、多选以及填空题。
单选、多选采用随机选择的方法,而填空题则需要自己配置填写的内容。
具体配置方法为:
如果问卷里的第四题是填空题,那么在全局变量config加上一个键值,里面有 id 和 answer 两个键,填上相应的值(第四题即id: 4)即可。

1
2
3
4
5
6
var config = [
{
id: 4,
answer: ["不知道", "随便吧", "自学去"],
},
];
运行

打开浏览器,进入问卷页面如js 测试
有以下两种方法运行:

我用的是 Firefox 浏览器,其它浏览器的操作都差不多,可以就是快捷键有区别。

  1. F12,点击控制台,再把脚本粘贴到文本输入框,再点击上面的运行即可。
    运行js
  2. 浏览器安装一个名为Violentmonkey暴力猴的脚本插件。安装完成之后,进入问卷页面,点击 violentmonkey 的图标,会出现一个弹框,
    violentmonkey
    再点击其中的+,会出现编辑脚本的页面。
    edit
    将脚本粘贴进去,保存文件,再回到问卷页面刷新,此时脚本即可自动运行。
脚本编写思路
  1. 主体思路,找到所有class="div_question"的 div,再遍历div,分析每个 div 是什么类型的题目,再选择对应的操作。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    function Traverse(params) {
    var title_list = document.getElementsByClassName("div_question");
    for (let i = 0; i < title_list.length; i++) {
    const title = title_list[i];
    var lies = title.getElementsByTagName("li");
    var textarea = title.getElementsByTagName("textarea");
    var lis = [];
    // 将lies放在数组里
    for (var kl = 0; kl < lies.length; kl++) {
    lis.push(lies[kl]);
    }

    // 如果是选择,那么执行以下操作
    if (lis.length > 0) {
    // 如果是多选
    if (lis[0].getElementsByClassName('jqCheckbox').length > 0) {
    multiple_selection(lis);
    }
    // 如果是单选
    else {
    single_selection(lis);
    }
    }
    // 如果是填空题,那么调用对应的处理函数。
    else if (textarea.length > 0) {
    blanks(title, textarea);
    }
    else {
    // 如果是其它,添加相应的操作.....
    console.log("other");
    }
    }
    }
  2. 单选和多选采用随机数算法

    • 单选题,直接生成一个随机数,再点击随机数的选项。
    1
    2
    3
    4
    5
    // 处理单选
    function single_selection(lis) {
    var random_0 = random_num(lis.length);
    lis[random_0].getElementsByClassName('jqRadio')[0].click();
    }
    • 多选题,先随机生成一个要选的选项数,再用一个 for 循环执行。循环里面再生成随机数,接着去点击随机数对应的选项。
      在随机的情况下,有可能会重复点击选项,导致没有选项选上,这时就需要检测一下有没有选项被选上了,如果没有,那就手动选一个。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // 处理多选
    function multiple_selection(lis) {
    // 获取随机数
    var random_0 = random_num(lis.length);
    for (let i = 0; i <= random_0; i++) {
    var random_1 = random_num(lis.length);
    lis[random_1].getElementsByClassName('jqCheckbox')[0].click();
    }

    // 如果选中的全部抵消了,那么就手动加上一个
    var flag = false;
    for (let i = 0; i < lis.length; i++) {
    const element = lis[i].getElementsByClassName("jqChecked");
    if (element.length > 0)
    flag = true
    }
    if (!flag) {
    lis[random_0].getElementsByClassName('jqCheckbox')[0].click();
    }
    }
  3. 填空题的内容从配置文件里找出,也采用随机填写。
    先获取题目的 id,然后从config中找到对应的值,再随机选取一个值将其赋值到文本框里。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // 填空
    function blanks(title, textarea) {
    // 获取当前题目的id
    var id_text = title.getAttribute("id");
    var re_id = /div(\d+)/;
    var id = re_id.exec(id_text)[1]
    // 遍历config里id值为id的answer
    for (var j = 0; j < config.length; j++) {
    if (id == config[j].id) {
    textarea[0].innerHTML = config[j].answer[random_num(config[j].answer.length)];
    }
    }
    }
  4. 重定向到 PC 版网页。
    由于问卷星手机版的网页与 PC 版相差无几,因此使用正则表达式修改即可。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // 将手机版网页转为PC版
    function redirect(url) {
    try {
    var re = /(https:\/\/www\.wjx\.cn\/)(m|jq)(.*)g/
    var obj = re.exec(url);
    if (obj[2] == 'm') {
    console.log("redirect now");
    window.location.href = obj[1] + "jq" + obj[3];
    }
    else {
    console.log("do......");
    }
    } catch (error) {

    }
    }
    1. 由于填写完成并提交后会跳转到一个抽奖页面,此时的网址含有问卷页面的 id,因此可以将其抽取出来,重定向到问卷填写页面。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // 完成填写重新打开填写界面
    function new_wxj() {
    var url = window.location.href;
    //https://www.wjx.cn/wjx/join/complete.aspx?q=83481770&JoinID=106588372552&jidx=1&s=&njqj=1
    var re = /complete\.aspx\?q=(\d+)/;
    var obj = re.exec(url);
    if (obj) {
    window.location.href = "https://www.wjx.cn/jq/" + obj[1] + ".aspx";
    }
    else {
    console.log("no pat", obj);
    }
    }

完整代码在此
欢迎访问我的博客网站

IDM 是什么?

Internet Download Manager(简称 IDM)是一个用于 Windows 系统的下载管理器。
IDM 可以让用户自动下载某些类型的文件,可将文件划分为多个下载点以更快下载,并列出最近的下载,方便存取文件。相对于其他下载管理器,具有独特的动态档案分割技术。
其优点在于,能分析下载地址中的实际地址,但若地址无效时则跳换成失效网页,当地址重新有效而无法恢复成原来的地址。
而缺点在于,必须设置分段的临时文件存放的磁盘位置,下载完成后再自动合并成一个完整的文件,同时删除临时文件(这种做法不同于其他下载软件预先分配一整块磁盘空间)。所以,下载的如果是机密文件,就容易被数据恢复软件恢复,造成安全隐患。
– 摘自维基百科

通俗来讲就是一个优秀的下载工具。

为什么使用 IDM

因为 IDM 使用的是多线程下载,所以比浏览器自带的下载要快很多。
并且 IDM 其它的功能:

  • 下载百度网盘;
  • 下载 BIliBili、Youtube 等主流视频网站以及几乎所有的盗版视频网站的视频。
  • 下载文件自动分类

安装使用

  1. 这是个收费软件,可以去官网购买下载。
  2. 也可使用绿色版:
    网盘地址
    提取码:jinl
    • 下载上述文件后,提取到一个纯英文目录(养好安装文件都放在纯英文目录的习惯)。
    • 打开其文件目录,点击绿化.bat文件。// 不执行这一步的话浏览器无法调用 IDM 下载

推荐配置

  • 常规
    image
  • 连接
    把最大连接数改为 32(虽然一般不会用到这么多)。
  • 代理服务器
    如果你的电脑已经挂了代理,并希望下载 Youtube 等网站的东西,可选择切换为使用系统代理
  • 其它的保持默认即可。

配置浏览器

  • Firefox:打开浏览器$\rightarrow$打开 Firefox 附加组件$\rightarrow$搜索 idm$\rightarrow$点进第一个搜索结果安装。
  • Chrome:打开浏览器$\rightarrow$打开 Chrome 网上应用$\rightarrow$搜索 idm$\rightarrow$点进第一个搜索结果安装。
    Chrome 需要额外配置:右上三点$\rightarrow$更多工具$\rightarrow$扩展$\rightarrow$IDM Integration Module$\rightarrow$详细信息$\rightarrow$打开允许访问文件网址。
  • 其它浏览器:同上

配置好浏览器后,以后下载文件就是自动调用 IDM 下载了。

下载视频

当浏览器开打含有视频播放的网页时,视视屏框的右上角会出现一个悬浮条,直接点击下载即可。

注意:

  1. 下载优酷的官方上传的版权视频时,会下载到一个无法解析的.ts 文件。
  2. 当 B 站的使用 HTML5 播放器时,下载的 B 站视频没有声音,此时使用 Flash 播放器即可。Flash 就要淘汰了怎么办?可以在 Chrome 浏览下载一款名为“B 站下载助手”的插件。

下载百度网盘的文件

  1. 首先下载插件网盘助手
    这个插件可以直接生成直链,而 IDM 需要直链才能下载。除此之外,此插件还有很多功能,如自动填充提取码等,就不一一赘述了。
  2. 要下载网盘里的文件,首先需要将文件保存在自己的网盘里。在要下载的文件前打上勾,这时上方就会出现生成链接的选项$\downarrow$。
    生成链接
  3. 点击后会出现下载直链$\downarrow$
    直链
  4. 右键该链接,选择 IDM 下载。
    idm

注意:如果出现 403、401 等错误,可以点击修改步骤三的里的应用 ID,一般改为778750即可。


以上就是全部内容,欢迎访问个人博客

使用Jmeter测试网页的性能

  1. 打开Jmeter

  2. 添加测试线程组
    右键 Test Plan $\rightarrow$ Add $\rightarrow$ Threads(Users) $\rightarrow$ Thread Group

    添加测试线程组

  3. 添加Http请求
    右键Thread Group $\rightarrow$ Add $\rightarrow$ Samper $\rightarrow$ HTTP Request

    添加http request

    结果:
    result

  4. 添加观察树
    右键 Test Plan $\rightarrow$ Add $\rightarrow$ Listener $\rightarrow$ View Result Tree
    观察树

  5. 测试
    点击HTTP Request,在path项输入一个网址,例如 https://www.zhihu.com/ ,然后点击run
    然后点击View Result Tree,就会出现以下结果:

  6. 集合点
    右键Thread Group $\rightarrow$ Add $\rightarrow$ Timer $\rightarrow$ Synchronizing Timer
    第一个变量代表的是线程数量。
    第二个变量代表的是结束的时间,当时间达到一个段后,所有的线程都会被释放。

Thread Group变量

  1. Number of Thread(users): 指模拟的用户数。
    例子:如果要模拟一百个人,那么输入一百即可。
  2. Ramp-Up Period(in seconds):虚拟用户增长时长。
    例子:测试一个考勤系统,登录的时候不是所有人一起登陆,而是有一个时间点是大家一起登陆的。比如是八点到九点这一段时间登录的,时长就是3600秒。但不需要设置这么大的数
  3. Loop Count:一个虚拟用户所需要做的测试数。如果把Infinite勾上的话,那么运行的时候是永不停止的,除非手动强制停止。