首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >创建图像,然后使用其API将其添加到Google幻灯片

创建图像,然后使用其API将其添加到Google幻灯片
EN

Stack Overflow用户
提问于 2021-02-25 19:34:29
回答 2查看 281关注 0票数 1

我想用Python创建一个图像,matplotlib图,然后自动插入到google幻灯片演示文稿中。

我已经有了一个自动的google幻灯片演示。它更新了大量的文本,还用一些文本交换了一些设置的照片,即这5张照片总是相同的。使用Google API文档,弄清楚所有这些花了相当多的时间。我非常依赖Google API Github DocumentationCore Python Programming BlogReplacing text & images with the Google Slides API

虽然有一些与Google Service API帐户共享图像的例子,但我从来没有让它工作过。我只能通过使我的google驱动器中的图像对公众可见来让它将文本更新为图像。否则(例如,当服务帐户有访问权限,但公众没有访问权限时),我会得到这个错误:

代码语言:javascript
运行
AI代码解释
复制
<HttpError 400 when requesting [image URL] returned "Invalid requests[2].replaceAllShapesWithImage: There was a problem retrieving the image. The provided image should be publicly accessible, within size limit, and in supported formats.". Details: "Invalid requests[2].replaceAllShapesWithImage: There was a problem retrieving the image. The provided image should be publicly accessible, within size limit, and in supported formats.">

如果我将图像共享更改为公共,它就会起作用。

我知道有时谷歌的应用程序接口就是不起作用,正如here和我所看到的那样,我也会遇到这个错误。只需等待几个小时或等到明天,它就会再次工作,只要图像是公开的。通常,当出现这种情况时,我会得到以下错误:

代码语言:javascript
运行
AI代码解释
复制
HttpError 400 when requesting [image URL] "Invalid requests[0].replaceAllShapesWithImage[or createImage]: Access to the provided image was forbidden."

如何使用google API将在Python中创建的图像保存到google驱动器文件夹中,并使其可公开访问?或!更妙的是,当照片与创建幻灯片的google服务帐户共享时,如何将照片保存到google驱动器文件夹中,并使图像批量更新工作,但没有将其完全公开?

这是我到目前为止的代码:

代码语言:javascript
运行
AI代码解释
复制
from matplotlib import pyplot as plt
import json
import unidecode
from oauth2client.service_account import ServiceAccountCredentials
from httplib2 import Http
from apiclient import discovery
import pandas as pd


plt.bar(['hi', 'how', 'are', 'you'], [3,6,3,8], color="skyblue")
plt.savefig('test_bar_plot.png')


# google slides authorization
json_key  = json.load(open('../../creds/creds_file.json'))
scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive'] #would love to reduce scope if possible
creds = ServiceAccountCredentials.from_json_keyfile_dict(json_key, scope)

# file to copy for slide deck
TMPLFILE='test_run_slide_deck_template'

HTTP = creds.authorize(Http())
DRIVE =  discovery.build('drive',  'v3', http=HTTP)
SLIDES = discovery.build('slides', 'v1', http=HTTP)

# find slide template, delete copy if it already exists, then make a new copy
file_list = pd.DataFrame(DRIVE.files().list().execute().get('files'))
tempfileSTR = 'test_run_slide_deck'
new_file = '_copy'

try:
    DECK_ID= file_list[file_list.name == tempfileSTR+new_file]['id'].values[0]
    print("** Found File ID for %s" % (tempfileSTR+new_file))
    file = DRIVE.files().delete(fileId=DECK_ID).execute()
    print("** Deleting file for %s" % (tempfileSTR+new_file))
except IndexError:
    print("** Did NOT Find File ID for %s" % (tempfileSTR+new_file))
rsp = DRIVE.files().list(q="name='%s'" % TMPLFILE).execute().get('files')[0]
DATA = {'name': tempfileSTR+new_file, 'parents':['14CvIXemPv5fGcLaiTj_HfMXZS_OKI6Lv']}
print('** Copying template %r as %r' % (rsp['name'], DATA['name']))
DECK_ID = DRIVE.files().copy(body=DATA, fileId=rsp['id']).execute().get('id')

