VKontakteのクイズボット

「Smeshariki」のコミュニティ管理者
, — .



前書き



約3か月前、VKontakteネットワークの友達が一般的なチャット(会話)で推測ゲームをプレイしました。これは、私たちみんなが大好きな漫画「Smeshariki」をベースにしたゲームです。ルール:ホストは漫画のキャラクターの引用を書き、プレーヤーはこの引用がどのシリーズからのものかを推測します。私はゲームをもっと面白くして、それを主要なボットの役割に割り当てることにしました。



グループ作成



ボットのグループまたはコミュニティを作成するには、VKontakteの[コミュニティ]セクションに移動し、右上隅にある[コミュニティの作成]ボタンをクリックする必要があります。



画像



コミュニティの種類「インタレストグループ」を選択します。



画像



名前を考え出し、トピックを選択し、グループのタイプを開いたままにします。



画像



次に、IDを見つけて、グループトークンを作成する必要があります。



アドレスバーの「クラブ」の後にIDが表示されている場合は、トークンについて少し心配する必要があります。



画像



グループ管理に移動



画像



します。「APIの操作」セクションを選択し、そこでボットが機能するように「LongPollAPI」を有効にします。



画像



次に、[アクセスキー]に移動し、次の設定でアクセスキーを作成します



画像



。結果のアクセスキーはトークンです。



画像



残っているのは、グループを会話に追加できるようにすることだけです。



「メッセージ->ボットの設定」セクションに移動し、「ボット機能」をオンにして、「会話へのコミュニティの追加を許可する」をクリックします。保存します。



画像



vk_apiモジュールのインストール



Vkontakte APIを操作するためのモジュールをインストールするには、コマンドラインに次のコマンドを記述する必要があります。



pip3 install vk_api


また、botディレクトリにファイル「points.pickle」を作成する必要があります。



基本機能



ソフトウェアの部分に移り

ます。必要なプラグイン(pickle、random、requests、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」という単語と等しい場合、ボットは推測する必要のある見積もりで応答します(これはすべて「ifisinstance」をチェックした後)。




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コミュニティ「Abodeof Quests | Smesharikiで見ることができます



ちなみに、彼はチャットだけでなく、プライベートメッセージでも働いています。



また、ここでは取り上げていないことがいくつかあります。



All Articles