首页 > 编程问答 >如何使用 python (使用服务帐户)在应用程序脚本 Web 应用程序上触发 doGet()?

如何使用 python (使用服务帐户)在应用程序脚本 Web 应用程序上触发 doGet()?

时间:2024-08-03 15:58:17浏览次数:14  
标签:python google-apps-script

我想从返回 json 的应用程序脚本 Web 应用程序触发 doGet(e) 事件。 我们的网络应用程序无法在我们的组织域之外访问,因此需要服务帐户。 我执行了下面的代码,但“发生错误:401 客户端错误”

from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession
import requests

SERVICE_ACCOUNT_FILE = r'C:\Users\USER\Documents\fga-openrpa-sa.json'
SCOPES = ['https://www.googleapis.com/auth/script.external_request']

credentials = service_account.Credentials.from_service_account_file(
    SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    
authed_session = AuthorizedSession(credentials)

url = 'https://script.google.com/a/macros/s/path/exec?page=something'

try:
    response = authed_session.get(url)
    response.raise_for_status()
    print("Response status code:", response.status_code)
    print("Response content:", response.text)
except requests.exceptions.RequestException as e:
    print("An error occurred:", e)

我也尝试了 oauth,但服务帐户更容易设置。我也没有可用的代码


在尝试使用服务帐户访问 Google Apps Script Web 应用程序时遇到“401 客户端错误”的原因是,即使使用服务帐户,Web 应用程序也需要身份验证。服务帐户仅用于服务器端授权,而需要模拟用户身份验证才能触发 doGet(e)

以下是可以考虑的替代解决方案:

1. 使用用户身份验证(OAuth 2.0):

  • 这是最常见且推荐的访问 Google Apps Script Web 应用程序的方法,因为它可以正确处理用户授权。
  • 需要设置 OAuth 2.0 流以获取用户访问令牌,然后将其用于向 Web 应用程序发出请求。
  • 以下是使用 Python 进行设置的步骤:

    ```python from googleapiclient.discovery import build from google_auth_oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import AuthorizedSession

    # 替换为的信息 SCOPES = ['https://www.googleapis.com/auth/script.projects'] SCRIPT_ID = 'your_script_id'

    flow = InstalledAppFlow.from_client_secret_file('client_secret.json', SCOPES) credentials = flow.run_local_server()

    authed_session = AuthorizedSession(credentials)

    url = f'https://script.google.com/macros/s/{SCRIPT_ID}/exec?page=something'

    try: response = authed_session.get(url) response.raise_for_status() print("Response status code:", response.status_code) print("Response content:", response.text) except requests.exceptions.RequestException as e: print("An error occurred:", e) ```

  • 请记住,此方法需要用户交互以授予应用程序访问其数据的权限。

2. 将 Web 应用程序发布为可由所有人(甚至未登录的用户)访问:

  • 这是不太安全的选择,因为它允许任何人调用的 Web 应用程序。
  • 如果的 Web 应用程序不处理敏感数据并且确定要将其公开,则此选项可能适用。
  • 要更改部署设置,请在 Apps Script 编辑器中转到“部署”>“新建部署”>“任何人,即使未登录 Google 也可以访问”。

3. 使用 Google Cloud Functions 或类似服务作为中介:

  • 在此方法中,可以创建一个 Cloud Function,该函数可以使用服务帐户进行身份验证,然后调用的 Apps Script Web 应用程序。
  • 这允许将用户身份验证与服务帐户授权分离,但需要设置和管理额外的基础结构。

请记住,使用服务帐户模拟用户身份验证会带来安全风险,并且违反了 Google 的服务条款。 建议使用 OAuth 2.0 或其他安全方法来对用户进行身份验证并访问的 Web 应用程序。

标签:python,google-apps-script
From: 78828061

相关文章

  • 如何使用 BeautifulSoup python 查找选择标签的选定选项值
    我正在尝试从python中的htmlselect标签获取选定的值。好吧,当选项属性设置为selected="selected"时,它是成功的,但我试图废弃的网站具有不同的选项属性,例如:-html="""<select><optionvalue="">Pleaseselectavlalue</option><o......
  • 12:Python元组属性
    #元组tuple,元素不可被修改,不能被增加或则删除tu=(111,'alex',(11,22),[(33,44)],True,33,44,)#一般写元组的时候,最后可以加个逗号不报错print(tu)tu=(111,'alex',(11,22),[(33,44)],True,33,44,)v=tu[0]#元组索引print(v)tu=(111,'alex',(11,2......
  • 如何在venv python中安装requirements.txt
    我是Python虚拟环境的初学者,在安装requirements.txt文件时遇到问题。问题是,当我运行命令来安装requirements.txt文件时,没有安装任何内容。平台:WindowsVS代码镜像如何解决这个问题?没有正确激活虚拟环境。请按照以下步骤操作:1.激活虚拟环境:在VSC......
  • 【代码随想录】图论复习(Python版)
    深度优先搜索1.搜索过程一个方向搜,不到黄河不回头,直到遇到绝境了,搜不下去了,再换方向(换方向的过程就涉及到了回溯)2.代码框架回溯法的代码框架:defbacktracking(参数):if终止条件:存放结果returnfor选择本层集合中的元素(树中节点孩子的数量......
  • 【Python】数据类型之字符串
    本篇文章将继续讲解字符串其他功能:1、求字符串长度功能:len(str)  ,该功能是求字符串str的长度。代码演示:2、通过索引获取字符串的字符。功能:str[a]  str为字符串,a为整型。该功能是获取字符串str索引为a处的字符。注意:字符串的索引是从0开始的。代码演示:注意......
  • 【Python】python基础
    本篇文章将讲解以下知识点:(1)循环语句(2)字符串格式化(3)运算符一:循环语句循环语句有两种:while   for本篇文章只讲解while循环格式:while 条件:  代码(只有条件为真的时候,此代码才会被执行,此处的代码可以是多行代码)(1)循环语句基本使用示例1:此处代码执行过程:1<3......
  • python 爬虫入门实战——爬取维基百科“百科全书”词条页面内链
    1.简述本次爬取维基百科“百科全书”词条页面内链,仅发送一次请求,获取一个html页面,同时不包含应对反爬虫的知识,仅包含最基础的网页爬取、数据清洗、存储为csv文件。爬取网址url为“https://zh.wikipedia.org/wiki/百科全书”,爬取内容为该页面所有内链及内链标识(下图蓝......
  • Python:match()和search()的区别
    在Python中,match()和search()函数通常与正则表达式(regularexpressions)一起使用,特别是在re模块中。尽管它们都用于搜索字符串中的模式,但它们在搜索行为上有关键的区别。re.match()re.match()函数尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()......
  • Python:range()函数的用法
    range()函数是Python中一个内置函数,用于生成一个数字序列。这个函数通常用于在for循环中迭代一个指定的次数。range()函数可以接收一到三个参数,分别是起始值(start)、结束值(stop)和步长(step),但步长是可选的,默认值为1。基本用法两个参数:range(start,stop)生成一个从star......
  • 计算机毕业设计-基于python高校大学生评奖评优系统【源码+文档+PPT】
    精彩专栏推荐订阅:在下方主页......