forked from DjangoIPython/TelegramBot
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhandlers.py
More file actions
163 lines (130 loc) · 9.04 KB
/
handlers.py
File metadata and controls
163 lines (130 loc) · 9.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# Импортируем необходимые компоненты
from bs4 import BeautifulSoup
from glob import glob
from random import choice
import requests
from emoji import emojize
from telegram import InlineKeyboardMarkup, InlineKeyboardButton
from telegram import ParseMode
from telegram import ReplyKeyboardMarkup
from telegram import ReplyKeyboardRemove
from telegram.ext import ConversationHandler
from mongodb import mdb, search_or_save_user, save_user_anketa, save_picture_name, save_file_id, save_like_dislike
from utility import get_keyboard
from utility import SMILE
# функция sms() будет вызвана пользователем при отправке команды start,
# внутри функции будет описана логика при ее вызове
def sms(bot, update):
user = search_or_save_user(mdb, bot.effective_user, bot.message) # получаем данные из базы данных
print(user)
smile = emojize(choice(SMILE), use_aliases=True) # для ответа добавили emoji
print('Кто-то отправил команду /start. Что мне делать?') # вывод сообщения в консоль при отправки команды /start
bot.message.reply_text('Здравствуйте, {}! \nПоговорите со мной {}!'
.format(bot.message.chat.first_name, smile), reply_markup=get_keyboard()) # отправляем ответ
# функция отправляет случайную картинку
def send_meme(bot, update):
lists = glob('images/*') # создаем список из названий картинок
picture = choice(lists) # берем из списка одну картинку
image = save_picture_name(mdb, picture) # получаем из базы данных словарь
inl_keyboard = InlineKeyboardMarkup([[
InlineKeyboardButton(f"👍 {image['like']}", callback_data=1),
InlineKeyboardButton(f"👎 {image['dislike']}", callback_data=-1)
]])
msg = update.bot.send_photo(
chat_id=bot.message.chat.id,
photo=open(picture, 'rb'),
reply_markup=inl_keyboard) # отправляем картинку и inline клавиатуру
save_file_id(mdb, picture, msg) #
def inline_button_pressed(bot, update):
# print(bot.callback_query)
query = bot.callback_query # данные которые приходят после нажатия кнопки
data = int(query.data) # получаем данные нажатой кнопки (1 или -1)
save_like_dislike(mdb, query, data) # отправляем в бд
update.bot.edit_message_caption(
caption='Спасибо вам за ваш выбор!',
chat_id=query.message.chat.id,
message_id=query.message.message_id) # уберем inline клавиатуру выведем текст
# функция парсит анекдоты
def get_anecdote(bot, update):
receive = requests.get('http://anekdotme.ru/random') # отправляем запрос к странице
page = BeautifulSoup(receive.text, "html.parser") # подключаем html парсер, получаем текст страницы
find = page.select('.anekdot_text') # из страницы html получаем class="anekdot_text"
for text in find:
page = (text.getText().strip()) # из class="anekdot_text" получаем текс и убираем пробелы по сторонам
bot.message.reply_text(page) # отправляем один анекдот, последний
# функция parrot() отвечает темже сообщением которое ему прислали
def parrot(bot, update):
print(bot.message.text) # печатаем на экран сообщение пользователя
bot.message.reply_text(bot.message.text) # отправляем обратно текс который пользователь послал
# функция печатает и отвечает на полученный контакт
def get_contact(bot, update):
print(bot.message.contact)
bot.message.reply_text('{}, мы получили ваш номер телефона!'.format(bot.message.chat.first_name))
# функция печатает и отвечает на полученные геоданные
def get_location(bot, update):
print(bot.message.location)
bot.message.reply_text('{}, мы получили ваше местоположение!'.format(bot.message.chat.first_name))
def anketa_start(bot, update):
user = search_or_save_user(mdb, bot.effective_user, bot.message) # получаем данные из базы данных
if 'anketa' in user:
text = """Ваш предыдущий результат:
<b>Имя:</b> {name}
<b>Возраст:</b> {age}
<b>Оценка:</b> {evaluation}
<b>Комментарий:</b> {comment}
Данные будут обновлены!
Как вас зовут?
""".format(**user['anketa'])
bot.message.reply_text(
text, parse_mode=ParseMode.HTML, reply_markup=ReplyKeyboardRemove()) # вопрос и убираем основную клавиатуру
return "user_name"
else:
bot.message.reply_text(
'Как вас зовут?', reply_markup=ReplyKeyboardRemove()) # вопрос и убираем основную клавиатуру
return "user_name" # ключ для определения следующего шага
def anketa_get_name(bot, update):
update.user_data['name'] = bot.message.text # временно сохраняем ответ
bot.message.reply_text("Сколько вам лет?") # задаем вопрос
return "user_age" # ключ для определения следующего шага
def anketa_get_age(bot, update):
update.user_data['age'] = bot.message.text # временно сохраняем ответ
reply_keyboard = [["1", "2", "3", "4", "5"]] # создаем клавиатуру
bot.message.reply_text(
"Оцените статью от 1 до 5",
reply_markup=ReplyKeyboardMarkup(
reply_keyboard, resize_keyboard=True, one_time_keyboard=True)) # при нажатии клавиатура исчезает
return "evaluation" # ключ для определения следующего шага
def anketa_get_evaluation(bot, update):
update.user_data['evaluation'] = bot.message.text # временно сохраняем ответ
reply_keyboard = [["Пропустить"]] # создаем клавиатуру
bot.message.reply_text("Напишите отзыв или нажмите кнопку пропустить этот шаг.",
reply_markup=ReplyKeyboardMarkup(
reply_keyboard, resize_keyboard=True, one_time_keyboard=True)) # клава исчезает
return "comment" # ключ для определения следующего шага
def anketa_comment(bot, update):
update.user_data['comment'] = bot.message.text # временно сохраняем ответ
user = search_or_save_user(mdb, bot.effective_user, bot.message) # получаем данные из базы данных
anketa = save_user_anketa(mdb, user, update.user_data) # передаем и получаем результаты анкеты
print(anketa)
text = """Результат опроса:
<b>Имя:</b> {name}
<b>Возраст:</b> {age}
<b>Оценка:</b> {evaluation}
<b>Комментарий:</b> {comment}
""".format(**update.user_data)
bot.message.reply_text(text, parse_mode=ParseMode.HTML) # текстовое сообщение с форматированием HTML
bot.message.reply_text("Спасибо вам за комментарий!", reply_markup=get_keyboard()) # сообщение и возвр. осн. клаву
return ConversationHandler.END # выходим из диалога
def anketa_exit_comment(bot, update):
update.user_data['comment'] = None
user = search_or_save_user(mdb, bot.effective_user, bot.message) # получаем данные из базы данных
save_user_anketa(mdb, user, update.user_data) # передаем результаты анкеты
text = """Результат опроса:
<b>Имя:</b> {name}
<b>Возраст:</b> {age}
<b>Оценка:</b> {evaluation}""".format(**update.user_data)
bot.message.reply_text(text, parse_mode=ParseMode.HTML) # текстовое сообщение с форматированием HTML
bot.message.reply_text("Спасибо!", reply_markup=get_keyboard()) # отправляем сообщение и возвращаем осн. клаву
return ConversationHandler.END # выходим из диалога
def dontknow(bot, update):
bot.message.reply_text("Я вас не понимаю, выберите оценку на клавиатуре!")