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 编码) |
---|---|---|---|
action | True | String | 该值为send_talk |
cid | True | String | 时光机页面的cid值,后台可查看(也可利用该值为其他页面添加评论) |
time_code | True | String | 该值为后台时光机编码的MD5值(32位十六进制小写),用于身份验证 |
token | True | String | 将作为评论的agent字段,用于判断说说来源并显示(普通UA->系统版本,weixin->"微信公众号",crx->"浏览器插件" 也可自己在UA.php 中修改) |
msg_type | True | String | 消息类型。有text (文字)、link (链接)、image (图片)、location (位置)、mixed_talk (图文混合说说) |
content | True | String | 消息内容。为msg_type相对应的格式 |
返回字段:
返回字段 | 字段类型 | 说明 |
---|---|---|
status | Int | 返回结果状态。1:提交成功;-2:参数缺失 ; -3:身份验证失败 |
补充说明:
- msg_type为
text
的内容可以包含HTML代码及短代码,会在前台解析 - msg_type为
image
的发送格式为:图片网络地址
(图片会自动上传至博客,例如:https://iyear.me/usr/uploads/2019/12/801984719.png)
如为本地图片先上传图片
操作,再以text
类型提交并手动加上<img>
标签
吐槽一下这里的操作逻辑,如果能在typeImageContent
内加一个是否为本站图片的判断,并采取不重复上传的操作就好了
- 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
的后台处理方式很奇怪。格式为未知#未知#位置名称#地图图片
- 需要博客支持emoji,具体参考YearCross文档
- 地图图片通过调用高德地图的静态地图API实现的,最终会上传至本地服务器的
time
文件夹。
接口不是很明朗,还是建议采用text
提交。形式为?+位置名称+<img src="位置图片URL"/>
BB了这么多,其实我觉得这些类型没啥太大用处,直接在发送端处理完所有格式以text
发送就行了(而且服务端的处理明显只是主题作者自己用的接口)
上传图片
请求URL:
http(s)://博客地址/
请求方式:
- POST
参数:
参数名 | 必选 | 数据类型 | 说明(所有参数涉及中文采用UTF-8 编码) |
---|---|---|---|
action | True | String | 该值为upload_img |
time_code | True | String | 该值为后台时光机编码的MD5值(32位十六进制小写),用于身份验证 |
file | True | String | 具体说明 ↓ |
type | False | String | 如file 采取本地上传,可指定后缀例如.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):
返回字段 | 字段类型 | 说明 |
---|---|---|
status | Int | 返回结果状态。1:提交成功;-1:请求参数错误 ; -3:身份验证失败 |
data | String | 上传成功后的图片地址(对"/"转义,且所有网络图片均转码为jpg 保存至/time 文件夹,本地图片如果指定了后缀则使用该后缀) |
返回示例:{"status":"1","data":"https:\/\/iyear.me\/usr\/uploads\/time\/5e19a4cd41c71.jpg"}
做一个自己的时光机机器人
虽然已经有了上文的QQ机器人,不过从环境安装和个性化角度讲,用python写的机器人有点小麻烦了。
所以同样基于酷Q,打算用E写一个,可以直接把cpk
包放在目录下,即开即用会方便很多。
机器人已经发布
详情见于:
来学习学习,自己也安排一个!
位置消息发送显示不出来可能是因为数据库不支持emoji,具体怎么让数据库支持emoji你搜索一下。
关于位置消息的处理是用提取位置坐标,然后用高德地图的api处理成图片,再把坐标,位置名称,处理后的图片一块发送到服务器。
另外处理相关方法你可以参考我的项目中的相关代码 https://github.com/iLay1678/wechat_for_handsome/blob/f4da7fea0f7a76efc89b3a44880e74e0ece60f56/server.php#L204
不过对于微信公众号的地图图片似乎要用到高德的api
嗯,现在已经知道了。在YearCross文档里已经附上了Typecho支持emoji的支持方法。当然接下来打算在YearCross对位置信息的样式做出调整,而且酷Q对位置信息的返回本身已经包含了经纬度和位置名称,应该不需要进一步处理了
这个接口会不会不安全啊,如果被知道了验证码
是的,时光机编码就是授权。所以尽量让时光机编码复杂些
居然有分这么多接口∠( ᐛ 」∠)_
其实一些接口写的复杂了,我正在撸的机器人就是在发送前把所有格式全部先转掉直接text发送