导出 Chaser Windows Phone Strava 应用的行程数据





5.00/5 (1投票)
本文将介绍如何将 Chaser Windows Phone 应用中的最后一次行程数据导出,并将其转换为 GPX 数据,以便您可以手动上传到 Strava。
引言
Strava 已停止支持其 V1 和 V2 API,并且只允许选定的合作伙伴使用其 V3 API。Windows Phone 没有官方的 Strava 应用,因此任何正在使用的应用都已停止工作,而没有提供将数据直接从手机上传到 Strava 的完全集成选项。
我使用了一款名为 Chaser 的特定应用,并在他们关闭 V2 API 的那天记录了一次骑行。我不想丢失这些数据,所以我开始寻找一种收集这些数据的方法。该应用本身没有内置的方法来实现这一点。本文将介绍如何将数据从手机中导出,并将其转换为正确的格式(.GPX),以便正确上传到 Strava。
许多 Windows Phone 应用仅通过第三方支持。不幸的是,这意味着其他应用也很可能发生这种情况。本文中的一些信息可能对您从手机中提取数据有所帮助。反序列化 JSON 并将其序列化为 XML 的示例可能也很有用;尽管实现方式不同;但相同的总体范例也适用。
背景
无法访问 Windows Phone 上应用的内部存储。为了从手机中获取数据,我使用 Fiddler 作为手机的代理。使用 Fiddler 作为代理可让您查看发送到手机的所有 HTTP 网络流量。由于 Chaser 应用在未先验证身份验证令牌的情况下,只是将包含所有行程信息的 JSON 块发送到 Strava,因此您可以轻松获取行程的所有数据。
获取数据后,它会以某种非标准格式存储。有一种常见的 GPS 数据格式称为 .GPX。许多网站支持 GPX,并且该标准与 schema 一起发布。我们将把数据重新格式化为 .GPX 文件,然后您可以将其上传到 Strava 或任何接受 .GPX 数据的其他网站。
设置代理的步骤
- 安装 Fiddler - 如果您还没有安装 Fiddler,可以使用此链接在您的台式电脑上安装它。我安装的是 4.0 版本,但我想其他版本也应该同样有效。
- 将 Fiddler 配置为代理并将 Windows Phone 设置为通过代理进行连接 - Fiddler 网站上有关于如何执行此操作的出色说明。这些说明在 Windows Phone 8 上对我来说也同样有效。我必须将台式电脑连接到以太网才能使其正常工作,不确定这是否对每个人都适用。
- 启动 Fiddler - 运行 Fiddler 后,它将充当代理,您应该可以在电脑上看到手机的所有 HTTP 流量。现在,在 Windows Phone 上访问任何网页进行测试,并确保您可以在 Fiddler 中看到数据。
捕获数据
- 尝试上传数据 - 将手机设置为代理后,您可以进入 Chaser 应用,点击“完成”按钮,然后点击“上传”按钮。现在已经设置好了代理,您将在 Fiddler 中看到包含您的行程的封包。所有数据都包含在一个 JSON 块中。Chaser 上传屏幕的图像
- 保存数据 - 将 Fiddler 中的 JSON 块复制粘贴到文本文件中。根据您实现的以下代码,您可以将其保存到文件中,或者将其作为
string
传递以将其转换为 .gpx。数据应如下所示
{"token": "XxxxXxxxxxx", "id": "2013-07-05T14:08:56", "activity_type":"Ride", "activity_name":"Jul Fri 5 14:07 2013", "type": "json", "data_fields": ["time", "latitude", "longitude"], "data": [["2013-07-04T00:10:28",47.63803872, -122.12497856], ["2013-07-04T00:10:38",47.63819225, -122.12509857], ["2013-07-04T00:10:43",47.6381939649582, -122.125069499016], ["2013-07-04T00:10:47",47.6381939649582, -122.125101685524], ["2013-07-04T00:11:10",47.63819442, -122.12514232], ["2013-07-04T00:11:11",47.6381948, -122.12514444], ["2013-07-04T00:11:12",47.63819501, -122.12514552], ["2013-07-04T00:11:13",47.6381971, -122.12514657], ["2013-07-04T00:11:14",47.6382686, -122.1252347], ["2013-07-04T00:11:15",47.63830859, -122.125289], ["2013-07-04T00:11:16",47.63832192, -122.12532939], ["2013-07-04T00:11:18",47.63833359, -122.12537187], ["2013-07-04T00:11:21",47.63834116, -122.12540437], ["2013-07-04T00:11:24",47.63834063, -122.12543642], ["2013-07-04T00:11:40",47.63834157, -122.12546144], ["2013-07-04T00:12:32",47.63834165, -122.12492476], ["2013-07-04T01:14:35",47.59522847, -122.30526577], ["2013-07-04T01:23:56",47.6166450977325, -122.307384610176], ["2013-07-04T01:24:04",47.6166558265686, -122.307406067848]] }
代码
- 从 .GPX schema 创建序列化类
正如我之前提到的,.GPX schema 是公开的,可以在 http://www.topografix.com/GPX/1/1/gpx.xsd 找到。Visual Studio 提供了一个 命令行工具,用于从 XSD 创建序列化类。下载 XSD,然后打开 Visual Studio 命令提示符。您可以使用类似 '
xsd /c gpx.xsd
' 的命令行运行该工具,它将生成一个类文件 gpx.cs。您可以将此文件添加到 Visual Studio 项目中,我们将使用它将数据转换为 GPX 文件数据。 - 反序列化 JSON 块
保存数据后,您需要将其转换为 .GPX 格式。我用 C# 编写了一个快速的辅助方法来完成此操作。
using 语句
using System;
using System.Collections.Generic;
using System.IO;
using System.Web.Script.Serialization;
using System.Xml.Serialization;
我们使用 System.Web.Script.Serialization
命名空间中的 JavaScriptSerializer
类,这需要您添加对 System.Web.Extensions.dll 的引用,因为它默认未在 C# 项目中引用。我们还使用 System.Xml.Serialization
类中的 XmlSerializer
类。
序列化 JSON 数据
使用 JavaScriptSerializer
类序列化 JSON 数据相对简单。
var serializer = new JavaScriptSerializer();
object obj = serializer.DeserializeObject(json);
Dictionary<string, object><string,> jsonDictionary = (Dictionary<string, object><string,>)obj;
</string,></string,>
这将创建一个松散类型集合。每个项目的键对应于 JSON 块中“:
”之前的数据,而值中包含的对象是该对象“:
”之后的所有内容。
创建 GPX 对象
我从 Strava 下载了一个 .GPX 文件,以比较 JSON 块与 GPX 文件的映射方式。通过这样做,我能够确定 GPX 对象的结构。
gpxType gpx = new gpxType();
gpx.creator = "Strava JSON to GPX convertor";
gpx.metadata = new metadataType();
gpx.metadata.author = new personType();
gpx.metadata.author.name = "Nigel Stuke";
gpx.version = "1.1";
gpx.trk = new trkType[1];
gpx.trk[0] = new trkType();
gpx.trk[0].name = "The name for this ride";
gpx.trk[0].trkseg = new trksegType[1];
gpx.trk[0].trkseg[0] = new trksegType();
这将创建对象并实例化一些字段。其中一些数据(活动名称)可以从 JSON 数据中提取。但我们主要关心的是 GPS 数据。
转换数据
查看 JSON 块,我们可以看到三个值:“time
”、“latitude
”和“longitude
”。我们可以轻松地将每个数据点的这些值取出来,并将其填入 GPX 文件中的相应类型。
object dataObject = jsonDictionary["data"];
object[] dataObjects = (object[])dataObject;
wptType[] waypoints = Array.ConvertAll(
dataObjects,
new Converter<object, wptType>(
(waypointObject) =>
{
object[] waypointObjects = (object[])waypointObject;
DateTime dateTime = Convert.ToDateTime(waypointObjects[0]);
Decimal latitude = Convert.ToDecimal(waypointObjects[1]);
Decimal longitude = Convert.ToDecimal(waypointObjects[2]);
var waypoint = new wptType();
waypoint.time = dateTime;
waypoint.timeSpecified = true;
waypoint.lat = latitude;
waypoint.lon = longitude;
return waypoint;
}));
gpx.trk[0].trkseg[0].trkpt = waypoints;
这将使我们从 JSON 块中获得所有元素,并将其转换为 .GPX 格式的正确数据点类型。
现在您已将数据作为 .GPX 对象,您可以将其简单地序列化为 .GPX 文件,或者对其进行任何您想进行的操作。这将使您不必丢弃数据;您现在可以通过电脑导入您的数据!
using (StreamWriter sw = new StreamWriter("output.gpx"))
{
XmlSerializer serializer = new XmlSerializer(typeof(gpxType));
serializer.Serialize(sw, gpx);
}
在我的例子中,我上传了新文件,并能够看到行程已正确绘制并导入到 Strava。希望您也能使用此模式来捕获 Windows Phone 的数据。