Habitica Wiki
Advertisement
Habitica Wiki

Habitica端[]

第三方工具[]

一些第三方工具能用于设置Webhook。

Webhook分类[]

使用上述工具建立Webhook,可以使Habitica监听特定操作:

Webhook分类 操作
副本动态
  • 副本开始
  • 副本完成
  • 副本邀请
任务动态
  • 任务创建
  • 任务更新
  • 任务删除
  • 任务勾选
  • 清单条目勾选
用户动态
  • 宠物孵化
  • 坐骑养成
  • 玩家升级
群聊消息
  • 收到特定团体(队伍/公会)的新消息

Habitica官方API文档[]

详细信息请查看Habitica官方API文档

Webhook传递的数据实例[]

Web应用(doPost(e)函数中var dataContents=e.postData.contents的值)将会接收到的数据的实例如下:

副本邀请(包括“questOwner”,即副本发起者):

{"type":"questInvited","group":{"id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","name":"My Habitica Party"},quest":{"key":"owl","questOwner":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}","webhookType":"questActivity","user":{"_id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}}

副本完成:  

{"type":"questFinished","group":{"id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","name":"My Habitica Party"},"quest":{"key":"butterfly"},"webhookType":"questActivity","user":{"_id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}}

任务创建:

{"type":"created","task":{"challenge":{},"group":{"approval":{"required":false,"approved":false,"requested":false},"assignedUsers":[],"sharedCompletion":"singleCompletion"},"completed":false,"collapseChecklist":false,"type":"todo","notes":"","tags":[],"value":0,"priority":1,"attribute":"str","byHabitica":false,"text":"Add To Do","_id":"0ec3a680-3c8b-4e61-88f1-2848782226e9","reminders":[],"checklist":[],"createdAt":"2020-03-30T10:23:10.956Z","updatedAt":"2020-03-30T10:23:10.956Z","userId":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","id":"0ec3a680-3c8b-4e61-88f1-2848782226e9"},"webhookType":"taskActivity","user":{"_id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}}

任务勾选:

{"type":"scored","direction":"up","delta":1,"task":{"challenge":{},"group":{"approval":{"required":false,"approved":false,"requested":false},"assignedUsers":[],"sharedCompletion":"singleCompletion"},"completed":true,"collapseChecklist":false,"type":"todo","notes":"","tags":[],"value":1,"priority":1,"attribute":"str","byHabitica":false,"checklist":[],"reminders":[],"createdAt":"2020-03-30T10:23:10.956Z","updatedAt":"2020-03-30T10:27:28.236Z","_id":"0ec3a680-3c8b-4e61-88f1-2848782226e9","text":"Add To Do","userId":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","dateCompleted":"2020-03-30T10:27:28.204Z","id":"0ec3a680-3c8b-4e61-88f1-2848782226e9"},"user":{"_tmp":{"quest":{"progressDelta":1.475,"collection":1},"drop":{"target":"Desert","canDrop":true,"value":1,"key":"Potatoe","type":"Food","dialog":"You've found a Potato!"}},"stats":{"buffs":{"str":0,"int":0,"per":0,"con":0,"stealth":0,"streaks":false,"snowball":false,"spookySparkles":false,"shinySeed":false,"seafoam":false},"training":{"int":0,"per":0,"str":0,"con":0},"hp":46.35717357116706,"mp":136.94362288135568,"exp":199218.27891340942,"gp":3319.1888075206516,"lvl":931,"class":"wizard","points":0,"str":0,"con":0,"int":100,"per":0,"toNextLevel":226140,"maxHealth":50,"maxMP":527},"_id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"},"webhookType":"taskActivity"}

“任务删除”时收到的数据全文:

可以看到e.postData.contents的值包含反斜杠“\”。可以用var dataContents = JSON.parse(e.postData.contents)来解析子字符串。

{"parameter":{},"contextPath":"","contentLength":672,"queryString":"","parameters":{},"postData":{"type":"application/json","length":672,"contents":"{\"type\":\"deleted\",\"task\":{\"challenge\":{},\"group\":{\"approval\":{\"required\":false,\"approved\":false,\"requested\":false},\"assignedUsers\":[],\"sharedCompletion\":\"singleCompletion\"},\"completed\":false,\"collapseChecklist\":false,\"type\":\"todo\",\"notes\":\"\",\"tags\":[],\"value\":-33.71057310093657,\"priority\":1,\"attribute\":\"str\",\"byHabitica\":false,\"checklist\":[],\"reminders\":[],\"createdAt\":\"2020-02-09T10:46:46.723Z\",\"updatedAt\":\"2020-03-30T10:22:43.497Z\",\"_id\":\"dc5d0acd-e889-4c42-850f-9110aef8be33\",\"text\":\"test\",\"userId\":\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",\"id\":\"dc5d0acd-e889-4c42-850f-9110aef8be33\"},\"webhookType\":\"taskActivity\",\"user\":{\"_id\":\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"}}","name":"postData"}}


处理Webhook不可或缺的,是监听Webhook的服务器。因此,在Habitica中设置Webhook之前,请先设置好服务端:

服务端(后端)[]

谷歌应用脚本服务端(Web应用)[]

在执行上述的指定操作时,Habitica会根据网址,向负责处理Webhook请求的服务器发送请求;服务器则会监听来自Habitica的POST请求,例如设置在谷歌应用脚本中的服务器,可以使用doPost(e)函数,如下文所示:

谷歌应用脚本可以用于设置服务器,只需将服务器脚本部署为Web应用

https://developers.google.com/apps-script/guides/web?hl=zh-cn

自动接受的脚本范例[]

以下是自动接受副本邀请的服务端脚本范例:

// [用户] 请填入脚本运行的必需数据
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);
}

更多范例(可能还有在谷歌表格中显示数据的脚本)请见:

https://github.com/PitiTheGrey/google-script-Webhook-Server-for-Habitica

服务端脚本操作[]

如何保存和管理服务端脚本,以及将脚本部署为Web应用:

服务端脚本 详细说明
保存脚本 使用“管理版本”[可能过时]保存脚本。每次改动代码后都应保存为新版本。
部署为“Web应用” 脚本的每个新版本都应部署为“Web应用”,这样才会提供服务端网址(用于在Habitica端设置Webhook)。代码和版本的改动并不会改变已经生成的网址。但是,要让代码和版本改动生效,必须将脚本重新部署为新版本Web应用。
“Web应用”配置 将脚本部署为Web应用时,只有按下文所说设置配置,才能让Habitica的Webhook正常使用:

- “执行身份”选择“我”

- “有访问权限的人员”选择“任何人”

Web应用的网址 部署为Web应用后,谷歌会显示Web应用的网址,这个网址将用于设置Habitica端的Webhook。(服务端脚本部署为新版本时,Habitica端的Webhook并不需要改动!)

疑难解答与故障排查[]

大多数问题都可以在Habitica的Aspiring Comrades公会中提出。

如果是关于API助手或“PitiTheGrey”写的服务端脚本范例之类的特定问题,可以在Habitican Wardrobes公会中提出。

Piti! 2020年5月30日

Advertisement