Простий бот для телеграм

Обсуждение программ
Відповісти
Автор
Повідомлення
AW
Junior

Повідомлення

Вітаю. Хочу відразу сказати, что абсолютно в цьому нічого не розумію, але хотілося б реалізувати, якщо це можливо.

Дано:
1) Відповідальна особа
2) колектив підлеглих

Що потрібно:
Раз на місяць підлеглі повинні звітувати про виконання плану робіт. Писати багато не потрібно, умовно треба лише 2 варіанта "так" та "ні" або "+" та "-" або ж червона кнопка та зелена. Щось таке.

Відповідно у відповідальної особи повинно показувати відповідь підлеглого і його ім'я, щоб можна було бачити хто виконав план а хто ні.

Чи реально таке зробити, якщо так - то як? Буду вдячний за покроковий мануал. Дякую
pelia
Member
Аватар користувача

Повідомлення

реально, вам навіть chatgpt напише такого бота
AW
Junior

Повідомлення

pelia
Дякую за вашу увагу до мого повідомлення, але ваша відповідь не наблизила мене до реалізації задумки. Я ж одразу написав, що не розбираюся в цьому, тому конкретне питання задав - як саме це робиться.
yupi
Member
Аватар користувача

Повідомлення

AW
SendPulse
pelia
Member
Аватар користувача

Повідомлення

AW: 04.06.2024 10:25 pelia
Дякую за вашу увагу до мого повідомлення, але ваша відповідь не наблизила мене до реалізації задумки. Я ж одразу написав, що не розбираюся в цьому, тому конкретне питання задав - як саме це робиться.
так і я не розбираюсь, але вбивши практично слово в слово ваше прохання у чатгпт я отримав відповідь. Не знаю на скільки воно працює, але теоретично повинно
Dremjke
Member
Аватар користувача

Повідомлення

AW: 04.06.2024 10:25Дякую за вашу увагу до мого повідомлення, але ваша відповідь не наблизила мене до реалізації задумки. Я ж одразу написав, що не розбираюся в цьому, тому конкретне питання задав - як саме це робиться.
Краще переведись на іншу кафедру або факультет, на спецальність, яка тобі ближче до душі буде. Потім сам собі за це рішення подякуєш.
AW
Junior

Повідомлення

Dremjke: 04.06.2024 11:27Краще переведись на іншу кафедру
Та я вже зрозумів що форумом помилився.
Пошукаю щось інше ближче до теми де у учасників буде більше бажання допомогти.
Мінусів напхали наче я якийсь спамер чи люто правила порушую :(

Можна тему закрити.
pelia
Member
Аватар користувача

Повідомлення

Ну типу, пояснювати як chatgpt користуватись чи що?
спойлер
https://chat.openai.com/
мені потрібен telegram бот, котрий кожен місяць буде запитувати у певних користувачів їх ім'я та прізвище і задавати кілька питань, на котрі повинна бути відповіть "так" або "ні", ці дані бот повинен записувати у гугл таблицю, створюючи колонку з новим місяцем після кожного опитування
Далі підправляємо те що не подобається, додаємо хотілки і отримуємо кінцеву відповіть
Створити телеграм-бота:
Зареєструвати бота через BotFather у Telegram та отримати токен доступу.

Встановити необхідні бібліотеки:
python-telegram-bot для роботи з Telegram API.
gspread для роботи з Google таблицями.
oauth2client для аутентифікації в Google API.

Налаштувати доступ до Google таблиць:
Створити проект у Google Cloud Console та включити Google Sheets API.
Створити сервісний аккаунт та згенерувати ключ JSON.
Надати доступ до таблиці сервісному аккаунту.

Написати код бота:
Реалізувати опитування користувачів.
Зберігати дані у Google таблиці.

Нижче наведено приклад коду для реалізації такого бота:
Приклад коду

Інсталяція бібліотек:

Код: Виділити все

pip install python-telegram-bot gspread oauth2client
Створення бота:

Код: Виділити все

from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext, ConversationHandler, CallbackQueryHandler
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import datetime

# Авторизація у Google Sheets
scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]
creds = ServiceAccountCredentials.from_json_keyfile_name("path/to/your/service_account.json", scope)
client = gspread.authorize(creds)

# Відкрити таблицю за назвою
sheet = client.open("Telegram Survey").sheet1

# Стан для розмови
NAME_SURNAME, QUESTION = range(2)

def start(update: Update, context: CallbackContext) -> int:
    # Перевірка, чи вже відомі ім'я та прізвище користувача
    user_id = update.message.from_user.id
    user_data = context.user_data.get(user_id)
    
    if user_data:
        ask_question(update, context)
        return QUESTION
    else:
        update.message.reply_text('Введіть, будь ласка, ваше ім\'я та прізвище:')
        return NAME_SURNAME

def name_surname(update: Update, context: CallbackContext) -> int:
    user_id = update.message.from_user.id
    context.user_data[user_id] = {'name_surname': update.message.text}
    ask_question(update, context)
    return QUESTION

def ask_question(update: Update, context: CallbackContext) -> None:
    keyboard = [
        [
            InlineKeyboardButton("✅", callback_data='так'),
            InlineKeyboardButton("❌", callback_data='ні')
        ]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)
    update.message.reply_text('Чи задоволені ви нашими послугами?', reply_markup=reply_markup)

