gitblog icon indicating copy to clipboard operation
gitblog copied to clipboard

如何获取悦跑圈数据

Open yihong0618 opened this issue 3 years ago • 12 comments

这几天想给朋友分享如何把跑步数据同步到 NRC 发现自己当年一系列的操作几乎忘光了,他没有成功,有些遗憾。想着,如果当时写个博客就好了,以后跟人分享还方便,也能让更多的人转移成功。

于是,这些天尝试如何获取悦跑圈数据的过程,记录一下。

  • 尝试给 running_page 加入悦跑圈已经很久了,我是先本着凡事先搜索的原则找到了有人分享过悦跑圈逆向的加密。但我不知道接口,尝试抓包,嗯,不出意外 SSL Pinning
  • 为了解决这个,我先后学会了,装夜神模拟器,怎么 trust,怎么模拟器配合 charles 抓包,但是,不知道为什么还是失败。不过倒是学了一点逆向安卓,发现了 Xserver 这个项目
  • 放弃之际,ben-29 给我发来一条私信,说他抓到了悦跑圈的包,说是用低版本的 apk 可以,我一下就兴奋了。于是去下了一个3.0的,果然能抓到,好兴奋。
  • 接下来就是一系列破解接口的过程,具体方式方式不便讲。但发现了一个隐藏的项目 PKURunningHelper 里面直接有加密需要的两个 key。我用了一些其中的代码,但实在是不喜欢代码的 taste,几乎都重写了。
  • 但是带来了一个新问题,joyrun 更改了它的登陆策略,目前,只支持单设备登陆并且,如果是新设备必须用验证码登陆,这下就麻烦了,一下子必须 runner 必须具备抓包和搞到低版本的能力,这样是没法通用的。
  • 于是我想了从验证码就行突破找找运气,我尝试了只用验证码校验的接口是否能登陆成功,-- 在手机获取验证码,然后把验证码传入 python 端校验验证码的接口上,看起来我运气不错,搞定了。
  • 并且,登陆之后会有 sid, uid, 悦跑圈的 cookie 也是用这两个拼的,加密也是,只需要保留这两个大家就可以再用这个登陆了,方便很多,我加了个简单的用 sid, uid 登陆的方法。
  • 之后导入数据,转换成 GPX 和其它的软件类似,不过 joyrun 的数据格式做的太差了甚至和 keep 比都差很多,心率和海拔是分开的没有时间戳。。。转换成 GPX 造成了非常的大困难。我暂时没加这两个。

关于获取数据代码在这里

yihong0618 avatar Dec 18 '20 04:12 yihong0618

nb

lmmsoft avatar Dec 16 '22 17:12 lmmsoft

感谢分享!成功导出了七年前的数据,但是200多条跑步记录只导出了80多条,有办法解决吗?谢谢!

yusong17 avatar May 19 '23 22:05 yusong17

我看可以显示200多条记录,但是很多没有成功, 成功的是 downloading joyrun_id xxxxxxx gpx 不成功的就是 invalid syntax (, line 1)

然后再次运行python,就显示 No tracks found.。 有什么办法吗。谢谢!

yusong17 avatar May 19 '23 22:05 yusong17

不确定

  1. 可能你数据不全是跑步,目前只能导出跑步
  2. 没有路径信息是无法导出 gpx 的
  3. 你再运行 no track 是因为导完了,删掉 scripts/data.db 重新跑就行

yihong0618 avatar May 19 '23 22:05 yihong0618

谢谢及时回复! 应该都是跑步数据,我都是同样的方式跑的。。 我刚刚删掉data.db重新导出,似乎还是一样的问题。这样隔几条失败几个成功几个 invalid syntax (, line 1) invalid syntax (, line 1) downloading joyrun_id 49720290 gpx downloading joyrun_id 159686114 gpx invalid syntax (, line 1) invalid syntax (, line 1) invalid syntax (, line 1)

yusong17 avatar May 19 '23 23:05 yusong17

因为现在还没办法全导入到strava,我还不完全确定。但我看了一下我的跑步数据,我怀疑导出的85条数据都是在北京时区(北京+新加坡)跑的(数值上恰好对的上),剩下的100多条是美国的时区下跑的,不知道会不会是这个原因,导致他导出的时候混乱了。。不知道您有没有这方方面的经验

yusong17 avatar May 19 '23 23:05 yusong17

invalid

你可以把这些 print 出来试试

yihong0618 avatar May 19 '23 23:05 yihong0618

从 拿 single 的时候 print 看看是不是 json 不一样

yihong0618 avatar May 19 '23 23:05 yihong0618

从 拿 single 的时候 print 看看是不是 json 不一样

没太明白您的意思哈哈

yusong17 avatar May 19 '23 23:05 yusong17

从 拿 single 的时候 print 看看是不是 json 不一样

抱歉一直打扰 确实不太懂 又确实也很想把数据弄出来哈哈 谢谢了!

yusong17 avatar May 20 '23 00:05 yusong17

@yusong17

def get_single_run_record(self, fid):
    payload = {
        "fid": fid,
        "wgs": 1,
    }
    r = self.session.post(
        f"{self.base_url}/Run/GetInfo.aspx",
        data=payload,
        auth=self.auth.reload(payload),
    )
    print(r.text)
    print(r.json())
    data = r.json()
    return data

搜索这个函数,加这两个 print 然后截图

yihong0618 avatar May 20 '23 00:05 yihong0618

嗯嗯 给您发邮件了,谢谢!

yusong17 avatar May 20 '23 00:05 yusong17