Reading view

There are new articles available, click to refresh the page.

Telegram 中文搜索方案探索

因为过年忘记带上电脑的电源适配器,好久没有更新博客了。生活总是稀疏平常,随着时间的推移,愈发觉得有些东西其实寥寥数语就可以讲完,无需长篇累牍地写上一篇长文。或许这是频道写多的弊端,就像让习惯了微博的人去写博客一样,内心必然是比较抵触的。但博客这种载体好就好在文字可以随着时间沉淀下来,记录自己思考和成长的过程,快餐式的频道内容无法与之相提并论。

本文写在为频道部署按关键词索引的机器人之后,顺带盘点一下 IT 社群和自留地为了让大家更为迅速地寻找自己想要的内容,做过了哪些努力。请注意,并没有一劳永逸解决全平台群组和频道中文搜素问题的方案。由于我个人对索引群友发言存在精神洁癖,因此这篇文章的受众是 TG 频道主。

《Telegram 中文搜索方案探索》

Telegram 中文搜索现状

照例还是要啰嗦几句,讲讲我为什么要针对中文搜索下如此大的功夫。

Telegram 目前的搜索逻辑是根据「单词」来进行的,请注意这里的「单词」不一定是常见的单词,前后含有空格和标点符号则自成「单词」。譬如:Newlearner 如果写成“[空格] New lear ner [空格]”,那么在搜索中,你可以找到 New、lear、ner 这三个「单词」 。

这个搜索逻辑不可避免地带来一些问题,由于中文字与字之间是连贯没有空格的,如果你想要搜索某个历史关键词来找到之前的消息,可以说是很困难的。让我再次举例比较一下:

随着越来越多新朋友的加入,日聊天数量越来越多,有必要减少一些无关话题以保证群聊的高话题相关性。相关性不高的话题建议大家去对应群聊讨论

随着越来越多新朋友的加入,日聊天数量越来越多,有必要减少一些 无关 话题 以保证群聊的高 话题 相关性。相关性不高的 话题 建议大家去对应群聊讨论

可以看到第二段的“话题”一词前后都有空格,我如果想要搜索到这段话(群置顶),只需要搜“无关 话题”即可。而第一段话则搜索不出任何结果。九歌有一句鸽人鸽语叫做:“反正只要足够香,你的眼神就可以不要。”而我每次想要 forword,需要搜索“你的眼神就可以不要”才可以找到这句话。

那么中文搜索逻辑如此,含大量空格的英文搜素体验会好吗,或许如此。但 Telegram 的搜索始终做不到类似浏览器关键词那样的「拆词」,搜索“New”是找不到“Newlearner”的。和中文一样,很多小语种也被这套搜索的逻辑深深地困扰。

从 Telegram 搜索逻辑入手

所以 Telegram 中文搜索难用已成事实,我将从 Telegram 搜索逻辑入手,和大家分享一下我前期做过什么努力。

  • 为频道消息打 Tag
  • 频道群组聊天时,将关键词前后空格
  • 含有英文的句子中,将英文前后空格

通过以上步骤,就将「我记得某消息有个关键词叫…」的问题转化为「某消息我当时打了什么 Tag、其中是否含有关键词(英文)」。

这里附上一张我们不对外公开的、主编内部材料:自留地 Tag 列表(不完整)

《Telegram 中文搜索方案探索》

在实际操作的过程中,我们觉得自己需要这么一张 Tag 表,便于对消息进行一个大致的分类和便于搜索。但随着时间的推移,消息数量的累计,Tag 起到的只剩下一个分类的作用,且分类后消息数量依然庞大。不得不采用 Tag + 英文关键词这样的方式使这套机制正常运作。

因此弊端非常明显:

  • Tag 太多让读者无法自动联想和对号入座,有时候频道主编也不能。而过于宽泛的 Tag 带来的依然是海量的信息量
  • 空格是个好文明,但不是所有的群友和频道主都能在聊天和编辑频道内容中做到

基于此我们认为,脱离 Telegram 的搜索体系,采用全局爬虫才是这个问题的最优解,目的是实实在在地让大家通过「关键词」去探索频道内容或寻找之前消息。

手动整理的尝试

既然决定脱离 Telegram 这个搜索框架,我首先想到了自己的博客。博客是一个公开的内容展示平台,且可以配合浏览器进行无死角的关键词搜索。于是在去年12月份,我开始了艰难的手动频道内容整理,详见 Newlearnerの自留地导航页

《Telegram 中文搜索方案探索》

经过两天的手动整理,我把具有实用性的技巧、文章、源码、软件工具等收录到这个导航页,形式是标题+链接。关注自留地的老读者都知道,我们之前每天推送信息的数量较多,其中夹杂着大量的时效性、羊毛新闻等。这个导航页主要目的有二:提供一个简单的分类、便于读者们搜索。

网站上线以来,阅读量近 5K。说实话并不算很多,我认为一方面不是每个读者都有搜索的需求,另一方面打开网页搜索体验确实没有 Telegram 内直接搜索来得直接。

基于 Web 的搜索引擎

在今年1月份,为了进一步优化大家的搜索体验,我和 sssoou.com 站长达成合作,将自留地展示于首页便于大家勾选并进行搜索。这种网页爬虫+搜索引擎的方案我比较喜欢,使用起来也确实很方便。

《Telegram 中文搜索方案探索》

基于 Pyhton 的索引 Bot

上面的两套方案都跳出了 Telegram,转战浏览器,有些读者可能认为这样的体验不太好。因此近日我决心搭建一个关键词搜索 TG Bot,这样在兼顾体验的同时能够快速找出自己想要的消息。

方案选择