def button(update: Update, context: CallbackContext) -> None:
    query = update.callback_query
    user_id = query.from_user.id
    query.answer()
    
    context.user_data[user_id]['question'] = query.data
    
    # Отримати поточний місяць
    current_month = datetime.datetime.now().strftime("%B %Y")
    
    # Перевірити, чи існує стовпець для поточного місяця
    headers = sheet.row_values(1)
    if current_month not in headers:
        sheet.update_cell(1, len(headers) + 1, current_month)
        headers.append(current_month)

    # Знайти або додати користувача
    all_records = sheet.get_all_records()
    name_surname = context.user_data[user_id]['name_surname']
    row_index = None

    for i, record in enumerate(all_records, start=2):
        if record.get('ім\'я та прізвище') == name_surname:
            row_index = i
            break

    if row_index is None:
        row_index = len(all_records) + 2
        sheet.update_cell(row_index, 1, name_surname)

    # Оновити відповідь
    col_index = headers.index(current_month) + 1
    sheet.update_cell(row_index, col_index, context.user_data[user_id]['question'])
    
    # Застосувати форматування до комірки
    cell = sheet.cell(row_index, col_index)
    if context.user_data[user_id]['question'] == 'так':
        sheet.format(cell.address, {"backgroundColor": {"red": 0.0, "green": 1.0, "blue": 0.0}})
    else:
        sheet.format(cell.address, {"backgroundColor": {"red": 1.0, "green": 0.0, "blue": 0.0}})
    
    query.edit_message_text(text="Дякуємо за відповіді!")

def cancel(update: Update, context: CallbackContext) -> int:
    update.message.reply_text('Опитування скасовано.')
    return ConversationHandler.END

def main() -> None:
    updater = Updater("YOUR_TELEGRAM_BOT_TOKEN")

    dispatcher = updater.dispatcher

    conv_handler = ConversationHandler(
        entry_points=[CommandHandler('start', start)],
        states={
            NAME_SURNAME: [MessageHandler(Filters.text & ~Filters.command, name_surname)],
            QUESTION: [CallbackQueryHandler(button)],
        },
        fallbacks=[CommandHandler('cancel', cancel)],
    )

    dispatcher.add_handler(conv_handler)

    updater.start_polling()

    updater.idle()

if __name__ == '__main__':
    main()
Пояснення коду

Авторизація та підключення до Google таблиці:
Встановлюємо авторизацію через gspread та відкриваємо таблицю.

Обробка команд:
Команда /start ініціалізує процес опитування.
Якщо користувач вже надав ім'я та прізвище, пропускаємо цей крок і переходимо до питання.
Запитуємо питання з відповіддю "так" або "ні" через кнопки з emoji.

Збереження даних:
Отримуємо поточний місяць і перевіряємо, чи є відповідний стовпець у таблиці. Якщо ні, додаємо його.
Перевіряємо, чи існує рядок для даного користувача (ім'я та прізвище). Якщо ні, додаємо новий рядок.
Оновлюємо відповідь користувача в потрібному стовпці.

Форматування комірок:
Застосовуємо зелений фон для відповіді "так" і червоний фон для відповіді "ні".

Цей код забезпечує зручний інтерфейс для користувачів, дозволяючи їм відповідати на питання за допомогою кнопок з emoji, а також забезпечує збереження та форматування даних у таблиці.
Все зайняло 15 хвилин, але мені ліньки це перевіряти, впевнений що якісь недоліки будуть, але все можна так само підправити додавши уточнення чатгпт
7mindfields
Member
Аватар користувача

Повідомлення

pelia
Ти не зрозумів, потрібен перевірений безкоштовний покроковий гайд як це зробити людині, яка в цьому не розбирається
і не планує розбиратися
pelia
Member
Аватар користувача

Повідомлення

7mindfields: 04.06.2024 14:49 pelia
Ти не зрозумів, потрібен перевірений безкоштовний покроковий гайд як це зробити людині, яка в цьому не розбирається
і не планує розбиратися
так і я ніби не сильно розбираюсь :rotate:
Dremjke
Member
Аватар користувача

Повідомлення

AW: 04.06.2024 14:36Та я вже зрозумів що форумом помилився.
Ти не форумом помилився, а кафедрою, де навчаєшся. Всеодно потім не будеш по спеціальності працювати, то навіщо зря час витрачати.
За безкоштовно ніхто тобі нічого робити не буде. Або готуйся платити гроші за виконану роботу, або розбирайся сам. Нема такого коду чи конфіга, якого не було б на Stack Overflow. А ще кращий варіант запропонував pelia, то взагалі ультимативне рішення, я сам часто chat GPT по роботі використовую. Аби ця штука була, коли я навчався, то був би відмінником на стипендії :lol:
yupi
Member
Аватар користувача

Повідомлення

Я написал ресурс, где самому с нулем знаний можно создать бота :dontknow:
pelia
Member
Аватар користувача

Повідомлення

yupi: 05.06.2024 19:47 Я написал ресурс, где самому с нулем знаний можно создать бота :dontknow:
ну, їх боти ніби не вміють записувати кудись далі їхньої срм, котра вже не безкоштовна і доволі крива, зовсім нещодавно мав з ними проблеми
yupi
Member
Аватар користувача

Повідомлення

pelia
Для первого опыта с нулем знаний можно опробовать и их
Відповісти