2025-10 跑步日记

2025-10 运动次数: 2 运动距离: 32.14 km 运动时长: 3:15:42 平均距离: 16.07 km 平均心率: 146 bpm 平均配速: 6:05 / km 2025-10-01 时间: 2025-10-01 06:04:14 距离: 10.93 km 时长: 1:00:00 配速: 5:29 / km 心率: 162 bpm ...

十月 3, 2025 · 1 分钟 · 50 字 · Jogger ·  跑步

跑步总结(2025-10-03 更新)

累计数据 运动次数: 460 运动距离: 4079.72 km 运动时长: 17d 6:38:31 平均距离: 8.87 km 平均心率: 153 bpm 平均配速: 6:05 / km 2025 运动次数: 118 运动距离: 1076.23 km 运动时长: 4d 15:14:24 平均距离: 9.12 km 平均心率: 148 bpm 平均配速: 6:12 / km ...

十月 3, 2025 · 1 分钟 · 149 字 · Jogger ·  跑步

2025-09 跑步日记

2025-09 运动次数: 14 运动距离: 180.45 km 运动时长: 18:39:24 平均距离: 12.89 km 平均心率: 146 bpm 平均配速: 6:12 / km 2025-09-03 时间: 2025-09-03 06:53:17 距离: 15.16 km 时长: 1:36:21 配速: 6:12 / km 心率: 144 bpm ...

九月 29, 2025 · 2 分钟 · 242 字 · Jogger ·  跑步

2025-08 跑步日记

2025-08 运动次数: 18 运动距离: 141.09 km 运动时长: 14:49:13 平均距离: 7.84 km 平均心率: 144 bpm 平均配速: 6:18 / km 2025-08-01 时间: 2025-08-01 06:34:48 距离: 8.01 km 时长: 47:40 配速: 5:57 / km 心率: 153 bpm ...

八月 31, 2025 · 2 分钟 · 306 字 · Jogger ·  跑步

2025-07 跑步日记

2025-07 运动次数: 14 运动距离: 101.70 km 运动时长: 10:34:16 平均距离: 7.26 km 平均心率: 145 bpm 平均配速: 6:14 / km 2025-07-02 时间: 2025-07-02 06:23:26 距离: 7.77 km 时长: 47:03 配速: 6:03 / km 心率: 144 bpm ...

七月 30, 2025 · 2 分钟 · 242 字 · Jogger ·  跑步

用脚步丈量世界:2025上半年12城跑步笔记

