带有 python 的重力形式 API

问题描述 投票:0回答:2

API的文档在这里,我尝试用python实现这一行

//retrieve entries created on a specific day (use the date_created field)
//this example returns entries created on September 10, 2019
https://localhost/wp-json/gf/v2/entries?search={"field_filters": [{"key":"date_created","value":"09/10/2019","operator":"is"}]}

但是当我尝试在下面的代码中使用 python 时,我得到了一个错误:

import json
import oauthlib
from requests_oauthlib import OAuth1Session

consumer_key = ""
client_secret = ""

session = OAuth1Session(consumer_key, 
client_secret=client_secret,signature_type=oauthlib.oauth1.SIGNATURE_TYPE_QUERY)

url = 'https://localhost/wp-json/gf/v2/entries?search={"field_filters": [{"key":"date_created","value":"09/01/2023","operator":"is"}]}'


r = session.get(url)
print(r.content)

错误信息是:

ValueError: Error trying to decode a non urlencoded string. Found invalid characters: {']', '['} in the string: 'search=%7B%22field_filters%22:%20[%7B%22key%22:%22date_created%22,%22value%22:%2209/01/2023%22,%22operator%22:%22is%22%7D]%7D'. Please ensure the request/response body is x-www-form-urlencoded.

一个解决方案是参数化url:

import requests
import json

url = 'https://localhost/wp-json/gf/v2/entries'

params = {
    "search": {"field_filters": [{"key":"date_created","value":"09/01/2023","operator":"is"}]}
}

headers = {'Content-type': 'application/json'}

response = session.get(url, params=params, headers=headers)

print(response.json())

但是在检索到的条目中,没有过滤指定日期的数据。

在官方文档中,他们给出了这种格式的日期“09/01/2023”,但在我的数据集中,格式是:“2023-01-10 19:16:59” 我必须转换格式吗?我尝试了不同的日期格式

date_created = "09/01/2023"
date_created = datetime.strptime(date_created, "%d/%m/%Y").strftime("%Y-%m-%d %H:%M:%S")

我可以测试哪些替代解决方案?

python api wordpress-rest-api gravity-forms-plugin
2个回答
0
投票

如果你使用

urllib.parse.urlencode
函数怎么办,那么你的代码将如下所示:

import json
import oauthlib
from requests_oauthlib import OAuth1Session

import urllib.parse

consumer_key = ""
client_secret = ""

session = OAuth1Session(consumer_key, 
client_secret=client_secret,signature_type=oauthlib.oauth1.SIGNATURE_TYPE_QUERY)

params = {
    "search": {"field_filters": [{"key":"date_created","value":"09/01/2023","operator":"is"}]}
}

encoded_params = urllib.parse.urlencode(params)
url = f'https://localhost/wp-json/gf/v2/entries?{encoded_params}'


r = session.get(url)
print(r.content)

希望有帮助


0
投票

我有同样的问题,并找到了这个代码的解决方案:

params = {
    'search': json.dumps({
        'field_filters': [
            { 'key': 'date_created', 'value': '2023-01-01', 'operator': 'is' }
        ],
        'mode': 'all'
    })
}

encoded_params = urllib.parse.urlencode(params, quote_via=urllib.parse.quote)
url = 'http://localhost/depot_git/wp-json/gf/v2/forms/1/entries?' + encoded_params + '&paging[page_size]=999999999' # nombre de réponses par page forcé manuellement

我不太确定是什么允许它工作,因为我是 Python 的绝对初学者,但我发现你需要在 URL 中使用双引号 (") 而不是简单的引号 ('),所以 William Castrillon 的解决方案还不够。

关于日期格式,Gravity Forms 好像能理解DD/MM/YYYY。它也不需要时间。

© www.soinside.com 2019 - 2024. All rights reserved.