Как получать уведомление в телеграмм от excel
Перейти к содержимому

Как получать уведомление в телеграмм от excel

  • автор:

Telegram bot excel python

Добрые люди помогите уже пару дней не могу понять что делать! Мне нужно Телеграм бот парсер по заданой строчки выводилась информация. Например, у меня в excel-листе написано в первом столбе текст, а во втором инфа. Мне нужно написать боту:

ул. аношкина 85

Отслеживать
18.4k 5 5 золотых знаков 24 24 серебряных знака 48 48 бронзовых знаков
задан 2 мая 2020 в 19:54
Сова Дюран Сова Дюран
1 1 1 бронзовый знак
Таблица недоступна по ссылке. К тому же не понятно, речь о Google Sheets API или об MS Excel ?
2 мая 2020 в 20:17
Google Sheets API
3 мая 2020 в 9:17

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Для работы с Google Sheets API вам необходимо получить API ключ (в форме json). Вот пример работы кода:

import httplib2 import apiclient.discovery from oauth2client.service_account import ServiceAccountCredentials def auth(CREDENTIALS_FILE): credentials = ServiceAccountCredentials.from_json_keyfile_name( CREDENTIALS_FILE, ['https://www.googleapis.com/auth/spreadsheets', 'https://www.googleapis.com/auth/drive']) httpAuth = credentials.authorize(httplib2.Http()) return apiclient.discovery.build('sheets', 'v4', http=httpAuth) CREDENTIALS_FILE = ""#Название вашего json ключя service = auth(CREDENTIALS_FILE) 

После этого пишем функцию, которая возвращает инфу об адресе.

def get_info(address): def get_spreadsheet_values(list_name:str, range:str, type:str): values = service.spreadsheets().values().get( spreadsheetId = config.spreadsheet_id, range = "'" + list_name + "'!" + range, majorDimension = type ).execute() return(values['values']) def get_spreadsheet_data(range): # list_name = "Лист2" try: return get_spreadsheet_values(list_name, range, "ROWS") except: return [] data = get_spreadsheet_data("A1:A999") #2-у мерный массив, [[A1],[A2]. for i, el in enumerate(data): if (el[0] == address): return get_spreadsheet_data("B"+i)[0][0]: info = get_info(address) 

(адреса в столбце A, Данные в столбце B) Далее при помощи PyTelegramBotApi отправляем из пользователю

bot.send_message(chat_id=chat_id, , info) 

ccылка на пример простого проекта с Google Spreadsheet Api на gitHub — именно из него я брал все функции получения информации по range итп. Данные с него так же отправляются пользователю через Telegram, но благодаря http API, возможно это вам будет предпочтительней.

Делаем простого бота в Telegram на Python. Интеграция с Excel

Друг предложил мне поработать над проектом для нашей кафедры. ТЗ пока не сформулировано, но точно известно, что это будет бот в телеге. Я хоть и питонист, но с ботами дел никогда не имел, поэтому пишу эту статью, как заметку, для себя и молодых перспективных ребят, чтоб у них было от чего оттолкнуться. Постараюсь писать максимально понятным и простым языком. Профессионалам тут особо делать не чего, хотя, может и придёт какая-нибудь идея.

Краткое описание бота

Наш бот будет создан на тематику Белого движения в гражданской войне в России (1917-1922) /сегодня разговор не о политике. Это просто пример/

  • По команде /start бот будет приветствие и посылать стикер;
  • После приветствия появится клавиатура под строкой набора сообщений с двумя кнопками «Вывести случайную цитату белогвардейца» и «Литература»
  • Нажатие на первую кнопку выведет рандомную цитату из excel файла (такое извращение нужно для подготовки к будущему проекту)
  • Нажатие на кнопку «Литература» выдаст инлайновую клавиатуру (далее будет прояснение, для тех кто не понял что это) с названиями произведений белогвардейских авторов или о белогвардейцах.После нажатия клавиатура пропадёт (просто этим навыком, думаю, необходимо обладать), начнётся загрузка pdf файла и появится оповещение «Приятного чтения!»

Вот такой простенький бот у нас по выйдет.

Начало. Создание бота и добавление библиотек.

Для начала добавим библиотеку pyTelegramBotAPI обычным пипом в cmd.

