Imjunjie

蜻蜓雨荷


  • 首页

  • 标签

  • 分类

  • 归档

  • 搜索

自己做腾讯视频真实地址解析分析

发表于 2019-03-03 | 分类于 电脑 , 视频解析
本文字数: 9.3k | 阅读时长 ≈ 8 分钟

我觉得网上的一些资料大多是直接给出处理的结果,而不注重分析过程,对我们程序员来说,其过程更重要,工作中碰到的问题是多种多样的,不可能每个碰到的问题都能从网上直接找到答案,我也觉得作为程序员直接去找答案的做法本身有问题.应该提高主动去分析解决问题的能力.下面是对这类问题的一个相对通用的分析方法.

URL分析

http://v.qq.com/cover/g/g9jgclyhpp5sp7p.html?vid=g00118pmaso

打开这个url的页面源码,找到下面这些内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var COVER_INFO = {
title :"独家首发",
id :"g9jgclyhpp5sp7p",
isPrev :false,
pic :"http://i.gtimg.cn/qqlive/img/jpgcache/files/qqvideo/g/g9jgclyhpp5sp7p_h.jpg",
typeid:22,
videoReName :false,
sourceid:0,
isEurope:false,
useTextVideoList:false,
columnid:0,
hasRecommend:true,
specialTemp:false,
varietyDate:"",
copyright:5
};

在源码中搜索g9jgclyhpp5sp7p字符串,从其出现的位置基本可以判断这个字符串唯一代表了一个合集(或者叫专辑). 不管它有没有用,先大概看一下,把URL中觉得有用的东西过一遍.

腾讯视频播放地址的url有几种模式,上面是其中一种,其它的几种模式对解析其地址没什么太大关系,这里就以这种为例了.这个url中最关键的就是最后面接的一个参数vid(videoID)=g00118pmaso.

抓包

这里首先要说一点,平时做web应用或者后台接口,要有习惯去抓包,并且对抓到的包进行一些简单的分析,这是一个很好的习惯,有时候会学到一些意想不到的东西.

最简单的抓包方式就是直接用浏览器自带的工具了,我平时用的chrome,F12 - Network中就有当前页面发送出去的http报文,另外还有个小技巧,因为浏览器会有缓存,按Ctrl+F5刷新页面,就会强制从服务端获取内容而不用缓存,有时候需要这样做,具体的原理可以去看看http协议中的Cache-Control头部. 用浏览器抓包还有个不太方便的地方,当页面跳转时,前面抓的包就没有了,抓的永远是当前页面相关的报文.所以我平时用的比较多的是fiddler,一个免费的抓包工具,非常方便.

回到正题, 我们从浏览器输入链接http://v.qq.com/cover/g/g9jgclyhpp5sp7p.html?vid=g00118pmaso, 抓到了很多http包,我这里给出一部分的截图

标出来的部分请求是关键请求, 我自己在分析的时候,是从下往上分析的,

1)首先找到视频的下载地址

1
2
3
4
5
http://101.71.72.2/music.qqvideo.tc.qq.com/g00118pmaso.p309.1.mp4?sdtfrom=v10&type=mp4

&vkey=95C006D54AA7217B859B15732EE04FB88B3986D36E53116ECAF1CFD43EE6615BA6AD5DDDF8CC3D7B

&level=3&platform=1&br=351&fmt=fhd&sp=0

这里继续分析url,g00118pmaso上面讲到了,是vid,但是后面多出了.p309.1. 继续往下看sdtfrom=v10(未知),type=mp4,这个好理解,vkey=95C006D54AA7217B859B15732EE04FB88B3986D36E53116ECAF1CFD43EE6615BA6AD5DDDF8CC3D7B,这个看起来又像是一个比较关键的参数,

  • level=3(后面xml中对应的level),
  • platform=1(平台,web、client、iphone…?暂时也是未知),
  • br=351(bitrate=351?大概是码率的意思,后面xml中的br=351),
  • fmt=fhd(大概意思是format=flvHD?实际上这里是后面id为10309对应的format name),
  • sp=0(后面xml中对应的sp).

这里有一大堆的参数,有很多都是未知,这个时候别慌,整个链接直接下载肯定是可以下载到视频的,现在要做的是,去掉其中一些参数,看是否能下载.

1
http://101.71.72.2/music.qqvideo.tc.qq.com/g00118pmaso.p309.1.mp4?type=mp4&vkey=95C006D54AA7217B859B15732EE04FB88B3986D36E53116ECAF1CFD43EE6615BA6AD5DDDF8CC3D7B&br=351&fmt=fhd

最后发现,保留这些参数,能正常下载到视频。所以其它参数暂时先别管。这里有几个关键的地方,vkey从哪里来的?br和fmt从那里获取?vid后面的p309.1哪里来的?还有就是ip地址来源未知。分析到这里,继续往上找到另一个比较关键的请求。

http://vv.video.qq.com/getkey

分析玩上面的视频地址链接的组成,很容易就找到了这个请求,getkey。它是一个post请求,查看其发送的参数format=10309&otype=xml&vt=210&vid=g00118pmaso&ran=0%2E9477521511726081&charge=0&filename=g00118pmaso%2Ep309%2E1%2Emp4&platform=11

http response中的内容如下:

1
2
<?xml version="1.0" encoding="utf-8"  standalone="no" ?>
<root><br>360602.1875</br><ct>604800</ct><key>95C006D54AA7217B859B15732EE04FB88B3986D36E53116ECAF1CFD43EE6615BA6AD5DDDF8CC3D7B</key><level>3</level><levelvalid>1</levelvalid><s>o</s><sp>0</sp><sr>0</sr></root>

在这里我们找到了key,同时还发现了和上面链接对应的level和sp两个参数,上面一个链接中的一个参数,不过这个参数也非必要,暂时不管。

1
2
3
4
5
URLDecode后为:

format=10309(这里实际上是后面的format id)&otype=xml&vt=210&vid=g00118pmaso

&ran=0.9477521511726081&charge=0&filename=g00118pmaso.p309.1.mp4&platform=11

同样,在代码中试,看那几个参数是必要的,经试验,发现format,type,vid,filename是必要的。

继续网上分析第三个url,http://vv.video.qq.com/getinfo

也是一个POST请求,参数是:

1
2
otype=xml&pid=2FAF2F6427123207101EBDA3F1523310A76216BD&
platform=11&vids=g00118pmaso&charge=0&speed=1246&ran=0.8439321480691433

返回的结果如下:

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<?xml version="1.0" encoding="utf-8"  standalone="no" ?>
<root>
<fl>
<cnt>5</cnt>
<fi>
<br>64</br>
<id>1</id>
<name>flv</name>
<sl>0</sl>
</fi>
<fi>
<br>550</br>
<id>10301</id>
<name>shd</name>
<sl>0</sl>
</fi>
<fi>
<br>230</br>
<id>10302</id>
<name>hd</name>
<sl>0</sl>
</fi>
<fi>
<br>64</br>
<id>10303</id>
<name>sd</name>
<sl>0</sl>
</fi>
<fi>
<br>900</br>
<id>10309</id>
<name>fhd</name>
<sl>1</sl>
</fi>
</fl>
<hs>0</hs>
<ls>0</ls>
<preview>276</preview>
<s>o</s>
<tm>1361366724</tm>
<vl>
<cnt>1</cnt>
<vi>
<br>351</br>
<ch>0</ch>
<cl>
<ci>
<cd>276.480011</cd>
<cmd5>beace783957b52f460006604229b57cf</cmd5>
<cs>99699295</cs>
<idx>1</idx>
<keyid>g00118pmaso.10309.1</keyid>
</ci>
<fc>1</fc>
</cl>
<fmd5>4ebecd94d64f46666d4e43826c120b5f</fmd5>
<fn>g00118pmaso.p309.mp4</fn>
<fs>99699378</fs>
<fst>5</fst>
<lnk>g00118pmaso</lnk>
<logo>1</logo>
<pl>
<cnt>2</cnt>
<pd>
<c>10</c>
<cd>2</cd>
<fmt>40001</fmt>
<fn>q1</fn>
<h>45</h>
<r>10</r>
<url>http://video.qpic.cn/video_caps/0/</url>
<w>80</w>
</pd>
<pd>
<c>5</c>
<cd>2</cd>
<fmt>40002</fmt>
<fn>q2</fn>
<h>90</h>
<r>5</r>
<url>http://video.qpic.cn/video_caps/0/</url>
<w>160</w>
</pd>
</pl>
<share>1</share>
<st>2</st>
<td>276.48</td>
<ti>因你而在</ti>
<type>3585</type>
<ul>
<ui>
<dt>2</dt>
<dtc>10</dtc>
<url>http://101.71.72.2/music.qqvideo.tc.qq.com/</url>
<vt>210</vt>
</ui>
<ui>
<dt>2</dt>
<dtc>10</dtc>
<url>http://113.207.98.27/music.qqvideo.tc.qq.com/</url>
<vt>210</vt>
</ui>
<ui>
<dt>2</dt>
<dtc>10</dtc>
<url>http://video.store.qq.com/</url>
<vt>0</vt>
</ui>
</ul>
<vh>1080</vh>
<vid>g00118pmaso</vid>
<videotype>0</videotype>
<vw>1920</vw>
</vi>
</vl>
</root>

