· 4 years ago · Nov 05, 2020, 12:40 PM
1import asyncio
2
3import aiohttp
4import vkquick as vq
5import saya
6import requests
7
8
9# Авторизация в вк
10vk = saya.AVk(token=token, group_id=175959304)
11vq.current.api = vq.API(
12 token=token,
13 version=5.124,
14 owner="group"
15)
16
17
18async def send_doc(event):
19 peer_id = event['object']['message']['peer_id']
20 async with aiohttp.ClientSession() as session:
21 async with session.get(
22 event['object']['message']['attachments'][0]['doc']['url']
23 ) as response:
24 doc_bytes = await response.read()
25
26 doc_uploader = vq.Doc.message(
27 file=doc_bytes,
28 peer_id=peer_id,
29 type_="doc"
30 )
31 doc = await doc_uploader()
32 await vk.messages.send(
33 random_id=0,
34 peer_id=peer_id,
35 attachment=repr(doc)
36 )
37
38
39async def handle_event(event):
40 if event['type'] == 'message_new':
41 text = event['object']['message']['text'].lower()
42 peer = event['object']['message']['peer_id']
43 attachment = event['object']['message']['attachments']
44 # Здесь должна идти куча проверок, но я решил опустить эту часть кода
45 # Если боту отправляют сообщение которое НЕ ОТНОСИТЬСЯ к его командам
46 # Авторизацию с базой данных я тоже опустил. Этот запрос забирает id пользователя, которому должно отправиться
47 # сообщение. Также это айди является айди Исполнителя, с которым работает заказчик
48 taskId = clientDB.getRequest("executor", peer)[0]
49 # Здесь идёт проверка айди, дело в том, что при указании taskId = 1, бот ожидает заполнение ТЗ
50 # А при taskId = 2, бот ожидает заполнение жалования на дизайнера
51 # А если айди равен нулю, то далее проверяются на taskId = 1 и taskId = 2
52 if (taskId != "0" and taskId != "1" and taskId != "2"
53 # В этом запросе идёт проверка для исполнителя, если он не равен нулю, то сообщение отправляется от Исполнителя
54 # к клиенту. А если taskId равен чему-то кроме "0", "1" и "2", то от Заказчика к исполнителю
55 or executorDB.getRequest('interlocutor', peer, check=False)[0] != '0'):
56 # Проверяем, является ли пользователь исполнителем
57 if str(peer).startswith(executorAll):
58 print(executorDB.getRequest("interlocutor", peer)[0])
59 # Айди человека, которому мы отправляем сообщение
60 Id = executorDB.getRequest("interlocutor", peer)[0]
61 # Если он не исполнитель, то мы указываем айди уже человека, с которым работает клиент
62 else:
63 print(executorDB.getRequest("id", peer, where="interlocutor", check=False)[0])
64 Id = executorDB.getRequest("id", peer, where="interlocutor", check=False)[0]
65 # Проверяем на вложения, решил не загромождать код проверками try...except
66 if attachment:
67 # Указываем в переменную тип вложения
68 typeAttach = attachment[0]['type']
69 # Если это документ, то запускаем уже 2 функции, которые, по-моему, мнению должны не мешать работе друг друга
70 if typeAttach == 'doc':
71 await send_doc(event)
72 # Если это фото, то просто его скачиваем. Пытался переотправлять с secret_key, но меня обломали
73 elif typeAttach == 'photo':
74 imgReq = requests.get(attachment[0]['photo']['sizes'][-1]['url'])
75 with open('attach.png', 'wb') as out:
76 out.write(imgReq.content)
77 response = await vk.uploader.message_photo(
78 "attach.png", peer_id=peer)
79 # Отправляем сообщение с загружённой картинкой
80 await vk.messages.send(
81 random_id=0,
82 peer_id=Id,
83 attachment=AUploader.format(response, "photo"),
84 message=event['object']['message']['text']
85 )
86 # Если тип не документ и не фото
87 else:
88 await vk.messages.send(
89 random_id=0,
90 peer_id=peer,
91 message="Сообщение не было отправлено!\nТип вложения не поддерживается! Только фото и документы."
92 )
93
94
95async def main():
96 async for event in vk.longpoll.listen(True):
97 asyncio.create_task(handle_event(event))
98
99
100if __name__ == "__main__":
101 asyncio.run(main())