Bot kuis untuk VKontakte

Administrator komunitas untuk "Smeshariki"
, β€” .



pengantar



Sekitar tiga bulan yang lalu, teman-teman saya di jaringan VKontakte dalam obrolan umum (percakapan) memainkan permainan tebak-tebakan - permainan berdasarkan kartun "Smeshariki", yang kita semua sukai. Aturan: pembawa acara menulis kutipan karakter kartun, pemain menebak dari seri mana kutipan ini berasal. Saya memutuskan untuk membuat game lebih menarik dan menugaskannya ke peran bot terkemuka.



Pembuatan grup



Untuk membuat grup atau komunitas untuk bot kami, Anda harus pergi ke bagian "Komunitas" di VKontakte dan klik tombol "Buat komunitas" di pojok kanan atas.



gambar



Kami memilih jenis komunitas "Kelompok kepentingan".



gambar



Muncul dengan nama, memilih topik, membiarkan jenis grup terbuka.



gambar



Sekarang kita perlu mencari tahu ID dan membuat token grup.



Jika ID dapat ditemukan di address bar setelah kata "club", maka Anda perlu sedikit khawatir dengan tokennya.



gambar



Pergi ke manajemen grup:



gambar



Pilih bagian "Bekerja dengan API" dan aktifkan "API Jajak Pendapat" di sana agar bot dapat bekerja.



gambar



Selanjutnya, buka "Access Keys", buat kunci akses dengan pengaturan berikut:



gambar



Kunci akses yang dihasilkan adalah token kami:



gambar



Satu-satunya yang tersisa adalah mengizinkan grup untuk ditambahkan ke percakapan.



Pergi ke bagian "Pesan -> Pengaturan untuk bot", aktifkan "Kemampuan bot" dan klik "Izinkan untuk menambahkan komunitas ke percakapan". Kami menabung.



gambar



Menginstal modul vk_api



Untuk menginstal modul untuk bekerja dengan Vkontakte API, Anda perlu menulis perintah berikut di baris perintah:



pip3 install vk_api


Anda juga perlu membuat file "points.pickle" di direktori bot.



Fungsi dasar



Pindah ke bagian perangkat lunak: Kami

menghubungkan plugin yang diperlukan: acar, acak, permintaan, dan pustaka vk_api, berkat itu Anda dapat bekerja dengan VKontakte.



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


Kami membuat kamus dengan kutipan dan kamus untuk menyimpan informasi:



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


Tanda kutip itu sendiri diapit oleh daftar di kunci kamus β€œseri” sehingga ada banyak kutipan per seri.



Variabel "series_in_chats" diperlukan untuk menyimpan informasi tentang rangkaian dalam percakapan terpisah, variabel "quotes_in_chats" serupa, hanya untuk menyimpan informasi tentang kutipan.



Sekarang kami terhubung ke grup:



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


Anda dapat membuat fungsi untuk mengirim pesan dengan lebih nyaman:



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


Argumen:
ch_id # ID ,     
msg #  




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


Metode pengiriman pesan.



Parameter yang dibutuhkan:



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


Baca lebih lanjut tentang metode ini di sini.



Memproses pesan



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 -    - 
        #  ,   


Sekarang kami dapat memproses pesan yang diterima oleh grup, mengirim pesan atas nama grup dan banyak lagi.



Kami memperkenalkan kacamata



Kode ini perlu disisipkan setelah memeriksa "jika chat_id tidak ada dalam 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
                        #   
                       


Menebak



Kami memeriksa: jika pesan yang diterima dalam percakapan sama dengan kata "tebakan", bot akan merespons dengan kutipan yang perlu ditebak (semua ini setelah memeriksa "if isinstance"):




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


Yang tersisa hanyalah memeriksa kebenaran rangkaian - jika pesan berisi nama rangkaian, bot akan menjawab bahwa rangkaian tersebut telah ditebak:




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}) #   
    


Kesimpulan



Hasilnya, bot akan bekerja seperti ini:







Tentu saja, atas dasar ini, Anda dapat membuat hampir semua bot - bukan hanya tebakan.



Bot yang dibuat dapat dilihat di komunitas VKontakte " Abode of Quests | Smeshariki ".



Ngomong-ngomong, dia bekerja tidak hanya dalam obrolan, tetapi juga dalam pesan pribadi.



Ada juga beberapa hal yang belum saya bahas di sini.



All Articles