pip install pyTelegramBotAPI

А также загрузим простенькую библиотеку для работы с Excel. (ЧИТАЕТ ТОЛЬКО .xls. )

pip install xlrd

Время импортировать все необходимые библиотеки.

import telebot #импорт pyTelegramBotAPI from telebot import types #также достанем типы import random #рандом обязательно import xlrd #библиотка чтения экселевских файлов

Далее нужно создать самого бота в телеграме. Для этого пройдёмся по следующим шагам:

  1. Найти в поиске телеграма @BotFather
  2. Написать ему команду /newbot
  3. Первым сообщение отправить имя бота, а вторым его юзернейм (который пишется с @). Он должен быть уникальный и оканчиваться на Bot или _bot

После этих шагов батя пришлёт нам ссылку на нашёго бота и его API.

Нужно скопировать всю строку, которая на скрине закрыта красным прямоугольником

Если коротко, то API — это контракт, который предоставляет программа. «Ко мне можно обращаться так и так, я обязуюсь делать то и это».
(Более подробная инфа тут API)

Кодим

Раз библиотеки уже добавили, значит создаём переменную, определяющую бота с помощью API.

bot = telebot.TeleBot("TOKEN")

В начале, при написании команды /start, бот у нас выдаст приветствие. Соответственно, вставляем декоратор обработчика сообщений.

@bot.message_handler(commands=['start'])

Если кто не знает что такое декораторы, то есть достаточно подробная статья, рекомендую ознакомиться.

Коротко: Декораторы — это, по сути, просто своеобразные «обёртки», которые дают нам возможность делать что-либо до и после того, что сделает декорируемая функция, не изменяя её.

Теперь наш бот понимает команду /start, но ещё ничего не делает. Создаём функцию приветственного сообщения.

@bot.message_handler(commands=['start']) def send_welcome(message): stic = open('stic/welcome.webp', 'rb') #чтение файла в двоичном формате # клавиатура markup = types.ReplyKeyboardMarkup(resize_keyboard=True) but1 = types.KeyboardButton("Вывести случайную цитату белогвардейца") but2 = types.KeyboardButton("Литература") markup.add(but1, but2) bot.reply_to(message, "Здравствуй, \nСмотрю, ты за Единую, Великую и Недилимую".format(message.from_user) ,parse_mode='html',reply_markup=markup) bot.send_sticker(message.chat.id,stic)

Пробежимся по коду

Строкой stic = open(‘stic/welcome.webp’, ‘rb’) мы записываем в переменную путь к нашему стикеру в формате .webp (скачать его можно из сообщений телеграма правой кнопкой мыши, «сохранить как»)

Ниже происходит создание клавиатуры
markup = types.ReplyKeyboardMarkup(resize_keyboard=True) , а точнее запись в переменную подстрочной клавиатуры. Параметр resize_keyboard=True подгоняет кнопки по высоте до возможного минимума. Также создаём две кнопочки и добавляем в клавиатуру:

but1 = types.KeyboardButton("Вывести случайную цитату белогвардейца") but2 = types.KeyboardButton("Литература") markup.add(but1, but2)

Клавиатура готова, но пока не используется. Пока оставим её и переключимся на сообщение. Одной строкой мы указываем боту отправить сообщение с текстом, именем отправителя ( , а вытягивает его он из .format(message.from_user) мы можем дописать .format(message.from_user, bot.get_me()) и вызвать имя бота, добавив в текст ), правилом оформления parse_mode=’html’ ( также можно выбрать ‘markdown’) и определением клавиатуры, которую создали выше.

bot.reply_to(message, "Здравствуй, \nСмотрю, ты за Единую, Великую и Недилимую".format(message.from_user) ,parse_mode='html',reply_markup=markup)

Последней строкой отправляем стикер bot.send_sticker(message.chat.id,stic)

Приветственное сообщение и клавиатура

Время дать возможность боту коммуницировать

