首页 > 其他分享 >佳明批量下载活动文件导入Strava

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

时间:2024-11-15 19:08:49浏览次数:1  
标签:code fit 导入 client token Strava 佳明 print response

佳明导出.fit文件

解析.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 Token
          new_refresh_token = token_data['refresh_token']  # 新的 Refresh Token
          print(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}")
    

标签:code,fit,导入,client,token,Strava,佳明,print,response
From: https://www.cnblogs.com/beatrix-y/p/18548513

相关文章

  • .Net Core关于项目引用和命名空间导入的一个小坑
    .NetCore关于项目引用和命名空间导入的一个小坑一、.NetCore项目嵌套引用的情况经笔者测试验证,发现对于一个.NetCore项目Root,其引用另一个.NetCore项目Root.SubA后,Root项目会自动将Root.SubA项目引用的子项目,也纳入其引用项目池中,而无需再手动引用这些子项目。但这些项目如......
  • python从旧库中导出csv并导入新库
    在线的游戏,迁移数据库,数据比较大,游戏不能停很久,先使用sqldump导入不变的表,再使用python导出可变的表到csv文件,导入到新库.找出各表中csv中最大的id,然后停服, 然后根据各表的id,从id位置开始再导出新增数据,再导入到新库.export.py"""导出msql表格"""impo......
  • C++builder中的人工智能(29):如何在Windows项目中导入FANN库
    这篇文章旨在使用由SteffenNissen开发的FANN库实现人工神经网络。FANN库支持20多种编程语言,包括Delphi和C++Builder。您可以在FANN的官方网站上找到完整信息和文档,并下载FANN的源文件。步骤:下载FANN库:从Nissen的官方网站下载FANN库包(http://leenissen.dk),包含二进制文......
  • springboot导入EXCEL数据10+浏览器等待超时问题
    解决办法异步导入法:前台js解决思路:调用导入按钮后,把前台相应的操作按钮置为不可用,每个10秒查询一次导入结果返回值,直到查询到导入成功或失败的返回值后,将后续的操作按钮置为可用状态关键代码如下:com.langyashi.dialog.asyncImportExcel({ctx:"${ctx}",......
  • mysql 导入SQL文件报错, Specified key was too long; max key length is 767 bytes
    【方案1】一、my.ini文件加入配置,然后重启mysql服务innodb_large_prefix=1二、mysql登陆运行命令登录自己的mysql的方法:1.在D:\ProgramFiles\MySQL\MySQLServer5.7\bin路径下运行命令行,2.登录:mysql-h127.0.0.1-uroot-p然后输入密码3.切换到指定数据库  use数......
  • R语言data.table导入数据实战:data.table使用自定义函数及Reduce函数实现一次性性多表
    R语言data.table导入数据实战:data.table使用自定义函数及Reduce函数实现一次性性多表连接、data.table使用自定义函数及Reduce函数实现一次性性多表连接目录R语言data.table导入数据实战:data.table使用自定义函数及Reduce函数实现一次性性多表连接#data.table是什么?#dat......
  • harmony_flutter_amp 导入高德地图
    接入功能目前已接入amap_flutter_location_ohos已经接入了updatePrivacyShow、updatePrivacyAgree、setApiKey、setLocationOption、startLocation、stopLocation、stopLocation、destroy方法初始化1.高德地图隐私弹窗设置AMapFlutterLocation.updatePrivacyAgree(true);......
  • 管家婆财贸ERP BB059.银行流水导入对账
    最低适用版本:C系列22.8插件简要功能说明:系统支持按固定模板导入银行流水明细银行流水支持销售单、销售退货单快捷对账,按单生成收款单银行流水支持生成其他付款业务单据更多细节描述见下方详细文档插件操作视频:进销存类定制插件--银行流水导入对账插件详细......
  • 如何正确导入mapstruct,同时避免编译时mapstruct与lombok冲突
    本文介绍编译时产生的冲突,导包时期产生的冲突请劳驾查找其他解决方法一般情况下只需要按照官网的导入即可,但如果同时使用了lombok,则需要小心。详细信息可以查看官网文档:MapStruct1.5.5.Final集成lombok注意:在编译测试的时候,一定先清理再编译。这样可以解决80%的报错问题......
  • SQLSever将csv文件中的数据导入数据库中的某个表中的操作以及可能会出现的报错
    注:导入数据前,检查一下数据类型是否与数据库中的数据类型相匹配第一种方法:首先打开SQLSever数据库,右击你的数据库找到任务后点开导入平面文件,如图 在弹开的窗口中点击下一步 接下来 填写完后点击下一步,跳转到预览数据的页面,会显示出表中的前20条数据,在检查没有错误后接......