看到这个后,比较兴奋,想要的东西基本上在这里可以找到了。再回过来分析一下这个请求所带的参数

1
2
3
otype=xml&pid=2FAF2F6427123207101EBDA3F1523310A76216BD

&platform=11&vids=g00118pmaso&charge=0&speed=1246&ran=0.8439321480691433

  • otype返回格式,
  • pid看起来又像是个比较重要的参数(未知),
  • platform(上面是1,这里又来了个11,不明白),
  • vid和上面一样,charge(应该是付费信息,0表示不付费,来源未知),speed(未知),ran和上面一样应该是个0-1之间的随机数。
    用httpclient模仿这个请求,令人兴奋的是只需要vids和otype就能返回该xml(不需要再去找pid了)。

再整理一下:

1.先通过http://vv.video.qq.com/getinfo POST请求添加参数otype,vid就能获得上面的xml。

2.根据这个xml中的内容发送http://vv.video.qq.com/getkey POST请求,参数列表为format,type,vid,filename。

其中format的id和name有个对应关系,10309-fhd、10303-sd、10302-hd。这里填写的为id。例如:format=10309

filename由几部分组成g00118pmaso.p309.1.mp4 最前面一部分是vid,如果格式id为10309,则后面加上p309.1,最后是格式mp4。例如我我要下载格式id为10303的视频,那拼出来应该是g00118pmaso.p303.1.mp4。

type为xml,vid为每个视频唯一的id,这里是g00118pmaso。

3.根据以上信息拼接视频的真实地址

首先是xml中的地址http://101.71.72.2/music.qqvideo.tc.qq.com

紧跟着拼上filename,这里例如g00118pmaso.p309.1.mp4、g00118pmaso.p303.1.mp4、g00118pmaso.p302.1.mp4、g00118pmaso.p301.1.mp4。注意filename要和vkey一一对应,不能用p309的key和g00118pmaso.p303.1.mp4拼接。

然后就是vkey,根据filename获得的vkey进行拼接。

接着type=mp4,fmt和format id对应,例如10309对应的是fhd。

对于format id为10309的视频,最后拼出来的结果是

1
http://101.71.72.2/music.qqvideo.tc.qq.com/g00118pmaso.p309.1.mp4?type=mp4&vkey=95C006D54AA7217B859B15732EE04FB88B3986D36E53116ECAF1CFD43EE6615BA6AD5DDDF8CC3D7B&fmt=fhd

注意这里把一些不必要的参数去掉了。

4.若通过抓包的方式无法分析出来真实地址,则需要反编译swf,找到拼接视频地址的代码,还原其过程。

腾讯的视频地址分析还算顺利,因为不需要反编译swf

参考文献

  • 自己做腾讯视频真实地址解析分析_20130225
------------------------ The End ------------------------

安卓逆向分析笔记---001

发表于 2019-03-03 | 分类于 Android , 安卓逆向分析
本文字数: 1.2k | 阅读时长 ≈ 1 分钟

第一次使用电脑修改APK,新人上路,很基础,不要喷我~

【所需工具】Androidkiller

【用例下载链接】链接:https://pan.baidu.com/s/1E9W77vA3wn-u8zqsTeRW4g 提取码:zfw4

【开始操作】

先将APK拖到AndroidKiller里面进行反编译,过一会儿之后,反编译成功,点击左侧“工程管理器”,如下图

用手机打开APP,看到直接进入登录页面,根据以往修改经验说明,登录页在第一启动类里,所以我双击打开AndroidManifest.xml,查看包名还有“application”下面的第一个“activity”,如下图

看到“package=”com.mycompany.myapp””和第一个“activity”的“android:name=”.RD””,通过分析就可以知道第一启动类的路径为“smali/com/mycompany/myapp/RD.smali”,打开smali文件夹,根据上述路径找到RD.smali,双击打开,如下图

直接看smali代码头疼,点击上方工具栏里面的查看Java源码,出现Java查看页面,如下图

我放大页面看,如图

可以看到“onBtButtonClick”的方法,if判断后弹出提示“失败”和“成功”,我打开smali页面找到同样的位置,如下图

一张图截不下

  • 【修改方法一】
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.line 80
const-string v0, "1"

const-string v1, "1"

if-ne v0, v1, :cond_0
````

修改为:
```` bash
.line 80
const-string v0, "0"

const-string v1, "1"

if-ne v0, v1, :cond_0
  • 【修改方法二】
    1
    2
    3
    4
    5
    6
    .line 80
    const-string v0, "1"

    const-string v1, "1"

    if-ne v0, v1, :cond_0

修改为:

1
2
3
4
5
6
.line 80
const-string v0, "1"

const-string v1, "1"

if-eq v0, v1, :cond_0

  • 【修改方法三】(需要Unicode工具)
    修改文字显示,不推荐使用这种修改方法,治标不治本。

改完后闪退,可能是手机安卓版本太高吧!
没有测试成,很遗憾!

疑问:你的方法一改的和没改的一样啊
回答:是那个上面两个1,改成一个1和一个0,当时写草稿纸上复制粘贴也没看清楚


安卓逆向分析笔记—-001
https://www.52pojie.cn/thread-884957-1-1.html
(出处: 吾爱破解论坛)

------------------------ The End ------------------------

Windows 10文件资源管理器中删除快速访问

发表于 2019-03-03 | 分类于 电脑 , 常见故障
本文字数: 337 | 阅读时长 ≈ 1 分钟

建议备份好您的注册表。要在Windows 10文件资源管理器中删除快速访问,

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer]
“HubMode”=dword:00000001

万一又想折腾回去,请打开注册表编辑器,然后将HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows CurrentVersion Explorer \

右键单击HubMode并选择“删除”。


Windows 10文件资源管理器中删除快速访问
https://www.52pojie.cn/thread-884830-1-1.html
(出处: 吾爱破解论坛)

------------------------ The End ------------------------

PC监控小工具

发表于 2019-03-03 | 分类于 电脑 , 软件
本文字数: 245 | 阅读时长 ≈ 1 分钟

我一直喜欢用的监控软件分享

先下载用来加载工具的应用
Gadgets Revived: https://gadgetsrevived.com/download-sidebar/

小工具官网: http://addgadgets.com

链接: https://pan.baidu.com/s/1AjmHPJPzQmBgdcx7HSSGRA 提取码: 1kss


PC监控小工具
https://www.52pojie.cn/thread-884752-1-1.html
(出处: 吾爱破解论坛)

------------------------ The End ------------------------

IDM可以直接捕捉、下载各种格式的网页在线视频

发表于 2019-03-03 | 分类于 Idm
本文字数: 1.3k | 阅读时长 ≈ 1 分钟

本人亲测、实力见证!新版 IDM不仅可以全速、无死角下载百度云里的一切资源,还可以下载网络上各种敏感、限制级的资源,最重要的是可以直接嗅探、捕捉、下载各种格式的网页在线视频!包括 m3u8 代码形式的在线视频,而不需要使用下载速度比较慢且不能批量下载的m3u8 downloader了。

完全可以代替迅雷、百度网盘实现满速、全速下载。真正做到所见即所得!(划重点)

STEP 1→如何安装?

1.下载新版IDM文件夹,先运行软件安装程序:IDM v6.xx.x.exe,安装完成后关闭注册提醒对话框。(新版IDM下载链接在文末)

2.运行压缩包 Crack.zip 中的 IDM_6.2x_Crack.exe 进行破解,破解完成。