首先在 GitHub 上找到了几套方案:

由于无需细说的自留地和 IT 社群附属关系,我们打算为频道做一个关键词搜索机器人。相比第一个项目提供搜素结果展示/选择界面,第三个项目则直接将所有相关消息暴力 forword,因此体验很差。经过一番比较,我们决定使用 telegram-search 作为机器人搭建方案。

部署

部署过程中得到了开发者 EEYHN 的无私帮助,在这里先表示感谢。大致部署过程如下:

#申请机器人 && clone 到本地
git clone https://github.com/EYHN/telegram-search.git

#安装依赖
pip install -r requirements.txt

#修改 main.py && 创建 session 文件夹
mkdir session

#生成数据库文件
python main.py

#针对小内存机器,建立 Swap(1G),并
sysctl -w vm.max_map_count=262144

#修改 main.py 中 Docker 环境参数
ES_JAVA_OPTS=-Xms512m -Xmx512m

#安装 docker 相关环境并运行
docker-compose up -d

运行之后机器人会实时抓取频道消息,并使用 elasticsearch 建立搜索引擎,整个项目对内存大小有一定的要求。如果你想要修改结果展示的字数,可以在 main.py 中找到相关代码,默认值为 15 个字符。

使用

机器人使用的是 Lucene 查询语法,可以精准到关键字词、日期。很多朋友直接输入关键词,对结果产生了很多疑问和不满,这里也来统一解答一下。先举个例子,例如我需要查询含有“动森”(动物森友会)的频道消息:

  • 直接输入“动森”查询,会发现结果很多。这是由于未遵循查询语法,结果将含有“动”和“森”的所有消息全部列出。
  • 当根据语法要求,输入“+动森”,会发现结果依然很多。这是因为词库并不认为「动森」是一个名词,而将含有“动”和“森”的所有消息全部列出。
  • 因此正确的做法是,输入“+动 +森”,这表示搜索所有既含有“动”又含有“森”的消息。

《Telegram 中文搜索方案探索》

总结与其他思路

照例来一张表格做一个横向对比:

  基于 Telegram 框架 支持分类 按日期搜索 准确搜索关键词 备注
Telegram 自带搜索 对中文搜索不友好
Tag 与空格 操作难度大
自留地导航(博客) 人力付出多
Web 搜索引擎 精确但需要浏览器和站主收录
Telegram 索引 Bot 精确、基于 TG 但需要自学搜索语法和服务器开销

通过以上表格,相信大家对本文介绍的几种方案有了一个更直观的认知。在 Telegram 没有打算添加非英语语种的分词搜素措施前,我们应该不断寻找方法,改善群友和读者的搜索体验。最后附上我想到的其他思路:

  • 对于个人:Windows 端支持导出频道全部内容,将其放置于浏览器,并加以搜索即可
  • 对于群主/频道主:可以做一个关键词回复机器人,触发某关键词回复相关内容或者链接。但操作难度大、关键词并不明确且无法满足所有人的需求,只能做一些常用的,也称不上「搜索」或者「索引」

最后啰嗦一句,以上方案并不一定适合每位频道主,在信息累积到一定量之前简单的方法见效还是不错的。譬如我作为一个频道主,更新频率不高,每次更新完之后在 Notion 等处记录下 Tag、关键词和标题链接等重要信息,也可以做到自我索引。索引,既方便了自己,也方便了频道读者,因此非做不可。

希望以上内容为其他频道主提供一些有益的思路。更重要的是,让我们的读者了解到我们为了让大家有一个良好的搜索环境,做了哪些跨平台的方案。

Telegram 频道:Newlearnerの自留地 导航页

欢迎关注 Telegram 频道 Newlearnerの自留地 的各位!

四个月前,应群友建议,我决定创建一个频道,在其中分享一些东西。在当时,水群的聊天数量已经不少,分享进去的东西容易被刷屏以至于难以寻找。四个月过去了,我现在是一个 5K 频道的频道主,自认为我做了我喜欢做的事情而且还算有点成功。

但是最近我一直在思考一个问题:Newlearnerの自留地以 IT 资讯和分享为主,但由于更新频率较高,Telegram 对于中文搜索支持太差。因为消息众多,即使打了 Tag,寻找起来还是很困难。更不用说后来关注的朋友,不会知道频道前面发送过哪些内容,老实说有些内容我自己也不记得自己发过。

因此,我打算抽出一点时间,为我的频道做一个导航页。我将在本篇博文中按照不同分类(而非时间)顺序给大家整理之前发过的信息,并在每周末添加本周的信息作为补充。因此本文会越来越长,建议大家使用浏览器关键字搜索

《Telegram 频道:Newlearnerの自留地 导航页》

收录标准

按规矩我应该先说说哪些内容会被收录到本篇博文:时效性较弱的,具有实用性的技巧、文章、源码、软件工具等,不会收录时效性强新闻、羊毛消息、折扣消息、无厘头的碎碎念等在我的频道出现频率相对不算低的消息。有关 #Wallpers、#Keyboards 和 #Android 的内容可以通过 Tag 准确找到,这里就不再整理相关所有内容。

提醒各位频道主,发频道消息务必打 Tag,否则日积月累寻找起来难度十足。

下面,让我们开始,每个二级标题都是一个分类👇

Telegram

iOS

macOS

工具/软件/技巧

开源相关

XXX 和 TA 的 XXX 

音视频/流媒体

博客专栏

硬件相关

Refresh 周报

un.Block 区块链周报

Fabric 周报

科技新闻

VPS/代理/网络相关

每周觅食

准大学生数字生活指南

其他

最后的话

