strava_connector.connector

  1from typing import Literal, overload
  2
  3import requests
  4
  5from strava_connector.authenticator import Authenticator
  6
  7
  8class Connector:
  9    def __init__(
 10        self,
 11        client_token_path: str,
 12        strava_token_path: str,
 13        api_url: str = """https://www.strava.com/api/v3""",
 14    ) -> None:
 15        self.api_url = api_url
 16        self.authenticator = Authenticator(
 17            client_token_path=client_token_path,
 18            strava_token_path=strava_token_path,
 19        )
 20
 21    @property
 22    def access_token(self) -> str:
 23        """Append the credentials to the request."""
 24        self.authenticator.update_token()
 25        return str(self.authenticator.strava_tokens["access_token"])
 26
 27    @overload
 28    def get_request(
 29        self,
 30        route: str,
 31        print_query: bool,
 32        params: dict,
 33        to_json: Literal[True],
 34    ) -> dict: ...
 35
 36    @overload
 37    def get_request(
 38        self,
 39        route: str,
 40        print_query: bool,
 41        params: dict,
 42        to_json: Literal[False],
 43    ) -> requests.Response: ...
 44
 45    def get_request(
 46        self,
 47        route: str,
 48        print_query: bool,
 49        params: dict,
 50        to_json: bool,
 51    ) -> dict | requests.Response:
 52        """GET request against strava's API."""
 53        params["access_token"] = self.access_token
 54        params_str = "&".join(
 55            [f"{k}={v}" for k, v in params.items() if v is not None]
 56        )
 57        url = f"{self.api_url}/{route}?{params_str}"
 58        if print_query:
 59            print(url)
 60        result = requests.get(url, timeout=self.authenticator._timeout)
 61        if to_json:
 62            return result.json()
 63        else:
 64            return result
 65
 66    def getActivityById(
 67        self,
 68        id: int,
 69        include_all_efforts: bool | None = None,
 70        print_query: bool = False,
 71    ) -> dict:
 72        """Get Activity.
 73
 74        https://developers.strava.com/docs/reference/#api-Activities-getActivityById
 75        """
 76        return self.get_request(
 77            route=f"activities/{id}",
 78            print_query=print_query,
 79            params={
 80                "include_all_efforts": include_all_efforts,
 81            },
 82            to_json=True,
 83        )
 84
 85    def getCommentsByActivityId(
 86        self,
 87        id: int,
 88        page: int | None = None,
 89        per_page: int | None = None,
 90        page_size: int | None = None,
 91        after_cursor: str | None = None,
 92        print_query: bool = False,
 93    ) -> dict:
 94        """List Activity Comments .
 95
 96        https://developers.strava.com/docs/reference/#api-Activities-getCommentsByActivityId
 97        """
 98        return self.get_request(
 99            route=f"activities/{id}/comments",
100            print_query=print_query,
101            params={
102                "page": page,
103                "per_page": per_page,
104                "page_size": page_size,
105                "after_cursor": after_cursor,
106            },
107            to_json=True,
108        )
109
110    def getKudoersByActivityId(
111        self,
112        id: int,
113        page: int | None = None,
114        per_page: int | None = None,
115        print_query: bool = False,
116    ) -> dict:
117        """List Activity Kudoers.
118
119        https://developers.strava.com/docs/reference/#api-Activities-getKudoersByActivityId
120        """
121        return self.get_request(
122            route=f"activities/{id}/kudos",
123            print_query=print_query,
124            params={
125                "page": page,
126                "per_page": per_page,
127            },
128            to_json=True,
129        )
130
131    def getLapsByActivityId(
132        self,
133        id: int,
134        print_query: bool = False,
135    ) -> dict:
136        """Get Activity Laps.
137
138        https://developers.strava.com/docs/reference/#api-Activities-getLapsByActivityId
139        """
140        return self.get_request(
141            route=f"activities/{id}/laps",
142            print_query=print_query,
143            params={},
144            to_json=True,
145        )
146
147    def getLoggedInAthleteActivities(
148        self,
149        page: int,
150        per_page: int | None = None,
151        print_query: bool = False,
152    ) -> dict:
153        """List Athlete Activities.
154
155        https://developers.strava.com/docs/reference/#api-Activities-getLoggedInAthleteActivities
156        """
157        return self.get_request(
158            route="athlete/activities",
159            print_query=print_query,
160            params={
161                "page": page,
162                "per_page": per_page,
163            },
164            to_json=True,
165        )
166
167    def getZonesByActivityId(
168        self,
169        id: int,
170        print_query: bool = False,
171    ) -> dict:
172        """Get Activity Zones.
173
174        https://developers.strava.com/docs/reference/#api-Activities-getZonesByActivityId
175        """
176        return self.get_request(
177            route=f"activities/{id}/zones",
178            print_query=print_query,
179            params={},
180            to_json=True,
181        )
182
183    def getLoggedInAthlete(
184        self,
185        print_query: bool = False,
186    ) -> dict:
187        """Get Athlete.
188
189        https://developers.strava.com/docs/reference/#api-Athletes-getLoggedInAthlete
190        """
191        return self.get_request(
192            route="athlete", print_query=print_query, params={}, to_json=True
193        )
194
195    def getLoggedInAthleteZones(
196        self,
197        print_query: bool = False,
198    ) -> dict:
199        """Get Zones.
200
201        https://developers.strava.com/docs/reference/#api-Athletes-getLoggedInAthleteZones
202        """
203        return self.get_request(
204            route="athlete/zones",
205            print_query=print_query,
206            params={},
207            to_json=True,
208        )
209
210    def getStats(
211        self,
212        id: int,
213        print_query: bool = False,
214    ) -> dict:
215        """Get Stats.
216
217        https://developers.strava.com/docs/reference/#api-Athletes-getStats
218        """
219        return self.get_request(
220            route=f"athletes/{id}/stats",
221            print_query=print_query,
222            params={},
223            to_json=True,
224        )
225
226    def getClubActivitiesById(
227        self,
228        id: int,
229        page: int | None = None,
230        per_page: int | None = None,
231        print_query: bool = False,
232    ) -> dict:
233        """List Club Activities.
234
235        https://developers.strava.com/docs/reference/#api-Clubs-getClubActivitiesById
236        """
237        return self.get_request(
238            route=f"clubs/{id}/activities",
239            print_query=print_query,
240            params={
241                "page": page,
242                "per_page": per_page,
243            },
244            to_json=True,
245        )
246
247    def getClubAdminsById(
248        self,
249        id: int,
250        page: int | None = None,
251        per_page: int | None = None,
252        print_query: bool = False,
253    ) -> dict:
254        """List Club Administrators.
255
256        https://developers.strava.com/docs/reference/#api-Clubs-getClubAdminsById
257        """
258        return self.get_request(
259            route=f"clubs/{id}/admins",
260            print_query=print_query,
261            params={
262                "page": page,
263                "per_page": per_page,
264            },
265            to_json=True,
266        )
267
268    def getClubById(
269        self,
270        id: int,
271        print_query: bool = False,
272    ) -> dict:
273        """Get Club.
274
275        https://developers.strava.com/docs/reference/#api-Clubs-getClubById
276        """
277        return self.get_request(
278            route=f"clubs/{id}",
279            print_query=print_query,
280            params={},
281            to_json=True,
282        )
283
284    def getClubMembersById(
285        self,
286        id: int,
287        page: int | None = None,
288        per_page: int | None = None,
289        print_query: bool = False,
290    ) -> dict:
291        """List Club Members.
292
293        https://developers.strava.com/docs/reference/#api-Clubs-getClubMembersById
294        """
295        return self.get_request(
296            route=f"clubs/{id}/members",
297            print_query=print_query,
298            params={
299                "page": page,
300                "per_page": per_page,
301            },
302            to_json=True,
303        )
304
305    def getLoggedInAthleteClubs(
306        self,
307        page: int,
308        per_page: int | None = None,
309        print_query: bool = False,
310    ) -> dict:
311        """List Athlete Clubs.
312
313        https://developers.strava.com/docs/reference/#api-Athletes-getLoggedInAthleteClubs
314        """
315        return self.get_request(
316            route="athlete/clubs",
317            print_query=print_query,
318            params={
319                "page": page,
320                "per_page": per_page,
321            },
322            to_json=True,
323        )
324
325    def getGearById(
326        self,
327        id: str,
328        print_query: bool = False,
329    ) -> dict:
330        """Get Gear.
331
332        https://developers.strava.com/docs/reference/#api-Gears-getGearById
333        """
334        return self.get_request(
335            route=f"gear/{id}", print_query=print_query, params={}, to_json=True
336        )
337
338    def getRouteAsGPX(
339        self,
340        id: int,
341        print_query: bool = False,
342    ) -> requests.Response:
343        """Export Route GPX.
344
345        https://developers.strava.com/docs/reference/#api-Routes-getRouteAsGPX
346        """
347        return self.get_request(
348            route=f"routes/{id}/export_gpx",
349            print_query=print_query,
350            params={},
351            to_json=False,
352        )
353
354    def getRouteAsTCX(
355        self,
356        id: int,
357        print_query: bool = False,
358    ) -> requests.Response:
359        """Export Route TCX.
360
361        https://developers.strava.com/docs/reference/#api-Routes-getRouteAsTCX
362        """
363        return self.get_request(
364            route=f"routes/{id}/export_tcx",
365            print_query=print_query,
366            params={},
367            to_json=False,
368        )
369
370    def getRouteById(
371        self,
372        id: int,
373        print_query: bool = False,
374    ) -> dict:
375        """Get Route.
376
377        https://developers.strava.com/docs/reference/#api-Routes-getRouteById
378        """
379        return self.get_request(
380            route=f"routes/{id}",
381            print_query=print_query,
382            params={},
383            to_json=True,
384        )
385
386    def getRoutesByAthleteId(
387        self,
388        id: int,
389        page: int | None = None,
390        per_page: int | None = None,
391        print_query: bool = False,
392    ) -> dict:
393        """List Athlete Routes.
394
395        https://developers.strava.com/docs/reference/#api-Routes-getRoutesByAthleteId
396        """
397        return self.get_request(
398            route=f"athletes/{id}/routes",
399            print_query=print_query,
400            params={
401                "page": page,
402                "per_page": per_page,
403            },
404            to_json=True,
405        )
406
407    def getEffortsBySegmentId(
408        self,
409        segment_id: int,
410        start_date_local: str | None = None,
411        end_date_local: str | None = None,
412        per_page: int | None = None,
413        print_query: bool = False,
414    ) -> dict:
415        """List Segment Efforts.
416
417        https://developers.strava.com/docs/reference/#api-SegmentEfforts-getEffortsBySegmentId
418        """
419        return self.get_request(
420            route=f"segments/{id}/all_efforts",
421            print_query=print_query,
422            params={
423                "segment_id": segment_id,
424                "start_date_local": start_date_local,
425                "end_date_local": end_date_local,
426                "per_page": per_page,
427            },
428            to_json=True,
429        )
430
431    def getSegmentEffortById(
432        self,
433        id: int,
434        print_query: bool = False,
435    ) -> dict:
436        """Get Segment Effort.
437
438        https://developers.strava.com/docs/reference/#api-SegmentEfforts-getSegmentEffortById
439        """
440        return self.get_request(
441            route=f"segment_efforts/{id}",
442            print_query=print_query,
443            params={},
444            to_json=True,
445        )
446
447    def exploreSegments(
448        self,
449        bounds: str,
450        activity_type: str | None = None,
451        min_cat: int | None = None,
452        max_cat: int | None = None,
453        print_query: bool = False,
454    ) -> dict:
455        """Explore segments.
456
457        https://developers.strava.com/docs/reference/#api-Segments-exploreSegments
458        """
459        return self.get_request(
460            route="segments/explore",
461            print_query=print_query,
462            params={
463                "bounds": bounds,
464                "activity_type": activity_type,
465                "min_cat": min_cat,
466                "max_cat": max_cat,
467            },
468            to_json=True,
469        )
470
471    def getLoggedInAthleteStarredSegments(
472        self,
473        page: int | None = None,
474        per_page: int | None = None,
475        print_query: bool = False,
476    ) -> dict:
477        """List Athlete Starred Segments.
478
479        https://developers.strava.com/docs/reference/#api-Segments-getLoggedInAthleteStarredSegments
480        """
481        return self.get_request(
482            route="segments/starred",
483            print_query=print_query,
484            params={
485                "page": page,
486                "per_page": per_page,
487            },
488            to_json=True,
489        )
490
491    def getRouteStreams(
492        self,
493        id: int,
494        print_query: bool = False,
495    ) -> dict:
496        """Get Route Streams.
497
498        https://developers.strava.com/docs/reference/#api-Streams-getRouteStreams
499        """
500        return self.get_request(
501            route=f"routes/{id}/streams",
502            print_query=print_query,
503            params={},
504            to_json=True,
505        )
506
507    def getSegmentEffortStreams(
508        self,
509        id: int,
510        keys: list[str],
511        key_by_type: bool = False,
512        print_query: bool = False,
513    ) -> dict:
514        """Get Segment Effort Streams.
515
516        https://developers.strava.com/docs/reference/#api-Streams-getSegmentEffortStreams
517        """
518        return self.get_request(
519            route=f"segment_efforts/{id}/streams",
520            print_query=print_query,
521            params={
522                "keys": keys,
523                "key_by_type": key_by_type,
524            },
525            to_json=True,
526        )
527
528    def getSegmentStreams(
529        self,
530        id: int,
531        keys: list[str],
532        key_by_type: bool = False,
533        print_query: bool = False,
534    ) -> dict:
535        """Get Segment Streams.
536
537        https://developers.strava.com/docs/reference/#api-Streams-getSegmentStreams
538        """
539        return self.get_request(
540            route=f"segments/{id}/streams",
541            print_query=print_query,
542            params={
543                "keys": keys,
544                "key_by_type": key_by_type,
545            },
546            to_json=True,
547        )
548
549    def getUploadById(
550        self,
551        uploadId: int,
552        print_query: bool = False,
553    ) -> dict:
554        """Get Upload.
555
556        https://developers.strava.com/docs/reference/#api-Uploads-getUploadById
557        """
558        return self.get_request(
559            route=f"uploads/{id}",
560            print_query=print_query,
561            params={"uploadId": uploadId},
562            to_json=True,
563        )
class Connector:
  9class Connector:
 10    def __init__(
 11        self,
 12        client_token_path: str,
 13        strava_token_path: str,
 14        api_url: str = """https://www.strava.com/api/v3""",
 15    ) -> None:
 16        self.api_url = api_url
 17        self.authenticator = Authenticator(
 18            client_token_path=client_token_path,
 19            strava_token_path=strava_token_path,
 20        )
 21
 22    @property
 23    def access_token(self) -> str:
 24        """Append the credentials to the request."""
 25        self.authenticator.update_token()
 26        return str(self.authenticator.strava_tokens["access_token"])
 27
 28    @overload
 29    def get_request(
 30        self,
 31        route: str,
 32        print_query: bool,
 33        params: dict,
 34        to_json: Literal[True],
 35    ) -> dict: ...
 36
 37    @overload
 38    def get_request(
 39        self,
 40        route: str,
 41        print_query: bool,
 42        params: dict,
 43        to_json: Literal[False],
 44    ) -> requests.Response: ...
 45
 46    def get_request(
 47        self,
 48        route: str,
 49        print_query: bool,
 50        params: dict,
 51        to_json: bool,
 52    ) -> dict | requests.Response:
 53        """GET request against strava's API."""
 54        params["access_token"] = self.access_token
 55        params_str = "&".join(
 56            [f"{k}={v}" for k, v in params.items() if v is not None]
 57        )
 58        url = f"{self.api_url}/{route}?{params_str}"
 59        if print_query:
 60            print(url)
 61        result = requests.get(url, timeout=self.authenticator._timeout)
 62        if to_json:
 63            return result.json()
 64        else:
 65            return result
 66
 67    def getActivityById(
 68        self,
 69        id: int,
 70        include_all_efforts: bool | None = None,
 71        print_query: bool = False,
 72    ) -> dict:
 73        """Get Activity.
 74
 75        https://developers.strava.com/docs/reference/#api-Activities-getActivityById
 76        """
 77        return self.get_request(
 78            route=f"activities/{id}",
 79            print_query=print_query,
 80            params={
 81                "include_all_efforts": include_all_efforts,
 82            },
 83            to_json=True,
 84        )
 85
 86    def getCommentsByActivityId(
 87        self,
 88        id: int,
 89        page: int | None = None,
 90        per_page: int | None = None,
 91        page_size: int | None = None,
 92        after_cursor: str | None = None,
 93        print_query: bool = False,
 94    ) -> dict:
 95        """List Activity Comments .
 96
 97        https://developers.strava.com/docs/reference/#api-Activities-getCommentsByActivityId
 98        """
 99        return self.get_request(
100            route=f"activities/{id}/comments",
101            print_query=print_query,
102            params={
103                "page": page,
104                "per_page": per_page,
105                "page_size": page_size,
106                "after_cursor": after_cursor,
107            },
108            to_json=True,
109        )
110
111    def getKudoersByActivityId(
112        self,
113        id: int,
114        page: int | None = None,
115        per_page: int | None = None,
116        print_query: bool = False,
117    ) -> dict:
118        """List Activity Kudoers.
119
120        https://developers.strava.com/docs/reference/#api-Activities-getKudoersByActivityId
121        """
122        return self.get_request(
123            route=f"activities/{id}/kudos",
124            print_query=print_query,
125            params={
126                "page": page,
127                "per_page": per_page,
128            },
129            to_json=True,
130        )
131
132    def getLapsByActivityId(
133        self,
134        id: int,
135        print_query: bool = False,
136    ) -> dict:
137        """Get Activity Laps.
138
139        https://developers.strava.com/docs/reference/#api-Activities-getLapsByActivityId
140        """
141        return self.get_request(
142            route=f"activities/{id}/laps",
143            print_query=print_query,
144            params={},
145            to_json=True,
146        )
147
148    def getLoggedInAthleteActivities(
149        self,
150        page: int,
151        per_page: int | None = None,
152        print_query: bool = False,
153    ) -> dict:
154        """List Athlete Activities.
155
156        https://developers.strava.com/docs/reference/#api-Activities-getLoggedInAthleteActivities
157        """
158        return self.get_request(
159            route="athlete/activities",
160            print_query=print_query,
161            params={
162                "page": page,
163                "per_page": per_page,
164            },
165            to_json=True,
166        )
167
168    def getZonesByActivityId(
169        self,
170        id: int,
171        print_query: bool = False,
172    ) -> dict:
173        """Get Activity Zones.
174
175        https://developers.strava.com/docs/reference/#api-Activities-getZonesByActivityId
176        """
177        return self.get_request(
178            route=f"activities/{id}/zones",
179            print_query=print_query,
180            params={},
181            to_json=True,
182        )
183
184    def getLoggedInAthlete(
185        self,
186        print_query: bool = False,
187    ) -> dict:
188        """Get Athlete.
189
190        https://developers.strava.com/docs/reference/#api-Athletes-getLoggedInAthlete
191        """
192        return self.get_request(
193            route="athlete", print_query=print_query, params={}, to_json=True
194        )
195
196    def getLoggedInAthleteZones(
197        self,
198        print_query: bool = False,
199    ) -> dict:
200        """Get Zones.
201
202        https://developers.strava.com/docs/reference/#api-Athletes-getLoggedInAthleteZones
203        """
204        return self.get_request(
205            route="athlete/zones",
206            print_query=print_query,
207            params={},
208            to_json=True,
209        )
210
211    def getStats(
212        self,
213        id: int,
214        print_query: bool = False,
215    ) -> dict:
216        """Get Stats.
217
218        https://developers.strava.com/docs/reference/#api-Athletes-getStats
219        """
220        return self.get_request(
221            route=f"athletes/{id}/stats",
222            print_query=print_query,
223            params={},
224            to_json=True,
225        )
226
227    def getClubActivitiesById(
228        self,
229        id: int,
230        page: int | None = None,
231        per_page: int | None = None,
232        print_query: bool = False,
233    ) -> dict:
234        """List Club Activities.
235
236        https://developers.strava.com/docs/reference/#api-Clubs-getClubActivitiesById
237        """
238        return self.get_request(
239            route=f"clubs/{id}/activities",
240            print_query=print_query,
241            params={
242                "page": page,
243                "per_page": per_page,
244            },
245            to_json=True,
246        )
247
248    def getClubAdminsById(
249        self,
250        id: int,
251        page: int | None = None,
252        per_page: int | None = None,
253        print_query: bool = False,
254    ) -> dict:
255        """List Club Administrators.
256
257        https://developers.strava.com/docs/reference/#api-Clubs-getClubAdminsById
258        """
259        return self.get_request(
260            route=f"clubs/{id}/admins",
261            print_query=print_query,
262            params={
263                "page": page,
264                "per_page": per_page,
265            },
266            to_json=True,
267        )
268
269    def getClubById(
270        self,
271        id: int,
272        print_query: bool = False,
273    ) -> dict:
274        """Get Club.
275
276        https://developers.strava.com/docs/reference/#api-Clubs-getClubById
277        """
278        return self.get_request(
279            route=f"clubs/{id}",
280            print_query=print_query,
281            params={},
282            to_json=True,
283        )
284
285    def getClubMembersById(
286        self,
287        id: int,
288        page: int | None = None,
289        per_page: int | None = None,
290        print_query: bool = False,
291    ) -> dict:
292        """List Club Members.
293
294        https://developers.strava.com/docs/reference/#api-Clubs-getClubMembersById
295        """
296        return self.get_request(
297            route=f"clubs/{id}/members",
298            print_query=print_query,
299            params={
300                "page": page,
301                "per_page": per_page,
302            },
303            to_json=True,
304        )
305
306    def getLoggedInAthleteClubs(
307        self,
308        page: int,
309        per_page: int | None = None,
310        print_query: bool = False,
311    ) -> dict:
312        """List Athlete Clubs.
313
314        https://developers.strava.com/docs/reference/#api-Athletes-getLoggedInAthleteClubs
315        """
316        return self.get_request(
317            route="athlete/clubs",
318            print_query=print_query,
319            params={
320                "page": page,
321                "per_page": per_page,
322            },
323            to_json=True,
324        )
325
326    def getGearById(
327        self,
328        id: str,
329        print_query: bool = False,
330    ) -> dict:
331        """Get Gear.
332
333        https://developers.strava.com/docs/reference/#api-Gears-getGearById
334        """
335        return self.get_request(
336            route=f"gear/{id}", print_query=print_query, params={}, to_json=True
337        )
338
339    def getRouteAsGPX(
340        self,
341        id: int,
342        print_query: bool = False,
343    ) -> requests.Response:
344        """Export Route GPX.
345
346        https://developers.strava.com/docs/reference/#api-Routes-getRouteAsGPX
347        """
348        return self.get_request(
349            route=f"routes/{id}/export_gpx",
350            print_query=print_query,
351            params={},
352            to_json=False,
353        )
354
355    def getRouteAsTCX(
356        self,
357        id: int,
358        print_query: bool = False,
359    ) -> requests.Response:
360        """Export Route TCX.
361
362        https://developers.strava.com/docs/reference/#api-Routes-getRouteAsTCX
363        """
364        return self.get_request(
365            route=f"routes/{id}/export_tcx",
366            print_query=print_query,
367            params={},
368            to_json=False,
369        )
370
371    def getRouteById(
372        self,
373        id: int,
374        print_query: bool = False,
375    ) -> dict:
376        """Get Route.
377
378        https://developers.strava.com/docs/reference/#api-Routes-getRouteById
379        """
380        return self.get_request(
381            route=f"routes/{id}",
382            print_query=print_query,
383            params={},
384            to_json=True,
385        )
386
387    def getRoutesByAthleteId(
388        self,
389        id: int,
390        page: int | None = None,
391        per_page: int | None = None,
392        print_query: bool = False,
393    ) -> dict:
394        """List Athlete Routes.
395
396        https://developers.strava.com/docs/reference/#api-Routes-getRoutesByAthleteId
397        """
398        return self.get_request(
399            route=f"athletes/{id}/routes",
400            print_query=print_query,
401            params={
402                "page": page,
403                "per_page": per_page,
404            },
405            to_json=True,
406        )
407
408    def getEffortsBySegmentId(
409        self,
410        segment_id: int,
411        start_date_local: str | None = None,
412        end_date_local: str | None = None,
413        per_page: int | None = None,
414        print_query: bool = False,
415    ) -> dict:
416        """List Segment Efforts.
417
418        https://developers.strava.com/docs/reference/#api-SegmentEfforts-getEffortsBySegmentId
419        """
420        return self.get_request(
421            route=f"segments/{id}/all_efforts",
422            print_query=print_query,
423            params={
424                "segment_id": segment_id,
425                "start_date_local": start_date_local,
426                "end_date_local": end_date_local,
427                "per_page": per_page,
428            },
429            to_json=True,
430        )
431
432    def getSegmentEffortById(
433        self,
434        id: int,
435        print_query: bool = False,
436    ) -> dict:
437        """Get Segment Effort.
438
439        https://developers.strava.com/docs/reference/#api-SegmentEfforts-getSegmentEffortById
440        """
441        return self.get_request(
442            route=f"segment_efforts/{id}",
443            print_query=print_query,
444            params={},
445            to_json=True,
446        )
447
448    def exploreSegments(
449        self,
450        bounds: str,
451        activity_type: str | None = None,
452        min_cat: int | None = None,
453        max_cat: int | None = None,
454        print_query: bool = False,
455    ) -> dict:
456        """Explore segments.
457
458        https://developers.strava.com/docs/reference/#api-Segments-exploreSegments
459        """
460        return self.get_request(
461            route="segments/explore",
462            print_query=print_query,
463            params={
464                "bounds": bounds,
465                "activity_type": activity_type,
466                "min_cat": min_cat,
467                "max_cat": max_cat,
468            },
469            to_json=True,
470        )
471
472    def getLoggedInAthleteStarredSegments(
473        self,
474        page: int | None = None,
475        per_page: int | None = None,
476        print_query: bool = False,
477    ) -> dict:
478        """List Athlete Starred Segments.
479
480        https://developers.strava.com/docs/reference/#api-Segments-getLoggedInAthleteStarredSegments
481        """
482        return self.get_request(
483            route="segments/starred",
484            print_query=print_query,
485            params={
486                "page": page,
487                "per_page": per_page,
488            },
489            to_json=True,
490        )
491
492    def getRouteStreams(
493        self,
494        id: int,
495        print_query: bool = False,
496    ) -> dict:
497        """Get Route Streams.
498
499        https://developers.strava.com/docs/reference/#api-Streams-getRouteStreams
500        """
501        return self.get_request(
502            route=f"routes/{id}/streams",
503            print_query=print_query,
504            params={},
505            to_json=True,
506        )
507
508    def getSegmentEffortStreams(
509        self,
510        id: int,
511        keys: list[str],
512        key_by_type: bool = False,
513        print_query: bool = False,
514    ) -> dict:
515        """Get Segment Effort Streams.
516
517        https://developers.strava.com/docs/reference/#api-Streams-getSegmentEffortStreams
518        """
519        return self.get_request(
520            route=f"segment_efforts/{id}/streams",
521            print_query=print_query,
522            params={
523                "keys": keys,
524                "key_by_type": key_by_type,
525            },
526            to_json=True,
527        )
528
529    def getSegmentStreams(
530        self,
531        id: int,
532        keys: list[str],
533        key_by_type: bool = False,
534        print_query: bool = False,
535    ) -> dict:
536        """Get Segment Streams.
537
538        https://developers.strava.com/docs/reference/#api-Streams-getSegmentStreams
539        """
540        return self.get_request(
541            route=f"segments/{id}/streams",
542            print_query=print_query,
543            params={
544                "keys": keys,
545                "key_by_type": key_by_type,
546            },
547            to_json=True,
548        )
549
550    def getUploadById(
551        self,
552        uploadId: int,
553        print_query: bool = False,
554    ) -> dict:
555        """Get Upload.
556
557        https://developers.strava.com/docs/reference/#api-Uploads-getUploadById
558        """
559        return self.get_request(
560            route=f"uploads/{id}",
561            print_query=print_query,
562            params={"uploadId": uploadId},
563            to_json=True,
564        )
Connector( client_token_path: str, strava_token_path: str, api_url: str = 'https://www.strava.com/api/v3')
10    def __init__(
11        self,
12        client_token_path: str,
13        strava_token_path: str,
14        api_url: str = """https://www.strava.com/api/v3""",
15    ) -> None:
16        self.api_url = api_url
17        self.authenticator = Authenticator(
18            client_token_path=client_token_path,
19            strava_token_path=strava_token_path,
20        )
api_url
authenticator
access_token: str
22    @property
23    def access_token(self) -> str:
24        """Append the credentials to the request."""
25        self.authenticator.update_token()
26        return str(self.authenticator.strava_tokens["access_token"])

