Share This
Связаться со мной
Крути в низ
Categories
//Телеграм бот для Календаря Google

Телеграм бот для Календаря Google

31.10.2021Category : Python

В этой статье мы расскажем, как создать Телеграм бота для планирования встреч при помощи Календаря Google. Наш бот будет помогать назначать встречи, учитывая доступность свободного времени.

Будет весьма неплохо, если у вас уже есть базовые знания о Python и HTTP-запросах, а также представление о google-calendar-api.

Начнем с того, что перейдем в Телеграм и найдем там Бота-Отца (BotFather). Этот бот предназначен для создания новых ботов и управления ими.

telegram bot dlja kalendarja google 1a2d026 - Телеграм бот для Календаря Google

Далее введем следующие команды:

/start /newbot

После этого введем имя бота и имя пользователя. В результате будет создан бот и сгенерирован ключ API. Давайте проверим бот, послав ему сообщение.

telegram bot dlja kalendarja google 220f3a8 - Телеграм бот для Календаря Google

У BotFather есть несколько опций для настройки нового бота:

/setname - change a bot's name /setdescription - change bot description /setabouttext - change bot about info /setuserpic - change bot profile photo /setcommands - change the list of commands

Но пока мы не будем усложнять наш проект и остановимся на создании нового бота.

telegram bot dlja kalendarja google 52e5d4c - Телеграм бот для Календаря Google

Марк Лутц «Изучаем Python»

Скачивайте книгу у нас в телеграм

Скачать ×

Python-код

Далее создадим файл под названием main.py и сохраним туда следующий код:

import requests import datetime  import json  api_key='your_api_key'  def run():     url = "https://api.telegram.org/bot{}/getUpdates".format(api_key)     response = requests.get(url)     data=response.json()     print(data)  if __name__ == "__main__":     run()

Результатом выполнения этого кода будут данные в формате JSON, которые содержат сообщения, посланные в этот бот. Если же сообщений еще нет, то результатом будет пустой список.

'ok': True, 'result': [{'update_id': 471332233, 'message': {'message_id': 1, 'from': {'id': 572274814, 'is_bot': False, 'first_name': 'automationfeed'}, 'chat': {'id': 572274814, 'first_name': 'automationfeed', 'type': 'private'}, 'date': 1578749467, 'text': '/start', 'entities': [{'offset': 0, 'length': 6, 'type': 'bot_command'}]}}, {'update_id': 471332234, 'message': {'message_id': 2, 'from': {'id': 572274814, 'is_bot': False, 'first_name': 'automationfeed', 'language_code': 'en'}, 'chat': {'id': 572274814, 'first_name': 'automationfeed', 'type': 'private'}, 'date': 1578749481, 'text': 'test'}}]}

Создаем связь с Google-календарем

Теперь перейдем в Google-календарь по следующей ссылке и активируем Google Calendar API .

telegram bot dlja kalendarja google c1a50f1 - Телеграм бот для Календаря Google

Загружаем файл credential.json и сохраняем его в том же каталоге, что и наш файл main.py. А далее для установки нужных нам модулей выполняем в терминале следующую команду:

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

После этого скопируем файл quickstart.py, переименуем его в scheduler.py и переместим его в тот же каталог, где уже находятся наши рабочие файлы. Таким образом иерархия файлов будет иметь следующий вид:

Telegram-Bot      |      |----- main.py      |----- scheduler.py      |----- credentials.json

После этого нам нужно создать в файле scheduler.py функцию, создающую событие и возвращающую значения булевого типа: True, если событие удалось успешно занести в календарь, и False в противном случае.

from __future__ import print_function import datetime import pickle import os.path from googleapiclient.discovery import build from google_auth_oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import Request  # If modifying these scopes, delete the file token.pickle. # SCOPES = ['https://www.googleapis.com/auth/calendar.readonly'] SCOPES = ['https://www.googleapis.com/auth/calendar']  def book_timeslot(event_description,booking_time,input_email):     """Shows basic usage of the Google Calendar API.     Prints the start and name of the next 10 events on the user's calendar.     """     creds = None     # The file token.pickle stores the user's access and refresh tokens, and is     # created automatically when the authorization flow completes for the first     # time.     if os.path.exists('token.pickle'):         with open('token.pickle', 'rb') as token:             creds = pickle.load(token)     # If there are no (valid) credentials available, let the user log in.     if not creds or not creds.valid:         if creds and creds.expired and creds.refresh_token:             creds.refresh(Request())         else:             flow = InstalledAppFlow.from_client_secrets_file(                 'credentials.json', SCOPES)             creds = flow.run_local_server(port=0)         # Save the credentials for the next run         with open('token.pickle', 'wb') as token:             pickle.dump(creds, token)      service = build('calendar', 'v3', credentials=creds)          #--------------------- Manipulating Booking Time ----------------------------     start_time=str(datetime.datetime.now())[:10]+'T'+booking_time+':00+08:00'     end_time=str(datetime.datetime.now())[:10]+'T'+str(int(booking_time[:2])+1)+':00:00+08:00'     #----------------------------------------------------------------------------      # Call the Calendar API     now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time     print('Booking a time slot....')     events_result = service.events().list(calendarId='primary', timeMin=now,                                         maxResults=10, singleEvents=True,                                         orderBy='startTime').execute()     events = events_result.get('items', [])     if not events:         event = {         'summary': 'Hair Cut Appointment',         'location': 'Singapore',         'description': str(event_description) + 'with AutomationFeed',         'start': {         'dateTime': start_time,         'timeZone': 'Asia/Singapore',         },         'end': {         'dateTime': end_time,         'timeZone': 'Asia/Singapore',         },         'recurrence': [         'RRULE:FREQ=DAILY;COUNT=1'         ],         'attendees': [         {'email': 'automationfeed@gmail.com'},         {'email': str(input_email)},         ],         'reminders': {         'useDefault': False,         'overrides': [             {'method': 'email', 'minutes': 24 * 60},             {'method': 'popup', 'minutes': 10},         ],         },         }         event = service.events().insert(calendarId='primary', body=event).execute()         print ('Event created: %s' % (event.get('htmlLink')))         return True      else:         # --------------------- Check if there are any similar start time ---------------------          for event in events:             start = event['start'].get('dateTime', event['start'].get('date'))             if start==start_time:                 print('Already book....')                 return False         # -------------------- Break out of for loop if there are no apppointment that has the same time ----------         event = {         'summary': 'Hair Cut Appointment',         'location': 'Singapore',         'description': str(event_description) + 'with AutomationFeed',         'start': {         'dateTime': start_time,         'timeZone': 'Asia/Singapore',         },         'end': {         'dateTime': end_time,         'timeZone': 'Asia/Singapore',         },         'recurrence': [         'RRULE:FREQ=DAILY;COUNT=1'         ],         'attendees': [         {'email': 'automationfeed@gmail.com'},         {'email': str(input_email)},         ],         'reminders': {         'useDefault': False,         'overrides': [             {'method': 'email', 'minutes': 24 * 60},             {'method': 'popup', 'minutes': 10},         ],         },         }         event = service.events().insert(calendarId='primary', body=event).execute()         print ('Event created: %s' % (event.get('htmlLink')))         return True        if __name__ == '__main__':      input_email='test@gmail.com'     booking_time='14:00'      result=book_timeslot('Dye',booking_time,input_email)

В этом коде некоторые операторы if изменяют результат в зависимости от текущего времени. Например, если текущее время 07:15, то на встроенной клавиатуре будут отображаться временные интервалы от 08:00 до 18:00.

telegram bot dlja kalendarja google 39ee709 - Телеграм бот для Календаря GoogleТак как текущее время 15:59, то показаны интервалы с 16:00 до 18:00.

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

def check_email(email):     regex = '^w+([.-]?w+)*@w+([.-]?w+)*(.w{2,3})+$'     if(re.search(regex,email)):           print("Valid Email")          return True     else:           print("Invalid Email")           return False

Вот так это будет выглядеть в Телеграм.

telegram bot dlja kalendarja google 81a4ace - Телеграм бот для Календаря Google

И теперь нам нужно убедиться, что событие было создано в Календаре Google. Для этого перейдем в Календарь и убедимся, что данное мероприятие существует. Вы можете настроить продолжительность мероприятия, сделать его описание и указать состав участников.

telegram bot dlja kalendarja google b038101 - Телеграм бот для Календаря Google

Код данного проекта можно загрузить по следующей ссылке: https://github.com/kaikiat/telegram-scheduler-bot/tree/master.

Перевод статьи «Build a Telegram Bot Scheduler with Python».

  • 20 views
  • 0 Comment

Leave a Reply

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Свежие комментарии

    Рубрики

    About Author 01.

    blank
    Roman Spiridonov

    Моя специальность - Back-end Developer, Software Engineer Python. Мне 39 лет, я работаю в области информационных технологий более 5 лет. Опыт программирования на Python более 3 лет. На Django более 2 лет.

    Categories 05.

    © Speccy 2022 / All rights reserved

    Связаться со мной
    Close