- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近我开始尝试使用 Google 的日历 API 来为自己制作一个个人应用程序,该应用程序可以随机创建每日亮点,然后在将其传递到我的谷歌日历之前利用它们制作事件。我对这类事情的经验很少,几乎没有,但谷歌的快速入门指南让我在一个不错的地方设置。我几乎只是采用了他们提供的 Quickstart python 代码,添加了一些我自己的函数来创建和删除事件,并调整了范围以包括创建和删除所述事件的权限。我使用的代码:
from __future__ import print_function
import datetime
from hashlib import new
import os.path
from re import S
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from highlightsGenerator import *
# If modifying these scopes, delete the file token.json.
SCOPES = ['https://www.googleapis.com/auth/calendar.readonly',
'https://www.googleapis.com/auth/calendar.events',
'https://www.googleapis.com/auth/calendar']
templateEvent = {
'summary': 'Daily Highlight',
'description': '',
'start': {
'dateTime': '',
},
'end': {
'dateTime': '',
},
'reminders': {
'useDefault': True,
},
}
def createHighlightEvents(service):
workingDate = datetime.date.today()
workingDate += datetime.timedelta(days=1)
highlightSchedule = scheduleGenerator()
print(highlightSchedule)
for k in highlightSchedule:
newEvent = templateEvent
newEvent['description'] = k
newEvent['start']['dateTime'] = str(workingDate) + 'T13:00:00+3:00'
newEvent['end']['dateTime'] = str(workingDate) + 'T17:00:00+03:00'
service.events().insert(calendarId='primary', body=newEvent).execute()
workingDate += datetime.timedelta(days=1)
def deleteHighlightEvents(service):
now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
events_result = service.events().list(calendarId='primary', q='Daily Highlight',timeMin=now,
maxResults=20, singleEvents=True,
orderBy='startTime').execute()
events = events_result.get('items', [])
# if not events:
# print('No upcoming events found.')
# return
for event in events:
eID = event['id']
service.events().delete(calendarId='primary', eventId=eID).execute()
def reRollHighlightEvents(service):
deleteHighlightEvents(service)
createHighlightEvents(service)
def getDate(dateTime):
dateStr = dateTime[:len(dateTime) - 6]
date = datetime.datetime.strptime(dateStr, '%Y-%m-%dT%H:%M:%S')
return date
def shiftHighlights(service, numDays):
now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
events_result = service.events().list(calendarId='primary', q='Daily Highlight',timeMin=now,
maxResults=20, singleEvents=True,
orderBy='startTime').execute()
events = events_result.get('items', [])
if not events:
print('No upcoming events found.')
return
for event in events:
newStartDate = getDate(event['start']['dateTime']) + datetime.timedelta(days=numDays)
newEndDate = getDate(event['end']['dateTime']) + datetime.timedelta(days=numDays)
newStartDateStr = 'T'.join([str(newStartDate.date()), str(newStartDate.time())])
newEndDateStr = 'T'.join([str(newEndDate.date()), str(newEndDate.time())])
newEvent = event
newEvent['start']['dateTime'] = newStartDateStr + '+03:00'
newEvent['end']['dateTime'] = newEndDateStr + '+03:00'
service.events().update(calendarId='primary', eventId=event['id'], body=newEvent).execute()
def main():
"""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.json 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.json'):
creds = Credentials.from_authorized_user_file('token.json', SCOPES)
# 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(
'client_secret_158794507060-ucqbqgapmlf7lmvre6knjc5nehd00ms0.apps.googleusercontent.com.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token.json', 'w') as token:
token.write(creds.to_json())
try:
service = build('calendar', 'v3', credentials=creds)
# Call the Calendar API
now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
print('Getting the upcoming 10 events')
events_result = service.events().list(calendarId='primary', timeMin=now,
maxResults=10, singleEvents=True,
orderBy='startTime').execute()
events = events_result.get('items', [])
if not events:
print('No upcoming events found.')
return
# Prints the start and name of the next 10 events
for event in events:
start = event['start'].get('dateTime', event['start'].get('date'))
print(start, event['summary'])
userInput = input('Create (c), Delete (d), Re-Roll (r), Shift (s) highlights?\n')
if userInput == 'c':
createHighlightEvents(service)
elif userInput == 'd':
deleteHighlightEvents(service)
elif userInput == 'r':
reRollHighlightEvents(service)
elif userInput == 's':
numDays = input('How many days would you like to shift by? (x) to cancel\n')
if numDays != 'x' and numDays.isnumeric:
shiftHighlights(service, int(numDays))
elif numDays != 'x':
print('Please input a number or (x) to cancel')
else:
print('That is not one of the options')
except HttpError as error:
print('An error occurred: %s' % error)
if __name__ == '__main__':
main()
我设法让它做我想做的事,基本上就是这样,但是当我昨天尝试运行它时,它给出了一个错误请求的 http 400 错误。单击它提供的链接给了我这个:
{
"error": {
"code": 403,
"message": "The request is missing a valid API key.",
"errors": [
{
"message": "The request is missing a valid API key.",
"domain": "global",
"reason": "forbidden"
}
],
"status": "PERMISSION_DENIED"
}
}
现在您可能已经看到,我留在代码中用于检索和显示前 10 个即将发生的事件。它仍然能够正常运行,但如果尝试创建事件或删除事件,则会显示此错误消息。我对这条消息感到很困惑,因为我已经完成了我认为需要的所有授权。我的客户端密码没有改变,但即便如此,我还是重新下载了它,看看它是否会做任何事情,但它没有。我删除了 token 并让它一次又一次地运行授权,我给予了许可。这也被证明是徒劳的,据我所知,我的示波器还不错。
这里有几个问题有类似的错误,但他们似乎出于与我不同的原因(据我所知)或者因为他们缺少我认为我已经拥有的授权。
同样,我对这类事情几乎没有经验,所以可能有一些非常明显的事情我没有做,但恐怕我真的不知道那可能是什么。
如果您能提供任何帮助,我们将不胜感激
最佳答案
我已经重新创建并运行了您的代码,但我无法遇到 403
。代码看起来不错,应该可以工作,特别是因为您可以使用列表命令检索数据。这不是一个明确的答案,但要使其正常工作,您可以尝试:
'https://www.googleapis.com/auth/calendar'
范围,因为这是限制最少的范围,也是创建事件所需的范围。尽管如此,我确实设法找到了一个错误,该错误会导致您的代码在启动和运行时失败。 'start'
和 'end'
属性同时需要 'dateTime'
和 'timeZone'
属性作为它是在 this 中完成的例子。因此这段代码会失败:
newEvent['start']['dateTime'] = str(workingDate) + 'T13:00:00+3:00'
newEvent['end']['dateTime'] = str(workingDate) + 'T17:00:00+03:00'
并且应该替换为这个:
newEvent['start']['dateTime'] = str(workingDate) + 'T13:00:00'
newEvent['start']['timeZone'] = 'Your timeZone'
newEvent['end']['dateTime'] = str(workingDate) + 'T17:00:00'#Having the +3:00 will fail
newEvent['end']['timeZone'] = 'Your timeZone'
当然,您可以在维基百科中找到您的时区:https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
关于python - 谷歌日历 API : Error code 403: The request is missing a valid API key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70495445/
要在标题(或谷歌)中简洁地描述这是一个棘手的问题。我有一个分类表,其中某些列可能会根据置信度列为“已删除”。我想用“未识别”替换任何显示“已删除”的列,后跟第一列中未识别的值以行方式说“掉落”。因此,
我在 VSCode 上使用 pygame 模块,但遇到了 pygame 没有 init 成员的问题。我遵循了 this 的解决方案关联。我编辑了用户设置并添加了 "python.linting
我的问题是如何解决丢失的脚本太旧或丢失!! checking for a BSD-compatible install... /usr/bin/install -c checking whether
我正在使用带有启动器的 Spring Boot。当我错误配置启动器(缺少或定义了错误的值)时,它会打印“缺少 bean”错误消息,而不是“缺少值”。很难找到这个错误。 我的开胃菜看起来像 @Condi
我在 Django 1.7 中遇到问题,我正在尝试将用户保存到表中,但我收到一个错误,指出该表不存在。 这是我正在执行的代码: from django.conf import settings fro
我正在查看 EhCache 统计数据,我看到了这些数字: CacheMisses: 75977 CacheHits: 38151 InMemoryCacheMisses: 4843 InMemoryC
我正在尝试使用这些数据运行 lme 模型: tot_nochc=runif(10,1,15) cor_partner=factor(c(1,1,0,1,0,0,0,0,1,0)) age=runif(
我在 Microsoft Visual Studio C++ 中编写了一个程序,并为此使用了 SFML。我包含了程序所需的正确的 .dll 文件,并将它们复制到“发布”文件夹中。有效。整个程序在我的电
在设置新的Reaction CSR应用程序、一些样板库等过程中。在控制台中收到以下错误:。现在,我不会去修复一些我没有维护的包。我怎么才能找到真正的问题呢?Vite dev Build没有报告错误。
我正在上 React Native 类(class),然后使用 Flow 尝试纠正类(class)中的错误,因为讲师没有使用任何类型检查。 我在 Flow 中遇到了另一个错误,通过在互联网上进行长时间
我想删除图像标签正在寻找的缺失错误。我不想要 ult 标签占位符,试图故意将其保留为空白,直到我使用回形针浏览上传照片。 我已经将 url(:missing) 更改为许多其他内容,例如 nil 等。是
CREATE TABLE customer(customer_id NUMBER(6) PRIMARY KEY , customer_name VARCHAR2(40) NOT NULL , cust
我正在设置 invisible reCAPTCHA在我的 Web 应用程序中并且无法验证用户的响应。 (即使我传递了正确的 POST 参数) 我通过调用 grecaptcha.execute(); 以
我搜索了 these SO results找不到与我的问题相关的任何内容。我怀疑这可能是重复的。 我目前正在 .NET C# 3.5 中编写 Microsoft.Office.Interop.Exce
我在同一行收到两个错误。 Bridge *在 Lan 类中排名第一。我错过了什么? #include #include #include using namespace std; class L
首先,我看到了一些解决方案,但我没有理解它们。我是 QT 的新手,甚至谷歌也没有帮助我。英语不是我的母语 这是在QT Creator 5.6中调试后的报错信息 C2143: syntax error:
有没有办法把表1展开成表2?就是将start_no和end_no之间的每一个整数作为seq_no字段输出,取原表的其他字段组成新表(表2)。 表 1: date source market
我在 Excel (2016) 中制作了一个旭日形图,并希望为所有数据点添加标签。问题是,Excel 会自动丢弃一些标签: 似乎标签被删除是因为数据点太小或标签字符串太长。如何让 Excel 显示所有
在 R 3.0.2 中,missing() 函数可以告诉我们是否缺少形式参数。 如何避免硬编码传递给丢失的变量名称?例如在 demoargs <- function(a=3, b=2, d) {
我试图在 UI 上的某些功能中返回一个按钮,但出现了一个奇怪的错误。有人可以帮忙吗? var div = "View" 我得到的错误是: 参数列表后缺少 )。 最佳答案 onclick="javas
我是一名优秀的程序员,十分优秀!