用Tasker把自己的微信变成机器人
以前玩机的时候接触并在 Google Play 上购买了 tasker,但是每次都是难以上手、耗电、不知道需要自动化什么任务放弃使用了。这次突然想给自己的微信增加一个自动回复的功能, 像以前 QQ 的离线回复一样,稍微研究了一下怎么利用已有的工具实现,理论上来说也不算任何「外挂」程序, 应该不会被微信官方封号 。
整个自动回复的流程大概是这样的:
1. 微信通知事件被 Tasker 捕获
2. Tasker 解析出通知的文本并通过图灵机器人 Api 上传
3. 图灵机器人回传的文本通过 Tasker 回复此通知事件
大致流程热身
在实现前面所述的效果之前,我们先来通过一个简单的自动回复的例子来熟悉一下 Tasker 操作的流程。这里不需要用到图灵机器人,也不用接触 JavaScript 。触发事件
首先设置 Tasker 的事件,这里直接采用 Tasker 自带的通知事件进行触发。点击右下角的加号,选择事件-界面-通知,按照截图中的方式输入:所有者程序 :微信和 Pushbullet,后者完全是为了测试用,因为我可以在电脑浏览器给自己手机发消息从而触发事件,验证流程;文字 :这里匹配两个文本,「在吗」或「跟我说话」,中间的斜杠表示「或」的概念,当然你要在后面再过滤也是可以的,在这里添加可以避免所有的通知都要走后面的操作。任务编辑
之后进入任务编辑的界面,这里就是实现两个 if 逻辑,分别匹配之前输入的文本。
这里需要注意两个地方:if 操作中 %evtprm 是 Event Context 中的内容,即事件的上下文参数,是一个数组。%evtprm3 是数组的第三个元素,对于通知事件来说就是通知的文本内容(%evtprm2 是标题)。Notification Listener 同样提供了 %nltext 作为通知的文本变量,使用这个也是一样的。~R 表示正则匹配,即匹配到「在吗」就会走第一个逻辑。具体执行的回复操作是通过 Notification Listener 实现的,%nlkey 是它提供的变量,直接填上并加上回复信息就行。通过女娲石使微信支持快捷回复
这里还有一个问题,微信本身是不支持快捷回复的,这里就需要女娲石来实现这样一个按钮,我的手机已 Root,因此能够微信的身份发送通知,之前的所有者程序选择微信,是没有问题的。没有测试过普通模式下的效果,理论上也是可以的,只需要把之前的所有者程序加上女娲石即可。
激活配置之后,现在收到微信消息,就会自动回复消息了。进阶
显然我们不仅仅满足于此,以上是基本实现了 QQ 离线消息的效果,让人一下子穿越回十几年前盯着别人 QQ 上下线的年代。现在我希望自己完全变成一个没有感情的机器人,不再受世间的纷纷扰扰。
有了热身的基本原理,我想大家应该已经明白了,获取通知文本、回复微信消息的方法。现在只需要一个机器人的接口,我们把文本输进去,它把回复吐出来,然后接上之前的流程就可以了。找一个机器人
一番搜索之后确定了图灵机器人,因为它提供了 Web API。个人用户一天的调用上限是 100 次,和朋友玩玩是完全够了。
图灵机器人触发事件
触发事件可以依然按照之前使用的 Tasker 自带的通知事件,这里我使用的是 Notification Listener 提供的 Posted Apps。略带挑战的任务编辑
建立一个如图的操作,对,Tasker 是支持 JavaScript 的,这样就可以很方便的进行 Web Api 的调用。这里遇到了这个任务里面最大的困难。首先对于 JavaScript 不是特别熟悉,其次 Tasker 的 js 还有点不太一样的地方。
对于 Tasker 的 JavaScriptlet 来说,如果勾选了「自动退出」,则会在执行到最后一行之后退出程序,那么对于异步的网络请求和更改变量就会不起效果;否则的话,需要自行调用 exit() 来告诉 Tasker 何时退出。这里有一个坑是在异步的请求里,直接对 tasker 的 Local 变量赋值是不起作用的,需要调用 setLocal 来赋值。var xhr = new XMLHttpRequest(); var url = "http://openapi.tuling123.com/openapi/api/v2"; var response = "default"; xhr.open("POST", url, true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { var json = JSON.parse(xhr.responseText); response = json.results[0].values.text; flash(response); setLocal("response", response); exit(); } }; var text = nltext; var str = { reqType: 0, perception: { inputText: { text: text, }, selfInfo: { location: { city: " 杭州 ", province: " 浙江 ", }, }, }, userInfo: { apiKey: "", userId: "", }, }; var data = JSON.stringify(str); xhr.send(data);
当然可以完全忽略上一段,直接把这段代码中的 apiKey 和 userId 更改为你的机器人的 API 密钥以及用户名。如果你有兴趣,我们可以简单描述一下这段代码的细节:var test = nltext,这里是把 Notification Listener 的 %nltext 变量赋值并后面拼接在 JSON 请求里面。虽然显得有点多余,但是你可以把 nltext 变成确定的字符串,来测试你的代码是否能正确从服务器拿回请求(按下编辑页面里面的播放键)。flash() 会生成一个 Toast 提示,也就是每次回复的消息会在下方提示内容。JSON 请求里面的 location 是机器人的默认地址,也就是说如果问它天气怎么样,会告诉我杭州的天气。测试效果
现在就可以找个小伙伴测试一下你的机器人啦,在工作时段打开静音模式,让机器人来回复那些消息吧。
注意事项
当然 最后一个提醒 ,如果有群聊通知没有开免打扰、或者在群里被 @,还是会回复的,以免再工作群里回复一些莫名其妙的话,可以考虑像热身这一节所讲的,做在通知标题 %nltitle 上做一些过滤,制定一个白名单。
为优秀传统文化精品而自豪回复师友们对木版年画的关注看到有如此众多的师友发帖对木版年画表示关注,有点拇指,有表示非常支持,我心情激动,十分高兴,深表感谢。几幅年画能引起大家的兴趣,是没有想到的。或许这就是心有灵犀一点通吧。我们同处一
马寅初的骨气马寅初(18821982),浙江省嵊州人,当代中国经济学家教育家。1907年北洋大学毕业,保送赴美留学,获耶鲁大学经济学硕士哥伦比亚大学经济专业博士学位。1916年回国任北京大学经
刘禹锡与白居易的诗上交流走进河南省荥阳市的檀山公园里,你会看到刘禹锡墓冢北侧的墓碑上,镌刻着几行大字唐代文学家哲学家刘禹锡之碑。并有一联高风长在至今人咏陋室颂功节难移此后长观满庭花这副对联不禁让人想起了这
古代诗人写给劳动者的诗劳动创造了世界,而创造世界的劳动者在古代社会中却没有地位。受万般皆下品,唯有读书高信条的束缚,古代的文人墨客,为劳动者写下的诗甚少,流传下来的就更少了。然而,也有不少有见地的同情民
卡文迪许一场魔术表演催生的科学发现卡文迪许(17311810),英国科学家。18岁考入剑桥大学,成绩优良。1753年赴巴黎留学。偶然的一笔巨额遗产,创建起了极好的个人实验室。他首先制取了氢气,验证了万有引力定律,确
人体的10大奥秘,科学家已经发现了攻克癌细胞的杀死代码?从生物学的角度来看,人类的身体是由神经和细胞组成的,在这个人体宇宙中,存在着很多不可思议的构造。在最近的医学界有一些奇妙的发现,并且确认了人类目前还在不断的进化中,本文介绍一下科学
美军撤出阿富汗,友军两小时后才发现,皇协军的下场向来如此随着美军加速撤离阿富汗,运输大队长丢下大批物资和武器装备,塔利班卷土重来,面对来势汹汹的塔利班,政府军能守得住吗?会不会像当年的南越,被抛弃之后,随即溃败。阿富汗政府军会不会那么弱
元素周期表氢氦锂铍硼你知道门捷列夫是怎么发现的吗?俄国化学家门捷列夫在总结前人的经验基础上,经过长期研究化学元素间的规律,于1869年终于发现了化学元素周期律。门捷列夫的周期表很接近我们今天认为是正确的东西。当某一元素的性质使他不
这五个发现是外星人存在的最好证明,难道刘慈欣猜对了?引言在古代人们通常都比较相信封建迷信以及一些有神论,面对那些没有办法做出解释的事情只好把它交给神佛,但现在人类的科学技术进步飞快,我们的生活也和古时候有了很大的区别。但随着科技的进
外星文明真的存在吗?为什么至今没有发现?霍金的答案细思极恐很久以前,我们抬头仰望星空,总觉得天上有神明在保佑我。那时候我们的科学尚未发达,所以对于宇宙没有任何概念,只能寄托于神话传说。但是现在人类的科技水平飞速发展,已经开始深入探索宇宙,
珠穆朗玛峰长草了?研究者并非好现象,也许有超14亿的人受影响引言说起珠穆朗玛峰,相信大家都知道,这也是世界上最高的山峰,高度可达到8848米左右,而珠穆朗玛峰也是因为过于高,所以环境恶劣,很多冒险人员也是试图登上珠穆朗玛峰,但是成功登顶的人