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日