Habitica为你的账户中可能发生的操作(例如,你完成了某个任务,或是有人在你加入的公会中发了一条消息)提供了“Webhook”服务。类似上述的操作将会触发Webhook,使其向特定脚本或是其他网站上的工具发送关于这一操作的信息。
技术细节[]
Habitica将会向Webhook的链接发送POST请求。
登录Habitica网站,依次点击用户图标>设置>API/应用程序接口,便可以具体设置哪些脚本会接收到Habitica的Webhook发送的信息。
更多信息请见Habitica API文档的Webhooks部分。
设置无效网址可能会导致Habitica运行缓慢甚至出错,因此,如果你不了解Webhook,最好不要使用这一功能。在请求超时的错误出现之前,Webhook有30秒时间响应2XX的HTTP状态码。最好的办法是,在收到200的HTTP状态码与非空的响应信息的请求后,立即响应Habitica服务器(如响应一个很小的json文件,或是使用HtmlService.createHtmlOutput()
)。这样便能确保Habitica服务器等待你的Webhook的时间尽可能短(可以先响应,之后再处理收到的信息),同时避免超出30秒的时间限制。一个月内出错多于10次的Webhook将会被自动禁用。
如果你在开发响应Webhook的脚本时需要帮助,可以向Aspiring Comrades公会中的其他开发者寻求帮助。
如果你希望自己的Webhook开发工作得到认可,请查看同志页面。
实例[]
Python Flask[]
以下脚本使用Python Flask提供处理Webhook的支持。你在Habitica中输入的链接应该类似这样:http://<你的IP地址>:<你的端口>/taskevent
Flask的默认监听端口是5000,但是你也可以自己设定不同的端口,然后填入链接中的<你的端口>。
如果你的脚本在防火墙开启时运行,你可能需要端口转发,或是在防火墙设定中允许端口连接。
from flask import Flask, request app = Flask(__name__) # 接收入站Webhook请求的URI URI for receiving inbound webhook request @app.route('/taskevent', methods=['POST']) def webhook(): # https://habitica.com/apidoc/#api-Webhook列出了请求及数据的实例 Request contains data as shown at https://habitica.com/apidoc/#api-Webhook # 将.json转换为Python字典 .json converts request to Python dictionary print(request.json) # type: dict # <处理事件的代码写在这YOUR CODE FOR HANDLING EVENT HERE> return '', 200 # 向服务器返回200状态码 Return 200 code to the sending webserver if __name__ == "__main__": app.run(host='0.0.0.0', port='<your_port>')
谷歌应用脚本[]
以下脚本使用谷歌应用脚本来监听Habitica的Webhook。为确保脚本生效,每次编辑完成后都应点击“部署>新建部署”保存为新版本,类型选择“Web应用”,执行身份选择“我”,有权限访问的人员选择“任何人”。
以下实例可以实现立即自动接受副本邀请:
// [用户] 请填入脚本运行的必需数据 const USER_ID = "在此处粘贴你的用户ID"; const API_TOKEN = "在此处粘贴你的API令牌"; // 不要分享给任何人 // [用户] 请勿改动以下代码
// [开发者] 如果你在编写自己的脚本,在下方填写自己的 // 用户ID和脚本名称。若只是用作示例,则不需要改动。 const AUTHOR_ID = "01daa187-ff5e-46aa-ac3f-d4c529a8c012"; const SCRIPT_NAME = "Faster Auto Accept Quests"; const HEADERS = { "x-client" : AUTHOR_ID + "-" + SCRIPT_NAME, "x-api-user" : USER_ID, "x-api-key" : API_TOKEN, } // [开发者] 这是Habitica中遇到Webhook // 指定的操作时将会执行的函数 function doPost(e) { var dataContents = JSON.parse(e.postData.contents); var type = dataContents.type; if (type == "questInvited") { api_acceptQuest(); } return HtmlService.createHtmlOutput(); } function api_acceptQuest() { var params = { "method" : "post", "headers" : HEADERS, "muteHttpExceptions" : true, } var url = "https://habitica.com/api/v3/groups/party/quests/accept"; UrlFetchApp.fetch(url, params); }
详细信息:使用谷歌应用脚本处理Webhook
第三方工具[]
Habitica目前的界面中添加和编辑Webhook的功能比较有限,但Habitica的API却提供了更多操作。这意味着你可以使用第三方工具来建立Webhook,例如下方就列出了几个;扩展和插件页面可能还有更多工具。但是,就和其他第三方工具一样,你应该考虑周全这些工具是否适合你使用。Habitica的工作人员并不为第三方工具提供直接支持亦或是担保。