前述

众所周知,Telegram 的中文搜索非常稀烂。其原因,跟它最开始设计「搜索」这个功能的时候就有关系。Telegram 的发言搜索,实际上是按照单词分组的(空格或符号作为分隔符),后端把这些词再加以存储归类(并非我们通常所以为和常用的逐字匹配

举个简单的例子,现在你看到一条消息:

从中文的角度来看,第二句是:我加了一堆愿望单,如果也发一句英文版就是 I added a lot to wishlist。这个时候,你如果在 Telegram 的搜索功能里搜索愿望单是搜不到的,但是你搜索 wishlist 却可以(当然前提是你发了英文版)。

为什么?正如前面所说的,Telegram 的发言搜索,实际上是按照单词分组的,也就是说,这个句子里面,我加了一堆愿望单 对于 Telegram 来说是一个完整的词语,你只有在搜索功能里搜索完整的这一段文字才能搜到。

但是正常人都不可能在搜索的时候记得自己完整的句子内容……

从原理上反推,如果你 打字 的 时候 记得 给 词语 分词,那么 你的 话 也 比较 容易 可以 搜索 出来。但 正常人 都 不会 这么 说话。

所以 luoxu 这类程序就是预先把聊天记录存进数据库,后面再依赖数据库来搜索(

准备

此文章所用环境为 CentOS 7.9,请确保你的机器能连接 Telegram 的 Bot API

安装 gitscreenvim

yum update -y
yum install -y git screen vim

找个文件夹存储你的小东西们,请自行修改:

mkdir /home/TigerBeanst/telegram-bot
cd /home/TigerBeanst/telegram-bot

拉取 luoxu 和 luoxu-bot:

git clone https://github.com/lilydjwg/luoxu.git
git clone https://github.com/TigerBeanst/luoxu-bot.git

Python 版本

luoxu 可能需要 Python 3.8 以上的版本,如果机器上的 Python 版本不够(使用 python3 -V 检查),可以参阅博客文章更新:

最后,前往 My Telegram

获取 API development tools 中的 api_id 和 api_hash

luoxu

安装依赖:

cd cd /home/TigerBeanst/telegram-bot/luoxu
pip3 install -r requirements.txt

修改配置文件:

cp config.toml.example config.toml
vim config.toml

按下键盘上的 i 进入编辑模式,移动光标到对应位置修改好以下字段:

  • api_id(前面获取了)
  • api_hash(前面获取了)
  • account(需要带+号,即带国家地区代码的)
  • session_db(随意)
  • index_groups(需要未设置禁止引用的群组,设置了的群组可能会一直抓空)

index_groups 字段是你实际要索引的群组 ID 或 公开链接(带 @ 的那种),如果你使用第三方 Telegram 客户端可以直接获取到群组 ID 的话,可以直接在此输入(注意,这个 ID 前面是不带 -100 的。如果你查看的结果是带了 -100 的,移除掉 -100 后剩下的部分就是群组 ID 了)。

当然作者也有预先写好了相关的模块用于获取群组 ID:

python3 -m luoxu.ls_dialogs

首次使用可能会需要输入登录验证码(和密码,如果设置了的话)

修改好后,按下 Esc,再输入 :wq 回车保存

PostgreSQL

参考 https://ken.io/note/centos7-postgresql12-install-and-configuration

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

yum install -y postgresql12 postgresql12-server

然后还要安装 PGroonga 扩展:

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(cut -d: -f5 /etc/system-release-cpe | cut -d. -f1)-$(rpm -qf --queryformat="%{ARCH}" /etc/redhat-release)/pgdg-redhat-repo-latest.noarch.rpm

yum install -y https://packages.groonga.org/centos/groonga-release-latest.noarch.rpm

yum install -y postgresql12-pgdg-pgroonga

然后再来初始化 PostgreSQL 和设置开机自启:


/usr/pgsql-12/bin/postgresql-12-setup initdb
systemctl start postgresql-12
systemctl enable postgresql-12

提前把 luoxu 文件夹的权限给到 postgres 用户:

chown postgres /home/TigerBeanst/telegram-bot/luoxu -R

安装完成后会生成 postgres 用户,切换过去:

su postgres
psql

创建数据库(以下指令都在 psql 里进行,注意部分句子句末有分号,请不要把 # 或者 $ 之前的东西一起复制了,这里一起贴出来主要是好理解当前在什么状态下):

postgres=# create database luoxu;  //创建数据库
postgres=# \c luoxu    //进入数据库

luoxu=# CREATE EXTENSION pgroonga;    //添加扩展
luoxu=# exit //退出

导入数据库:

bash-4.2$ psql luoxu < /home/TigerBeanst/telegram-bot/luoxu/dbsetup.sql;

回到原来的 root 用户,回到 luoxu 目录,使用 screen(或任何你喜欢的后台运行工具):

screen -R luoxu
su postgres

cd /home/TigerBeanst/telegram-bot/luoxu
python3 -m luoxu

如果提示 ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /usr/local/Python3.10.5/lib/python3.10/site-packages/opencc/clib/opencc_clib.cpython-310-x86_64-linux-gnu.so) 之类的,下载 后上传到 /usr/lib64/ 目录下,备份原有(mv libstdc++.so.6 libstdc++.so.6.bak)后,创建新的符号链接:ln -s libstdc++.so.6.0.26 libstdc++.so.6

screen 是用来挂后台运行的,如果成功开始索引了,直接关掉当前终端窗口就行,等着吧。

luoxu-bot

同理,进到 luoxu-bot 的目录,安装依赖

cd /home/TigerBeanst/telegram-bot/luoxu-bot
pip3 install -r requirements.txt

编辑配置文件 config.py

vim config.py

修改对应字段:

  • my_id:你的账号的 ID,可以通过向 @getuseridbot 发送 /start 来获得
  • api_id:上面拿过
  • api_hash:上面拿过
  • bot_token:上面还是拿过

直接使用 screen(或任何你喜欢的后台运行工具)运行 main.py

screen -R luoxu-bot
cd /home/TigerBeanst/telegram-bot/luoxu-bot
python3 main.py

当出现 开摆 时,代表项目已启动,可以向自己的 Bot 尝试发送指令(请提前向自己的 Bot 激活 /start

部分指令使用请参考:https://github.com/TigerBeanst/luoxu-bot#readme