佳明批量下载活动文件导入Strava

news/2024/11/15 19:11:58/文章来源:https://www.cnblogs.com/beatrix-y/p/18548513

佳明导出.fit文件

  • 国际服:https://www.garmin.com/en-US/account/profile

    国内服:https://www.garmin.cn/zh-CN/account/profile

  • 选择Data Management-Export Your Data,导出所有数据,数据准备完成后会发送邮件提供下载链接

  • 所有.fit活动文件在/DI_CONNECT/DI-Connect-Uploaded-Files/中的压缩包内

解析.fit文件

可以用fitparse库解析.fit文件,选取自己想上传的文件

例如想获取活动时间在2024-1-20之前的文件:

from fitparse import FitFile
fit = FitFile(fit_filepath)
for record in fit.get_messages('record'):timestamp = record.get_value('timestamp')if timestamp and timestamp < cutoff_date:print(f"File {fit_filepath} has a timestamp before 2024/01/20: {timestamp}")break

strava导入.fit文件

  • 在 Strava 开发者控制台创建应用:

    • 创建 Strava 开发者账户并登录 Strava Developer Portal。
    • 创建一个新的应用,网站可以设置成http://localhost:8080,用于用户授权后传authorization_code
    • 获取应用的 Client IDClient Secret
  • 用户授权:

    • 本地起服务:

      import http.server
      import socketserver
      import urllib.parse
      PORT = 8080
      Handler = http.server.SimpleHTTPRequestHandler
      class MyHandler(http.server.BaseHTTPRequestHandler):def do_GET(self):parsed_path = urllib.parse.urlparse(self.path)query_params = urllib.parse.parse_qs(parsed_path.query)if 'code' in query_params:authorization_code = query_params['code'][0]print(f"Authorization code received: {authorization_code}")self.send_response(200)self.end_headers()self.wfile.write(b"Authorization code received successfully")else:self.send_response(400)self.end_headers()self.wfile.write(b"Error: Authorization code not found")
      with socketserver.TCPServer(("", PORT), MyHandler) as httpd:print(f"Serving at port {PORT}")httpd.serve_forever()
      
    • 替换client_id,在浏览器中访问链接:
      https://www.strava.com/oauth/authorize?client_id={client_id}&response_type=code&redirect_uri=http://localhost:8080&scope=activity:write,read&state=random_string&approval_prompt=auto

    • 在浏览器中授权后,本地服务端获得Authorization Code

  • OAuth认证:

    • 根据Client ID、Client Secret、Authorization Code,获取有读写权限的Access Token
      data = {'client_id': client_id,'client_secret': client_secret,'code': authorization_code,'grant_type': 'authorization_code','redirect_uri': 'http://localhost:8080'
      }
      response = requests.post('https://www.strava.com/oauth/token', data=data)
      if response.status_code == 200:token_data = response.json()new_access_token = token_data['access_token']  # 新的 Access Tokennew_refresh_token = token_data['refresh_token']  # 新的 Refresh Tokenprint(f"New Access Token: {new_access_token}")print(f"New Refresh Token: {new_refresh_token}")
      else:print(f"Failed to refresh token: {response.text}")
      
  • 过期刷新Access Token:

    • Refresh Token在Strava创建的应用页面可找到
    • 上一步的data改成如下,重新请求获取Access Token
    refresh_data = {'client_id': client_id,'client_secret': client_secret,'refresh_token': refresh_token,'grant_type': 'refresh_token'
    }
    
  • 批量上传.fit文件

      upload_url = 'https://www.strava.com/api/v3/uploads'fit_files = [f for f in os.listdir(source_folder) if f.endswith('.fit')]for fit_file in fit_files:fit_filepath = os.path.join(source_folder, fit_file)print(f"Uploading {fit_filepath}...")with open(fit_filepath, 'rb') as f:files = {'file': (fit_file, f, 'application/octet-stream')}params = {'access_token': access_token,'data_type': 'fit',  # 上传文件类型为 FIT'name': fit_file,  # 设置上传活动的名称,默认用文件名}response = requests.post(upload_url, files=files, data=params)if response.status_code == 201:print(f"Successfully uploaded {fit_file} to Strava.")else:print(f"Failed to upload {fit_file}: {response.text}")
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834189.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DHCP欺骗

DHCP 欺骗原理DHCP 协议(Dynamic Host Configuration Protocol) 动态主机配置协议:主要给客户机提供 TCP/IP 参数,包括:IP 地址、子网掩码、网关、DNS、租期工作原理应用层协议,基于UDP 主机向服务器 67 号端口发送 DHCP 请求 服务器响应给客户机的 68号端口配置设置DHCP 服…

Redis运行的时候碰到# Creating Server TCP listening socket *:6379: bind: No error

Redis运行的时候碰到# Creating Server TCP listening socket *:6379: bind: No error 解决方案: 1、启动redis客户端:redis-cli.exe。 2、执行关闭命令:输入shutdown3、执行退出命令:exit4、重新启动Redis输入:redis-server.exe redis.windows.conf

https实验

https 实验原理httphttps https = http + SSL/TLS •SSL: Secure Socket Layer 安全套接层 •TLS: Transport Layer Security 传输层安全协议加密方式:PKI(公钥基础设施)使用公钥技术和数字签名来保证信息安全由公钥密码算法、数字证书(Certificate)、CA(Certificate Aut…

手把手教你搭建OpenScenario交通场景(上)

经纬恒润动力学仿真软件ModelBase基于OpenScenario1.0标准,开发内嵌了场景编辑器,可用于对仿真测试过程中的车辆行驶道路模型之外,继续进行周边动态场景的搭建。 OpenScenario是一种专为自动驾驶系统仿真测试设计的场景描述语言,它基于XML格式,旨在提供一个标准化、…

动态规划题单2

第一个题单编辑到后面实在是太卡了,就新开了一个,以后应该也会 \(30\) 题为一个题单。 31.CF1580D Subsequence CF1580D Subsequence 不会笛卡尔树,但是看到题解区的妙妙解法...... 题目的式子非常大便,我们考虑把它翻译成人话: 一个子序列的价值为: \(sum*m - 每两个数及他…

java 反序列化 cc7 复现

java 反序列化 cc7 复现复现环境:common-collections版本<=3.2.1,java版本随意.cc7就是cc6换了一个出口,整体的逻辑没有太大的变化.在Lazymap之前的还那样,我们从如何触发Lazymap的get方法开始看起. AbstractMap 看他的equals方法 public boolean equals(Object o) { if (o…

告别Print,使用IceCream进行高效的Python调试

在Python开发实践中,调试是一个不可或缺的环节。如果采用print()语句来追踪程序执行流程,可能会遇到一个持续出现的异常情况,并且经过多次代码审查问题的根源仍然难以确定,这可能是因为随着终端输出信息的不断增加,这种调试方式的局限性逐渐显现。本文将介绍IceCream库,这…

浏览器

控制台 查看继承的样式 Inherited(继承) from xxx: 继承样式来自于xxx <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><title>Document</title><style>.font {font-size: 12px;}.font2 {fon…

团队项目Scrum冲刺-day5

一、每天举行站立式会议 站立式会议照片一张昨天已完成的工作成员 任务陈国金 判题机架构设计凌枫 整合代码编辑器陈卓恒 更新题目界面部分完成谭立业 浏览题目页面部分完成廖俊龙 接口测试曾平凡 前端页面测试曾俊涛 判题服务薛秋昊 判题服务今天计划完成的工作成员 任务陈国金…

js原型链污染

js原型链污染 原理介绍 对于语句:object[a][b] = value 如果可以控制a、b、value的值,将a设置为__proto__,我们就可以给object对象的原型设置一个b属性,值为value。这样所有继承object对象原型的实例对象在本身不拥有b属性的情况下,都会拥有b属性,且值为value。 可以通过…

基于米尔NXP i.MX93开发板OpenCV的相机捕捉视频进行人脸检测

本篇测评由优秀测评者“eefocus_3914144”提供。 本文将介绍基于米尔电子MYD-LMX93开发板(米尔基于NXP i.MX93开发板)的基于OpenCV的人脸检测方案测试。 OpenCV提供了一个非常简单的接口,用于相机捕捉一个视频(我用的电脑内置摄像头)1、安装python3-opencvapt install pyth…

hbase-2.2.7分布式搭建文档(附详细操作步骤命令及相关操作截图)

hbase-2.2.7分布式搭建文档 一,搭建前准备 1.检查是否已经安装JDK 2.搭建hbase前需要先搭建好hadoop 3.检查zookeeper是否正常启动 #启动zookeeper(三台都要启动) zkServer.sh start#查看zookeeper状态(一个leader两个follower) zkServer.sh status4.到官网或国内镜像站下载hb…