前述

    众所周知,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 /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 回车保存

    然后修改 /luoxu/db.py 中的 SEARCH_LIMIT,修改至 10,因为默认 50 会导致过长的搜索结果,Bot 发不出来

    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