@bot.message_handler(func=lambda message: True) def menu(message): if message.chat.type == 'private': if message.text == "Вывести случайную цитату белогвардейца": #достаём циататы из ворда rb = xlrd.open_workbook('citat/citat.xls', formatting_info=True) sheet = rb.sheet_by_index(0) for rownum in range(sheet.nrows): rand = int(random.randint(0,rownum)) row = sheet.row_values(rand) bot.send_message(message.chat.id, row) elif message.text == "Литература": #инлайновая клавиатура inMurkup = types.InlineKeyboardMarkup(row_width=1) but1 = types.InlineKeyboardButton("И.Ф. Плотников - Александр Васильевич Колчак. Исследователь, адмирал, Верховный правитель России",callback_data='book1') but2 = types.InlineKeyboardButton("А.В. Туркул - Дроздовцы в огне", callback_data='book2') but3 = types.InlineKeyboardButton("П.Н. Врангель - Записки", callback_data='book3') but4 = types.InlineKeyboardButton("М.Г. Дроздовский - Дневник", callback_data='book4') inMurkup.add(but1, but2, but3, but4) bot.send_message(message.chat.id, "Книги на любой вкус", reply_markup=inMurkup) else: bot.send_message(message.chat.id, "Я не знаю что и ответить")

Букв много, но сейчас всё раскидаем. Берём знакомый декоратор и делаем проверку лямбдой сообщение. Если не в курсе что такое лямбда-функция, то сюда. Бот у нас работает через личные сообщения, поэтому пропишем if message.chat.type == ‘private’: , если требуется, то можете указать условия для “group”, “supergroup” или “channel” , но нам это не нужно.

Далее идёт строка с текстом. ВАЖНО текст должен совпадать с названием кнопки клавиатуры, которую указывали выше.

Создаём экселевский файлик, в первую колонку вписываем цитаты, сохраняем в формате .xls в папку, как делали со стикером.

Со спокойной душой вызываем на файл на чтение
rb = xlrd.open_workbook(‘citat/citat.xls’, formatting_info=True), указываем лист с которого считываем инфу sheet = rb.sheet_by_index(0) индексы как у массива (первый элемент нулевой).

Далее определяем диапазон заполненных строк в листе и записываем их количество в rownum . Используем эту переменную как верхнюю границу до которой может сгенерироваться случайное число rand = int(random.randint(0,rownum)) . Получив ячейку, вытаскиваем из неё значение row = sheet.row_values(rand) отправляем его bot.send_message(message.chat.id, row) .

Вышло как-то так

Для литературы будем использовать инлайновую клавиатуру.

elif message.text == "Литература": #инлайновая клавиатура inMurkup = types.InlineKeyboardMarkup(row_width=1) but1 = types.InlineKeyboardButton("И.Ф. Плотников - Александр Васильевич Колчак. Исследователь, адмирал, Верховный правитель России", callback_data='book1') but2 = types.InlineKeyboardButton("А.В. Туркул - Дроздовцы в огне", callback_data='book2') but3 = types.InlineKeyboardButton("П.Н. Врангель - Записки", callback_data='book3') but4 = types.InlineKeyboardButton("М.Г. Дроздовский - Дневник", callback_data='book4') inMurkup.add(but1, but2, but3, but4) bot.send_message(message.chat.id, "Книги на любой вкус", reply_markup=inMurkup)

Определяем клавиатуру inMurkup = types.InlineKeyboardMarkup(row_width=1) параметр row_width=1 говорит о том, что на одной строке будет одна кнопка. Принцип кнопок создания такой же как и у обычной клавиатуры, но появляется параметр callback_data значения которого примет бот после нажатия на кнопку и поймёт что нужно сделать (далле это всё опишем).

Последней строкой отправляем сообщение и цепляем к нему инлайновую клавиатуру.

Работа с callback_data

@bot.callback_query_handler(func=lambda call: True) def callback_inline(call): try: if call.message: if call.data == 'book1': doc = open('boo/Plotnikov_Ivan-Aleksandr_Vasilevich_Kolchak_Issledovatel_admiral_Verhovnyi_pravitel_Rossii.pdf', 'rb') bot.send_document(call.message.chat.id, doc) elif call.data == 'book2': doc = open('boo/Turkul_-_Drozdovtsy_v_ogne.pdf','rb') bot.send_document(call.message.chat.id, doc) elif call.data == 'book3': doc = open('boo/Vrangel_P_Zapiski_a4.pdf', 'rb') bot.send_document(call.message.chat.id, doc) elif call.data == 'book4': doc = open('boo/Drozdovsky_dnevnik_1963__ocr.pdf', 'rb') bot.send_document(call.message.chat.id, doc) #удаляем инлайновую клаву bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Книги на любой вкус", reply_markup=None) #Создаём уведомление bot.answer_callback_query(callback_query_id=call.id, show_alert=False, text='Приятного чтения!') except Exception as e: print(repr(e))