2025上半年结束,跑步距离定格在620公里,离年初制定的全年1500公里目标还有不小的差距。主要原因是3月小腿意外受伤,让我结结实实地休整了一个月才基本恢复。 不过,年初“多跑一些城市”的愿望倒是超额实现了。上半年,我的足迹已经遍布12个城市,超过去年全年的10个,也算是一份意料之外的惊喜。 保定(1月) 北京(2月) 鞍山(4月) 兰州(4月) 南京(4月) 乌鲁木齐(5月) 西宁市(5月) 成都(6月) 广州(6月) 呼和浩特(6月) 济南(6月) 泰安(6月) 每到一个新的城市,我都会习惯性地打开咕咚,寻找一条同城热门路线。跑步,已经成为我感知一座城市最直接的方式。以下便是我对这13座城市,仅限于个人视角的跑步路线感受。 1月 · 保定 1月的保定天寒地冻,在田野中奔跑,别有一番风味。1月底,路边的麦田已经吐出了嫩芽,小麦的地上部分会停止生长,但根系仍在悄悄吸收养分,为春季返青积蓄力量。这正像是跑者的冬训,是为新一年“打造”更强心肺功能的黄金期。 2月 · 北京 2月的北京春意渐浓,体感很舒服。清河两岸的道路一年四季都适合跑步。冬天的清河里,有越冬的候鸟在此停留。去年,一对黑天鹅在河边孵化宝宝,一度成为网红,引来不少周边群众打卡围观。如今,在清河之舟的展厅里,还能欣赏到摄影爱好者们为它们拍摄的嬉戏作品。 4月 · 鞍山 4月的鞍山感受热情,因为宾馆附近没有找到热门路线,就索性绕着宾馆跑了几圈。都说东北近年来人口外流,但亲身体验下来,这里少了些大城市的喧嚣,路面不拥挤,生活节奏很是惬意。而且这里的人们非常热情,东北菜也是名不虚传,嘎嘎香! 4月 · 兰州 4月的兰州依旧凉爽。每次到兰州,基本都会选择住在黄河附近,这样清晨一出门,就可以沿着黄河跑步打卡。跑的这段路,有一部分还是兰州马拉松的赛道。6月初兰马之后一周又去了一趟,跑步时想到有许多跑友为兰马拍摄vlog,跑起来也格外带劲。 4月 · 南京 4月的南京古都之行,南京的跑步圣地,非玄武湖莫属。一圈9.6公里,地处主城区,早上跑步的人非常多。沿途风景美不胜收,目不暇接。最近在网上刷了不少程鸣的vlog,那句“我又不会害你”的口头禅尤其洗脑,跑步的时候我还在想,会不会在这里与他偶遇呢。 5月 · 乌鲁木齐 5月的乌鲁木齐格外凉快,宾馆附近有个植物园,但看起来不大,就没进去跑,选择了路跑画圈。途中有些路段的人行道非常窄,汽车几乎是擦着身子开过,感觉有些危险。加上时差还没完全倒过来,跑得不够尽兴。下次有机会,一定得选个好地方跑个过瘾的长距离。 5月 · 西宁 5月的西宁避暑天堂,下着小雨的时候甚至还得穿件外套。西宁海拔2260米左右,记得去年刚到时还有些高原反应,呼吸略喘,连续几天都没睡好。但现在适应多了,头天晚上到,第二天早上就能开跑。高海拔的跑步感受和内地平原地区还是有明显区别,心率很容易飙高。不过这个季节的西宁,温度和湿度都恰到好处,跑起来非常美。回想3月份的拉伤,就是因为热身不充分,这次可不敢大意了。 6月 · 成都 6月的成都有点热辣。住的地方在金融城附近,早上上班族行色匆匆。于是,选了不远处一圈2公里多的锦城公园跑圈。公园虽然不大,但一路基本都有绿荫遮挡,成都的绿道跑起来,只能用“巴适得板”来形容。跑完步再吃顿成都的美食,更是“安逸喽”! 6月 · 广州 6月的广州潮湿闷热,一落地就感受到了扑面而来的热情。早上出来跑了不到5公里,短裤就已湿透。这条路线途经香雪公园、草莓园和黄埔图书馆,若是在天气凉爽的时候跑,体验感一定会非常棒。这次广州之行还有一个额外收获:解锁了地道的大排档体验,大电风扇呼呼地吹,菜用大盆装着,肉可以大口吃,江湖气十足! 6月 · 呼和浩特 6月的呼和浩特喜逢大雨,穿着短袖感觉还有点冷。好在天公作美,清晨时分短暂放晴,我赶紧出门开跑。在宾馆门口,还偶遇一位跑友询问去哪儿跑,他正准备绕着成吉思汗公园跑两圈。于是我便跟着进了成吉思汗公园。出公园时还有个小插曲:一位老大爷看见我,竟拿着一根会发出叮当声响的棍子追着我跑,吓得我立马大步流星地开溜。跑了一段距离后,看见前面另一位跑友时,才放慢了脚步,跟着前面的跑友继续跑了。 6月 · 济南 6月的济南热辣滚烫,当然是为了看“夏雨荷”。虽然宾馆距离大明湖有点远,济南的夏天也热,但这些都挡不住跑步的脚步。跑了3公里多到达大明湖,绕湖一圈,不虚此行,确实看到了湖中盛开的荷花,以及岸边大大的卡通形象“夏雨荷”。 ...

七月 5, 2025 · 1 分钟 · 65 字 · Byter ·  summary

2025-06 跑步日记

2025-06 运动次数: 24 运动距离: 206.50 km 运动时长: 21:41:06 平均距离: 8.60 km 平均心率: 147 bpm 平均配速: 6:18 / km 2025-06-01 时间: 2025-06-01 06:33:11 距离: 15.09 km 时长: 1:32:01 配速: 5:59 / km 心率: 146 bpm ...

六月 30, 2025 · 2 分钟 · 402 字 · Jogger ·  跑步

同步指定时间的Garmin运动记录到不同账号