日积月累,自留地的内容数量不可小觑,初次整理内容花了我两天的时间。今后,我会每周整理并更新自留地的最新内容。

由于内容众多,分类也相对粗糙。有些消息其实可以放在多个分类,我根据自己的想法将其放在了最正确、最相关的分类。大部分消息是按照发布时间排序,也有少部分信息和之前的消息内容相关联,我就将它们放在了一起。大家使用时,可以在浏览器中搜索相关的关键词

是为导航,其实也是一个几个月来的总结。一路以来得到很多人的支持,这个频道也是社区共建共享的,感谢之情无法言表。这个由我手动整理的导航,希望能够给喜欢自留地的朋友们带来便利。

20.4.18 日更新:

在20年三月初,自留地迎来了一批优秀新主编的加入,我们也改变了以往零碎、众多且不定期发布消息的模式。一个人可能会爬得很高,但我深知只有一群人才能走得更远!

Hungrymark-书签化文件/网页/软件的macOS应用

大概在一周前我偶然得知了这个新开发的软件:Hungrymark,和它的名字一样,这是一个收藏怪专用的软件。借助 Hungrymark,我们可以将自己常用或者生僻难找的「网页/文件/软件」书签化收藏,并且方便随时调用。

今天来和大家分享下我是怎么用这款软件的,这也是本博客为数不多的软件介绍博文。主要是最近忙于 Telegram 频道和其他事宜,一心不能二用,博客更新放缓。

欢迎关注 TG 频道:Newlearnerの自留地

《Hungrymark-书签化文件/网页/软件的macOS应用》

简介与软件特色

Hungrymark 是一款能够快速访问你收集的网址、本地常用文件、文件夹、APP的软件。难得的是开发者并没有强调「效率工具」,这个词和「装机必备」一样让我反感

特色

1、收藏网址 / 本地app / 文件和文件夹
2、快速访问收藏的书签,文件书签可以直接运行,或者在finder中查看
3、访问web书签可以选择使用哪种浏览器
4、方便的访问本地磁盘文件,挂载在本地的网络磁盘(Samba共享服务,或者AFP共享服务等)
5、支持(多级)分组,组内可以使用分割线进行再分组
6、可以建立多个规则文件,譬如「工作」「家」「孩子」
7、提供选择本地文件路径,自动复制到剪贴板,方便的粘贴到书签文件中
8、配置文件采用类 Markdown 语法书写,简单易懂
9、菜单栏直接调用,方便快捷

v1.2 新增:
1、支持拖拽网页收藏
2、支持拖拽文件、文件夹、APP 收藏
3、添加悬停预览功能
4、支持浏览器(Chrome / Safari)书签导入
5、支持直接执行脚本书签

这款软件最能打动我的地方就是上手简单并且功能对口,个人不喜欢各种花里胡哨需要配来配去的「效率软件」,偏实用主义。此外这个规则的书写方式我也很喜欢,虽然 GUI 可能会更方便些。这让我想起了曾经 Surge 和 Clash 手动撸配置的日子。

TODO

1、 icloud 同步
2、文件预览
3、分组加密
4、浏览器插件
5、插件功能

针对新功能今后博客会随之更新,并用删除线划掉已经实现的功能。

如何使用

在 v1.2 之后,Hungrymark 才用了图形化交互方式,创建书签组和添加内容均可以通过拖拽等方式完成。因此以下 Markdown 文件的书写仅做参考,非必须。

纯文本配置规则

1. 注释以 “//”开头 (必须在行首,不能在元素中间)
2. 空行将被忽略
3. 组名之前必须有 “*”
4. 组里元素可以是书签或者是组
5. 书签项规则 : 文件路径或网址 + 空格 + 标题 (标题可以忽略)
6. 组元素必须用 Tab 或者空格缩进 (不要混合使用 Tab 和 空格)
7. 使用”—“来创建分割线

配置示例

// 简单示例
  /Applications/Calendar.app "Apple Calendar"
  /Applications/Calculator.app
  ---
  https://www.apple.com "Apple website"
  https://www.icloud.com
  ---
  https://www.bing.com "Bing search"
  https://www.xbox.com/ "Xbox official Website"
  ---
  /Applications/Skype.app
  "/Applications/Visual Studio Code.app"

// 分组示例
* "Apple Web & App"
  https://www.apple.com "Apple website"
  https://www.icloud.com
  ---
  /Applications/Calendar.app "Apple Calendar"
  /Applications/Calculator.app

// 多级分组示例
* "Microsoft Web & App"
  * "Web"
    https://www.bing.com "Bing search"
    https://www.xbox.com/ "Xbox official Website"
  * "App"
    "/Applications/Skype.app"
    "/Applications/Visual Studio Code.app"

在书写文件/文件夹/APP 路径时,尽量调用软件自带「获取文件路径」工具,因为这个软件的路径书写和 Terminal 不是很一样,尤其是带空格的软件。总的来说没有太高的技术要求,甚至可以直接用 macOS 自带的「文本编辑器」写。

写好之后保存配置,到顶部菜单栏 Hungrymark 图标处查看是否能正常显示:

《Hungrymark-书签化文件/网页/软件的macOS应用》

设置选项

  • 选择书签文件:针对不同的「场景」可以有不同的选择
  • 书签点击行为:直接打开文件/打开文件所在文件夹
  • 显示URL:显示/不显示文件、APP、网页的具体地址
  • 文件列表排序:支持按修改时间/创建时间/文件名升序/倒序排列
  • 默认浏览器:网页默认打开的浏览器,支持 Chrome / Firefox / Safari / 随系统设置

考虑到以后要加入更多的功能,我还是希望开发者能把这个设置单独做成一个弹窗界面显示,不过目前的这种菜单栏多层级显示和软件的主题很搭配。

