【问题标题】:How to save/display giphy gif using python API?如何使用 python API 保存/显示 giphy gif?
【发布时间】:2019-07-26 07:40:16
【问题描述】:

我正在创建一个很酷的移动相框,最终用我自己的照片,但现在我只想搜索 giphy 并保存/显示一个 gif。

这是我从他们的API 收集到的代码。

import giphy_client as gc
from giphy_client.rest import ApiException
from random import randint

api_instance = gc.DefaultApi()
api_key = 'MY_API_KEY'
query = 'art'
fmt = 'gif'

try:
    response = api_instance.gifs_search_get(api_key,query,limit=1,offset=randint(1,10),fmt=fmt)
    gif_id = response.data[0]
except ApiException:
    print("Exception when calling DefaultApi->gifs_search_get: %s\n" % e)

with open('test.txt','w') as f:
    f.write(type(gif_id))

我得到一个类型的对象:类 'giphy_client.models.gif.Gif',我想保存这个 gif 并将其显示在监视器上。我知道我在这方面还有很长的路要走,但我仍在学习 API 以及如何使用它们。如果有人可以帮助我找到保存此 gif 或直接从他们的网站显示的方法,将不胜感激!

【问题讨论】:

    标签: python api giphy


    【解决方案1】:

    欢迎德巴特!

    我看到您的代码确实成功检索了随机图像,这很好。 获取图像需要 3 个步骤:

    1. 获取 GIF 网址。

    您正在使用的 giphy_client 客户端是使用 Swagger 制作的,因此,您可以像访问任何其他对象一样访问 REST 响应元素,或打印它们。

    例如:

    >>> print(gif_id.images.downsized.url)
    'https://media0.giphy.com/media/l3nWlvtvAFHcDFKXm/giphy-downsized.gif?cid=e1bb72ff5c7dc1c67732476c2e69b2ff'
    

    请注意,当我打印此内容时,我会得到一个 URL。你得到的Gif 对象,称为gif_id,有一堆URL 用于下载不同分辨率的GIF 或MP4。在这种情况下,我选择了缩小尺寸的 GIF。你可以看到使用print(gif_id)检索到的所有元素

    所以,我将把它添加到你的代码中:

    gif_url = gif_id.images.downsized.url
    
    1. 下载 GIF

    现在您有了一个 URL,是时候下载 GIF 了。我将使用 requests 库来执行此操作,如果您的环境中没有,请使用 pip 安装它。似乎您已经尝试过这样做,但出现了错误。

    import requests
    [...]
    with open('test.gif','wb') as f:
        f.write(requests.get(url_gif).content)
    
    1. 显示 GIF

    有很多用于 Python 的 GUI 可以执行此操作,或者您甚至可以调用浏览器来显示它。您需要调查哪种 GUI 更适合您的需求。对于这种情况,我将使用example posted here,并进行一些修改,以使用 TKinter 显示 Gif。如果您的 Python 安装中不包含 Tkinter,请安装。

    最终代码:

    import giphy_client as gc
    from giphy_client.rest import ApiException
    from random import randint
    import requests
    from tkinter import *
    import time
    import os
    
    root = Tk()
    
    api_instance = gc.DefaultApi()
    api_key = 'YOUR_OWN_API_KEY'
    query = 'art'
    fmt = 'gif'
    
    try:
        response = api_instance.gifs_search_get(api_key,query,limit=1,offset=randint(1,10),fmt=fmt)
        gif_id = response.data[0]
        url_gif = gif_id.images.downsized.url
    except ApiException:
        print("Exception when calling DefaultApi->gifs_search_get: %s\n" % e)
    
    with open('test.gif','wb') as f:
        f.write(requests.get(url_gif).content)
    
    frames = []
    i = 0
    while True:  # Add frames until out of range
        try:
            frames.append(PhotoImage(file='test.gif',format = 'gif -index %i' %(i)))
            i = i + 1
        except TclError:
            break
    
    def update(ind):  # Display and loop the GIF
        if ind >= len(frames):
            ind = 0
        frame = frames[ind]
        ind += 1
        label.configure(image=frame)
        root.after(100, update, ind)
    
    label = Label(root)
    label.pack()
    root.after(0, update, 0)
    root.mainloop()
    

    如果您想继续使用 giphy_client 库,请继续学习如何使用 REST API 和 Swagger。如果没有,您可以直接使用requests 库发出请求。

    【讨论】:

    • 这比我希望的要彻底得多!这是一个很好的答案,因为你给了我很多跳跃点来了解这个问题的不同方面。我的背景是科学计算,所以学习所有这些新信息正是我所需要的!感谢您的辛勤工作!
    • 嘿,我有另一个问题,我想你可能拥有知识来再次帮助我?我的新问题在这里stackoverflow.com/questions/55013938/…
    • 你好,我猜它必须对 GIF 的动画是如何完成的,以及 Tkinter 本身不支持 GIF 的部分做一些事情。我稍后会检查它,同时您可以检查此代码以使用 Qt5 而不是 Tkinter es.stackoverflow.com/a/205620/16435(西班牙语)
    猜你喜欢
    • 2020-02-14
    • 2017-05-28
    • 2017-05-31
    • 1970-01-01
    • 2019-12-21
    • 2020-08-20
    • 2020-02-15
    • 2021-04-13
    • 1970-01-01
    相关资源
    最近更新 更多