【问题标题】:google calendar credentials handling谷歌日历凭据处理
【发布时间】:2020-12-16 16:27:42
【问题描述】:

我已经构建了一个写入 Google 日历事件的脚本,我使用 Pyinstaller 将脚本编译为一个 EXE 文件。我已经成功地从源文件夹运行该文件,当我尝试从桌面运行它时,它无法写入谷歌日历,因为它的凭据文件位于源代码中。

我不知道如何解决这个问题,因为我希望我的朋友能够使用它。

这是我编写的日历脚本:

from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
import pickle
import os.path
from google.auth.transport.requests import Request
from datetime import date, timedelta

SCOPES = ['https://www.googleapis.com/auth/calendar']

class PostToGoogleCalendar:
    def __init__(self):
        self.credentials = None
        if os.path.exists('token.pickle'):
            with open('token.pickle', 'rb') as token:
                self.credentials = pickle.load(token)
        if not self.credentials or not self.credentials.valid:
            if self.credentials and self.credentials.expired and self.credentials.refresh_token:
                self.credentials.refresh(Request())
            else:
                flow = InstalledAppFlow.from_client_secrets_file(
                    'credentials.json', SCOPES)
                self.credentials = flow.run_local_server()
            with open('token.pickle', 'wb') as token:
                pickle.dump(self.credentials, token)

        self.service = build('calendar', 'v3', credentials=self.credentials)
        result = self.service.calendarList().list().execute()
        self.calendar_id = result['items'][0]['id']


    def get_events(self):
        current_day_date = date.today()
        this_sunday_date = current_day_date - timedelta(days = (current_day_date.weekday() + 1) % 7)
        sunday_time = '08:00:00.000000Z'
        iso = f'{this_sunday_date}T{sunday_time}'
        events_result = self.service.events().list(calendarId=self.calendar_id, timeMin=iso,
                                                maxResults=500, singleEvents=True,
                                                orderBy='startTime').execute()
        return events_result.get('items', [])

    def create_event(self, event):
        if not self.already_exists(event):
            return self.service.events().insert(calendarId = self.calendar_id, body = event).execute() 
        else:
            return 'Event Already Exists'

    def already_exists(self, event):
        events = self.get_date_events(event['start']['dateTime'], self.get_events())
        event_list = [event['summary'] for event in events]
        if event['summary'] not in event_list:
            return False
        else:
            return True

    def get_date_events(self, date, events):
        lst = []
        date = date
        for event in events:
            if event.get('start').get('dateTime'):
                d1 = event['start']['dateTime']
                d1 = d1[:-6]
                if d1 == date:
                    lst.append(event)
        return lst

这部分是从主脚本调用的。

任何帮助将不胜感激!

【问题讨论】:

    标签: python google-api google-api-python-client


    【解决方案1】:

    您不得与您的朋友分享您的凭据文件,因为您在创建项目时同意与 Google 达成一致的TOS

    要求开发人员做出合理的努力来保护他们的私钥,而不是将它们嵌入到开源项目中。

    指导您的朋友如何创建自己的凭据文件并将其与您的 exe 放在同一目录中,以便它可以拾取它。

    【讨论】:

    • 有没有办法在用户每次打开我的脚本时默认自动执行此操作?它要求访问每个用户的谷歌日历并创建令牌的方式相同?
    • 不,您不能自动创建客户端凭据。如果您要提供您的代码,您还必须指导人们如何配置它,这包括如何创建他们自己的客户端凭据,并验证他们的应用程序,因为您使用的是完全访问 Google 日历范围,他们必须通过应用程序验证过程也是如此。 support.google.com/cloud/answer/7454865?hl=en
    • 如果我将我的范围更改为仅事件 (googleapis.com/auth/calendar.events)?他们还需要创建自己的凭据吗?有什么办法可以避免吗?
    • 只要您使用 Oauth2 对用户进行身份验证,您就需要在 Google 开发者控制台上创建一个项目并创建凭据。您不能共享该文件。您使用的范围无关紧要。
    • 在某个地方托管应用程序并让他们从他们那里运行它,那么他们就是您的用户。如果你给他们源代码让他们自己运行,那么他们需要自己的凭据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 2016-04-15
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多