最近带着小朋友在运动,小朋友看到运动记录都在我的Garmin Connect活动在一起,还有点不开心,希望有自己的账号,只有他自己的运动记录。于是就有了下面忙活的内容。 现在博客跑步的内容是通过yihong0618大佬的running_page实现跑步记录自动生成博文,详细可以看《跑步记录自动生成Markdown发布博文》。 大致思路就是如下: 申请一个新的Garmin Connect账号; python脚本实现:做一个fit文件的缓存;根据指定的时间找到对应的fit文件;上次fit文件到新注册的Garmin Connect账号; shell脚本实现:接收时间参数;获取Garmin Connect账号密钥;执行python脚本。 Garmin Connect账号注册 账号注册时需要注意,Garmin有国内账号和国际账号的区分,因此如果这方面需求的可以稍微注意一下。 国内账号地址:[[https://connect.garmin.cn/]] 国际账号地址:[[https://connectus.garmin.cn/]] python同步脚本 下面的脚本放在run_page工程下的run_page目录下: import argparse import asyncio import json import os from datetime import datetime import config from garmin_sync import Garmin from gpxtrackposter.track_loader import load_fit_file FIT_FOLDER = os.path.join(config.parent, "FIT_OUT") FIT_CACHE_FILE = os.path.join(config.parent, "fit_cache.json") def save_fit_cache_list(fit_cache_list): with open(FIT_CACHE_FILE, "w") as f: json.dump(fit_cache_list, f) def load_fit_cache_list(): if os.path.exists(FIT_CACHE_FILE): with open(FIT_CACHE_FILE, "r") as f: try: return json.load(f) except Exception as e: print(f"json load {FIT_CACHE_FILE} \nerror {e}") pass return {} def upload_files_to_garmin(options): print("Need to load all fit files maybe take some time") fit_cache_list = load_fit_cache_list() file_names = [] for file_name in os.listdir(FIT_FOLDER): if file_name.endswith('.fit') and file_name not in fit_cache_list: file_names.append(file_name) for file_name in file_names: track = load_fit_file(os.path.join(FIT_FOLDER, file_name)) if track.start_time_local: fit_cache_list[file_name] = datetime.strftime(track.start_time_local, "%Y-%m-%d:%H:%M:%S") save_fit_cache_list(fit_cache_list) to_upload_files = [] if options.dt is not None: dts = options.dt.split(",") for dt in dts: for file_name in fit_cache_list: if fit_cache_list[file_name].startswith(dt): to_upload_files.append(os.path.join(FIT_FOLDER, file_name)) break print("Uploading files to Garmin...") garmin_auth_domain = "CN" if options.is_cn else "" garmin_client = Garmin(options.secret_string, garmin_auth_domain) loop = asyncio.get_event_loop() future = asyncio.ensure_future( garmin_client.upload_activities_files(to_upload_files) ) loop.run_until_complete(future) if __name__ == "__main__": if not os.path.exists(FIT_FOLDER): os.mkdir(FIT_FOLDER) parser = argparse.ArgumentParser() parser.add_argument( "secret_string", nargs="?", help="secret_string fro get_garmin_secret.py" ) parser.add_argument( "--dt", dest="dt", help="if upload to strava all without check last time", ) parser.add_argument( "--is-cn", dest="is_cn", action="store_true", help="if garmin account is cn", ) upload_files_to_garmin(parser.parse_args()) 使用方式,如上传2025-06-22:20,2025-06-22:21两个时间相关的运动记录到新账号。 ...

六月 28, 2025 · 2 分钟 · 274 字 · Byter ·  Garmin

Python中ssl.SSLCertVerificationError处理

在做同步指定时间的Garmin运动记录到不同账号的时候碰到一个诡异的报错,因为重装了系统就出现问题,让我觉得系统出现什么问题。 在编写python脚本的时候,需要提前获取一下Garmin账号密钥,于是执行下面的命令。 python run_page/get_garmin_secret.py 账号 "密码" --is-cn 报错啦。。。 Traceback (most recent call last): File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/urllib3/connectionpool.py", line 464, in _make_request self._validate_conn(conn) ~~~~~~~~~~~~~~~~~~~^^^^^^ File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/urllib3/connectionpool.py", line 1093, in _validate_conn conn.connect() ~~~~~~~~~~~~^^ File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/urllib3/connection.py", line 790, in connect sock_and_verified = _ssl_wrap_socket_and_match_hostname( sock=sock, ...<14 lines>... assert_fingerprint=self.assert_fingerprint, ) File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/urllib3/connection.py", line 969, in _ssl_wrap_socket_and_match_hostname ssl_sock = ssl_wrap_socket( sock=sock, ...<8 lines>... tls_in_tls=tls_in_tls, ) File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/urllib3/util/ssl_.py", line 480, in ssl_wrap_socket ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname) File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/urllib3/util/ssl_.py", line 524, in _ssl_wrap_socket_impl return ssl_context.wrap_socket(sock, server_hostname=server_hostname) ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/homebrew/Cellar/[email protected]/3.13.5/Frameworks/Python.framework/Versions/3.13/lib/python3.13/ssl.py", line 455, in wrap_socket return self.sslsocket_class._create( ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ sock=sock, ^^^^^^^^^^ ...<5 lines>... session=session ^^^^^^^^^^^^^^^ ) ^ File "/opt/homebrew/Cellar/[email protected]/3.13.5/Frameworks/Python.framework/Versions/3.13/lib/python3.13/ssl.py", line 1076, in _create self.do_handshake() ~~~~~~~~~~~~~~~~~^^ File "/opt/homebrew/Cellar/[email protected]/3.13.5/Frameworks/Python.framework/Versions/3.13/lib/python3.13/ssl.py", line 1372, in do_handshake self._sslobj.do_handshake() ~~~~~~~~~~~~~~~~~~~~~~~~~^^ ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1028) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/urllib3/connectionpool.py", line 787, in urlopen response = self._make_request( conn, ...<10 lines>... **response_kw, ) File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/urllib3/connectionpool.py", line 488, in _make_request raise new_e urllib3.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1028) The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/requests/adapters.py", line 667, in send resp = conn.urlopen( method=request.method, ...<9 lines>... chunked=chunked, ) File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/urllib3/connectionpool.py", line 871, in urlopen return self.urlopen( ~~~~~~~~~~~~^ method, ^^^^^^^ ...<13 lines>... **response_kw, ^^^^^^^^^^^^^^ ) ^ File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/urllib3/connectionpool.py", line 871, in urlopen return self.urlopen( ~~~~~~~~~~~~^ method, ^^^^^^^ ...<13 lines>... **response_kw, ^^^^^^^^^^^^^^ ) ^ File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/urllib3/connectionpool.py", line 871, in urlopen return self.urlopen( ~~~~~~~~~~~~^ method, ^^^^^^^ ...<13 lines>... **response_kw, ^^^^^^^^^^^^^^ ) ^ File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/urllib3/connectionpool.py", line 841, in urlopen retries = retries.increment( method, url, error=new_e, _pool=self, _stacktrace=sys.exc_info()[2] ) File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/urllib3/util/retry.py", line 519, in increment raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='sso.garmin.cn', port=443): Max retries exceeded with url: /sso/embed?id=gauth-widget&embedWidget=true&gauthHost=https%3A%2F%2Fsso.garmin.cn%2Fsso (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1028)'))) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/xxx/PycharmProjects/workouts_page/run_page/get_garmin_secret.py", line 18, in <module> garth.login(options.email, options.password) ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/garth/http.py", line 167, in login self.oauth1_token, self.oauth2_token = sso.login( ~~~~~~~~~^ *args, **kwargs, client=self ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/garth/sso.py", line 92, in login client.get("sso", "/sso/embed", params=SSO_EMBED_PARAMS) ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/garth/http.py", line 155, in get return self.request("GET", *args, **kwargs) ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/garth/http.py", line 138, in request self.last_resp = self.sess.request( ~~~~~~~~~~~~~~~~~^ method, ^^^^^^^ ...<3 lines>... **kwargs, ^^^^^^^^^ ) ^ File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/requests/sessions.py", line 589, in request resp = self.send(prep, **send_kwargs) File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/requests/sessions.py", line 703, in send r = adapter.send(request, **kwargs) File "/Users/xxx/PycharmProjects/workouts_page/venv313/lib/python3.13/site-packages/requests/adapters.py", line 698, in send raise SSLError(e, request=request) requests.exceptions.SSLError: HTTPSConnectionPool(host='sso.garmin.cn', port=443): Max retries exceeded with url: /sso/embed?id=gauth-widget&embedWidget=true&gauthHost=https%3A%2F%2Fsso.garmin.cn%2Fsso (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1028)'))) 问题扔给GPT,看看解决方法。 ...

六月 28, 2025 · 7 分钟 · 1394 字 · Byter ·  Python

2025-05 跑步日记

2025-05 运动次数: 14 运动距离: 150.43 km 运动时长: 15:22:32 平均距离: 10.75 km 平均心率: 149 bpm 平均配速: 6:07 / km 2025-05-02 时间: 2025-05-02 06:40:34 距离: 5.20 km 时长: 32:16 配速: 6:12 / km 心率: 136 bpm ...

五月 30, 2025 · 2 分钟 · 242 字 · Jogger ·  跑步