您好,哈布罗夫斯克市民!
今天,我将尝试告诉您一个学生如何编写用于存储VK作业的机器人。
注意事项我将立即引起注意的事实是,对于严肃的项目, 不可能建立这样的基础架构,整个项目的创建仅是为了娱乐和消磨时间,并用于各种学校项目会议的演讲。
备注11/17/2019 15:55
他们在私人信息中给我写信说,在整篇文章中,他们所谈论的是什么样的作业还不是很清楚。
我将立即澄清,我在本文中讨论的所有任务都像常规日记一样填写,而旧任务“消失了”。
这就是用户接收他将需要执行的那些任务的方式。
该机器人是用PHP编写的,为了进行实验,我决定不使用CallBack API Webhooks,而是使用LongPoll接收更新。
由于我从来没有使用这种接收更新的方法来编写机器人,因此,我是否可以用PHP编写该机器人的疑惑使我感到痛苦,但最终一切顺利。 现在,我将继续探讨我的想法如何产生以及如何实现它们。
通常,第一个想法是编写一个机器人以在其中存储作业的想法。 好吧,如何存储。 像笔记一样的东西,但是在VK内部,因为我很少记笔记,它们对我来说不是很方便。
为了实现带有家庭作业的平庸机器人,我在数据库中创建了一个表,其中设置了项目的名称,家庭作业本身以及所有这些幸福的数目。 描述这不是很有趣,因此我将省略这一点,但是我将给出一个
强大的 ER图,说明数据库在开始时的样子。

然后我想,为什么不给其他人使用该机器人的机会。 好吧,他给了人们这个机会。 我稍微更改了数据库,但是所有围绕它旋转的表几乎保持不变。

从ER图中,您可以了解每个用户都属于一个组。 进入现有组是通过令牌进行的,对于每个新的令牌,都会生成一个唯一的令牌。 并且任务本身也属于一个或另一个组,因此用户不会看到他们和其他人的任务造成混乱。
我添加了代码,原则上也没有有趣的地方。 我这样做是为了避免出现旧任务,以免手动删除整个内容,但是,我认为,用SQL编写SELECT查询非常简单。
现在是时候好玩了:我开始添加会降低整体消息队列速度的函数,所以我决定将它们放在单独的脚本中,因为目前我无法使用多线程,但我选择了LongPoll。 (还有PHP的这种用法吗?)
这些功能包括:向群组的所有成员发送消息,以及生成QR码,对加入群组的密钥进行加密。
为此,我刚刚在数据库中创建了另一个表,在其中输入了邮件文本并指定了收件人。 该基地最终采用了这种形式。

通常,QR码的生成是在一个单独的过程中进行的,该过程还从VK接收有关传出消息的更新,并查看哪个消息包含该组的密钥。
到目前为止,一切看起来都差不多,但是后来我通过将JSON放入数据库中打破了关系模型。
我可以在数据库中放入哪种JSON? 我输入从VK接收到的附件参数,然后在发送消息时对其进行处理,以免加载主进程。
结果,整个事情看起来像这样。

大约采用相同的方法,然后我将文件附件添加到bot中的任务中。 任务会立即添加,如果文件符合Telegram Bot Api的格式和大小,则会逐渐附加文件。 我通过一组机器人将文件上传到Telegram,并保存了文件ID。
我将文件存储在Telegram中的原因是,保存我所有这些文件的服务器没有太多空间,因此在经济上很难扩展。
整个数据库开始看起来像这样:

但是现在我有一个任务:如何将文件还给用户? 然后,我做出了与添加文件几乎相同的逻辑。

然后为购物车添加了另一个机器人,但我将不再对其进行描述。
基本上,我认为数据库结构还不错,但是我不喜欢这里的东西。 也许对于一些新来者来说,在构想的发展过程中了解如何设计数据库结构会很有用,对于我听取对我的组织基础的批评并投入一些服务对我来说很有趣。
这篇文章很小,但是可以减少批评。
克拉茨1“直到我下午5点为止!”
为项目辩护后,我将在git上发布所有bot的源代码,写一篇文章不是罪过。
克拉特2在购物车的Habr聊天中向我提出了一些与处理文件有关的想法,我经常可以在那看到。
克拉斯3您可以
在此处戳一个直播机器人。 我很乐意提供反馈。