在Python 3上的VK中创建一个简单的聊天机器人

为机器人程序创建基础将包括以下步骤:


  1. 在VK中创建机器人
  2. API密钥生成
  3. 通过LongPoolVK创建机器人程序

本文适用于谁?


本文是为初学者设计的。 该程序的工作方法非常简单,任何了解Python语法并懂一点OOP的人都可以根据需要实现它。 但是原则上,即使不了解OOP的任何原理,我认为您也可以学习如何添加简单功能,或者至少在极端情况下使用GitHub上的现成资源。

这篇文章是什么?


创建机器人的基础。 之后,可以根据需要对其进行编程。 使某些例程自动化或用作对话者。

改进(机器人的版本稍微复杂)。 我决定首先介绍该机器人的简单程序代码,然后通过添加可显着改善该机器人的功能来使其稍微复杂化。

增加天气转移功能。 我们将教机器人告诉我们天气。

在VK中创建机器人


我们将从创建一个机器人(即VK中的组)开始。

为此,请转到“组”→“创建社区”。

选择任何类型的社区,然后输入名称,组主题。

在打开的设置页面上,选择“使用API​​”

接下来,您需要创建一个API密钥。

然后选择需要访问API密钥的参数。

最有可能的是,您将必须使用手机在VK中确认操作。 然后将生成的API密钥复制到文件中。 我们仍然需要它。

然后,您需要允许消息。 为此,请转到“消息”并打开它们。

让我们继续进行bot的程序部分


我们不会通过对VK的请求来实现它,或者更确切地说,我们只是使用VkLongPool库来为我们做。

这需要vk_api库。 通过pip安装:

python -m pip安装vk_api

但是我个人使用Anaconda的虚拟环境。 这通常会在首次工作中引起问题。 通常问题是系统无法识别python命令。 并通过将其添加到PATH来解决此问题。

让我们深入到代码本身:

我们导入必要的模块:

import vk_api from vk_api.longpoll import VkLongPoll, VkEventType 

然后是代码:

 def write_msg(user_id, message): vk.method('messages.send', {'user_id': user_id, 'message': message}) # API-   token = "6a9c267cd469388709a9e9acaddbe0aa81a0abbf12239b3e597a31729ffbddb9c88e80a443554c918b8f7" #    vk = vk_api.VkApi(token=token) #    longpoll = VkLongPoll(vk) #   for event in longpoll.listen(): #     if event.type == VkEventType.MESSAGE_NEW: #      (   ) if event.to_me: #    request = event.text #    if request == "": write_msg(event.user_id, "") elif request == "": write_msg(event.user_id, "((") else: write_msg(event.user_id, "   ...") 

write_msg函数接收VK用户ID <user_id>,它将向其发送消息和消息本身。

 def write_msg(user_id, message): vk.method('messages.send', {'user_id': user_id, 'message': message}) 

以社区身份登录并设置longpool:

 # API-   token = "6a9c267cd469388709a9e9acaddbe0aa81a0abbf12239b3e597a31729ffbddb9c88e80a443554c918b8f7" #    vk = vk_api.VkApi(token=token) #    longpoll = VkLongPoll(vk)    : #   for event in longpoll.listen(): 

在其中,我们将定期检查事件。 我们可以使用event.type获取事件类型。

之后,在收到用户的消息后,我们将能够使用已经创建的函数write_msg向他发送相应的字母。

因此,我们用相同的简单实现在VK中创建了一个非常简单的机器人。 机器人的逻辑可以根据需要进行编程。

GH代码清单

现在让我们开始更实际的编程。


在文件vk_bot.py中创建一个类VkBot,它将作为我们的机器人。

 class VkBot: def __init__(self, user_id): print("  !") self._USER_ID = user_id self._USERNAME = self._get_user_name_from_vk_id(user_id) self._COMMANDS = ["", "", "", ""] 