Append the credentials to the request.

def get_request( self, route: str, print_query: bool, params: dict, to_json: bool) -> dict | requests.models.Response:
46    def get_request(
47        self,
48        route: str,
49        print_query: bool,
50        params: dict,
51        to_json: bool,
52    ) -> dict | requests.Response:
53        """GET request against strava's API."""
54        params["access_token"] = self.access_token
55        params_str = "&".join(
56            [f"{k}={v}" for k, v in params.items() if v is not None]
57        )
58        url = f"{self.api_url}/{route}?{params_str}"
59        if print_query:
60            print(url)
61        result = requests.get(url, timeout=self.authenticator._timeout)
62        if to_json:
63            return result.json()
64        else:
65            return result

GET request against strava's API.

def getActivityById( self, id: int, include_all_efforts: bool | None = None, print_query: bool = False) -> dict:
67    def getActivityById(
68        self,
69        id: int,
70        include_all_efforts: bool | None = None,
71        print_query: bool = False,
72    ) -> dict:
73        """Get Activity.
74
75        https://developers.strava.com/docs/reference/#api-Activities-getActivityById
76        """
77        return self.get_request(
78            route=f"activities/{id}",
79            print_query=print_query,
80            params={
81                "include_all_efforts": include_all_efforts,
82            },
83            to_json=True,
84        )
def getCommentsByActivityId( self, id: int, page: int | None = None, per_page: int | None = None, page_size: int | None = None, after_cursor: str | None = None, print_query: bool = False) -> dict:
 86    def getCommentsByActivityId(
 87        self,
 88        id: int,
 89        page: int | None = None,
 90        per_page: int | None = None,
 91        page_size: int | None = None,
 92        after_cursor: str | None = None,
 93        print_query: bool = False,
 94    ) -> dict:
 95        """List Activity Comments .
 96
 97        https://developers.strava.com/docs/reference/#api-Activities-getCommentsByActivityId
 98        """
 99        return self.get_request(
100            route=f"activities/{id}/comments",
101            print_query=print_query,
102            params={
103                "page": page,
104                "per_page": per_page,
105                "page_size": page_size,
106                "after_cursor": after_cursor,
107            },
108            to_json=True,
109        )
def getKudoersByActivityId( self, id: int, page: int | None = None, per_page: int | None = None, print_query: bool = False) -> dict:
111    def getKudoersByActivityId(
112        self,
113        id: int,
114        page: int | None = None,
115        per_page: int | None = None,
116        print_query: bool = False,
117    ) -> dict:
118        """List Activity Kudoers.
119
120        https://developers.strava.com/docs/reference/#api-Activities-getKudoersByActivityId
121        """
122        return self.get_request(
123            route=f"activities/{id}/kudos",
124            print_query=print_query,
125            params={
126                "page": page,
127                "per_page": per_page,
128            },
129            to_json=True,
130        )
def getLapsByActivityId(self, id: int, print_query: bool = False) -> dict:
132    def getLapsByActivityId(
133        self,
134        id: int,
135        print_query: bool = False,
136    ) -> dict:
137        """Get Activity Laps.
138
139        https://developers.strava.com/docs/reference/#api-Activities-getLapsByActivityId
140        """
141        return self.get_request(
142            route=f"activities/{id}/laps",
143            print_query=print_query,
144            params={},
145            to_json=True,
146        )
def getLoggedInAthleteActivities( self, page: int, per_page: int | None = None, print_query: bool = False) -> dict:
148    def getLoggedInAthleteActivities(
149        self,
150        page: int,
151        per_page: int | None = None,
152        print_query: bool = False,
153    ) -> dict:
154        """List Athlete Activities.
155
156        https://developers.strava.com/docs/reference/#api-Activities-getLoggedInAthleteActivities
157        """
158        return self.get_request(
159            route="athlete/activities",
160            print_query=print_query,
161            params={
162                "page": page,
163                "per_page": per_page,
164            },
165            to_json=True,
166        )
def getZonesByActivityId(self, id: int, print_query: bool = False) -> dict:
168    def getZonesByActivityId(
169        self,
170        id: int,
171        print_query: bool = False,
172    ) -> dict:
173        """Get Activity Zones.
174
175        https://developers.strava.com/docs/reference/#api-Activities-getZonesByActivityId
176        """
177        return self.get_request(
178            route=f"activities/{id}/zones",
179            print_query=print_query,
180            params={},
181            to_json=True,
182        )
def getLoggedInAthlete(self, print_query: bool = False) -> dict:
184    def getLoggedInAthlete(
185        self,
186        print_query: bool = False,
187    ) -> dict:
188        """Get Athlete.
189
190        https://developers.strava.com/docs/reference/#api-Athletes-getLoggedInAthlete
191        """
192        return self.get_request(
193            route="athlete", print_query=print_query, params={}, to_json=True
194        )
def getLoggedInAthleteZones(self, print_query: bool = False) -> dict:
196    def getLoggedInAthleteZones(
197        self,
198        print_query: bool = False,
199    ) -> dict:
200        """Get Zones.
201
202        https://developers.strava.com/docs/reference/#api-Athletes-getLoggedInAthleteZones
203        """
204        return self.get_request(
205            route="athlete/zones",
206            print_query=print_query,
207            params={},
208            to_json=True,
209        )
def getStats(self, id: int, print_query: bool = False) -> dict:
211    def getStats(
212        self,
213        id: int,
214        print_query: bool = False,
215    ) -> dict:
216        """Get Stats.
217
218        https://developers.strava.com/docs/reference/#api-Athletes-getStats
219        """
220        return self.get_request(
221            route=f"athletes/{id}/stats",
222            print_query=print_query,
223            params={},
224            to_json=True,
225        )
def getClubActivitiesById( self, id: int, page: int | None = None, per_page: int | None = None, print_query: bool = False) -> dict:
227    def getClubActivitiesById(
228        self,
229        id: int,
230        page: int | None = None,
231        per_page: int | None = None,
232        print_query: bool = False,
233    ) -> dict:
234        """List Club Activities.
235
236        https://developers.strava.com/docs/reference/#api-Clubs-getClubActivitiesById
237        """
238        return self.get_request(
239            route=f"clubs/{id}/activities",
240            print_query=print_query,
241            params={
242                "page": page,
243                "per_page": per_page,
244            },
245            to_json=True,
246        )
def getClubAdminsById( self, id: int, page: int | None = None, per_page: int | None = None, print_query: bool = False) -> dict:
248    def getClubAdminsById(
249        self,
250        id: int,
251        page: int | None = None,
252        per_page: int | None = None,
253        print_query: bool = False,
254    ) -> dict:
255        """List Club Administrators.
256
257        https://developers.strava.com/docs/reference/#api-Clubs-getClubAdminsById
258        """
259        return self.get_request(
260            route=f"clubs/{id}/admins",
261            print_query=print_query,
262            params={
263                "page": page,
264                "per_page": per_page,
265            },
266            to_json=True,
267        )
def getClubById(self, id: int, print_query: bool = False) -> dict:
269    def getClubById(
270        self,
271        id: int,
272        print_query: bool = False,
273    ) -> dict:
274        """Get Club.
275
276        https://developers.strava.com/docs/reference/#api-Clubs-getClubById
277        """
278        return self.get_request(
279            route=f"clubs/{id}",
280            print_query=print_query,
281            params={},
282            to_json=True,
283        )
def getClubMembersById( self, id: int, page: int | None = None, per_page: int | None = None, print_query: bool = False) -> dict:
285    def getClubMembersById(
286        self,
287        id: int,
288        page: int | None = None,
289        per_page: int | None = None,
290        print_query: bool = False,
291    ) -> dict:
292        """List Club Members.
293
294        https://developers.strava.com/docs/reference/#api-Clubs-getClubMembersById
295        """
296        return self.get_request(
297            route=f"clubs/{id}/members",
298            print_query=print_query,
299            params={
300                "page": page,
301                "per_page": per_page,
302            },
303            to_json=True,
304        )
def getLoggedInAthleteClubs( self, page: int, per_page: int | None = None, print_query: bool = False) -> dict:
306    def getLoggedInAthleteClubs(
307        self,
308        page: int,
309        per_page: int | None = None,
310        print_query: bool = False,
311    ) -> dict:
312        """List Athlete Clubs.
313
314        https://developers.strava.com/docs/reference/#api-Athletes-getLoggedInAthleteClubs
315        """
316        return self.get_request(
317            route="athlete/clubs",
318            print_query=print_query,
319            params={
320                "page": page,
321                "per_page": per_page,
322            },
323            to_json=True,
324        )
def getGearById(self, id: str, print_query: bool = False) -> dict:
326    def getGearById(
327        self,
328        id: str,
329        print_query: bool = False,
330    ) -> dict:
331        """Get Gear.
332
333        https://developers.strava.com/docs/reference/#api-Gears-getGearById
334        """
335        return self.get_request(
336            route=f"gear/{id}", print_query=print_query, params={}, to_json=True
337        )
def getRouteAsGPX(self, id: int, print_query: bool = False) -> requests.models.Response:
339    def getRouteAsGPX(
340        self,
341        id: int,
342        print_query: bool = False,
343    ) -> requests.Response:
344        """Export Route GPX.
345
346        https://developers.strava.com/docs/reference/#api-Routes-getRouteAsGPX
347        """
348        return self.get_request(
349            route=f"routes/{id}/export_gpx",
350            print_query=print_query,
351            params={},
352            to_json=False,
353        )
def getRouteAsTCX(self, id: int, print_query: bool = False) -> requests.models.Response:
355    def getRouteAsTCX(
356        self,
357        id: int,
358        print_query: bool = False,
359    ) -> requests.Response:
360        """Export Route TCX.
361
362        https://developers.strava.com/docs/reference/#api-Routes-getRouteAsTCX
363        """
364        return self.get_request(
365            route=f"routes/{id}/export_tcx",
366            print_query=print_query,
367            params={},
368            to_json=False,
369        )
def getRouteById(self, id: int, print_query: bool = False) -> dict:
371    def getRouteById(
372        self,
373        id: int,
374        print_query: bool = False,
375    ) -> dict:
376        """Get Route.
377
378        https://developers.strava.com/docs/reference/#api-Routes-getRouteById
379        """
380        return self.get_request(
381            route=f"routes/{id}",
382            print_query=print_query,
383            params={},
384            to_json=True,
385        )
def getRoutesByAthleteId( self, id: int, page: int | None = None, per_page: int | None = None, print_query: bool = False) -> dict:
387    def getRoutesByAthleteId(
388        self,
389        id: int,
390        page: int | None = None,
391        per_page: int | None = None,
392        print_query: bool = False,
393    ) -> dict:
394        """List Athlete Routes.
395
396        https://developers.strava.com/docs/reference/#api-Routes-getRoutesByAthleteId
397        """
398        return self.get_request(
399            route=f"athletes/{id}/routes",
400            print_query=print_query,
401            params={
402                "page": page,
403                "per_page": per_page,
404            },
405            to_json=True,
406        )
def getEffortsBySegmentId( self, segment_id: int, start_date_local: str | None = None, end_date_local: str | None = None, per_page: int | None = None, print_query: bool = False) -> dict:
408    def getEffortsBySegmentId(
409        self,
410        segment_id: int,
411        start_date_local: str | None = None,
412        end_date_local: str | None = None,
413        per_page: int | None = None,
414        print_query: bool = False,
415    ) -> dict:
416        """List Segment Efforts.
417
418        https://developers.strava.com/docs/reference/#api-SegmentEfforts-getEffortsBySegmentId
419        """
420        return self.get_request(
421            route=f"segments/{id}/all_efforts",
422            print_query=print_query,
423            params={
424                "segment_id": segment_id,
425                "start_date_local": start_date_local,
426                "end_date_local": end_date_local,
427                "per_page": per_page,
428            },
429            to_json=True,
430        )
def getSegmentEffortById(self, id: int, print_query: bool = False) -> dict:
432    def getSegmentEffortById(
433        self,
434        id: int,
435        print_query: bool = False,
436    ) -> dict:
437        """Get Segment Effort.
438
439        https://developers.strava.com/docs/reference/#api-SegmentEfforts-getSegmentEffortById
440        """
441        return self.get_request(
442            route=f"segment_efforts/{id}",
443            print_query=print_query,
444            params={},
445            to_json=True,
446        )
def exploreSegments( self, bounds: str, activity_type: str | None = None, min_cat: int | None = None, max_cat: int | None = None, print_query: bool = False) -> dict:
448    def exploreSegments(
449        self,
450        bounds: str,
451        activity_type: str | None = None,
452        min_cat: int | None = None,
453        max_cat: int | None = None,
454        print_query: bool = False,
455    ) -> dict:
456        """Explore segments.
457
458        https://developers.strava.com/docs/reference/#api-Segments-exploreSegments
459        """
460        return self.get_request(
461            route="segments/explore",
462            print_query=print_query,
463            params={
464                "bounds": bounds,
465                "activity_type": activity_type,
466                "min_cat": min_cat,
467                "max_cat": max_cat,
468            },
469            to_json=True,
470        )
def getLoggedInAthleteStarredSegments( self, page: int | None = None, per_page: int | None = None, print_query: bool = False) -> dict:
472    def getLoggedInAthleteStarredSegments(
473        self,
474        page: int | None = None,
475        per_page: int | None = None,
476        print_query: bool = False,
477    ) -> dict:
478        """List Athlete Starred Segments.
479
480        https://developers.strava.com/docs/reference/#api-Segments-getLoggedInAthleteStarredSegments
481        """
482        return self.get_request(
483            route="segments/starred",
484            print_query=print_query,
485            params={
486                "page": page,
487                "per_page": per_page,
488            },
489            to_json=True,
490        )
def getRouteStreams(self, id: int, print_query: bool = False) -> dict:
492    def getRouteStreams(
493        self,
494        id: int,
495        print_query: bool = False,
496    ) -> dict:
497        """Get Route Streams.
498
499        https://developers.strava.com/docs/reference/#api-Streams-getRouteStreams
500        """
501        return self.get_request(
502            route=f"routes/{id}/streams",
503            print_query=print_query,
504            params={},
505            to_json=True,
506        )
def getSegmentEffortStreams( self, id: int, keys: list[str], key_by_type: bool = False, print_query: bool = False) -> dict:
508    def getSegmentEffortStreams(
509        self,
510        id: int,
511        keys: list[str],
512        key_by_type: bool = False,
513        print_query: bool = False,
514    ) -> dict:
515        """Get Segment Effort Streams.
516
517        https://developers.strava.com/docs/reference/#api-Streams-getSegmentEffortStreams
518        """
519        return self.get_request(
520            route=f"segment_efforts/{id}/streams",
521            print_query=print_query,
522            params={
523                "keys": keys,
524                "key_by_type": key_by_type,
525            },
526            to_json=True,
527        )
def getSegmentStreams( self, id: int, keys: list[str], key_by_type: bool = False, print_query: bool = False) -> dict:
529    def getSegmentStreams(
530        self,
531        id: int,
532        keys: list[str],
533        key_by_type: bool = False,
534        print_query: bool = False,
535    ) -> dict:
536        """Get Segment Streams.
537
538        https://developers.strava.com/docs/reference/#api-Streams-getSegmentStreams
539        """
540        return self.get_request(
541            route=f"segments/{id}/streams",
542            print_query=print_query,
543            params={
544                "keys": keys,
545                "key_by_type": key_by_type,
546            },
547            to_json=True,
548        )
def getUploadById(self, uploadId: int, print_query: bool = False) -> dict:
550    def getUploadById(
551        self,
552        uploadId: int,
553        print_query: bool = False,
554    ) -> dict:
555        """Get Upload.
556
557        https://developers.strava.com/docs/reference/#api-Uploads-getUploadById
558        """
559        return self.get_request(
560            route=f"uploads/{id}",
561            print_query=print_query,
562            params={"uploadId": uploadId},
563            to_json=True,
564        )