使用workflow实现地点打卡签到

Workflow是个神奇的软件,一直等着限免了很久,上个星期终于在数字尾巴的安利下买了这款软件。结果昨天苹果收购了这个团队,它就免费了…

banner

利用Workflow,我们可以做很多事,比如地点打卡。

这个想法来源于VSCOM的地点标记,VSCOM可以显示每张照片的地理坐标位置,然而局限性也是只是显示每一张的地理位置,无法全部显示。虽然macos下的照片可以显示全部地理坐标,但是没有照片也就无法采集地理数据,那么这个脚本就诞生了。

足迹:http://lab.mayuko.cn/check/

原理

原理很简单,使用Workflow的Scripting中的Get Current Location获得目前的地理位置,通过URL传递给服务器,服务器进行gps解析,转换gps坐标保存地址。前端将服务器中的位置显示出来。

实现方式

Workflow端

Get Current Location得到当前地理位置,保存为loc变量。

解析loc变量获得latitude(纬度),保存为lat变量。

getloc变量,解析loc变量获得longitude(经度),保存为lng变量。

得到latlng变量后,使用URL get到服务端,使用Get Contents of URL返回服务端的内容,显示一个通知。这样Workflow端就设置完毕了。

安全性问题

由于实用的GET方式明文传送,其他的人知道url地址也可以上传位置,为了解决这个问题,可以加入一个text框,输入一段密码,进行MD5加密,保存变量为token。服务器端同样使用这个密码MD5加密进行比较。

服务器端

服务器端得到了手机端传递过来的坐标信息(经度,纬度)。利用经纬度我们可以得到坐标对应的地址。

gps2loc:将坐标转换为对应的地址

请求地址https://api.mayuko.cn/gps2loc

请求参数

参数 示例值 备注
lat 37.4771117812175 纬度
lng 121.455885757247 经度
from* 1

经纬度类型 输入的坐标类型:

  • GPS 设备获取的角度坐标;
  • GPS 获取的米制坐标、sogou 地图所用坐标;
  • google 地图、soso 地图、aliyun 地图、mapabc 地图和 amap 地图所用坐标
  • 3 中列表地图坐标对应的米制坐标
  • 百度地图采用的经纬度坐标
  • 百度地图采用的米制坐标
  • mapbar 地图坐标;
  • 51 地图坐标

返回:json 数据

示例https://api.mayuko.cn/gps2loc?lat=37.4771117812175&lng=121.455885757247&f=1

这样我们得到了坐标对应地址,保存在数据库中就可以了。

如果使用的是度分格式的坐标,使用 gpsinfo 可以转换成小数格式坐标。

地图显示

一开始是使用的 Google 地图,隐隐约约记得 Google map 在大陆也可以使用,就找到了文档调试 api,使用 gmap.js 加载的 Google map,本地调试没有问题,加载到服务器就一直 error,控制台显示 Google API error,申请了 API 没有报错结果始终连不上,后来才发现电脑后台开了梯子。 :cry:

推倒重来,参考了百度地图,腾讯地图和高德题图,感觉还是高德地图最好看,文档也很详细。

国内所有的地图都是使用的非 WGS84 坐标系,而是使用 GCJ02 坐标系或 BD09 坐标(百度地图),所以需要将获得的 GPS 坐标进行转换。

高德官方文档提出了转换函数,可是文档只有一句话结果调试半天也没有转换成功,最后在论坛找到了一个通用转换 API:

请求地址http://restapi.amap.com/v3/assistant/coordinate/convert?parameters

请求参数

名称 含义 规则说明 是否必须
key 用户唯一标识 官网申请,用户唯一标识 必填
locations 坐标点 经度和纬度用 \”,\” 分割,经度在前,纬度在后,经纬度小数点后不得超过 6 位。多个坐标点间用”;” 进行分隔 必填
coordsys 原坐标系 可选值:gps;mapbar;baidu 请求坐标加密,返回加密结果。 必填
output 返回数据类型 可选值:json(默认),xml 可选

示例:http://restapi.amap.com/v3/assistant/coordinate/convert?locations=116.481499,39.990475&coordsys=gps&output=xml&key = 高德的 web 服务 key

最后通过 init 初始化就可以了。

1
2
3
4
5
var map = new AMap.Map('container', {
zoom: 10,
center: [116.39, 39.9],
scrollWheel: false
});

这样,进入 widget 界面,点击一下签到,返回,非常轻松的就可以记录当前的地点了。

ONE MORE THING

Workflow 真的是一个神器!很多需要操作很多步骤的只需要一些脚本就可以执行完毕,一般有过编程技巧的人都可以轻松的使用。

因为 VSCOM 记录了近半年的照片位置,所以很轻松的就把足迹导入过来了。

希望有一天能走过半个中国。

#EOF

 加载Disqus评论