并在其中添加方法,您可以通过vk id获取用户名。

 def _get_user_name_from_vk_id(self, user_id): request = requests.get("https://vk.com/id"+str(user_id)) bs = bs4.BeautifulSoup(request.text, "html.parser") user_name = self._clean_all_tag_from_str(bs.findAll("title")[0]) return user_name.split()[0] 

这是使用beatifulsoup4完成的。

如果不是,请安装:
python -m pip install bs4
有足够的文章值得研究。 使用它,我们将创建更多方法:

 #  : def _get_time(self): request = requests.get("https://my-calend.ru/date-and-time-today") b = bs4.BeautifulSoup(request.text, "html.parser") return self._clean_all_tag_from_str(str(b.select(".page")[0].findAll("h2")[1])).split()[1] #   def _get_weather(city: str = "-") -> list: request = requests.get("https://sinoptik.com.ru/-" + city) b = bs4.BeautifulSoup(request.text, "html.parser") p3 = b.select('.temperature .p3') weather1 = p3[0].getText() p4 = b.select('.temperature .p4') weather2 = p4[0].getText() p5 = b.select('.temperature .p5') weather3 = p5[0].getText() p6 = b.select('.temperature .p6') weather4 = p6[0].getText() result = '' result = result + (' :' + weather1 + ' ' + weather2) + '\n' result = result + (' :' + weather3 + ' ' + weather4) + '\n' temp = b.select('.rSide .description') weather = temp[0].getText() result = result + weather.strip() return result #       @staticmethod def _clean_all_tag_from_str(string_line): """   stringLine      :param string_line:   :return:   """ result = "" not_skip = True for i in list(string_line): if not_skip: if i == "<": not_skip = False else: result += i else: if i == ">": not_skip = True return result 

将_get_weather参数更改为所需的城市,稍后可以用城市调用此方法,默认情况下它将是您指定的值。

使用这些方法,我们可以获得时间和天气。 这些方法均来自我的主要bot项目。 您应该使用继承将它们组织在单独的包和类中。 但是为了举例说明,我决定将所有这些都放入一个机器人类中,这当然是不好的。

我们创建主要方法new_message,它将处理用户的消息并返回响应:

 def new_message(self, message): #  if message.upper() == self._COMMANDS[0]: return f"-, {self._USERNAME}!" #  elif message.upper() == self._COMMANDS[1]: return self._get_weather() #  elif message.upper() == self._COMMANDS[2]: return self._get_time() #  elif message.upper() == self._COMMANDS[3]: return f"-, {self._USERNAME}!" else: return "    ..." 

现在回到可执行文件:

导入我们的机器人的类:

 from vk_bot import VkBot 

让我们更改主循环:

 print("Server started") for event in longpoll.listen(): if event.type == VkEventType.MESSAGE_NEW: if event.to_me: print('New message:') print(f'For me by: {event.user_id}', end='') bot = VkBot(event.user_id) write_msg(event.user_id, bot.new_message(event.text)) print('Text: ', event.text) 

也就是说,现在我们将接收到的消息传输到bot对象,该对象将向我们返回所需的答案。

如果您想进一步改善Bot的功能,则仅需要使程序复杂化即可:

为每个_get_time和_get_weather函数创建单独的包和类。 组织来自普通班级的继承。 并在单独的类中定义每个新函数,当然最好也分成包。

添加具有用户ID密钥和机器人对象值的字典。 因此,不必在一个周期中每次都创建一个机器人对象。 此外,这将确保在复杂的设计中一次使用多个用户。

因此,选择一个好的代码架构,您可以创建一个多功能的机器人。

例如,我教我的机器人在计算机上播放音乐,坐在手机上打开网站。 发送早餐,午餐,晚餐食谱。

您可以自己编辑机器人。

文章中的Bot

GH上的主要bot项目(高级)

我会对您的想法感到高兴。 如有任何疑问,请写下。

Source: https://habr.com/ru/post/zh-CN427691/


All Articles