Первым делом вызываем декоратор обработки колбэка и подтверждаем, что он был получен @bot.callback_query_handler(func=lambda call: True) . Далее создаём функцию с конструкцией try-except (Что это? Чекай). Код хоть и приличный по объёму, но весь однотипный. Через if мы понимает какая «дата» пришла от кнопки, например
if call.data == ‘book1’: отвечает за первую кнопку с книгой про Колчака. Соответственно, командой

doc = open('boo/Plotnikov_Ivan-Aleksandr_Vasilevich_Kolchak_Issledovatel_admiral_Verhovnyi_pravitel_Rossii.pdf', 'rb')

мы создаём переменную doc в которую «суём» pdf файл, который сохранили в папку «boo» заранее.

Теперь строкой bot.send_document(call.message.chat.id, doc) отправляем файл в чат.

После леса из наших elif удалим инлайновую клавиатуру, дабы не мешалась. Действие необязательно, но мы же с вами тренируемся, поэтому пусть код будет здесь.

Вызываем функцию bot.edit_message_text По тексту определяется сообщение и
в параметр, который мы использовали для добавления клавиатуры reply_markup вносим значение None .

Уведомление призывается заклинанием

Параметр show_alert отвечает за вид оповещения (False простое временное уведомление, True уведомление с кнопкой «Ок»)

1 — False, 2 — True

Завершаем эту ступень кода конструкцией проверки исключений (ошибок).

except Exception as e: print(repr(e))
bot.polling(none_stop=True)

Именно этой командой и закончим наш код. Теперь бот постоянно проверяет не написал ли ему кто.

В итоге получился такой код:

import telebot from telebot import types import random import xlrd bot = telebot.TeleBot("TOKEN") @bot.message_handler(commands=['start']) def send_welcome(message): stic = open('stic/welcome.webp', 'rb') # клавиатура markup = types.ReplyKeyboardMarkup(resize_keyboard=True) but1 = types.KeyboardButton("Вывести случайную цитату белогвардейца") but2 = types.KeyboardButton("Литература") markup.add(but1, but2) bot.reply_to(message, "Здравствуй, \nСмотрю, ты за Единую, Великую и Недилимую".format(message.from_user),parse_mode='html',reply_markup=markup) bot.send_sticker(message.chat.id,stic) @bot.message_handler(func=lambda message: True) def menu(message): if message.chat.type == 'private': if message.text == "Вывести случайную цитату белогвардейца": #достаём циататы из ворда rb = xlrd.open_workbook('citat/citat.xls', formatting_info=True) sheet = rb.sheet_by_index(0) for rownum in range(sheet.nrows): rand = int(random.randint(0,rownum)) row = sheet.row_values(rand) bot.send_message(message.chat.id, row) elif message.text == "Литература": #инлайновая клавиатура inMurkup = types.InlineKeyboardMarkup(row_width=1) but1 = types.InlineKeyboardButton("И.Ф. Плотников - Александр Васильевич Колчак. Исследователь, адмирал, Верховный правитель России", callback_data='book1') but2 = types.InlineKeyboardButton("А.В. Туркул - Дроздовцы в огне", callback_data='book2') but3 = types.InlineKeyboardButton("П.Н. Врангель - Записки", callback_data='book3') but4 = types.InlineKeyboardButton("М.Г. Дроздовский - Дневник", callback_data='book4') inMurkup.add(but1, but2, but3, but4) bot.send_message(message.chat.id, "Книги на любой вкус", reply_markup=inMurkup) else: bot.send_message(message.chat.id, "Я не знаю что и ответить") #обработка callback @bot.callback_query_handler(func=lambda call: True) def callback_inline(call): try: if call.message: if call.data == 'book1': doc = open('boo/Plotnikov_Ivan-Aleksandr_Vasilevich_Kolchak_Issledovatel_admiral_Verhovnyi_pravitel_Rossii.pdf', 'rb') bot.send_document(call.message.chat.id, doc) elif call.data == 'book2': doc = open('boo/Turkul_-_Drozdovtsy_v_ogne.pdf','rb') bot.send_document(call.message.chat.id, doc) elif call.data == 'book3': doc = open('boo/Vrangel_P_Zapiski_a4.pdf', 'rb') bot.send_document(call.message.chat.id, doc) elif call.data == 'book4': doc = open('boo/Drozdovsky_dnevnik_1963__ocr.pdf', 'rb') bot.send_document(call.message.chat.id, doc) #удаляем инлайновую клаву bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Книги на любой вкус", reply_markup=None) #Создаём уведомление bot.answer_callback_query(callback_query_id=call.id, show_alert=False, text='Приятного чтения!') except Exception as e: print(repr(e)) bot.polling(none_stop=True)