3.全部过程完成,您需要重启一下电脑,再打开 IDM.,点击菜单—>关于 IDM,确认一下是否破解成功。

STEP 2→必要插件?

1.在浏览器装tampermonkey(油猴)插件,本人用360浏览器,浏览器收藏栏右上角有个:扩展—>扩展中心—>直接在搜索应用名称中输入tampermonkey,点击安装即可。

2.在浏览器中安装脚本,打开https://greasyfork.org/zh-CN/scripts,安装“百度网盘直接下载助手 直链加速版”脚本。

3.在浏览器装IDM插件:扩展—>扩展中心—>直接在搜索应用名称中输入IDM,点击安装即可。

4.安装完成后重启浏览器。

STEP 3→如何使用?

1.下载百度云资源:打开IDM,打开一个需要下载的文件,在页面的上部就会出现一个“下载助手”的按钮,点击按钮会出现:下载、显示链接、批量链接等选项,点击下载,IDM会自动嗅探到资源,弹出一个下载文件信息框,点击开始下载,享受全速下载的乐趣吧!

2.下载网页在线视频:打开一个需要下载的在线视频,点击播放,IDM会自动嗅探到资源,同时在播放框的右上角会出现如下按钮:,点击下载该视频,弹出一个下载文件信息框,点击开始下载,享受全速下载的乐趣吧!

STEP 4→什么是IDM?

IDM 全名Internet Download Manager 是一款国外的多线程下载神器(简称IDM)Internet Download Manager 支持多媒体下载、自动捕获链接、自动识别文件名、静默下载、批量下载、计划下载任务、站点抓取、队列等等是一款国外的老牌下载工具。
互联网下载管理器 (IDM)是一种提高下载速度5倍,恢复和下载时间表的工具。全面的错误恢复和恢复功能将重新启动由于连接丢失,网络问题,计算机关机或意外断电而导致的下载或中断下载。简单的图形用户界面,使IDM用户友好,易于使用。下载管理器有一个智能下载逻辑加速器,具有智能动态文件分割和安全的多部分下载技术,加快您的下载。与其他下载管理器和加速器不同,Internet Download Manager在下载过程中动态地分段下载文件,并重复使用可用的连接,无需额外的连接和登录阶段即可实现最佳加速性能。

下载地址

链接: https://pan.baidu.com/s/1m89whBLzvYoc7uZS6l9ZBQ 提取码: qcjp

------------------------ The End ------------------------

hexo博文加密

发表于 2019-03-02
本文字数: 11k | 阅读时长 ≈ 10 分钟

介绍一种给博客文章加密的方法。

很多时候当我们写了一篇博客,但并不想所有人能够访问它。对于WordPress这很容易做到,但是对于hexo,由于是静态网页,并不能做到完全的加密。

在GitHub上发现了有个人做了一个加密的插件,还挺好用,推荐给大家。

安装

在你的hexo根目录的package.json文件夹中添加:

1
“hexo-blog-encrypt”: “2.0.*”

然后在命令行中输入:

1
npm install

这样这个插件就安装好了。

找到根目录下的_config.yml文件,添加如下:

1
2
3
4
# Security
##
encrypt:
enable: true

这样就可以使用插件了。

使用

在你要加密的文章头部写入password,例如:

1
2
3
4
5
6
7
---
title: Hello World
date: 2016-03-30 21:18:02
password: abc123
abstract: Welcome to my blog, enter password to read.
message: Welcome to my blog, enter password to read.
---

这样就可以需要输入密码访问了。