我的配置

在购买之前我大概有了一个简单的规划:可以收纳一些相对不常用的 APP,配合 Dock 就不需要常去 Launchpad 到处找了。此外直接访问某个目录也很好,譬如我有访问 .ssh 和 Chrome 浏览器 插件crx 目录的需求,而他们要么需要手动取消隐藏,要么及其难找。然后就是搭配各种 Automator 使用,这个我觉得也可以再开一篇博文专门来讲

浏览器书签

《Hungrymark-书签化文件/网页/软件的macOS应用》

* "浏览器书签"
  https://www.newlearner.site "我的博客"
  https://www.newlearner.site/wp-login.php "博客后台"
  https://www.v2ex.com "V2EX"
  https://www.hostloc.com/forum.php "全球主机交流论坛"
  https://www.gcores.com "机核网"
  https://twitter.com "Twitter"
  https://www.zfrontier.com "装备前线"
  https://mail.yandex.com "Yandex"

都是一些每天需要访问的网页,有的因为信息量过大,強上 RSS 会爆炸。好处在于不需要去 Chrome 书签栏里面到处找,因为我的书签栏分层现象十分普遍(败笔)。

常用软件

《Hungrymark-书签化文件/网页/软件的macOS应用》

* "常用软件"
  /Applications/校园网登录.app "登录校园网"
  /Applications/Reeder.app "Reeder"
  /Applications/FinalShell.app "FinalShell"
  "/Applications/Moon FM.app" "Moon FM"
  "/Applications/Sublime Text.app"   "Sublime Text"
  "/Applications/Utilities/Disk Utility.app" "磁盘工具"
  "/Applications/Utilities/Script Editor.app" "脚本编辑器"
  /Applications/解锁Dock.app "解锁Dock"
  /Applications/锁定Dock.app "锁定Dock"

准确的说应该是「次常用软件」,我的 Dock 塞得够满了,朋友常常感叹这么小的图标怎么点。在里面我加上了日常要用的譬如文本编辑器和SSH工具,剩下的基本是一些 Automator 软件了,我觉得有必要简单讲一下。

Automator(自动操作)是 macOS 上面一个自动流程的工具,我们可以借助它做一些简单的小 app,譬如「校园网自动登录」「一键锁定 Dock」「一键关闭所有通知弹窗」「一键提取 iTunes 旧版 PKG」「一键生成 ISO 镜像」等,有些在前面的博文中讲过实现方式。

  • 拿「校园网自动登录」举一个例子,首先编写这个脚本:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
import base64
import requests
 
USER_ACCOUNT='电话'
DOMAIN_SELECTION='CMCC/ChinaNet/Unicom'
USER_PASSWATD='密码'
 
#登录地址
post_addr="登录网址"
 
#构造头部信息
post_header={
    'Host': '登录域名',
    'User-Agent':'Mozilla/5.0 (X11; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0',
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Language':'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
    'Accept-Encoding': 'gzip, deflate',
    'Content-Type': 'application/x-www-form-urlencoded',
    'X-Requested-With':'XMLHttpRequest',
    'Referer':'自己抓',
    'Content-Length': '67',
 
    'Cookie':'自己抓',
    'Connection':'keep-alive',
}
 
 
post_data={'domain':DOMAIN_SELECTION,
           'enablemacauth':'0',
           'password':base64.b64encode(USER_PASSWATD.encode()),
           'username':USER_ACCOUNT
          }
#发送post请求登录网页
z=requests.post(post_addr,data=post_data,headers=post_header)
#z.text为str类型的json数据因此先编码成byte类型在解码成unicode型这样就可以正常输出中文
s=z.text.encode('utf-8').decode('unicode-escape')
print(s)

接着放到固定的路径,在 Automator 中创建应用程序,选择「运行 shell 脚本」输入运行命令并保存为 APP。接着交给 Hungrymark 保存到书签,用的时候一点即可。

  • 再比如「一键关闭所有通知弹窗」,如法炮制即可:

//使用 applescript 运行

on run {input, parameters}
	tell application "System Events"
		tell process "NotificationCenter"
			set theWindows to every window
			repeat with i from 0 to number of items in theWindows
				try
					set this_item to item ((number of items in theWindows) - i) of theWindows
					click button 1 of this_item
				on error
					-- nothing
				end try
			end repeat
		end tell
	end tell
end run

因此我和我的朋友都认为这是一款「懒人必备」软件,它和其他软件相互搭配,可以玩出各种花样(证明你到底有多懒)。

文件目录

《Hungrymark-书签化文件/网页/软件的macOS应用》

* "文件目录"
  
  /Users/xxx/.ssh "SSH"
  /Users/xxx/Documents/Surge "Surge 配置" 
  "/Users/xxx/Library/Application Support/Mellow" "Mellow 配置"
  "/Users/xxx/Library/Application Support/Google/Chrome/Default/Extensions" "Chrome 扩展"
  /Users/xxx/uds "UDS"

选了几个典型而常用又及其难找的文件/文件夹,方便随时打开并编辑

总的来说

适合自己的就是最好的,这个软件做的事情就是「聚合」,把一些杂七杂八的东西整齐呈现在用户的眼前。这样在我们需要用到的时候就不用浪费时间多次寻找,我觉得有些「一劳永逸」的意思。

一块钱真的很良心了,开发者本来打算自用,家人用了之后也觉得不错并建议他上架,我们才得以见到一款优秀的 mark 软件。将来软件也会不断更新,加入新的功能。因此如果有这方面的需求,不妨支持一下。