Пара слов от автора

Если есть желание показать друзьям что наворотили, то запускайте код и всё будет работать, но если код остановить или выключить комп, то бот ничего выдавать не будет. Из этого выходит, что для полноценного бота просто необходим хостинг, что, как правило, платно.

Больше функций, параметров и всего прочего находится в документации. Справочник на русском. Библиотеки pyTelegramBotAPI и xlrd.

Огромное спасибо за прочтение статьи! Надеюсь она оказалась полезной. А если понравилась, то поднимай статью в рейтинге и оставляй комменты)

Приглашаю прочесть мои статьи:

Автор обитает тут: ВК, Инстаграм

Получение данных из форм в Telegram

Не используйте ключи повторно. Если требуется подключить Телеграм к разным проектам, то для каждого проекта нужно запрашивать новый API Key и Secret Key.

Вы получите в ответ API key и Secret key — эти данные нужно будет скопировать и вставить на странице добавления Телеграма в Тильде.

Важно: Бота также можно добавить и в группу в Telegram. Для этого нужно добавить бота в группу с помощью опции Add Members в группе и написать в чат /start , а последующие действия совпадают с инструкцией для добавления диалога с ботом для одного пользователя.

Telegram API Key будет отрицательным, т.е. со знаком минус.

Как получать уведомление в телеграмм от excel

Фриланс маркетплейс

Пользователей онлайн: 485

Последний заказ: 2 мин. назад

Логотип и брендинг

Презентации и инфографика

Арт и иллюстрации

Веб и мобильный дизайн

Маркетплейсы и соцсети

Интерьер и экстерьер

Обработка и редактирование

Полиграфия

Промышленный дизайн

Наружная реклама

Доработка и настройка сайта

Создание сайтов

Десктоп программирование

Скрипты и боты

Мобильные приложения

Сервера и хостинг

Юзабилити, тесты и помощь

Тексты и наполнение сайта

Набор текста

Продающие и бизнес тексты

Резюме и вакансии

Статистика и аналитика

Соцсети и SMM

Контекстная реклама

Базы данных и клиентов

E-mail рассылки

Маркетплейсы и доски объявлений

Реклама и PR

Аудиозапись и озвучка

Музыка и песни

Редактирование аудио

Интро и анимация логотипа

Видеоролики

Персональный помощник

Бухгалтерия и налоги

Обзвоны и продажи

Юридическая помощь

Продажа сайтов

Подбор персонала

Презентация

Обучение и консалтинг

Стройка и ремонт

Логотип и брендинг

Презентации и инфографика

Арт и иллюстрации

Веб и мобильный дизайн

Маркетплейсы и соцсети

Интерьер и экстерьер

Обработка и редактирование

Полиграфия

Промышленный дизайн

Наружная реклама

Доработка и настройка сайта

Создание сайтов

Десктоп программирование

Скрипты и боты

Мобильные приложения

Сервера и хостинг

Юзабилити, тесты и помощь

Тексты и наполнение сайта

Набор текста

Продающие и бизнес тексты

Резюме и вакансии

Статистика и аналитика

Соцсети и SMM

Контекстная реклама

Базы данных и клиентов

E-mail рассылки

Маркетплейсы и доски объявлений

Реклама и PR

Аудиозапись и озвучка

Музыка и песни

Редактирование аудио

Интро и анимация логотипа

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *