Получение ошибки «Неверный запрос» с кодом ошибки HTTP 400

Я пытаюсь выполнить автоматизированную задачу через API Календаря Google и получаю следующее сообщение об ошибке:

C:\Users\Documents\Calendar Add-On>python calendar_v2.py
Traceback (most recent call last):
  File "C:\Users\Documents\Calendar Add-On\calendar_v2.py", line 68, in <module>
    create_events(calendar_id)
  File "C:\Users\Documents\Calendar Add-On\calendar_v2.py", line 46, in create_events
    events_result = service.events().list(
  File "C:\Users\anaconda3\lib\site-packages\googleapiclient\_helpers.py", line 130, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "C:\Users\anaconda3\lib\site-packages\googleapiclient\http.py", line 938, in execute
    raise HttpError(resp, content, uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 400 when requesting https://www.googleapis.com/calendar/v3/calendars/primary/events?timeMin=2024-05-15T20%3A43%3A15.671352&timeMax=2024-06-14T20%3A43%3A15.671352&singleEvents=true&alt=json returned "Bad Request". Details: "[{'domain': 'global', 'reason': 'badRequest', 'message': 'Bad Request'}]">

Я не могу понять, почему он выдает мне это сообщение об ошибке.

Я много пробовал экспериментировать с кодом, но всегда возвращался к этой проблеме. Краткий фрагмент моего кода (я, очевидно, пропустил идентификатор календаря и имя файла .json):

from google.oauth2 import service_account
from googleapiclient.discovery import build
from datetime import datetime, timedelta

# Define the service account credentials
SERVICE_ACCOUNT_FILE = r'path_to_service_account_file.json'
SCOPES = ['https://www.googleapis.com/auth/calendar']

# Authenticate and build the Calendar API client
credentials = service_account.Credentials.from_service_account_file(
    SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = build('calendar', 'v3', credentials=credentials)

# Function to add buffer before and after each event
def add_event_buffer(event):
    start_time = event['start'].get('dateTime')
    end_time = event['end'].get('dateTime')
    
    if start_time and end_time:
        start_dt = datetime.fromisoformat(start_time)
        end_dt = datetime.fromisoformat(end_time)
        buffer_time = timedelta(minutes=10)
        buffered_start_time = (start_dt - buffer_time).strftime('%Y-%m-%dT%H:%M:%S.%fZ')
        buffered_end_time = (end_dt + buffer_time).strftime('%Y-%m-%dT%H:%M:%S.%fZ')
        event['start']['dateTime'] = buffered_start_time
        event['end']['dateTime'] = buffered_end_time
        event['summary'] = 'Travel Time - ' + event['summary']
        
    return event

# Function to create buffered events on the calendar
def create_buffered_events(calendar_id):
    try:
        start_time = datetime.now().isoformat()
        end_time = (datetime.now() + timedelta(days=30)).isoformat()
        events_result = service.events().list(
            calendarId=calendar_id,
            timeMin=start_time,
            timeMax=end_time,
            singleEvents=True
        ).execute()
        
        events = events_result.get('items', [])
        if not events:
            print('No events found.')
        else:
            for event in events:
                if 'Travel Time' in event.get('summary', ''):
                    print(f'Skipping buffered event for: {event["summary"]} (already buffered)')
                    continue
                buffered_event = add_event_buffer(event)
                if 'id' in event:
                    service.events().update(calendarId=calendar_id, eventId=event['id'], body=buffered_event).execute()
                    print(f'Buffered event updated for: {buffered_event["summary"]}')
                else:
                    service.events().insert(calendarId=calendar_id, body=buffered_event).execute()
                    print(f'Buffered event created for: {buffered_event["summary"]}')
    except Exception as e:
        print("An error occurred:", e)
        raise 

# Example usage
if __name__ == '__main__':
    calendar_id = '[email protected]'
    create_buffered_events(calendar_id)

Пожалуйста, сузьте проблему или уточните ее. Какой вызов не работает? service.events().list(), service.events().update() или service.events().insert()? Запишите все данные и проверьте их правильность. Сообщите нам, какие данные вы передаете на неудачный вызов. Посмотрите пример кода, представленный в другом месте, и сравните его со своим. Вы даже можете попросить ChatGPT сгенерировать для вас фрагмент и посмотреть, работает ли он и в чем различия.

dmitri 16.05.2024 03:40

Как мне узнать, какой вызов не работает? Я не смог найти пример кода где-либо еще, и он был создан с помощью ChatGPT. Все это для меня в новинку, поэтому мне может понадобиться помощь.

Danish Karmally 16.05.2024 04:03

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

dmitri 16.05.2024 04:24
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

А как насчет следующей модификации вашего сценария? Пожалуйста, измените create_buffered_events следующим образом.

От:

start_time = datetime.now().isoformat()
end_time = (datetime.now() + timedelta(days=30)).isoformat()

К:

start_time = datetime.now().isoformat() + "Z"
end_time = (datetime.now() + timedelta(days=30)).isoformat() + "Z"
  • Когда я тестировал ваш скрипт, я подтвердил то же сообщение об ошибке. И когда я протестировал сценарий, отражающий вышеуказанную модификацию, ошибок не произошло, и событие было обновлено.

БОЛЬШОЕ СПАСИБО!!!! Это сработало для меня! Не могу поверить, что это было так просто!

Danish Karmally 18.05.2024 02:56

Привет @Tanaike, извини, но в моем коде снова возникла проблема. Могу ли я попросить вас быстро меня найти? github.com/danishik/random/blob/main/calendar

Danish Karmally 23.05.2024 03:59

@Danish Karmally Что касается твоего нового вопроса Hi @Tanaike, sorry but my code is running into an issue again. Can I please request if you can quickly take a look for me?, я хотел бы тебя поддержать. Итак, можете ли вы опубликовать это как новый вопрос, включив дополнительную информацию? Это поможет пользователям, включая меня, придумать решение. Если вы можете помочь в решении вашего нового вопроса, я буду рад. Можете ли вы сотрудничать, чтобы сделать это?

Tanaike 23.05.2024 06:31

Другие вопросы по теме