VKontakte测验机器人

“ Smeshariki”的社区管理员
, — .



介绍



大约三个月前,我在VKontakte网络上的朋友通过一般聊天(对话)玩了一个猜谜游戏-一种基于我们大家都喜欢的卡通“ Smeshariki”的游戏。规则:主持人写卡通人物的引号,玩家猜测该引号来自哪个系列。我决定让游戏变得更有趣,并将其分配给领先机器人的角色。



组创建



为了为我们的机器人创建一个组或社区,您需要转到VKontakte中的“社区”部分,然后单击右上角的“创建社区”按钮。



图片



我们选择社区“兴趣小组”的类型。



图片



提出一个名字,选择一个主题,保持组类型为开放状态。



图片



现在,我们需要找出ID并创建一个组令牌。



如果可以在地址栏中的“ club”一词之后找到ID,则您需要担心令牌。



图片



转到组管理:



图片



选择“使用API​​”部分,然后在其中启用“长轮询API”,以使漫游器能够正常工作。



图片



接下来,转到“访问密钥”,使用以下设置创建访问密钥:



图片



生成的访问密钥是我们的令牌:



图片



剩下的唯一事情就是允许将群组添加到对话中。



转到“消息->机器人的设置”部分,打开“机器人功能”,然后单击“允许向对话添加社区”。我们保存。



图片



安装vk_api模块



为了安装用于Vkontakte API的模块,您需要在命令行中编写以下命令:



pip3 install vk_api


您还需要在bot目录中创建一个文件“ points.pickle”。



基本功能



进入软件部分:我们

连接了必要的插件:pickle,random,请求和vk_api库,借助这些插件,您可以与VKontakte一起使用。



import random
import pickle
import requests
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType 
#  BotLongpoll -        .


我们创建带有引号和字典的字典来存储信息:



series = {"":[" 1", " 2"], "":[" 1", " 2"]}
series_in_chats = {} 
quotes_in_chats = {}
points = {}


引号本身包含在“系列”字典键的列表中,因此每个系列有许多引号。



需要变量“ series_in_chats”在单独的对话中存储有关系列的信息,变量“ quotes_in_chats”类似,仅用于存储有关报价的信息。



现在我们连接到该组:



vk_session = vk_api.VkApi(token=" ") #  ID 
longpoll = VkBotLongPoll(vk_session, "ID  ") #  
vk = vk_session.get_api()


您可以创建一个函数来更方便地发送消息:



def send(ch_id, msg):
    vk.messages.send(chat_id=ch_id, random_id=random.randint(1, 9999999), message=msg)


参数:
ch_id # ID ,     
msg #  




vk.messages.send(chat_id, random_id, message)


发送消息的方法。



必填参数:



chat_id - ID ,    ,
random_id -   ,        ,
message -  .


此处阅读有关该方法的更多信息



处理消息



while True: # 
    try: 
        for event in longpoll.listen():
	    if event.type == VkBotEventType.MESSAGE_NEW and event.from_chat:
		chat_id = int(event.chat_id) #ID ,    
                text = event.object.text.lower() # 
                man = event.obj.from_id #ID   ,  
                if chat_id not in series_in_chats:
                    episode = random.choice(series.keys()) #   
                    #  
                    quote = random.choice(series.get(episode)) #    
                    # 
                    series_in_chats.update({chat_id:episode}) #   
                    quotes_in_chats.update({chat_id:quote}) #   
                    #     ,      
                    #      .
    except:
        continue
        # try except -    - 
        #  ,   


现在,我们可以处理该组收到的消息,代表该组发送消息等等。



介绍眼镜



检查“如果chat_id不在series_in_chats中”后,需要插入以下代码:




                if points == {}:
                    with open('points.pickle', 'wb') as f:
                        pickle.dump(points, f)
                    with open('points.pickle', 'rb') as f:
                        
                        points = pickle.load(f) 
                if isinstance(points.get(man), int) == False:
                    points.update({man:0})
                    with open('data.pickle', 'wb') as f:
                        pickle.dump(points, f)
                        #     points
                        #   
                       


猜测



我们进行检查:如果对话中收到的消息等于“ guess”一词,则该漫游器将以需要猜测的报价作为响应(检查“ if isinstance”后所有这些):




if text == "":
    send(chat_id, ",     : "+ quotes_in_chats.get(chat_id))


剩下的只是检查序列的正确性-如果消息中包含序列的名称,则漫游器将回答该序列已被猜测:




if series_in_chats.get(chat_id) in text:
    
    send(chat_id, "  !")
    points.update({man:points.get(man)+1}) # 1 
    
    with open('points.pickle', 'wb') as f:
        pickle.dump(points, f) #     
    send(chat_id, "  !\n   : "+str(points.get(man)))
    #   :
    episode = random.choice(series.keys()) #   
    #  
    quote = random.choice(series.get(episode)) #    
    # 
    series_in_chats.update({chat_id:episode}) #   
    quotes_in_chats.update({chat_id:quote}) #   
    


结论



结果,该机器人将像这样工作:







当然,在此基础上,您几乎可以创建任何机器人-不仅仅是猜测。



可以在VKontakte社区“ Abode of Quests | Smeshariki ”中看到创建的机器人



顺便说一句,他不仅在聊天中工作,而且还在私人消息中工作。



它也有一些我没有在这里讨论的东西。



All Articles