一个用于搜索电子书的 Telegram-bot

其实这篇文章应该很早之前就写的,但是我太懒了,一直拖到现在。TG-bot还是蛮好玩的,可以做到很多意想不到的功能。因为i-Book.in页面的后端是algolia的,他们对于免费用户最大的数据存储量只有1W条。而经过多次扩容,我目前的数据量已经有超过了很多了,但是我还是没有将它整改,因为Flask实在是太难了。而多出的数据没有索引的话我自己要找也很麻烦,所以我搭建了一个TG-bot,后端使用Elasticsearch储存数据,这样哪怕数百万条的数据,也能轻松应对,前端使用的是Telegram的API。

如果有兴趣可以 点击这里到TG群组里骚扰这个bot哦。

注:需要翻墙才可以使用Telegram

以下部分是这个bot的一些介绍。

使用方法

这个bot就只有一个命令,就是 /so,这个命令可以同时搜索书名和作者,根据你输入的内容,返回最接近的结果,建议输入完整的书名/作者以获取最精确的结果。当然,如果搜索的是数据库没有的书也会返回一些关键词接近的结果。

找不到想要的书这很正常,毕竟只是一个的样本量很小的数据库,要知道现在每年新增的出版物有几十万册之多,目前的总量连每年新增的十分之一都没有。我也没打算据此 盈利,只是对数据的整理以及提炼感兴趣。最近在爬取一些图书的信息,打算做一些数据的升华比如数据库里谁的书最多,那个国家的书最多,什么类型的书最多这样。

整个运行步骤简单来说就是:bot先接收私聊发来的信息返回给后端脚本,后端根据信息的内容去检索ES,再根据ES的返回数据解析出来的信息发送回接收到消息的频道。具体的细节不是很想写了,因为没有数据库,也没法复刻这个bot,所以我只打算写一些核心内容。

构建

安装 docker

因为ES我用的还不是很熟练,所以我直接使用的是docker版本,不用捣鼓java和断其八糟的配置项,直接pull就可以用了。

1     
2
curl -fsSL https://get.docker.com -o get-docker.sh     
sudo sh get-docker.sh

安装&配置 ES

docker安装完了之后就是要获取ES了:

1     
docker pull elasticsearch:6.7.0     

创建ES的挂载目录以及配置文件:

1     
2
3
4
5
6
7
8
cd  /     
mkdir-p mnt/elasticsearch
cd mnt/elasticsearch
mkdir config
mkdir master
mkdir slave
chmod 777 master
chmod 777 slave

config 里面分别放两个配置文件:

1     
2
3
cd config     
touch master.yml
touch slave.yml

matser.yml

1     
2
3
4
5
6
7
8
9
10
11
cluster.name: elasticsearch-cluster     
node.name: master
network.bind_host: 0.0.0.0
network.publish_host: `your ip`
http.port: 9200
transport.tcp.port: 9300
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: [" `your ip`:9300"," `your ip`:9301"]

slave.yml

1     
2
3
4
5
6
7
8
9
10
11
cluster.name: elasticsearch-cluster     
node.name: slave
network.bind_host: 0.0.0.0
network.publish_host: `your ip`
http.port: 9202
transport.tcp.port: 9302
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: false
node.data: true
discovery.zen.ping.unicast.hosts: ["`your ip`:9300","`your ip`:9301"]

注意!因为这个docker打包了java所以会特别消耗内存。

调高JVM线程数限制数量 (否则会报错)

1     
2
3
4
5
nano /etc/sysctl.conf     
#添加这个
vm.max_map_count=262144
#保存后执行这个命令
sysctl -p

初始化容器

master

1     
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 -v /mnt/elasticsearch/config/master.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /mnt/elasticsearch/master:/usr/share/elasticsearch/data --name es-master elasticsearch:6.7.0     

slave

1     
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9201:9201 -p 9301:9301 -v /mnt/elasticsearch/config/slave.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /mnt/elasticsearch/slave:/usr/share/elasticsearch/data --name es-slave elasticsearch:6.7.0     

后记

只有当数据量大了,数据才能玩出花,所以我最近收集的图书信息都不是根据我现有的数据抓取,而是看到一个就全站爬取,这样以后如果我有了电子书文件,直接匹配数据就可以输出了,不需要焦头烂额的找数据了。下一步打算将去除ipfs连接的图书信息在github开源 (我记得好像已经有现成的了,但我就喜欢造轮子!)

最近刚刚看完了猫腻的 间客,里面有一句话出现了很多遍:“社会阶层不平等的根源就是信息的不平等” 我很是赞同。我们没有办法将信息平等到每个人都一样多,但如果有能力获取到更多的信息,为什么不去做呢?我认为每个人都有这个能力,只是因为懒惰,因为怕麻烦,因为觉得很难,因为觉得很费时间所以放弃。看书是一件很费时间和精力的事情 (一定有人会反驳我的,说什么几天看完几百万字的书,不好意思,那些就是电子毒品,看完没有任何营养。),认认真真看书是能够将心神代入到书中的人物的,能够体会到作者透过文字传递出来的情感与感悟,也能够学到很多新的知识。这知识不一定是语数英,也许是某道菜的做法,也许是某个很冷门的小技巧,但只要掌握了,就是属于你的独一无二的知识。

可能需要使用Telegram提高了有些人使用这个bot的难度,但是我认为门槛是有必要的,如果你使用这个bot没有找到心仪的书,请不要私聊我让我添加,我不会添加的,我不喜欢一个个手动添加,那样很傻,除非我又找到了一批数据。但…如果有数百G的数据躺在我面前,我还是很馋的。

最后要是有会前端的大佬愿意接盘重构 i-book.in,可以联系我。

你可能感兴趣的:(计算机,软件,Free,i-book.in,电子书)