首页
归档
友链
关于
壁纸
直播
Search
1
夏日小风扇,进来凉快一下叭!
61 阅读
2
夏日小空调,进来凉快一下叭!
47 阅读
3
电脑开机主板 CPU 故障灯亮,无法正常开关机
45 阅读
4
《JavaScript重难点实例精讲》— 基本数据类型【number】
36 阅读
5
《JavaScript重难点实例精讲》— 基本数据类型【undefined null boolean】
35 阅读
站点
好玩
其他
读书笔记
开发
登录
Search
标签搜索
总结
读书笔记
小工具
好玩分享
windows
Typecho
云空调
云风扇
github
git
Nginx
Firewall-cmd
Frp
VSCode
PowerShell
PC
SSH
JMeter
Redis
cdn
XiaoLu
累计撰写
37
篇文章
累计收到
3
条评论
首页
栏目
站点
好玩
其他
读书笔记
开发
页面
归档
友链
关于
壁纸
直播
搜索到
6
篇与
的结果
2022-05-20
jsDelivr CDN 切换到阿里云自建加速
问题简述jsdelivr 本来是个服务大众的好站,免费给大家提供加速服务。由于众所周知的原因,一些心怀不轨的人拿这个搞事情,建 TM 什么图床啊,托管什么站点啊,导致其丢失了中国区的备案。白嫖、真香,呵呵。言归正传啊,本站使用的主题有相当一部分的资源是挂在 jsdelivr 上的,事到如今不切换是不行了。通过 VSCode 打开主题目录搜索了一下,存在 170 多个引用。因此我通过一些网上搜索的 python 脚本实现了较为快速的迁移吧。操作步骤🍉 开启阿里 OSS 和 CDN 服务 网上的教程很多,我就不重复其他人的工作了。如果有时间的话,还是会写一篇详细的教程,讲清楚每一个步骤的作用,其中确实是有很多坑的,暂时就先默认大家已经开了服务了。🍉 提取主题所有 jsdelivr 引用🍉 批量下载 jsdelivr 引用 到本地🍉 上传文件到阿里 OSS🍉 修改主题相关引用的域名{message type="info" content="Chrome 插件 Clear Site Data 可以快速清除当前站点的缓存,调试时是必备之选。"/}{anote icon="chrome" href="https://chrome.google.com/webstore/detail/clear-site-data/aihgofjefdlhpnmeakpnjjeajofpcbhj" type="info" content="Clear Site Data 安装地址"/}提取 jsdelivr 引用首先通过 VSCode 打开站点主题目录,这里可以 clone 主题到本地修改后再上传或使用 VSCode SSH Remote 插件直接修改,推荐 第二种 方法。然后点击左侧图标,全局搜索 jsdelivr 关键字,选择 “ 在编辑器中打开 ”,按下 Ctrl + S 保存搜索记录到本地,命名为 links.txt新建如下内容的 python 脚本,修改 TAG1 和 TAG2 两处,TAG1是脚本要搜索的目录,新建一个空白文件夹,把上面的 links.txt 放进来;TAG2 是结果导出位置。这个脚本来自 csdn ayesawyerimport re import os # TAG 1 path=r'C:\\Users\\Nickel\\Desktop\\temp' file_path=[] for filename in os.listdir(path): file_path.append((os.path.join(path,filename))) print (file_path) for adress in file_path: file_object=open(adress,'rb') lines = file_object.readlines( ) file_object.close() new_lines=[] for x in lines: new_x = x.split( ) for i in new_x: try: data=i; data = data.decode('utf-8') match_obj=re.search(r"https://.*",data) if match_obj: new_lines.append(match_obj.group()) except: continue final=new_lines # TAG 2 file_2=open(r'D:\\result.txt','w+') for x in final: for k in range(len(x)): if (x[k]=="\""): x=x[:k] break; file_2.write(x) file_2.write('\n') file_2.close()上面导出的结果文件还需要二次简单修改,主要问题有:末尾可能会有单引号,逗号不包括 //cdn.hello.com/xxx 无协议头的链接不包括 http 协议链接批量下载{message type="info" content="由于原 jsdelivr cdn 的链接是有目录层次的,所以批量下载时的脚本要照顾到这一点"/}首先新建如下内容的 Python 脚本,这个脚本来自 csdn DarkAthenaimport urllib.request import requests import re, os # 基于 https://zhuanlan.zhihu.com/p/62876301 修改 def get_file(url): ''' 递归下载网站的文件 :param url: :return: ''' if isFile(url): print(url) try: download(url) except: pass else: urls = get_url(url) for u in urls: get_file(u) def isFile(url): ''' 判断一个链接是否是文件 :param url: :return: ''' if url.endswith('/'): return False else: return True hander=urllib.request.ProxyHandler({'http':'127.0.0.1:10809'}) opener=urllib.request.build_opener(hander) def download(url): ''' :param url:文件链接 :return: 下载文件,自动创建目录 ''' full_name = url.split('//')[-1] filename = full_name.split('/')[-1] dirname = "/".join(full_name.split('/')[:-1]) if os.path.exists(dirname): pass else: os.makedirs(dirname, exist_ok=True) urllib.request.urlretrieve(url, full_name) def get_url(base_url): ''' :param base_url:给定一个网址 :return: 获取给定网址中的所有链接 ''' text = '' try: text = requests.get(base_url).text except Exception as e: print("error - > ",base_url,e) pass reg = '<a href="(.*)">.*</a>' urls = [base_url + url for url in re.findall(reg, text) if url != '../'] return urls if __name__ == '__main__': with open('links.txt', 'r') as f: lines = f.readlines() url_list = [] for line in lines: get_file(line.strip('\n'))我在它的基础上添加了代理,因为不加代理没办法下载下来的hander=urllib.request.ProxyHandler({'http':'127.0.0.1:10809'}) opener=urllib.request.build_opener(hander)然后安装 requests 模块,通过 pip 或 conda 都可以pip install requests # 或者 conda install requests执行这个脚本会在当前目录下载 links.txt 中的链接,记得修改上述脚本中 links.txt 的路径后续到这里就很简单了:打开阿里云 OSS 控制台,选择上传目录,等待上传完毕测试 cdn 链接是否可用通过 VSCode 全局查找功能,批量修改 jsdelivr.net 域名为你的 cdn 加速域名小结不知道说啥,反正挺无语的。。。又是瞎折腾的一天
2022年05月20日
5 阅读
0 评论
0 点赞
2022-03-13
破解 OpenWrite 微信导流
很多网站为了导流,使用了 openwrite 这个工具,想要阅读全部的文章就必须关注公众号,然后回复关键字,输入验证码。比如 这个网站 上是关于 opencv 的中文文档,即使关注了公众号,关闭标签页再打开仍要操作一遍,很是麻烦。因此经过一番研究,找到了解决方案。 介绍原理向公众号回复关键字后,微信会推送消息到站点服务器,站点服务器会调用 openwrite 的接口获取验证码,然后把验证码返回给手机微信。我们看到验证码,把它输入到网页上,点击提交时网页会调用 openwrite 的验证码校验接口,校验成功就会继续加载其他段落,此时全文就呈现出来了。校验失败就会给你一个提示。关键就是跳过 关注-回复-输入 这些步骤,直接调用 openwrite 获取验证码的接口,然后自动输入到文本框,然后触发提交。全程看不到阅读全文按钮和弹出的模态框,体验十分美好!代码实现Tips:最好的方式就是把这段代码加到油猴里面,这样就可以自动化执行了。🍓 首先判断站点是否安装 jquery 和 openwrite 插件,然后再去判断阅读全文是否已经被处理过。因为处理过后是没有阅读全文按钮的,当切换到其他页面时不做判空控制台会报错。🍓 然后把站点在 openwrite 注册的 blogId 和 openwrite API 接口 url 拼接一下,通过 jquery 发送 ajax 请求,返回的数据是一段结构很简单的 html,用 jquery 简单处理一下,拿到验证码(code)。🍓 用 jquery 把验证码输入到文本框内,然后触发【提交】按钮,模态框就消失了。(function () { if (!btw || !$) { alert("找不到btw或jquery"); return; } let hasMoreBtn = $("#read-more-btn").length; if (!hasMoreBtn) { console.log("尽情阅读叭,没有讨厌的验证码啦!"); return; } let blogId = btw.options.blogId; const baseUrl = "https://readmore.openwrite.cn/code/generate?blogId="; const openwriteUrl = `${baseUrl}${blogId}`; $.get(openwriteUrl, (data) => { codeHtml = $.parseHTML(data)[18]; code = codeHtml.innerText; $("#read-more-btn").click(); setTimeout(() => { $("#btw-modal-input").val(code); $("#btw-submit-btn").click(); }, 1000); }); })();油猴脚本注释如下,scikitlearn 这个站点也用了 openwrite,可以一并加进来。// ==UserScript== // @name OpenWrite 破解 // @namespace http://tampermonkey.net/ // @version 0.1 // @description try to take over the world! // @author Henrenx // @match https://www.scikitlearn.com.cn/* // @match http://www.woshicver.com/* // @icon https://www.google.com/s2/favicons?domain=scikitlearn.com.cn // @grant none // ==/UserScript==总结思考其实就是抓了 openwrite 验证码获取接口的漏洞,如果调用这个接口还需要再加一些其他字段,比如在站点注册时分发一个 privateKey,那么这个接口就不是任何人都能调用的了。
2022年03月13日
29 阅读
0 评论
0 点赞
2022-02-24
基于 SeaFile 搭建私有云文件服务器
Seafile 是一款开源的企业网盘,支持的平台十分全面,包括 Windows, Mac ,Linux ,Ios ,Android,支持文件同步或直接挂载到本地。我使用的场景是:同一个实验室内的小伙伴要做开发,共享文件资料只能通过QQ、微信、U盘,十分的不便。实验室内有几台服务器,通过 Seafile 便可以搭一个局域网环境下的文件、资料共享系统。十分感谢 Seafile 为我们普通用户提供的服务,和它为开源事业做出的努力 官网链接安装 MySQLSeafile 的运行是需要数据库的,它支持 SQLite 和 MySQL,这里选择 MySQL,因为实验室的服务器上已经安装好了。没有安装的读者,可以参考 这篇文章,我觉得写的比较规范和全面。{message type="error" content="下面这篇文章没了,好久之前折腾不小心删库了。。。"/}如果想要卸载旧版本,以便新版本的安装,可以参考我的这篇博客 https://www.henrenx.cn/archives/8/。为 Seafile 配置环境下面的 cryptography 是官方文档中没有的,目的是支持 mysql 较新的密码策略,mysql 8.0 以上的建议安装。# 安装 python3 和 pip3 环境 yum install python3 python3-setuptools python3-pip python3-ldap -y # 安装 Seafile 的依赖 pip3 install --timeout=3600 Pillow pylibmc captcha jinja2 sqlalchemy psd-tools pip3 install --timeout=3600 django-pylibmc django-simple-captcha cryptography下载和配置 Seafile读者可点击链接进入 Seafile 的下载页面,在服务器端那里下载版本较新的压缩包(旧版本可能会出现较多问题)放到 /opt 目录下,目前的最新版本是 7.1.4。下载完成后解压缩,目录结构如下:除了红框中的两个目录,其他的都是后来初始化过程中生成的,不用在意。其中,installed 目录里面是下载好的压缩包,seafile-server-7.1.4 目录中是压缩包解压缩后的文件。进入 seafile-server-7.1.4 目录,执行下面的命令:./setup-seafile-mysql.sh #运行安装脚本并回答预设问题期间会让你输入服务名称、数据库密码等,根据提示完成相应的问题即可。配置 Nginxnginx 如何下载和安装可以参考我的 这篇文章这里给出关于 Seafile 部分的 nginx 配置,其中需要改动的地方就是 listen server_name 和 proxy_pass,我在下面的配置中做了标注,改为你的实际情况即可(比如路径中的版本号,端口等)server { listen 5000; # 改 server_name 192.168.1.104; # 改 proxy_set_header X-Forwarded-For $remote_addr; location / { proxy_pass http://127.0.0.1:8000; # 改 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; proxy_read_timeout 1200s; client_max_body_size 0; } location /seafhttp { rewrite ^/seafhttp(.*)$ $1 break; proxy_pass http://127.0.0.1:8082; # 改 client_max_body_size 0; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 36000s; proxy_read_timeout 36000s; proxy_send_timeout 36000s; proxy_request_buffering off; send_timeout 36000s; } location /media { root /opt/seafile/seafile-server-7.1.4/seahub; # 改 } }配置防火墙如果嫌麻烦,可以直接关闭防火墙。因为我是实验室的环境,都是内部人员使用,所以我就直接关了。如果是具有公网 IP 的服务器,不建议直接关闭,可以在 firewall-cmd 中添加端口。关于如何添加端口,可以参考 这篇文章启动服务第一次启动 seahub 时,seahub.sh 脚本会提示你创建一个 seafile 管理员帐号。./seafile.sh start # 启动 Seafile 服务 ./seahub.sh start # 启动 Seahub 网站 其他管理命令./seahub.sh stop # 停止 Seahub ./seafile.sh stop # 停止 Seafile 进程 ./seafile.sh restart # 停止当前的 Seafile 进程,然后重启 Seafile ./seahub.sh restart # 停止当前的 Seahub 进程,重新启动 Seahub pgrep -f seafile-controller # 查看 Seafile 进程 pgrep -f "seahub" # 查看 Seahub 进程 pkill -f seafile-controller # 结束 Seafile 进程 pkill -f "seahub" # 结束 Seafile 进程功能体验头像不显示可以考虑清理缓存 rm -rf /tmp/seahub_cache/如果清理缓存无效,可以考虑按照下图修改,把原来的那两行用 # 号注释掉,然后把 service_url + 删掉。cd /opt/seafile/seafile-server-7.1.4/seahub/seahub/avatar/templatetags vim avatar_tags.py
2022年02月24日
23 阅读
0 评论
0 点赞
2022-02-24
Nginx 静态文件访问并支持 SSL
{message type="info" content="文章写于 2020 年 4 月,可能与现在有差异,仅供参考。"/}{alert type="info"} 题外话 :如果想在 windows 上共享文件给别人,windows 自带的文件共享服务玩不来的话,又不想拿优盘拷贝,可以试试 Everything。它不仅具有文件检索功能,还有文件服务器的功能,可以尝试一下。它也是类似 nginx 这样,提供一个网页目录。不过功能很简单,只支持单文件下载,不支持目录下载。{/alert}当你拥有一台闲置的云服务器,可以尝试使用 nginx 搭一个静态文件访问服务,nginx 自带的那个服务界面是不太美观的,本文使用 nginx + fancyIndex 来做一个美观的静态文件访问服务。下载 nginx 和 fancyIndexNginx 下载,当前最新 1.20.2FancyIndex 下载,当前最新 v0.5.2# 解压 nginx tar -zxvf *.gz # 解压 fancyindex,需要两次 xz -d *.xz tar -zxvf *.tar安装配置如果服务器已经安装了 nginx,可以先 备份 一下,然后重新编译安装,不然就被直接覆盖了!找到 nginx 解压后的根目录,执行以下命令:# 以 centos 为例,先安装几个依赖模块 yum install gcc -c++ yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl-devel #安装前的配置 把对应的目录更换一下 ./configure --prefix=/opt/nginx --add-module=../ngx-fancyindex-ngx-fancyindex --with-http_stub_status_module --with-http_ssl_module make && make install #编译并安装 ln -s /opt/nginx/sbin/nginx /usr/bin/nginx #创建软链接后面的两个 --with xxxx 指的是 SSL 模块,nginx 默认不加这个,因为要用到 HTTPS,所以这里选择加上。编辑 nginx.conf然后粘贴如下内容到 nginx.conf 中 (位置要正确),其中需要修改的是:server_name 域名 ssl_certificate 证书位置 (下面示例中 cert 是目录,和 conf 目录同级) ssl_certificate_key 证书秘钥位置 location 需要修改 root 为你服务器上某个目录 (wiki.wannax.cn 是个目录)注:location、fancyindex.conf 在后面会提到,先这样配置server { listen 443 ssl; listen 80; server_name wiki.wannax.cn; charset utf-8; ssl_certificate ../cert/wiki.wannax.cn.crt; ssl_certificate_key ../cert/wiki.wannax.cn.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; if ($scheme = http) { return 301 https://$server_name$request_uri; } location / { include fancyindex.conf; root /www/wiki.wannax.cn; } }如果你不想使用 SSL,或者没有证书的话,配置很简单:server { listen 80; server_name wiki.wannax.cn; charset utf-8; location / { include fancyindex.conf; root /www/wiki.wannax.cn; } }下载主题下载链接:https://github.com/Naereen/Nginx-Fancyindex-Theme/archive/master.zip解压命令:unzip *.zip此压缩包包含两个主题,一个明亮、一个暗黑,自己选择。把其中一个主题的目录移动到你的静态文件目录那块,和上面的 location root 保持一致即可移动命令:mv xxxx /www/wiki.wannax.cn/fancydark (mv 后面的 xxxx 和 / 之间有空格)把主题根目录下的 fancyindex.conf 移动到 nginx 的 conf 目录下编辑 fancyindex.conffancyindex on; fancyindex_localtime on; fancyindex_exact_size off; fancyindex_header "/fancydark/header.html"; fancyindex_footer "/fancydark/footer.html"; fancyindex_ignore "fancydark"; fancyindex_ignore "README.md"; fancyindex_ignore "HEADER.md"; fancyindex_name_length 255;其中,fancyindex_ignore 指的是对外不显示哪些文件或目录,此处配置的是主题目录不对外显示,但是仍可以通过浏览器手动访问此目录fancyindex_header 与 fancyindex_footer 是两个 html 文件,默认位于此主题中,如果你有一点 html 和 css 和 js 的基础,可以自己改写一下。最后一点工作下面的命令可以管理 nginxnginx -t #检测 nginx.conf 是否语法正确 nginx #启动 nginx nginx -s reload #重载 nginx nginx -s stop #停止运行 nginx开启 nginx 的服务后,在浏览器地址栏输入你的域名,就可以看到努力的成果了。
2022年02月24日
12 阅读
0 评论
0 点赞
2022-02-17
在 typecho 上实现锚点功能
最近在写一些前端的读书笔记,有的时候整个页面太长,想要快速定位到一些特定的位置只能依靠鼠标滚轮,而且使用的主题没有目录,所以动动手实现一下锚点功能。{anote icon="fa-anchor" href="#about" type="secondary" content="大致原理"/} {anote icon="fa-anchor" href="#jspart" type="secondary" content="JS 部分"/}{anote icon="fa-anchor" href="#csspart" type="secondary" content="CSS 部分"/} {anote icon="fa-anchor" href="#useinfo" type="secondary" content="用法"/} 大致原理基本原理是 暗锚 ,我的实际需求是在 markdown 文档里加入锚点功能,就是点击页面内某个链接能够跳转到页面上的某个特定位置。那种 JS 监听链接的点击然后控制页面滚动的方法实在麻烦,实现起来要计算元素高度之类的,因此这种方式不可行。所以还是考虑使用浏览器的原始功能,给被锚元素添加 id,然后使用 a 标签链接到这个元素上。暗锚 的意思就是找另外一个元素 B 替代原始元素 A,原本是点击链接 C 时跳转到 A,现在点击链接 C 时跳转到 B,而 A B 两个元素是挨着的,跳转的位置就是那一片区域,所以在用户体验上是无感知的。实现起来很简单,就是需要注意一些细节:markdown 的链接默认是新标签页打开隐藏锚点元素不能使用 display:none;JS 部分一定要等待全文加载完毕再执行下面的代码,不然 links 数组是空的。最好就是以单独 JS 文件的形式,引入到 body 的最下方。{message type="info" content="放不放下边无所谓了,忘记了 Jquery 的 ready 方法了,代码已经修改,可以忽略上面这段话"/}<!-- body 底部 --> <script src="https://henrenx.cn/anchor.js"></script>首先就是判断当前是不是文章页,如果是的话就找到文章中所有的 a 标签,然后看它的 href 是不是以 # 开头的页内链接,因为 markdown 的链接默认是新标签页,所以要把它的打开方式设置为页内。$(function () { let url = document.location.href; if (!url.includes('archives')) { return; } let links = $(".joe_detail__article a"); for (let i = 0; i < links.length; i++) { let href = $(links[i]).attr('href'); if (href && href.startsWith('#')) { $(links[i]).attr("target", "_self"); } } $(".joe_detail__article a[type='anchor']").parent().addClass('self_anchor'); });CSS 部分然后把这段 css 样式加入到全局中,目的就是把目标元素隐藏起来。为什么不用 display: none;这种方式呢?因为加了它就不能实现锚点功能了,点击链接是跳转不到指定位置的,具体原因不知,但是不能用。.self_anchor { margin: 0; font-size: 0; height: 0; top: -100px; position: relative; }需要注意的是,top 的值要适当调整,因为好多这种博客主题都是带顶栏的,点击链接实际上是锚到了相应元素,但是被顶栏遮住了,因此要将 A、B 元素适当分开些,分开的距离抵消了顶栏的高度,这时的功能才算正常。用法// 暗锚 <a type="anchor" id="anchorId"></a> \## This is subtitle // 链接 [点击跳转](#anchorId){dotted startColor="#ff6c6c" endColor="#1989fa"/}{callout color="#32c3b2"}体验一下由下向上的感觉:{/callout}大致原理JS 部分CSS 部分用法
2022年02月17日
27 阅读
1 评论
0 点赞
1
2