个人来讲其实还有一个小小的建议:希望能够自定义应用中各项的 logo,因为有些真的大果粒感严重。

GoIndex - GoogleDrive直链目录索引网盘

本站一直采用  开发的 OneIndex 作为网站的分享网盘,今天和大家来说说 donwa 大佬的又一力作:GoIndex。从此,GoogleDrive 也有了免费的直链目录索引前端,可以直接分享给别人,也可以自己作为私密盘使用。感谢各位开发者的辛勤劳动。

当然,本文不会局限于 GoIndex 这个项目,同时也会和大家介绍一下类似的可用于谷歌云盘直链下载的前端、接口。

交流群:Newlearnerの水群

《GoIndex - GoogleDrive直链目录索引网盘》

简介

GoIndex,即 Google Drive Directory Index,是部署在 CloudFlare Workers 的程序,调用了rclone的接口。可以将 Google Drive 文件以目录形式列出,并直连下载。流量走 CloudFlare ,网速由 CloudFlare 决定。因此,该项目的可用性完全取决于 CloudFlare 是否提供免费的服务。如果将来 CloudFlare 上市之后取消了免费计划,那么该方案成本会上升一个台阶。

目前是测试版,页面的风格和 OneIndex 类似,但是作者没有做容错和缓存,也没有做管理后台。这些是可以通过添加一些代码来解决的,期待后续作者的更新。

9月9日更新:1.0.2版本,加入了添加前端文件缓存功能和文件预览功能(临时)

9月12日更新:1.0.6版本,加入新主题 classic

Github地址:https://github.com/donwa/goindex

Demo地址:https://index.gd.workers.dev(material)https://indexc.gd.workers.dev(classic)

下面来说说 GoIndex 的优点:

  • 开源免费
  • 可直链下载文件,免翻
  • 目前支持mp4视频在线播放
  • 调用 CloudFlare Workers,没有额外成本
  • 从零到一的飞跃,即质变
  • 利用无限盘或共享盘的机制可以做大型分享云盘

部署流程

1、访问 https://install.gd.workers.dev,点击获取验证码

《GoIndex - GoogleDrive直链目录索引网盘》

2、点击之后跳转到谷歌验证界面,允许rclone应用程序访问,会获得一串认证码,复制到「Auth认证码」一栏。关于「目录ID」打开团队盘(文件夹或别人共享的文件夹),看地址栏。https://drive.google.com/drive/folders/{这后面一堆代码就是id},将这串代码复制到「目录ID」这一栏。接着填写「根目录密码」,默认为 index。最后点击生成代码

《GoIndex - GoogleDrive直链目录索引网盘》

3、将生成的JS代码保存,用同一个谷歌邮箱注册 cloudflare。注册好之后,进入首页,点击「Get started with Workers」。

《GoIndex - GoogleDrive直链目录索引网盘》

作者在新版本正式加入了「主题选择」和「MP4在线播放」功能:

  • 主题选择(9.12更新)

在新 index.js 中作者加入了「根目录访问认证」这一功能,在第三步得到的JS代码中,有以下片段:

var authConfig = {
    "siteName": "GoIndex", // 网站名称
    "root_pass": "index",  // 根目录密码,优先于.password
    "version" : "1.0.6", // 程序版本
    "theme" : "material", // material  classic 
    "client_id": "202264815644.apps.googleusercontent.com",
    "client_secret": "X4Z3ca8xfWDb1Voo-F9a7ZxJ",
    "refresh_token": "", // 授权 token
    "root": "root" // 根目录ID
};

在「themes」选项后面填写主题的名称,可供选择的主题有”material”和”classic”,自行查看 Demo。在这里我们还可以命名网站名称,设置根目录密码。

  • MP4在线播放(9.9更新)

作者在1.0.2版本中加入了文件预览功能,其中包括视频在线播放。大家更新到1.0.2或更高版本之后无需使用以下代码即可实现mp4在线播放,也就是重装GoIndex,会自动安装最新版。

(以下代码适用于1.0.1及以下版本)把以下代码放入<head></head>之间:

<script src="https://cdn.staticfile.org/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdn.staticfile.org/layer/2.3/layer.js"></script>
    <script>
  $(function () {
    $('.mdui-list').on('click','li',function(){
      var href = $(this).children('a').attr('href');
      console.log(href);
      if(href.lastIndexOf(".mp4") > -1) {
              layer.open({
                type: 1,
                title: decodeURI(href.substring(href.lastIndexOf("/") + 1, href.length)),
                shadeClose: true,
                shade: 0.8,
                area: ['100%', '100%'],
                content: '<center><video controls autoplay=true preload=auto style="width:80%;object-fit: cover;" src="' + href + '"></video></center>'
              });
              return false;
            }
    });     
  });
    </script>

4、进入 Workers 之后,会看到一个名为 worker.dev 的域名,这是CF提供的域名,一旦确认不可修改。接着输入一个自定义前缀(例如xxx),点击 Set up domain。在 Script 里复制刚才的代码code,右下角Run可以在右边看到浏览状态,左边上方可以修改地址,例如修改为111并保存。那么 111.xxx.workers.dev 就是你的域名地址了。打开这个域名,你就会看到谷歌网盘目录索引网页!

《GoIndex - GoogleDrive直链目录索引网盘》