Bugs

  • 对于hexo-blog-encrypt2.0之前的版本,无法触发渲染mathjax的函数,需要进行升级。
  • 如果想对TOC进行加密,以next主题为例,将next/layout/_macro/sidebar.swig的文件替换为:
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    {% macro render(is_post) %}
    <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
    <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
    <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
    <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
    </div>

    <aside id="sidebar" class="sidebar">
    <div class="sidebar-inner">

    {% set display_toc = is_post and theme.toc.enable %}
    {% if page.encrypt == true %}
    {% if display_toc and toc(page.origin).length > 1 %}
    <ul class="sidebar-nav motion-element">
    <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap" >
    {{ __('sidebar.toc') }}
    </li>
    <li class="sidebar-nav-overview" data-target="site-overview">
    {{ __('sidebar.overview') }}
    </li>
    </ul>
    {% endif %}
    {% else %}
    {% if display_toc and toc(page.content).length > 1 %}
    <ul class="sidebar-nav motion-element">
    <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap" >
    {{ __('sidebar.toc') }}
    </li>
    <li class="sidebar-nav-overview" data-target="site-overview">
    {{ __('sidebar.overview') }}
    </li>
    </ul>
    {% endif %}
    {% endif %}



    <section class="site-overview sidebar-panel{% if not display_toc or toc(page.content).length <= 1 %} sidebar-panel-active{% endif %}">
    <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <img class="site-author-image" itemprop="image"
    src="{{ url_for( theme.avatar | default(theme.images + '/avatar.gif') ) }}"
    alt="{{ theme.author }}" />
    <p class="site-author-name" itemprop="name">{{ theme.author }}</p>
    {% if theme.seo %}
    <p class="site-description motion-element" itemprop="description">{{ theme.signature }}</p>
    {% else %}
    <p class="site-description motion-element" itemprop="description">{{ theme.description }}</p>
    {% endif %}
    </div>
    <nav class="site-state motion-element">

    {% if config.archive_dir != '/' %}
    <div class="site-state-item site-state-posts">
    <a href="{{ url_for(theme.menu.archives) }}">
    <span class="site-state-item-count">{{ site.posts.length }}</span>
    <span class="site-state-item-name">{{ __('state.posts') }}</span>
    </a>
    </div>
    {% endif %}

    {% if site.categories.length > 0 %}
    {% set categoriesPageQuery = site.pages.find({type: 'categories'}, {lean: true}) %}
    {% set hasCategoriesPage = categoriesPageQuery.length > 0 %}
    <div class="site-state-item site-state-categories">
    {% if hasCategoriesPage %}<a href="{{ url_for(categoriesPageQuery[0].path) }}">{% endif %}
    <span class="site-state-item-count">{{ site.categories.length }}</span>
    <span class="site-state-item-name">{{ __('state.categories') }}</span>
    {% if hasCategoriesPage %}</a>{% endif %}
    </div>
    {% endif %}

    {% if site.tags.length > 0 %}
    {% set tagsPageQuery = site.pages.find({type: 'tags'}, {lean: true}) %}
    {% set hasTagsPage = tagsPageQuery.length > 0 %}
    <div class="site-state-item site-state-tags">
    {% if hasTagsPage %}<a href="{{ url_for(tagsPageQuery[0].path) }}">{% endif %}
    <span class="site-state-item-count">{{ site.tags.length }}</span>
    <span class="site-state-item-name">{{ __('state.tags') }}</span>
    {% if hasTagsPage %}</a>{% endif %}
    </div>
    {% endif %}

    </nav>

    {% if theme.rss %}
    <div class="feed-link motion-element">
    <a href="{{ url_for(theme.rss) }}" rel="alternate">
    <i class="fa fa-rss"></i>
    RSS
    </a>
    </div>
    {% endif %}

    <div class="links-of-author motion-element">
    {% if theme.social %}
    {% for name, link in theme.social %}
    <span class="links-of-author-item">
    <a href="{{ link }}" target="_blank" title="{{ name }}">
    {% if theme.social_icons.enable %}
    <i class="fa fa-fw fa-{{ theme.social_icons[name] | default('globe') | lower }}"></i>
    {% endif %}
    {{ name }}
    </a>
    </span>
    {% endfor %}
    {% endif %}
    </div>

    {% set cc = {'by': 1, 'by-nc': 1, 'by-nc-nd': 1, 'by-nc-sa': 1, 'by-nd': 1, 'by-sa': 1, 'zero': 1} %}
    {% if theme.creative_commons in cc %}
    <div class="cc-license motion-element" itemprop="license">
    <a href="https://creativecommons.org/{% if theme.creative_commons === 'zero' %}publicdomain/zero/1.0{% else %}licenses/{{ theme.creative_commons }}/4.0{% endif %}/" class="cc-opacity" target="_blank">
    <img src="{{ url_for(theme.images) }}/cc-{{ theme.creative_commons }}.svg" alt="Creative Commons" />
    </a>
    </div>
    {% endif %}

    {# Blogroll #}
    {% if theme.links %}
    <div class="links-of-blogroll motion-element {{ "links-of-blogroll-" + theme.links_layout | default('inline') }}">
    <div class="links-of-blogroll-title">
    <i class="fa fa-fw fa-{{ theme.links_icon | default('globe') | lower }}"></i>
    {{ theme.links_title }}
    </div>
    <ul class="links-of-blogroll-list">
    {% for name, link in theme.links %}
    <li class="links-of-blogroll-item">
    <a href="{{ link }}" title="{{ name }}" target="_blank">{{ name }}</a>
    </li>
    {% endfor %}
    </ul>
    </div>
    {% endif %}

    {% include '../_custom/sidebar.swig' %}

    </section>
    {% if page.encrypt == true %}
    {% if display_toc and toc(page.origin).length > 1 %}
    <!--noindex-->
    <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
    <div class="post-toc">

    {% if page.toc_number === undefined %}
    {% set toc = toc(page.origin, { "class": "nav", list_number: theme.toc.number }) %}
    {% else %}
    {% set toc = toc(page.origin, { "class": "nav", list_number: page.toc_number }) %}
    {% endif %}

    {% if toc.length <= 1 %}
    <p class="post-toc-empty">{{ __('post.toc_empty') }}</p>
    {% else %}
    <div class="post-toc-content">{{ toc }}</div>
    {% endif %}

    </div>
    </section>
    <!--/noindex-->
    {% endif %}
    {% else %}
    {% if display_toc and toc(page.content).length > 1 %}
    <!--noindex-->
    <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
    <div class="post-toc">

    {% if page.toc_number === undefined %}
    {% set toc = toc(page.content, { "class": "nav", list_number: theme.toc.number }) %}
    {% else %}
    {% set toc = toc(page.content, { "class": "nav", list_number: page.toc_number }) %}
    {% endif %}

    {% if toc.length <= 1 %}
    <p class="post-toc-empty">{{ __('post.toc_empty') }}</p>
    {% else %}
    <div class="post-toc-content">{{ toc }}</div>
    {% endif %}

    </div>
    </section>
    <!--/noindex-->
    {% endif %}
    {% endif %}

    {% if theme.sidebar.b2t %}
    <div class="back-to-top">
    <i class="fa fa-arrow-up"></i>
    {% if theme.sidebar.scrollpercent %}
    <span id="scrollpercent"><span>0</span>%</span>
    {% endif %}
    </div>
    {% endif %}

    </div>
    </aside>
    {% endmacro %}

参考文献

  • hexo博文加密_20180721
------------------------ The End ------------------------

Latex安装教程

发表于 2019-03-02 | 分类于 LaTex
本文字数: 1.1k | 阅读时长 ≈ 1 分钟

前言

毕业论文中需要使用Ctex来写,但是之前完全没有接触过这个软件,所以就打算记录一下自己的学习过程。本来打算自己写一下相关的一些东西,但是发现大佬们已经写得特别棒了,就把一些大佬写得东西的链接写出来,希望能帮到有需要的小伙伴们。

关于LaTeX和CTeX

LaTeX是一种基于ΤΕΧ的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在20世纪80年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由TeX所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。这个系统同样适用于生成从简单的信件到完整书籍的所有其他种类的文档。

CTeX是TEX中的一个版本,CTeX 指的是CTEX 中文套装的简称。TEX 在不同的硬件和操作系统上有不同的实现版本。这就像C 语言,在不同的操作系统中有不同的编译系统,例如Linux 下的gcc,Windows 下的Visual C++等。有时,一种操作系统里也会有好几种的TEX 系统。常见的Unix/Linux 下的TEX 系统是teTEX,Windows 下则有MiKTEX 和fpTEX。CTeX 指的是CTeX 中文套装的简称,是把MiKTEX 和一些常用的相关工具,如GSview,WinEdt 等包装在一起制作的一个简易安装程序,并对其中的中文支持部分进行了配置,使得安装后马上就可以使用中文。

LaTeX官方网站:https://www.latex-project.org/

CTeX官方网站:http://www.ctex.org/HomePage

下载LaTex软件

  1. 点击TeXLive (Unix/Linux/Windows),选择”download on DVD”

  2. 选择“downloading the Tex live ISO image and burning your own DVD”

  3. 选择”downloaded form nearby CTAN mirror”

  4. 选择”texlive2018.iso”


注意:可以直接单击,如下网址进行下载http://mirrors-wan.geekpie.club/CTAN/systems/texlive/Images/

安装LaTex软件

  1. 管理员权限打开”install-tl-advanced”

  2. 选择需要安装的组件

参考文献

  1. LaTeX的下载安装及简易使用_20180515
  2. latex安装教程_20190114
------------------------ The End ------------------------

hexo文章中图片点击全屏查看

发表于 2019-03-02 | 分类于 Hexo
本文字数: 2.1k | 阅读时长 ≈ 2 分钟

hexo中实现类似于微信公众号中,点击图片方法全屏查看,再点击后回到原来的状态。

效果如下,点击下图的图片放大查看。

1
2
3
|1|2|3|
|--|--|--|
|![](http://qnfile.devzhao.com/blog/2018-10-16-155439.png)|![](http://qnfile.devzhao.com/blog/2018-10-16-155529.png)|![](http://qnfile.devzhao.com/blog/2018-10-16-155650.jpg)|

实现的效果如下:

1 2 3

1.修改 post-details.js 文件

文件目录:

1
2
3
devzhao.com/themes/next/source/js/src/post-details.js

devzhao.com是我的站点根目录。

在文件最后添加:

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
//----自定义js----------------
function createImgEventFullScreen() {
var imgs = $(".post-body").find("img");
console.log(imgs);
for(var i = 0;i < imgs.length;i++) {
// $(imgs[i]).click(createCover(imgs[i]));
imgs[i].onclick= function(e) {
var src = e.srcElement.currentSrc;
createCover(src)
}
}

function createCover (src) {
console.log(src);
var cover = $("<div id='fullScreenCover' class='zhao-cover-img-container'><img class='zhao-cover-img' src='"+src+"'/></div>");
$("#fullScreenCover").remove();
$("body").append(cover);
$("body").addClass("zhao-no-scroll");
$("#fullScreenCover").click(function(){
$("#fullScreenCover").remove();
$("body").removeClass("zhao-no-scroll");
})
}
}
setTimeout(function(){
createImgEventFullScreen();
},1000)

2.修改custom.styl文件

文件目录:

1
devzhao.com/themes/next/source/css/_custom/custom.styl

在最后添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
.zhao-cover-img-container{
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100vh;
z-index: 10002;
text-align: center;
background-color: #000;
overflow-y: scroll;
}

.zhao-cover-img{
width: 100%;
position: absolute;
top: 0;
bottom: 0;
}
.zhao-no-scroll{
width: 100%;
height: 100vh;
overflow: hidden;
}

3.修改blog-encrypt.js文件

如果你安装了hexo-blog-encrypt插件,需要做这一步。

文件目录:

1
devzhao.com/node_modules/hexo-blog-encrypt/lib/blog-encrypt.js

找到如下代码

1
$('#encrypt-blog').html(content);

在后面加上这行代码:

1
createImgEventFullScreen();

如下图:

上面代码还有些问题:

  1. 还有点小问题,比如第三个图片,电脑上打开,头顶上和底部有一些显示不全。
  2. 在微信中打开第二个图,向上滑的时候,底下的层会跟着滑动(好像在微信里面,禁用滑动,没生效),手机Safari中也没有生效

参考文献

  • hexo文章中图片点击全屏查看
------------------------ The End ------------------------

Hexo 添加背景图片并自适应

发表于 2019-03-02 | 分类于 Hexo
本文字数: 518 | 阅读时长 ≈ 1 分钟

修改过程

  1. 在站点配置文件夹source/images/放入你的背景图片

  2. 然后修改主题文件夹themes/source/css/_custom/custom.styl
    PS: 这个文件是存放用户自定义css样式的
    在custom.styl开头加入如下的代码

    body {
     background:url(/images/background.jpg);
     background-repeat: no-repeat;
     background-attachment:fixed;
     background-position:50% 50%;
     background-size: cover;
     -webkit-background-size: cover;
     -o-background-size: cover;
     -moz-background-size: cover;
     -ms-background-size: cover;
    
     /*这是设置底部文字, 看个人需要修改*/
      #footer > div > div {
         color:#eee;
     }
    }
    

参考文献

  • Hexo 添加背景图片并自适应_20181231
------------------------ The End ------------------------

hexo里面Markdown对图片进行居中、设置大小

发表于 2019-03-02 | 分类于 Hexo
本文字数: 1.3k | 阅读时长 ≈ 1 分钟

标准的markdown中提供了图片的设置大小的操作,但是在本地把图片编辑好的代码生成静态文件发现图片不能显示了。

以后的hexo版本希望能够解决这个问题。

一般的markdown语法设置图片大小

标准的markdown,在图片后面加上 “=200x300” (200是宽度,300是高度,也可以之定义宽度),就能实现下面的效果。但是此版本的hexo不行。

1
![](https://mir-s3-cdn-cf.behance.net/project_modules/max_1200/36aa3462013499.5b14f258e6347.jpg  =200x300)

图片的宽度和高度同时修改:

1
<img width=80%  src="http://qnfile.devzhao.com/blog/2018-10-22-120649.png" >


1
<img width=500  src="http://qnfile.devzhao.com/blog/2018-10-22-120649.png" >

使用img标签,设置图片大小

直接在markdown中使用HTML标签,多数markdown工具都支持。

1
<img width=200 src="http://qnfile.devzhao.com/blog/2018-10-22-jhk-1540210533410.jpeg" >

当然简单学习一下html和css,你能做出更好的效果。

图片居中

markdown目前没有支持图片居中的,所有的图片要么是100%宽度,支持设置大小的markdown一般也是左对齐的,所以居中只能靠HTML标签了。

1
2
3
<div align=center>
![](http://qnfile.devzhao.com/blog/2018-10-22-jhk-1540210533410.jpeg =200x)
</div>

效果如下:

或者:

1
2
3
<div align=center>
<img width=200 src="http://qnfile.devzhao.com/blog/2018-10-22-jhk-1540210533410.jpeg" >
</div>

效果如下:


没有解决,图片的左对齐,右对齐。默认地,图片统一居中显示。

1
2
3
<div align=left>
![](http://qnfile.devzhao.com/blog/2018-10-22-jhk-1540210533410.jpeg =200x)
</div>

效果如下:

或者:

1
2
3
<div align=left>
<img width=200 src="http://qnfile.devzhao.com/blog/2018-10-22-jhk-1540210533410.jpeg" >
</div>

效果如下:

参考文献

  • hexo里面Markdown对图片进行居中、设置大小_20181022
------------------------ The End ------------------------

Hexo-Next搭建个人博客(代码块复制功能)

发表于 2019-03-02 | 分类于 Hexo
本文字数: 2.3k | 阅读时长 ≈ 2 分钟

为了提高博客代码块的用户体验,仅仅代码高亮还不行,最好还能一键复制代码。故此文将讲述Hexo NexT主题博客的代码块复制功能配置。

下载 clipboard.js

三方插件 clipboardjs ,相关介绍和兼容性我就不赘述了,去它主页或github上看。

下载地址:

  • clipboard.js
  • clipboard.min.js 推荐

保存文件clipboard.js / clipboard.min.js,目录如下:
.\themes\next\source\js\src

clipboardjs 使用

也是在.\themes\next\source\js\src目录下,创建clipboard-use.js,文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  /*页面载入完成后,创建复制按钮*/
!function (e, t, a) {
/* code */
var initCopyCode = function(){
var copyHtml = '';
copyHtml += '<button class="btn-copy" data-clipboard-snippet="">';
//fa fa-globe可以去字体库替换自己想要的图标
copyHtml += ' <i class="fa fa-clipboard"></i><span>copy</span>';
copyHtml += '</button>';
$(".highlight .code pre").before(copyHtml);
new ClipboardJS('.btn-copy', {
target: function(trigger) {
return trigger.nextElementSibling;
}
});
}
initCopyCode();
}(window, document);

在.\themes\next\source\css_custom\custom.styl样式文件中添加下面代码:

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
34
35
36
 //代码块复制按钮
.highlight{
//方便copy代码按钮(btn-copy)的定位
position: relative;
}
.btn-copy {
display: inline-block;
cursor: pointer;
background-color: #eee;
background-image: linear-gradient(#fcfcfc,#eee);
border: 1px solid #d5d5d5;
border-radius: 3px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-appearance: none;
font-size: 13px;
font-weight: 700;
line-height: 20px;
color: #333;
-webkit-transition: opacity .3s ease-in-out;
-o-transition: opacity .3s ease-in-out;
transition: opacity .3s ease-in-out;
padding: 2px 6px;
position: absolute;
right: 5px;
top: 5px;
opacity: 0;
}
.btn-copy span {
margin-left: 5px;
}
.highlight:hover .btn-copy{
opacity: 1;
}

引用

在.\themes\next\layout\_layout.swig文件中,添加引用(注:在 swig 末尾或 body 结束标签(</body>)之前添加):

1
2
3
<!-- 代码块复制功能 -->
<script type="text/javascript" src="/js/src/clipboard.min.js"></script>
<script type="text/javascript" src="/js/src/clipboard-use.js"></script>

补充

懂代码的也可以将clipboard.min.js和clipboard-use.js合并为一个文件,再在.\themes\next\layout\_layout.swig文件中使用。当然clipboard.min.js也可以直接用三方cdn的方式引入也行。

参考文献

  • Hexo-Next搭建个人博客(代码块复制功能)
------------------------ The End ------------------------

字数统计和阅读时长(网站底部/文章内)

发表于 2019-03-02
本文字数: 599 | 阅读时长 ≈ 1 分钟

字数统计和阅读时长(旧版本新版本)

插件地址: hexo-symbols-count-time

  1. 安装插件:

    1
    npm install hexo-symbols-count-time --save
  2. 修改 站点配置文件

    1
    2
    3
    4
    5
    6
    7
    symbols_count_time:
    #文章内是否显示
    symbols: true
    time: true
    # 网页底部是否显示
    total_symbols: true
    total_time: true
  3. 修改 主题配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # Post wordcount display settings
    # Dependencies: https://github.com/theme-next/hexo-symbols-count-time
    symbols_count_time:
    separated_meta: true
    #文章中的显示是否显示文字(本文字数|阅读时长)
    item_text_post: true
    #网页底部的显示是否显示文字(站点总字数|站点阅读时长)
    item_text_total: false
    # Average Word Length (chars count in word)
    awl: 4
    # Words Per Minute
    wpm: 275

参考文献

  • 字数统计和阅读时长
------------------------ The End ------------------------

在Hexo中添加LaTex公式

发表于 2019-03-02 | 分类于 Markdown
本文字数: 2.9k | 阅读时长 ≈ 3 分钟

在Hexo中渲染MathJax数学公式

在用markdown写技术文档时,免不了会碰到数学公式。常用的Markdown编辑器都会集成Mathjax,用来渲染文档中的类Latex格式书写的数学公式。基于Hexo搭建的个人博客,默认情况下渲染数学公式却会出现各种各样的问题。

代码编辑器,强烈推荐使用微软的 VS code,相比Atom开启迅速,使用方便,扩展丰富

原因

Hexo默认使用”hexo-renderer-marked”引擎渲染网页,该引擎会把一些特殊的markdown符号转换为相应的html标签,比如在markdown语法中,下划线'_'代表斜体,会被渲染引擎处理为标签。

因为类Latex格式书写的数学公式下划线'_'表示下标,有特殊的含义,如果被强制转换为标签,那么MathJax引擎在渲染数学公式的时候就会出错。例如,$x_i$在开始被渲染的时候,处理为$xi$,这样MathJax引擎就认为该公式有语法错误,因为不会渲染。

类似的语义冲突的符号还包括'*','{', '}','\'等。

解决方法

解决方案有很多,可以网上搜下,为了节省大家的时间,这里只提供亲身测试过的最靠谱的方法。

第一步: 安装Kramed

更换Hexo的markdown渲染引擎,hexo-renderer-kramed引擎是在默认的渲染引擎hexo-renderer-marked的基础上修改了一些bug,两者比较接近,也比较轻量级。

1
2
npm uninstall hexo-renderer-marked --save
npm install hexo-renderer-kramed --save

执行上面的命令即可,先卸载原来的渲染引擎,再安装新的。
安装Kramed

第二步:更改文件配置

打开/node_modules/hexo-renderer-kramed/lib/renderer.js,更改为,直接返回text:

  • 改动前:

    1
    2
    3
    4
    5
    // Change inline math rule
    function formatText(text) {
    // Fit kramed's rule: $$ + \1 + $$
    return text.replace(/`\$(.*?)\$`/g, '$$$$$1$$$$');
    }
  • 改动后:

    1
    2
    3
    4
    // Change inline math rule
    function formatText(text) {
    return text;
    }

第三步: 停止使用 hexo-math,并安装mathjax包

卸载hexo-math

1
npm uninstall hexo-math --save

安装 hexo-renderer-mathjax 包

1
npm install hexo-renderer-mathjax --save

第四步: 更新 Mathjax 的 配置文件

打开/node_modules/hexo-renderer-mathjax/mathjax.html
如图所示更改<script>为:
即注释掉<script>代码,并把以下代码复制到对应位置

  • 更改前:

    1
    <script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML"></script>
  • 更改后:

    1
    <script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>

整体效果:

1
2
<!-- <script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML"></script>

第五步: 更改默认转义规则

因为LaTeX与markdown语法有语义冲突,所以hexo默认的转义规则会将一些字符进行转义,所以我们需要对默认的规则进行修改.
打开/node_modules\kramed\lib\rules\inline.js

  • 更改前:

    1
    escape: /^\\([\\`*{}\[\]()#$+\-.!_>])/,
  • 更改后:

    1
    escape: /^\\([`*\[\]()# +\-.!_>])/,

2.

  • 更改前:

    1
    em: /^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
  • 更改后:

    1
    em: /^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,

第六步: 开启mathjax

打开/themes/yilia主题目录下的config.yml文件
因为我用的yilia主题,所以路径是/themes/yilia

我们需要在_config.yml文件 中开启 Mathjax, 找到 mathjax 字段添加如下代码:(不同的主题配置方法略微有区别)

1
2
mathjax:
enable: true

或者

1
mathjax: true

此外,还需要,更改当前文件下math: true

  • 更改前:

    1
    2
    math:
    enable: false
  • 更改后:

    1
    2
    math:
    enable: true

需要注意的是:无论是配置文件还是博客文件,配置项跟配置参数均有有一个空格,否则会配置失败
例如:

1
2
3
mathjax: true(mathjax:空格true)
而不是
mathjax:true(mathjax:true)

写博客文件时,要开启 Mathjax选项,, 添加以下内容:

1
mathjax: true

例如:

1
2
3
4
title: 特征提取——局部特征
date: 2018-07-16 09:39:40
tags: [GitHub, Mysql]
mathjax: true

结束语

通过以上步骤,我们就可以在 hexo 中使用 Mathjax 来书写数学公式。

参考文献

  1. 使用LaTex添加公式到Hexo博客里_20180803
  2. 在Hexo中渲染MathJax数学公式_20161229
------------------------ The End ------------------------

在markdown中插入数学公式

发表于 2019-03-02 | 分类于 Markdown
本文字数: 197 | 阅读时长 ≈ 1 分钟

一些扩展的Markdown语法支持采用LaTex语法写数学公式,而在网页中使用Mathjax插件来显示数学公式。

本教程介绍如何在Markdown中书写数学公式。

插入数学公式

在Markdown中插入数学公式的语法是$数学公式$和$$数学公式$$。

行内公式是可以让公式在文中与文字或其他东西混编,不独占一行。

  • 实例
1
质能方程$E = mc^2$
  • 显示
    质能方程 $E = mc^2$
------------------------ The End ------------------------

解决Chrome浏览器中Flash Player无法播放问题

发表于 2019-03-02 | 分类于 Chrome
本文字数: 2.2k | 阅读时长 ≈ 2 分钟

问题原因:

因为Flash相对于HTML5,有着运算效率低、资源占用大、安全性不高等缺点,随着HTML5越来越普及,Adobe已宣布2020年正式停止支持Flash这项技术。

但Adobe公司为了利益最大化,从Flash Player 30开始,就与国内某公司合作,推出中国特供版Flash Player,根据特供版用户协议,Flash Player将捆绑应用、广告等推广业务,同时会获取用户信息并披露给第三方,用户不能追究数据泄漏的法律责任,相当霸王的条款。如果中国大陆用户安装的是国际版的Flash Player,那打开Flash时会提示“此Flash Player与您的地区不相容,请重新安装Flash”并拒绝播放Flash,一定要下载并安装特供版才予以正常播放(不知这是否是侵犯消费者的权益)。

解决办法:

  1. 卸载本机所有Flash Player 29.0.0.171及之后的版本,推荐使用“uninstall_flash_player”一次性搞定;

  2. 安装Flash Player 29.0.0.140
    (安装时记得断网,不然还是会自动跳转到最新版的下载地址,真是无。。。!不同浏览器安装包不同,如果网上找不到请联系KP君获取全浏览器版)

  3. 在安装最后一个界面,选择“从不检查更新”,或是在“控制面板”-“Flash Player 设备管理器”-“更新”页面,选择“从不检查更新”。

特别值得一提的是,Flash Player 29.0.0.171安装过程已取消最后一个界面,当全部更新为29.0.0.171后,“更新”页面也消失了,可理解为Flash Player 29.0.0.171屏蔽了用户对更新的选择权,不再有“从不检查更新”了,也就是可能会强制更新到特供版。

本以为这样安装完后就可以顺利使用,结果还是提示错误,差点吐血,只好再找找攻略,还好有发现:

  1. Chrome地址栏输入:chrome://version/,可以看到Flash的信息
1
Flash    32.0.0.114 C:\Users\KPlayer\AppData\Local\Google\Chrome\User Data\PepperFlash\32.0.0.114\pepflashplayer.dll
  1. 找到之前安装的29版本的pepflashplayer.dll文件,通常在:
1
C:\Windows\System32\Macromed\Flash\pepflashplayer64_29_0_0_140.dll
  1. 关闭Chrome,将pepflashplayer64_29_0_0_140.dll替换之前的pepflashplayer.dll,并重命名

  2. 重新打开Chrome,即可正常浏览Flash。

结论:

Flash Player 29.0.0.140
百度网盘下载链接:https://pan.baidu.com/s/1WKYEUemCfRP_b1KPcXohag 密码: r4i5

这或许是我们还会安装的最后一个版本!
期待早日告别Flash这项落后的技术,期待Flash Player不尊重消费者的行为早点被唾弃!

附录:

V30前最后的几个版本号
(发布日期:2018/5/8)Flash Player 29.0.0.171 (422 MB)
(发布日期:2018/4/10)Flash Player 29.0.0.140 (422 MB)
(发布日期:2018/3/13)Flash Player 29.0.0.113 (405 MB)
(发布日期:2018/2/6)Flash Player 28.0.0.161 (408 MB)
(发布日期:2018/1/9)Flash Player 28.0.0.137 (406 MB)
(发布日期:2017/12/12)Flash Player 28.0.0.126 (405 MB)
(发布日期:2017/11/14)Flash Player 27.0.0.187 (403 MB)
(发布日期:2017/10/25)Flash Player 27.0.0.183 (404 MB)
(发布日期:2017/10/16)Flash Player 27.0.0.170 (404 MB)
(发布日期:2017/10/10)Flash Player 27.0.0.159 (405 MB)
(发布日期:2017/9/12)Flash Player 27.0.0.130 (405 MB)
(发布日期:2017/8/8)Flash Player 26.0.0.151 (404 MB)
(发布日期:2017/7/11)Flash Player 26.0.0.137 (404 MB)
(发布日期:2017/6/16)Flash Player 26.0.0.131 (404 MB)
(发布日期:2017/6/13)Flash Player 26.0.0.126 (404 MB)

参考地址:

  1. 【教程】解决Chrome浏览器“此Flash Player与您的地区不相容,请重新安装Flash”报错
  2. 提示“此Flash Player与您的地区不相容,请重新安装Flash”的解决办法
------------------------ The End ------------------------

Hexo添加字数统计、阅读时长

发表于 2019-03-01 | 分类于 Hexo
本文字数: 374 | 阅读时长 ≈ 1 分钟
  1. 打开hexo目录,运行git bush,安装插件
1
$ npm install hexo-symbols-count-time --save
  1. 修改博客网站配置文件,添加以下代码
1
2
3
4
5
symbols_count_time:
symbols: true
time: true
total_symbols: true
total_time: true
  1. 修改主题配置文件,搜索symbols_count_time,快速定位,修改成以下代码
1
2
3
4
5
6
symbols_count_time:
separated_meta: true
item_text_post: true
item_text_total: false
awl: 4
wpm: 275
  1. 重启服务
1
2
3
hexo clean
hexo g
hexo s
------------------------ The End ------------------------

Markdown语法

发表于 2019-02-28 | 更新于 2019-04-19 | 分类于 Markdown
本文字数: 5.5k | 阅读时长 ≈ 5 分钟

主要内容:

Markdown是什么?
谁创造了它?
为什么使用它?
谁在用它?
怎么使用它?

正文

1. Markdown是什么?

Markdown是一种轻量级标记语言,它以纯文本形式(易读、易写、易更改)编写文档,并最终以HTML格式发布。
Markdown也可以理解为将以MARKDOWN语法编写的语言转换成HTML内容的工具。

Markdown是一种纯文本格式的标记语言。通过简单的标记语法,它可以使普通文本内容具有一定的格式。
相比WYSIWYG编辑器
● 优点:
1、因为是纯文本,所以只要支持Markdown的地方都能获得一样的编辑效果,可以让作者摆脱排版的困扰,专心写作。
2、操作简单。比如:WYSIWYG编辑时标记个标题,先选中内容,再点击导航栏的标题按钮,选择几级标题。要三个步骤。而Markdown只需要在标题内容前加#即可
● 缺点:
1、需要记一些语法(当然,是很简单。五分钟学会)。
2、有些平台不支持Markdown编辑模式。

还好,简书是支持Markdown编辑模式的。

1
开启方式:设置->默认编辑器->Markdown编辑器

2.谁创造了它?

它由Aaron Swartz和John Gruber共同设计,Aaron Swartz就是那位于去年(2013年1月11日)自杀,有着开挂一般人生经历的程序员。维基百科对他的介绍是:软件工程师、作家、政治组织者、互联网活动家、维基百科人。

  • 14岁参与RSS 1.0规格标准的制订。
  • 2004年入读斯坦福,之后退学。
  • 2005年创建Infogami,之后与Reddit合并成为其合伙人。
  • 2010年创立求进会(Demand Progress),积极参与禁止网络盗版法案(SOPA)活动,最终该提案被撤回。
  • 2011年7月19日,因被控从MIT和JSTOR下载480万篇学术论文并以免费形式上传于网络被捕。
  • 2013年1月自杀身亡。
    Aaron_Swartz

3.为什么要用它?

  • 它是易读(看起来舒服)、易写(语法简单)、易更改纯文本。处处体现着极简主义的影子。
  • 兼容HTML,可以转换为HTML格式发布。
  • 跨平台使用。
  • 越来越多的网站支持Markdown。
  • 更方便清晰地组织你的电子邮件。(Markdown-here, Airmail)
  • 摆脱Word(我不是认真的)。

4. 谁在用它?

Markdown的使用者:

  • GitHub
  • 简书
  • Stack Overflow
  • Apollo
  • Moodle
  • Reddit
  • 等等

5.怎么使用它?

如果不算扩展,Markdown的语法绝对简单到让你爱不释手。
Markdown语法主要分为如下几大部分:标题,段落,区块引用,代码区块,强调,分割线,链接,图片,反斜杠\,符号~等。

一、标题

两种方式:
● 方式1
使用=和-标记一级和二级标题。

1
2
3
4
一级标题
=======
二级标题
-------

运行结果,如下:

一级标题

二级标题

● 方式2:使用#,可表示1-6级标题。

在想要设置为标题的文字前面加#来表示
一个#是一级标题,二个#是二级标题,以此类推。支持六级标题。
注:标准语法一般在#后跟个空格再写文字,貌似简书不加空格也行。
示例:

1
2
3
4
5
6
7
8
```
# 这是一级标题
## 这是二级标题
### 这是三级标题
#### 这是四级标题
##### 这是五级标题
###### 这是六级标题
```

运行结果,如下:

1
2
3
4
5
6
# 这是一级标题
## 这是二级标题
### 这是三级标题
#### 这是四级标题
##### 这是五级标题
###### 这是六级标题

段落

段落的前后要有空行,所谓的空行是指没有文字内容。若想在段内强制换行的方式是使用两个以上空格加上回车(引用中换行省略回车)。
段落:以一个空行开始,以一个空行结束,中间的就是一个段落。

二、字体

● 加粗
要加粗的文字左右分别用两个*号包起来

1
**加粗的字体**

运行结果,如下:
加粗的字体
● 斜体
要倾斜的文字左右分别用一个*号包起来

1
*要倾斜的字体*

运行结果,如下:
要倾斜的文字
● 斜体加粗
要倾斜和加粗的文字左右分别用三个*号包起来

1
***倾斜加粗的字体***

运行结果,如下:
倾斜加粗的字体
● 删除线
要加删除线的文字左右分别用两个~~号包起来

1
~~删除线的使用~~

运行结果,如下:
删除线的使用

三、引用

在引用的文字前加>即可。引用也可以嵌套,如加两个>>三个>>,n个···
貌似可以一直加下去,但没神马卵用

1
2
3
4
5
>这是引用的内容1
>>这是引用的内容2
>>>这是引用的内容3
>>>>这是引用的内容4
>>>>>这是引用的内容5

运行结果,如下:

这是引用的内容1

这是引用的内容2

这是引用的内容3

这是引用的内容4

这是引用的内容5

四、分割线

三个或者三个以上的 - 或者 * 都可以。

1
2
3
4
---
----
***
****

运行结果,如下:




五、图片

1
![图片alt](图片地址 "图片title")

其中,图片alt就是显示图片下面的文字,相当于对图片内容的解释。
图片title是图片的标题,当鼠标移到图片上时显示的内容。title可加也可不加。
示例:

1
![宠物](http://baiducdn.pig66.com/uploadfile/2017/0511/20170511074935785.jpg "宠物狗狗")

运行结果,如下:
宠物

六、超链接

语法:

1
[超链接名字](超链接地址 "超链接title")

其中,”超链接title”可加也可不加。
示例:

1
2
[简书](http://jianshu.com "访问简书主页")
[百度](http://www.baidu.com "访问百度主页")

运行结果,如下:
简书
百度
注:Markdown本身语法不支持链接在新页面中打开,貌似简书做了处理,是可以的。别的平台可能就不行了,如果想要在新页面中打开的话可以用html语言的a标签代替。

1
<a href="超链接地址" target="_blank">超链接名</a>

示例

1
<a href="https://www.jianshu.com/u/1f5ac0cf6a8b" target="_blank">简书</a>

七、列表

● 有序列表
有序列表:使用 数字 加一个英文句点.

1
2
3
4
5
1. 有序列表
2. 有序列表
3. 有序列表
4. 有序列表
5. 有序列表

运行结果,如下:

  1. 有序列表
  2. 有序列表
  3. 有序列表
  4. 有序列表
  5. 有序列表

● 无序列表
语法:
无序列表用" - + *"任何一种都可以

1
2
3
- 列表内容1
+ 列表内容2
* 列表内容3

注意:- + * 跟内容之间都要有一个空格,且结束列表时,需要中间空一行。
运行结果,如下:

  • 列表内容1
  • 列表内容2
  • 列表内容3

● 列表嵌套
上一级和下一级之间敲三个空格即可

1
2
3
4
- 一级无序列表内容1
- 二级无序列表内容2
- 二级无序列表内容2
- 二级无序列表内容2

运行结果,如下:

  • 一级无序列表内容1
    • 二级无序列表内容2
    • 二级无序列表内容2
    • 二级无序列表内容2
1
2
3
4
+ 一级无序列表内容1
+ 二级无序列表内容2
+ 二级无序列表内容2
+ 二级无序列表内容2

运行结果,如下:

  • 一级无序列表内容1
    • 二级无序列表内容2
    • 二级无序列表内容2
    • 二级无序列表内容2
1
2
3
4
* 一级无序列表内容1
* 二级无序列表内容2
* 二级无序列表内容2
* 二级无序列表内容2

运行结果,如下:

  • 以及无序列表内容1
    • 二级无序列表内容2
    • 二级无序列表内容2
    • 二级无序列表内容2

特别注意,如下这种情况:

  • 一级无序列表内容1
    • 二级无序列表内容2
    • 二级无序列表内容2
    • 二级无序列表内容2
      • 三级无序列表内容3
      • 三级无序列表内容3
      • 三级无序列表内容3
    • 二级无序列表内容2
  • 一级无序列表内容1
    (不知道为什么?加入字体高亮度显示时,会出错)

运行结果,如下:

  • 一级无序列表内容1
    • 二级无序列表内容2
    • 二级无序列表内容2
    • 二级无序列表内容2
      • 三级无序列表内容3
      • 三级无序列表内容3
      • 三级无序列表内容3
    • 二级无序列表内容2
  • 一级无序列表内容1

注意:这里想说明的是不同级别之间要有换行,如果不换行,默认还是上一级别。但是,这里实验可以发现这个问题已经不存在啦。

八、表格

语法:

1
2
3
4
表头|表头|表头
---|:--:|---:
内容|内容|内容
内容|内容|内容

说明:
第二行分割表头和内容。
- 有一个就行,为了对齐,多加了几个
文字默认居左
■两边加:表示文字居中
■右边加:表示文字居右
注:原生的语法两边都要用 | 包起来。此处省略
示例:

1
2
3
4
5
姓名|技能|排行
----|:--:|--:
刘备|哭|大哥
关羽|打|二哥
张飞|骂|二哥

运行结果,如下:(表语与上文要空一行,否则会错乱)

姓名 技能 排行
刘备 哭 大哥
关羽 打 二哥
张飞 骂 二哥

九、代码

语法:
● 单行代码:代码之间分别用一个反引号包起来

1
`代码内容`

● 代码块:代码之间分别用三个反引号包起来,且两边的反引号单独占一行

1
2
3
4
5
```
代码...
代码...
代码...
```

示例:
单行代码

1
`create database hero;`

运行结果,如下:
create database hero;
代码块

1
2
3
4
5
6
```
function fun(){
echo "这是一句非常牛逼的代码";
}
fun();
```

运行结果,如下:

1
2
3
4
function fun(){
echo "这是一句非常牛逼的代码";
}
fun();

十、流程图

1
2
3
4
5
6
7
8
9
```flow
st=>start: 开始
op=>operation: My Operation
cond=>condition: Yes or No?
e=>end
st->op->cond
cond(yes)->e
cond(no)->op
&```

运行结果,如下:

1
2
3
4
5
6
7
8
st=>start: 开始
op=>operation: My Operation
cond=>condition: Yes or No?
e=>end
st->op->cond
cond(yes)->e
cond(no)->op
&

(注意,这里并未打印出流程图,不知道什么原因?)

十一、显示网址

● 写法1:

1
2
3
超链接:[连接名称](网址 , 标题)
[我是链接名](http://www.izhangbo.cn, "我是标题")
[<i class="icon-refresh"></i> 点我刷新](/sonfilename/)

● 写法2:

1
2
3
4
另一种超链接写法:[链接名][链接代号]
[here][3]
然后在别的地方定义 3 这个详细链接信息,
[3]: http://www.izhangbo.cn "聚牛团队"

直接展示链接的写法:

1
<http://www.izhangbo.cn>

十二、反引号

code格式:反引号
Use the printf() function.

1
``There is a literal backtick (`) here.针对在代码区段内插入反引号的情况``

There is a literal backtick (`) here.针对在代码区段内插入反引号的情况

十三、缩进

markdown段落中如何产生缩进?

因为markdown的段落定义是由一个或多个连续的文本组成,中间的多个空格和tab会被认为是一个空格。
但是有时候确实需要这样的空格或tab缩进格式时怎么办?

  • 方法1:(有效,注意后面的分号)
    直接写
    半方大的空白 或 
    全方大的空白 或 
    不断行的空白格 或 

  • 方法2:(无效)
    输入法切换到全角,双击空格键~
    搜狗输入法切换全角与半角的快捷键:
    Shift + 空格,即可切换半角/全角。按住Shift,点击空格一次,即可互相切换。
    这个方法我遇到一个问题:首段不能缩进!

  • 方法3:(无效)

    1
    > your text

这个是引用的样式

  • 方法4:(无效)
    1
    <a>    test</a>

参考文献

Markdown基本语法 网址:https://www.jianshu.com/p/191d1e21f7ed
younghz/Markdown 网址:https://github.com/younghz/Markdown
掌握这几种 Markdown 语法
Markdown 语法说明 (简体中文版)

------------------------ The End ------------------------

Hexo中插入图片的方法

发表于 2019-02-28 | 更新于 2019-03-01 | 分类于 Hexo
本文字数: 2.3k | 阅读时长 ≈ 2 分钟

在写文章时,常常有配图说明的需求。Hexo有多种图片插入方式,可以将图片存放在本地引用或者将图片放在CDN上引用。

插入本地图片

绝对路径

本地图片统一放在source/images文件夹中。

使用Markdown语法

1
2
3
1  ![](/images/test.jpg)
2 helllsfl
3 fslfml

注意:
●images的名字可以改变,比如images0,images1,等
●images前面的”/“,必须要有,且不可写source,格式固定。

使用Html语法

1
<img src="/images/test.jpg">

相对路径

使用插件

1、把根目录下的配置文件_config.yml里的post_asset_folder选项设置为true;

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
1 # 文章配置
2 # 这个地方一般直接取默认值不用修改
3 # Writing
4 new_post_name: :title.md # File name of new posts # 新文章的文件名称
5 default_layout: post # 预设布局
6 titlecase: false # Transform title into titlecase # 把标题转换为 titlecase(titlecase指的是将每个单词首字母转换成大写)
7 external_link: true # Open external links in new tab # 在新标签中打开链接
8 filename_case: 0 # 把文件名称转换为 (1) 小写或 (2) 大写, 0表示不变
9 render_drafts: false # 显示草稿
10 post_asset_folder: true # 启动 Asset 文件夹
11 relative_link: false # 启动 Asset 文件夹
12 future: true # 显示未来的文章
13 highlight: # 代码块的设置
14 enable: true
15 line_number: true # 是否显示行号
16 auto_detect: false # 是否自动监测
17 tab_replace: # 将 tab 替换成其他字符串
```
2、在你的hexo目录下执行这句话npm install hexo-asset-image --save,这是下载安装一个可以上传本地图片的插件:
``` bash
huangsengolndeMacBook-Pro:hexo-blog huangaengoln$ npm install hexo-asset-image --save
(node:59464) fs: re-evaluating native module sources is not supported. If you are using the graceful-fs module, please update it to a more recent version.
hexo-site@0.0.0 /Users/huangaengoln/Documents/hexo-blog
└─┬ hexo-asset-image@0.0.3
└─┬ cheerio@0.19.0
├─┬ css-select@1.0.0
│ ├── css-what@1.0.0
│ └── domutils@1.4.3
└── lodash@3.10.1
huangsengolndeMacBook-Pro:hexo-blog huangaengoln$

3、下载完成后,下次再执行hexo n “1How-to-change-App-theme-color”来生成md博文时,/source/_posts文件夹内除了1How-to-change-App-theme-color.md文件,还有一个与之同名的文件夹;

4、最后在1How-to-change-App-theme-color.md中想引入图片时,先把图片复制到md对应的文件夹1How-to-change-App-theme-color中,然后只需要1How-to-change-App-theme-color.md中按照markdown的格式引入图片:

1
1 ![你想输入的替代文字](xxxx/图片名.jpg)

注意:xxxx是这个md文件的名字,也是同名文件夹的名字,你想引入的图片就只需要放入xxxx这个文件夹内就好了,很像引用相对路径。
5、最后检查一下,hexo g生成页面后,进入public\2017\02\26\index.html文件中查看相关字段,可以发现,html标签内的语句是插入网络图片

使用Markdown语法

1
![](网络图片地址)

使用Html语法

1
<img src="网络图片地址">

使用图床

可以把你的图片上传到 七牛之类的服务器,然后直接按照markdown的方式使用。
例如可以使用github作为图床,

CDN引用

除了在本地存储图片,还可以将图片上传到一些免费的CDN服务中。比如Cloudinary提供的图片CDN服务,在Cloudinary中上传图片后,会生成对应的url地址,将地址直接拿来引用即可。(来源:Yan Yinhong)

------------------------ The End ------------------------
1234
Junjie Jia

Junjie Jia

生命中的每一步都必须认真对待,把握今天,成就明天!

56 日志
23 分类
30 标签
RSS
© 2019 Junjie Jia | 458k | 6:57
由 Hexo 强力驱动 v3.8.0
|
主题 – NexT.Gemini v7.0.0
|
0%