Habitica Wiki
Advertisement
Habitica Wiki

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的工作人员并不为第三方工具提供直接支持亦或是担保。

Advertisement