# get the presentation and slides 
presentation = SLIDES.presentations().get(presentationId=DECK_ID).execute()
slides = presentation.get('slides')

# create dictionary of what to update for text
report_dict = {"{{change_to_hey_SO}}":"Hi StackOverflow"
           ,"{{change_to_farewell}}":"Bye StackOverflow"}
reqs =[]
for key in report_dict:
    reqs.append({'replaceAllText': {'containsText': {'text': key},
        'replaceText': report_dict[key]}},)

# create dictionary for what to update for an image already in the drive 
def find_img(IMG_FILE):
    rsp = DRIVE.files().list(q="name='%s'" % IMG_FILE).execute().get('files')[0]
    baseURL = "http://drive.google.com/uc?export=view&id="
    return baseURL+rsp['id']

def image_section(image_replace_text, image_file_name):
    image_json = {
        'replaceAllShapesWithImage': {
        'imageUrl':  find_img(image_file_name),
        'imageReplaceMethod': 'CENTER_INSIDE',
        'containsText': {
            'text': image_replace_text,
            'matchCase': True
            }
        }
    }
    return image_json



# add image update to the list for batch updating 
reqs.append(image_section('{{make_me_a_rooster}}', 'rooster_test.png')) 
    
 

# take saved bar plot, 'test_bar_plot.png', upload it to google drive, make it public or make sharing it with the service account work and use the image_section and find_image functions to add it to the reqs updating list for the batch update below.

# [added edit] this uploads the image file, to the same shared folder as the slide deck (shared with user and service account). 
# but does not make the image public and I get the same error as above when it's not public. 
file_metadata = {'name': 'test_bar_plot.png', 'parents':['14CvIXemPv5fGcLaiTj_HfMXZS_OKI6Lv']}
media = discovery.MediaFileUpload('test_bar_plot.png', mimetype='image/png')
file = DRIVE.files().create(body=file_metadata,
                                        media_body=media,
                                        fields='id').execute()
    
# add to reqs list 
reqs.append(image_section('{{update_chart}}', 'test_bar_plot.png')) #, img_lookup

条形图

更新前的幻灯片

代码语言:javascript
运行
AI代码解释
复制
SLIDES.presentations().batchUpdate(body={'requests': reqs}, presentationId=DECK_ID).execute()
print('DONE')

更新后的幻灯片

This documentation是查找MediaFileUpload的主要链接,在示例中没有显示其他参数,我很难找到其他地方是否列出了其他参数。

EN

回答 2

Stack Overflow用户

发布于 2021-02-26 14:21:13

您遇到了问题,因为服务帐户是而不是域的一部分,因此权限将与任何不相关的用户相同。Like the documentation states

与用户帐户不同,

服务帐户不是您的Google Workspace域的成员。如果您与Google Workspace域中的所有成员共享Google Workspace资产,如文档或事件,则不会与服务帐户共享这些资产。同样,由服务帐户创建的Google Workspace资产也不是在您的Google Workspace域中创建的。因此,您的Google Workspace和云身份管理员无法拥有或管理这些资产。

发生在您身上的情况是,幻灯片的所有者没有添加图像的权限(您正尝试将其添加为链接)。当服务帐户尝试访问未公开的幻灯片时,也会发生同样的情况。

让它工作的最简单的方法是impersonate a user,这样服务帐户就可以像用户一样进行API调用。另一种选择是有一个共享文件夹/驱动器,服务帐户和用户都可以在其中添加切片和图像(文件将自动共享给所有帐户)。您也可以在每次上传或创建文件时手动与其他帐户共享该文件。

票数 0
EN

Stack Overflow用户

发布于 2021-08-31 08:43:28

我还想找到一种使用Python将图片上传到Google幻灯片的方法。我创建了一个程序,将图像上传到Google Cloud Storage;为它们创建一个签名的URL;然后使用该URL将图像导入到Google幻灯片中。它是麻省理工学院许可下的here,可能是一个有用的工具/资源。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66375296

