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 )
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 )
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.
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.
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 )
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 )
List Activity Comments .
https://developers.strava.com/docs/reference/#api-Activities-getCommentsByActivityId
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 )
List Activity Kudoers.
https://developers.strava.com/docs/reference/#api-Activities-getKudoersByActivityId
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 )
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 )
List Athlete Activities.
https://developers.strava.com/docs/reference/#api-Activities-getLoggedInAthleteActivities
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 )
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 )
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 )
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 )
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 )
List Club Activities.
https://developers.strava.com/docs/reference/#api-Clubs-getClubActivitiesById
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 )
List Club Administrators.
https://developers.strava.com/docs/reference/#api-Clubs-getClubAdminsById
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 )
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 )
List Club Members.
https://developers.strava.com/docs/reference/#api-Clubs-getClubMembersById
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 )
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 )
Export Route GPX.
https://developers.strava.com/docs/reference/#api-Routes-getRouteAsGPX
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 )
Export Route TCX.
https://developers.strava.com/docs/reference/#api-Routes-getRouteAsTCX
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 )
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 )
List Athlete Routes.
https://developers.strava.com/docs/reference/#api-Routes-getRoutesByAthleteId
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 )
List Segment Efforts.
https://developers.strava.com/docs/reference/#api-SegmentEfforts-getEffortsBySegmentId
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 )
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 )
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 )
List Athlete Starred Segments.
https://developers.strava.com/docs/reference/#api-Segments-getLoggedInAthleteStarredSegments
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 )
Get Route Streams.
https://developers.strava.com/docs/reference/#api-Streams-getRouteStreams
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 )
Get Segment Effort Streams.
https://developers.strava.com/docs/reference/#api-Streams-getSegmentEffortStreams
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 )
Get Segment Streams.
https://developers.strava.com/docs/reference/#api-Streams-getSegmentStreams
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 )