LJY's Blog原创,转载请注明

前言

Handsome的时光机功能是非常不错的,相对于一篇博文,时光机这种类似说说的文字长度更易分享生活的状态。这也是让我从原来Mirages换回Handsome的重要原因,有时候我只是想吐槽几句或者说几句话,却以一篇文章的地位占去了首页的一个位置。
文章应当比说说文字更长,打磨时间更久才显得更有相应的价值。

但是仍然觉得微信公众号的发送方式显得繁琐了。特别是我这种垃圾手机,打开微信都要几秒,都懒得打开。其实严格来说没有实现时光机随时随地分享动态的目的,所以如何实现一个更加个性化方便的发送方式还是挺重要的。

还没想好做一个怎样的发送平台,不过先把时光机研究了一下。以下为初步研究的一些结果的整理。

基本信息

目前时光机有网页、微信公众号、CRX(浏览器插件)三种方式提交。
信息形式支持:文字、图片、地理位置、链接
发送模式支持:纯文字、纯图片、连续发送(混合模式)

与时光机相关的几个文件:

文件名说明
/handsome/libs/Ajax.php核心文件,用于接收与时光机有关的POST请求。该文件在Handsome5.3.0开始加密,如需查看请下载Handsome5.2.0(一些新功能的接口就只能通过抓包了)
/handsome/libs/UA.php对时光机的来源进行解析。如:weixin->微信公众号
/handsome/cross.php整体渲染文件。渲染部分:RSS自定义、联系方式、那年今日等等
/handsome/component/say.php说说的渲染文件。对具体内容、评论、点赞等进行操作

相关接口分析

此处感谢kizx的时光机QQ机器人提供了部分思路

其他思路来自Handsome6.0.0版本Ajax.php以及浏览器插件oper.js

没学过API的专业表述,就按自己想法写了,见谅!

发送说说

请求URL:

  • http(s)://博客地址/

请求方式:

  • POST

参数:

参数名必选数据类型说明(所有参数涉及中文采用UTF-8编码)
actionTrueString该值为send_talk
cidTrueString时光机页面的cid值,后台可查看(也可利用该值为其他页面添加评论)
time_codeTrueString该值为后台时光机编码的MD5值(32位十六进制小写),用于身份验证
tokenTrueString将作为评论的agent字段,用于判断说说来源并显示(普通UA->系统版本,weixin->"微信公众号",crx->"浏览器插件" 也可自己在UA.php中修改)
msg_typeTrueString消息类型。有text(文字)、link(链接)、image(图片)、location(位置)、mixed_talk(图文混合说说)
contentTrueString消息内容。为msg_type相对应的格式

返回字段:

返回字段字段类型说明
statusInt返回结果状态。1:提交成功;-2:参数缺失 ; -3:身份验证失败

补充说明:

  • msg_type为text的内容可以包含HTML代码及短代码,会在前台解析
  • msg_type为image的发送格式为:图片网络地址(图片会自动上传至博客,例如:https://iyear.me/usr/uploads/2019/12/801984719.png)
    如为本地图片先上传图片操作,再以text类型提交并手动加上<img>标签

吐槽一下这里的操作逻辑,如果能在typeImageContent内加一个是否为本站图片的判断,并采取不重复上传的操作就好了
sendtalk示例

  • msg_type为link的发送格式为:标题#描述#URL地址(不转义)
    比如:百度一下#来百度一下#https://www.baidu.com/
  • msg_type为mixed_talk的发送内容为UTF-8编码的JSON字符串
    例如:
{
    "results": [{
        "type": "text",
        "content": "test11"
    }, {
        "type": "text",
        "content": "test22"
    }, {
        "type": "image",
        "content": "https://cdn2.jianshu.io/assets/web/nav-logo-4c7bbafe27adc892f3046e6978459bac.png"
    }, {
        "type": "image",
        "content": "https://rescdn.qqmail.com/bizmail/zh_CN/htmledition/images/bizmail/new_login/exmail_logo_1473e91.png"
    }]
}
  • msg_type为location的后台处理方式很奇怪。格式为未知#未知#位置名称#地图图片
  1. 需要博客支持emoji,具体参考YearCross文档
  2. 地图图片通过调用高德地图的静态地图API实现的,最终会上传至本地服务器的time文件夹。
    接口不是很明朗,还是建议采用text提交。形式为?+位置名称+<img src="位置图片URL"/>

BB了这么多,其实我觉得这些类型没啥太大用处,直接在发送端处理完所有格式以text发送就行了(而且服务端的处理明显只是主题作者自己用的接口)


上传图片

请求URL:

  • http(s)://博客地址/

请求方式:

  • POST

参数:

参数名必选数据类型说明(所有参数涉及中文采用UTF-8编码)
actionTrueString该值为upload_img
time_codeTrueString该值为后台时光机编码的MD5值(32位十六进制小写),用于身份验证
fileTrueString具体说明 ↓
typeFalseStringfile采取本地上传,可指定后缀例如.png。如该值为空默认为.jpg

提交的file参数有两种形式:

1.网络地址(即图片URL地址,需包含完整http(s)头)
例如:https://www.baidu.com/img/bd_logo1.png
返回:{"status":"1","data":"https:\/\/iyear.me\/usr\/uploads\/time\/5e19aef89ebe2.jpg"}
2.本地图片
采取BASE64编码并对"+"用%2B替代。对编码后的字符串加上前缀data:image/(后缀名);base64,(注意逗号)

例如我上传了一张CSDN的用户头像,对其编码后file参数为:data:image/png;base64,iVBORw0KGgoAAAAN......

返回字段(JSON):

返回字段字段类型说明
statusInt返回结果状态。1:提交成功;-1:请求参数错误 ; -3:身份验证失败
dataString上传成功后的图片地址(对"/"转义,且所有网络图片均转码为jpg保存至/time文件夹,本地图片如果指定了后缀则使用该后缀)

返回示例:{"status":"1","data":"https:\/\/iyear.me\/usr\/uploads\/time\/5e19a4cd41c71.jpg"}

做一个自己的时光机机器人

虽然已经有了上文的QQ机器人,不过从环境安装和个性化角度讲,用python写的机器人有点小麻烦了。
所以同样基于酷Q,打算用E写一个,可以直接把cpk包放在目录下,即开即用会方便很多。

机器人已经发布
详情见于:

最后修改:2020 年 02 月 23 日 12 : 12 PM