使用IFTTT检查JSON内容并发送电子邮件或短信

时间:2018-01-30 03:20:34

标签: python json ifttt

我正在尝试学习如何在IFTTT上使用新的WebHooks服务,并且我正在努力弄清楚它应该如何工作。我在网上找到的大多数项目似乎都是指一个被弃用的"制造商"服务,解释新频道的资源非常少。

让我们说我想查看" online"的价值。在以下json文件中每隔十分钟:https://lichess.org/api/users/status?ids=thibault

我可以编写一个Python脚本来提取这个值,如下所示:

response = urlopen('https://lichess.org/api/users/status?ids=thibault')
thibault = response.read()
data = json.loads(thibault)
status = data[0]['online']

如果status等于" true",我希望通过电子邮件或短信收到通知。如何集成python脚本和webhooks服务?或者我甚至需要使用这个脚本?我假设我需要某种定期运行此Python脚本的cron作业,但如何将此作业与IFTTT连接?

当我在IFTTT上创建一个新applet时,我可以创建一个带有随机事件名称的触发器,但是它不清楚该事件名称对应的是什么。

1 个答案:

答案 0 :(得分:4)

我的IFTTT webhook服务有类似的设置。据我所知,你的问题的答案是肯定的,你需要这个脚本(或类似的)来取消online值,你可能想要做一个cron工作(我的方法)或保持脚本运行(不是我的偏好)。

IFTTT的webhooks最多包含3个json个值,您可以将其POST到给定的事件和密钥名称。

以下是我的webhook API的一个非常简单的摘录:

def push_notification(*values, **kwargs):
    # config is in json format        
    config = get_config()  
    report = {}
    IFTTT = {}

    # set default event/key if kwargs are not present
    for i in ['event', 'key']: 
        IFTTT[i] = kwargs[i] if kwargs and i in kwargs.keys() else config['IFTTT'][i]

    # unpack values received (up to 3 is accepted by IFTTT)
    for i, value in enumerate(values, 1): 
        report[f"value{i}"] = value
    if report:
        res = requests.post(f"https://maker.ifttt.com/trigger/{IFTTT['event']}/with/key/{IFTTT['key']}", data=report)
        # TODO: add try/except for status
        res.raise_for_status() 
        return res
    else:
        return None 

您可能不需要所有这些,但我的目标是建立一个多功能的解决方案。在一天结束时,您真正需要的就是这一行:

requests.post(f"https://maker.ifttt.com/trigger/{event}/with/key/{key}", data={my_json_up_to_3_values})

您将在何处放置您的webhook event名称和秘密key值。我将它们存储在配置文件中。一旦您在IFTTT上注册webhook服务,就可以使用密钥(转到您的IFTTT webhook applet设置)。您可以通过以下快速帮助链接找到您的密钥:https://maker.ifttt.com/use/{your_secret_key}。该事件可以是您在applet上设置的默认值,或者如果允许,用户可以选择其事件名称。

在您的情况下,您可以执行以下操作:

if status:
    push_notification("Status is True", "From id thibault", event="PushStatus", key="MysEcR5tK3y")

注意:我使用版本3.6+的f-strings(太棒了!),但如果版本较低,则应将所有f字符串切换为str.format().