5、如果不想使用预设的 worker.dev 域名,在执行完以上操作之后,绑定一个自己的域名到 CloudFlare。进入 DNS 管理页面,选择「Workers」。点击右侧的「Add route」,并根据提示设置route。route一项请填写你绑定cf的域名,自定义前缀,提前解析好,结尾跟上 /*。例如:gd.newlearner.site/*

《GoIndex - GoogleDrive直链目录索引网盘》

《GoIndex - GoogleDrive直链目录索引网盘》

6、设置文件夹密码

上面提到我们可以设置「首页登录认证」,对于文件夹,作者依然沿用了之前OneIndex的.password方案。将写有密码的.password文件上传到GD目录,则该目录需要密码验证后方可访问。

密码文件只能保护该文件不被列举,不能保护该文件夹的子文件夹不被列举,也不保护文件夹下文件不被下载。

程序文件中 root_pass 只为根目录密码,优先于 .password 文件

安全与隐私问题

有人可能会质疑,直接从  install.gd.workers.dev 通过验证,是否存在风险?

风险是有的,因为该网页可以保存谷歌用户的 refresh_token 从而读取你的GD文件,这从技术上可行。但我也提到了,作者是 OneIndex 开发者,做的贡献有目共睹,没有必要做这样的事情。作者本人也公开表示这个网页不会自动保存用户的 refresh_token。

同时,该程序也调用了rclone的 client_id 和 client_secret,如果对这个程序也有疑问,可以选择不用或者自己造轮子。

下面来讲一下不通过 install.gd.workers.dev 网页部署该程序的大致流程:

  • 在本地安装 rclone
  • 按照 https://rclone.org/drive 流程进行授权
  • 执行 rclone config file 查看 rclone.conf 路径,找到root_folder_id和refresh_token记录下来
  • 下载 https://github.com/donwa/goindex 中的 index.js 并填入 root 和 refresh_token
  • 复制代码 到 CloudFlare 部署

如果之前已经成功部署,也可以到这里取消授权:https://myaccount.google.com/security

拓展

利用 CloudFlare Workers 是个好思路,基于此又有一些成品轮子和大家见面,这利一并介绍下。

  • 萌咖 GoogleDrive API

萌咖大佬也用 workers 造了一个直连下载谷歌云盘文件的轮子,不过没有前端页面,只有一个 API 接口。

普通模式API:https://api.moeclub.org/GoogleDrive/<FileID>,走 谷歌CDN

高级接口模式API:https://api.moeclub.org/GoogleDrive/<FileID>/NoLimit,走 Cloudflare CDN,支持断点续传

这里的<FileID>是谷歌云盘分享链接中 id= 后面的一串字符,举个例子:https://drive.google.com/open?id=1x5SoOpOWSS5jxJSU7XyHlhG2EiPgHGGM,则<FileID>为1x5SoOpOWSS5jxJSU7XyHlhG2EiPgHGGM。

⚠️注意:一定要通过分享链接获取文件ID,经本人测试:团队盘、他人分享的文件不可以使用此API,只适用于个人(自己)网盘的分享

  • CF – Workers

沿用的依然是上面的部署方式,但作者自己写了一个 index.js,把页面做成了一个搜索框样式直链下载。支持在线播放视频和直链下载文件。

《GoIndex - GoogleDrive直链目录索引网盘》

Github:https://github.com/reruin/workers/blob/master/link/index.js

Demo:https://link.reruin.workers.dev

安装的时候把上文粘贴的代码换成项目中的JS代码即可。

使用

link.reruin.workers.dev/gd/<FileID> 中转下载
/gda/<FileID>?output=redirect 原始链接下载
/gda/<FileID>?output=json 获取文件详细信息(JSON格式)
/gda/<FileID>?output=preview 预览该文件(仅支持图片、视频、音频)
/gda/<FileID>?output=media 尝试使用转码模式播放视频文件(如wmv,rmvb)

羊毛虽好,请勿竭泽而渔。善待cf,从我做起。想要用得好,请自行申请EDU无限谷歌云盘或者加入他人的团队盘!

 

参考文章:

GoIndex预览版

GD 直链工具 cf-worker 版

回应下GoIndex获取token的风险问题以及临时解决方案

 

利用Yandex搭建个人域名邮箱服务

今天我利用Yandex搭建了一个域名邮箱服务,事实证明有一个自己的域名邮箱好处多多,比如自定义前缀,在需要重复注册某网站/服务时优势尽显。

在刚刚搭建好博客之后,我大奥降级跑去贴吧发了个贴,大致的意思是欢迎大家来讨论macOS。瑞先森跟我说其实有了域名之后可以优先考虑搭建一个域名邮箱,比如i@newlearner.site。我当时不以为意,觉得gmail等邮件服务足够我使用了。

去年双十一的时候着实让我感受到了域名邮箱的方便,你可以通过两个邮箱注册两个搬瓦工账号购买两套双十一套餐,防止将来出手的时候死在一个账号而无法出手,只能出租。What’s more,这玩意不需要手机号。不需要额外的邮箱或者QQ,即开即用,十分方便。

因此我开始研究如何搭建域名邮箱,一开始考虑的自然是服务器邮件方案。当时重点关注了几个主流的搭建方案,最后发现问题很多:TOS、搭建的繁琐性、spf与dkim的设置等,更不用提服务器需要自己维护所带来的备份等工作。于是不了了之。

今年上半年注册了yandex邮箱,偶然看见该邮件供应商提供个人域名邮箱服务,于是开始了我的搭建个人域名邮箱之路。

交流群:Newlearnerの水群

《利用Yandex搭建个人域名邮箱服务》

简介

Yandex(俄语:Яндекс)是一家俄罗斯互联网企业,旗下的搜索引擎在俄国内拥有逾60%的市场占有率,同时也提供其他的一系列互联网产品和服务。

Yandex mail注册入口(必须):mail.yandex.com

个人域名邮箱申请入口:Connect Yandex

今天的重点是Yandex的域名邮箱注册。

相对优势

  • 由大型企业/服务商维护,无需自行维护
  • 免费,并可提供1000个自定义前缀邮箱,每个用户10G容量
  • 成品spf、dkim,降低被认证为垃圾邮件的几率
  • 注册相比自行搭建步骤简单
  • 搭建好后多开邮箱账号无需门槛

当然有一些企业或者个人出于种种考虑会选择自行服务器搭建,这也无可厚非,无需捧一踩一

申请流程

1、注册Yandex邮箱

传送门:https://passport.yandex.com/registration

《利用Yandex搭建个人域名邮箱服务》

可以选择用电话号码或者设置安全问题两种方式注册,笔者是使用Google Voice注册的。

2、注册域名邮箱

个人域名邮箱申请入口:Connect Yandex,输入你的顶级域名注册。

《利用Yandex搭建个人域名邮箱服务》

接着就是验证该域名所有权,一共有四种方式:

  • Html files:放一个指定名称的html文件到服务器根目录
  • Meta tag:在网站首页加入指定的meta头
  • Whois:不推荐,因为大部分的whois都被商家做了保护
  • DNS record:在DNS解析中加入指定的TXT项

对于不懂得网站搭建的朋友,前两种方法注定是行不通了,只能在DNS管理后台做dns记录。如果你有自己的网站,优先选择方案二,加入一个meta头即可。

下面来讲解一下DNS record的设置方法,进入DNS的后台面板,点击添加TXT记录:

Name(host)填写yandex-verification

Value填写验证页面给定的值,比如5c10414be60d8631

做好验证之后就是等待通过验证的过程,此过程可能短至一天,长至数月,请耐心等待。笔者在今年上半年申请之后没有立即通过,直到最近群友提起才重新拾起查看。

当你点击这里,出现如下图显示画面时,说明你已经成功申请域名邮箱:

《利用Yandex搭建个人域名邮箱服务》

配置MX、SPF与DKIM记录

1、配置MX记录

进入DNS管理后台,找到mail设置或者可以填写MX记录的地方,Name(Host)填写@或者你的顶级域名,Value填写mx.yandex.net.,Priority填写10《利用Yandex搭建个人域名邮箱服务》解析好之后静待生效即可。

2、配置SPF和DKIM

SPF记录有助于降低从域名邮箱发送的电子邮件被标记为垃圾邮件的风险,因此一定要设置。进入DNS管理后台,添加新的TXT记录。Name(Host)填写@或者顶级域名,Value填写v = spf1 redirect = _spf.yandex.net

具体可以参考官网:传送门

使用DKIM签名,电子邮件收件人可以验证邮件是否真的来自所谓的发件人。进入DNS管理后台,添加新的TXT记录。Name(Host)填写mail._domainkey,Value填写Yandex.Connect设置中复制的公钥中的文本块。

公钥获取地址:传送门

具体可以参考官网:传送门

《利用Yandex搭建个人域名邮箱服务》解析好之后静待生效即可。

自定义域名邮箱前缀

如果你完成了以上所有步骤并且通过了Yandex的官方验证,那么恭喜你,你已经有了属于自己的域名邮箱。下面要做的工作就是通过简单的设置自定义域名邮箱的前缀。

进入这里(Все сотрудники),点击「Add」添加一位用户,并完成域名前缀和密码的设置。

《利用Yandex搭建个人域名邮箱服务》《利用Yandex搭建个人域名邮箱服务》

创建好之后回到Yandex mail官网登录,用户名和密码填写刚刚创建的信息即可。切记一定要登录,因为这里有一个协议需要同意,同意后该自定义前缀的域名邮箱方可开通。

Enjoy it!

其他

POP3:pop.yandex.com SSL端口:995

SMTP:smtp.yandex.com SSL端口:465

IMAP:imap.yandex.com SSL端口:993

API:https://tech.yandex.com/domain/doc/about-docpage/

DNS record全指南:

《利用Yandex搭建个人域名邮箱服务》

 

参考文章:

维基百科

如有乐享

Yandex Wiki

ZeroTier—P2P内网穿透工具

最近没事逛B乎的时候看到有人在安利一款内网穿透工具叫做ZeroTier,是基于P2P(peer to peer)的,出于兴趣安装并了体验了这个所谓的「无需公网ip,端对端穿透,多达100台设备」的免费工具。

之前介绍了npsfrp这两款内网穿透工具,他们的共同特点都是需要一个带有公网ip的服务器做中心节点,通过反向代理的方式实现内网穿透,因而需要做各种端口映射。而ZeroTier则像一个全球大型交换机,通过P2PVPN这种方式实现你的多台设备连在同一个虚拟交换机下面从而实现穿透。

经过体验之后我先上结论:官方的中心节点服务器太慢,建议自建中心服务器Moon。那样的话不如直接用nps和frp,除非你对端口映射有心理阴影。

交流群:Newlearnerの水群

《ZeroTier—P2P内网穿透工具》

简介与原理

官网: https://www.zerotier.com/

官方Github:https://github.com/zerotier

Zerotier在笔记本电脑,台式机,电话,嵌入式设备,云资源和应用之间建立了Peer to Peer VPN(P2PVPN)连接,在客户端通过ZeroTier One在对等体之间建立直接连接,即使它们位于NAT之后。连接到虚拟LAN的任何计算机和设备通常通过NAT和路由器设备与Internet连接。ZeroTier One使用STUN打孔来建立NAT后对等体之间的直接VPN连接。

说的直白一点,就是通过P2P等方式实现形如交换机或路由器上LAN设备的内网互联。

《ZeroTier—P2P内网穿透工具》

ZeroTier 官方搭建了一个行星根服务器叫做“行星Planet“,行星根服务器唯一的且是免费的,它记录了所有的路径信息。除此之外还有 12 个遍布全球的付费根服务器。所以使用免费套餐,连接时的延迟可能会很高,尤其是移动,毕竟 Earth 在国外。不过ZeroTier 能自己创建根服务器“卫星 Moon”,提供了一个解决网络延时、卡顿和失联的可能解决方案。连接行星或卫星的服务器成为”叶子节点 Leaf“。

每个免费套餐可以享受100台设备的内网互联,还是挺良心的。

注册与客户端安装

  • 注册与Planet配置

登录官网注册即可,填写你的邮箱和密码。

《ZeroTier—P2P内网穿透工具》

注册好之后我们来建立一个Network并分配内网网段:

《ZeroTier—P2P内网穿透工具》《ZeroTier—P2P内网穿透工具》

《ZeroTier—P2P内网穿透工具》

以上信息中Network ID需要牢记,这是客户端连接到行星服务器的唯一识别码。

  • 客户端配置

ZeroTier支持Windows、macOS、Linux 三大桌面平台,iOS、Android 两大移动平台,QNAP(威连通)、Synology(群晖)、Western Digital MyCloud NAS(西部数据)三个 NAS 平台,还支持 OpenWrt/LEDE 开源路由器项目。

可以说是支持的很全面了,对于路由器想多说两句:除非你有两台路由器,一台放在家里,另一台放在公司等地,并且有大量设备连接于这两台路由器且需要内网穿透,否则不要在路由器上面部署ZeroTier,仅使用单设备客户端即可。并且为了连接的稳定性,强烈建议自己部署Moon节点。

下载地址:https://www.zerotier.com/download/

我们以iOS和Mac设备为例介绍一下客户端如何与Planet相连接并分配到内网地址:

iOS下载好ZeroTier One之后填入刚刚的Network ID,配置好VPN之后会启动连接,届时会根据MAC地址分配给设备一个唯一认证字符串Node ID,可用来在web配置界面保留该设备不被删除以及帮助我们区分设备。

《ZeroTier—P2P内网穿透工具》

 

macOS同理,并且可以使用命令行辅助:

《ZeroTier—P2P内网穿透工具》

# 启动
zerotier-one -d

# 获取地址和服务状态
zerotier-cli status

# 加入、离开、列出网络
zerotier-cli join # Network ID
zerotier-cli leave # Network ID
zerotier-cli listnetworks

  • 认证设备和组网

回到一开始注册的网页,会发现设备当中多了两台,在前面的方框打钩即可。根据Node ID判断设备的类型,牢记设备被分配的ip。

《ZeroTier—P2P内网穿透工具》

简单使用体验

很遗憾我这边的体验可以用极差来形容,并且对B乎人均几十ping、不断连还可以流畅传输文件产生怀疑。当然移动要负一部分责任,不过我觉得这还是和Planet远在国外水土不服有关系。

测试环境:MBP连接电信网络,iPhone连接移动4G网络

从图中可以看到丢包严重,ping一直在400ms左右波动,最后测试结果丢包率高达85%。并且iOS上面有断连的情况发生。

《ZeroTier—P2P内网穿透工具》

最后还是成功连接上了Mac的ssh,我觉得这样的内网体验大概也只能连接ssh了:

《ZeroTier—P2P内网穿透工具》

优缺点

优点

1、配置简单上手方便

2、支持多设备多平台

3、无需配置端口映射,组网即用

4、免费且可以无需公网服务器

5、安全性从某种程度来讲好于自己维护的服务器

6、给设备分配唯一标识符,无需DDNS

缺点

1、Planet服务器在国外,在国内使用不稳定

2、相对于frp、nps等项目应用范围较小,更偏向于组网

针对以上的优缺点,我的建议是:

想要稳定&体验好,建议直接上npsfrp这两款工具,或者使用国内的花生壳等付费服务。

纯组网并有简单穿透需求,又不想大费周章,可以采用ZeroTier。进一步追求稳定,自己搭建Moon服务器。

Moon服务器搭建

  • 部署

#下载并安装
curl -s https://install.zerotier.com/ | sudo bash
#加入创建好的局域网
zerotier-cli join <network id>
#生成并给配置文件赋权
chmod 777 /var/lib/zerotier-one
cd /var/lib/zerotier-one
zerotier-idtool initmoon identity.public > moon.json
#查看本机Node ID
zerotier-cli info

生成好moon.json之后我们需要手动修改一项参数:

将下面的 “stableEndpoints”: [“公网ip/端口”] 补全完整并保存,并检验id是否有误

{
 "id": "",
 "objtype": "world",
 "roots": [
  {
   "identity": "",
   "stableEndpoints": ["公网ip/端口"]
  }
 ],
 "signingKey": "",
 "signingKey_SECRET": "",
 "updatesMustBeSignedBy": "",
 "worldType": "moon"
}

#生成moon.json
zerotier-idtool genmoon moon.json
#新建文件夹
mkdir moons.d
mv xxxxxxxxxxx.moon moons.d
#kill
killall -9 zerotier-one
#启动
zerotier-one -d

  • 使用

zerotier-cli orbit <id> <id>

*id为之前配置文件中的参数

  • 检验

zerotier-cli listpeers

列表中出现带有”MOON“字样的公网ip节点则说明部署成功。

关于ZeroTier就尝试了这么多,很多人可能关心路由器的配置,鉴于本人条件有限不能一一尝试。现在很多路由器固件提供了ZeroTier的下载,弄好防火墙和路由表即可,不过注意穿透两边的内网地址网段不要相同。

 

参考文章

维基百科
ZeroTier Wiki

❌