复制
相关文章
【Android 逆向】ELF 文件格式 ( ELF 程序头入口大小 | ELF 程序头入口个数 | ELF 文件节区头入口大小 | ELF 文件节区头入口个数 | 字符表序号 )
ELF 文件头 第 42 ~ 43 字节 : ELF 程序头入口大小 ; 一般是 32 字节 ;
韩曙亮
2023/03/29
1K0
【Android 逆向】ELF 文件格式 ( ELF 程序头入口大小 | ELF 程序头入口个数 | ELF 文件节区头入口大小 | ELF 文件节区头入口个数 | 字符表序号 )
程序一定要从main函数开始运行吗?
每个目标文件都有好多个段,目标文件在被链接成可执行文件时,输入目标文件中的各个段如何被合并到输出文件?
程序员小猿
2021/01/19
1.3K0
程序一定要从main函数开始运行吗?
gcc -E 选项
-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面. 例子用法: gcc -E hello.c > pianoapan.txt gcc -E hello.c | more 慢慢看吧,一个hello word 也要与处理成800行的代码
Java架构师必看
2021/03/22
9680
写一个操作系统_08 内核与C语言
我们开发用户应用程序的时候,有标准库可以用,最典型的就是GUN C库,标准库一般是系统调用的封装,表面上是通过标准库访问系统资源,实际上是通过系统调用实现的。Linux的系统调用一般是先往eax寄存器写入系统调用号,然后通过0x80中断来实现。中断向量号为0x80称为系统中断门,更多的中断参考中断描述符表。
changan
2020/11/04
8280
动态链接的步骤与实现
我们知道动态链接器本身也是一个共享对象,但是事实上它有一些特殊性。对于普通共享对象文件来说,它的重定位工作由动态链接器来完成。他也可以依赖其他共享对象,其中的被依赖共享对象由动态链接器负责链接和装载。可是对于动态链接器来说,它的重定位工作由谁来完成?它是否可以依赖于其他共享对象?
233333
2019/05/25
1.4K0
只有170字节,最小的64位Hello World程序这样写成
机器之心转载 作者:CJ Ting 最简单的 C 语言 Hello World 程序,底层到底发生了什么?如何编写出最小的 64 位 Hello World 程序? Hello World 应该是每一位程序员的启蒙程序,出自于 Brian Kernighan 和 Dennis Ritchie 的一代经典著作 The C Programming Language。 // hello.c#include <stdio.h>int main() { printf("hello, world\n"
机器之心
2023/03/29
5450
只有170字节,最小的64位Hello World程序这样写成
BUUCTF 刷题笔记——PWN 2
先验文件,本题文件为 32 为可执行文件,保护约等于没开。值得注意的是,该文件又是静态链接,因此又可以直接调用一些未被调用过的函数来解题,比如老朋友 mprotect() 函数。
h-t-m
2023/03/10
1.5K0
BUUCTF 刷题笔记——PWN 2
吴章金: 如何创建一个*可执行*的共享库
license: "cc-by-nc-nd-4.0" description: "本文手把手指导如何创建一个可以执行的共享目标文件"
Linux阅码场
2019/11/10
1.2K0
Linux共享库、静态库、动态库详解
1. 介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程
sunsky
2020/08/20
9K0
Linux共享库、静态库、动态库详解
含大量图文解析及例程 | Linux下的ELF文件、链接、加载与库(中)
可执行文件的装载 进程和装载的基本概念的介绍 程序(可执行文件)和进程的区别 程序是静态的概念,它就是躺在磁盘里的一个文件。 进程是动态的概念,是动态运行起来的程序。 现代操作系统如何装载可执行文件 给进程分配独立的虚拟地址空间 将可执行文件映射到进程的虚拟地址空间(mmap) 将CPU指令寄存器设置到程序的入口地址,开始执行 可执行文件在装载的过程中实际上如我们所说的那样是映射的虚拟地址空间,所以可执行文件通常被叫做映像文件(或者Image文件)。 可执行ELF文件的两种视角 可执行ELF格式具有不寻常的
刘盼
2022/08/26
3.4K0
含大量图文解析及例程 | Linux下的ELF文件、链接、加载与库(中)
ROP的基本原理和实战教学,看这一篇就够了!
ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(比如内存不可执行和代码签名等)。通过上一篇文章栈溢出漏洞原理详解与利用,我们可以发现栈溢出的控制点是ret处,那么ROP的核心思想就是利用以ret结尾的指令序列把栈中的应该返回EIP的地址更改成我们需要的值,从而控制程序的执行流程。
Java程序猿
2023/02/21
3.4K0
linux ldd命令源代码,Linux中ldd命令的用法详解[通俗易懂]
Linux中ldd命令主要用于查看程式运行所需的共享库,那么ldd命令具体要如何使用呢?下面小编就给大家介绍下Linux下ldd命令的使用方法,感兴趣的朋友一起来学习下吧。
全栈程序员站长
2022/08/23
3.5K0
linux ldd命令源代码,Linux中ldd命令的用法详解[通俗易懂]
实战操作系统 loader 编写(下) -- 进军内核
上一篇文章中,我们结合此前已经介绍过的一系列知识,成功的将内核载入内存并进入到了保护模式中。 实战操作系统 loader 编写(上) — 进入保护模式
用户3147702
2022/06/27
4090
实战操作系统 loader 编写(下) -- 进军内核
linux 编译汇编,linux下的汇编教程
第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针、设置页表、操作 ARM的协处理器等。初始化完成后就可以跳转到C代码执行。需要注意的是,GNU的汇编器遵循AT&T的汇编语法,可以从GNU的站点(www.gnu.org)上下载有关规范。
全栈程序员站长
2022/06/28
3.5K0
Linux命令(65)——ld命令
ld命令是二进制工具集GNU Binutils的一员,是GNU链接器,用于将目标文件与库链接为可执行程序或库文件。
恋喵大鲤鱼
2019/04/18
17.8K0
nox&amp;CSAW部分pwn题解
暑假的时候遇到了一群一起学习安全的小伙伴,在他们的诱劝下,开始接触国外的CTF比赛,作为最菜的pwn选手就试着先打两场比赛试试水,结果发现国外比赛真有意思哎嘿。
安恒网络空间安全讲武堂
2018/10/25
1K0
写一个操作系统_14 C 链接与系统调用
链接可以指定最终生成的可执行文件的起始虚拟地址,我们 指定 内核加载到 0x1500的地方,内核初始化的时候跳转内核要跳转到这个地方。
changan
2020/11/04
4660
动态链接的相关结构
在了解了共享对象的绝对地址的引用问题后,我们基本上对动态链接的原理有了初步的了解,接下来的问题是整个动态链接具体的实现过程了。动态链接在不同的系统上有不同的实现方式。ELF的动态链接的实现方式会比PE的简单一点,在这里我们先介绍ELF的动态链接过程在LINUX下的实现,最后我们会专门的章节中介绍PE在Windows下的动态链接过程和它们的区别
233333
2019/05/25
1.7K0
nox&CSAW部分pwn题解
暑假的时候遇到了一群一起学习安全的小伙伴,在他们的诱劝下,开始接触国外的CTF比赛,作为最菜的pwn选手就试着先打两场比赛试试水,结果发现国外比赛真有意思哎嘿。
安恒网络空间安全讲武堂
2019/09/29
1.1K0
nox&CSAW部分pwn题解
ELF文件的加载过程(load_elf_binary函数详解)--Linux进程的管理与调度(十三)
一种是固定的、静态的连接,就是把需要用到的库函数的目标代码(二进制)代码从程序库中抽取出来,链接进应用软件的目标映像中;
233333
2018/10/09
8.5K0
ELF文件的加载过程(load_elf_binary函数详解)--Linux进程的管理与调度(十三)

相似问题

从加载器跳转到ELF的入口点

156

ELF入口点是否与通常的0x80*?为什么要这么做?

21

更改入口点“主”

25

入口点地址与原入口点有什么不同?

10

链接器(%ld) ELF问题

12
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档