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.
Kami memilih jenis komunitas "Kelompok kepentingan".
Muncul dengan nama, memilih topik, membiarkan jenis grup terbuka.
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.
Pergi ke manajemen grup:
Pilih bagian "Bekerja dengan API" dan aktifkan "API Jajak Pendapat" di sana agar bot dapat bekerja.
Selanjutnya, buka "Access Keys", buat kunci akses dengan pengaturan berikut:
Kunci akses yang dihasilkan adalah token kami:
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.
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.