Stravalib

Rédigé par Paulo Aucun commentaire
Classé dans : Python, Divers Mots clés : strava

Just For Me : mention athlete dans une réponse (sur PC)
- le @Paulo... ne fonctionne que sur l'appli Android et iPhone( pwerk...)
- solution :  [strava://athletes/2653185] avec le numéro de l'athlete 
Pour ma pomme, ça donne ça 
 [strava://athletes/6852658]
source : https://support.strava.com/hc/en-us/community/posts/212717028--Mentions-on-Strava-send-us-your-feedback

 

Utilisation de l'api strava :
 

Creation obligatoire d'une application Strava
necessaire pour obtenir CLIENT_ID, CLIENT_SECRET, TOKEN_ACCESS et CODE

Remplir (genre ci-dessous) les champs demandés afin de creer l'appli : http://www.strava.com/settings/api

Une fois rempli/validé on obtient un CLIENT_ID, CLIENT_SECRET ansi qu'un ACCES_TOKEN (pour accés en lecture seulement)
 

 

Obtention de ''access_token" avec accés en ecriture sur compte Strava
  • génération du code (avec accés write afin de poster des sorties sur strava)
    https://www.strava.com/oauth/authorize?client_id=XXXXX      \ #obtenu ci-dessus
               &response_type=code                              \
               &redirect_uri=http://cornilyon.fr/token_exchange \
               &scope=write \ #on demande un accés en écriture
               &approval_prompt=force #force la gen d'un nouvel accés

    Ps : client_id obtenu lors de la création de l'appli sur Strava

  • le navigateur retourne une 404 mais on trouve le code dans la barre d'adresse.
    token_exchange?state=&code=ef....................................548
    Ps : Strava peut demander une confirmation au niveau de l'application
  • utilisation de curl pour poster le code obtenu :
    curl -X POST https://www.strava.com/oauth/token                                        \
            -F client_id=XXXXX                                                             \
            -F client_secret=e54895..............................f808                      \  
            -F code=ef.........................192

     

  • normalement, on récupère un beau morceau de json avec entre autre 'l'access_token'  (son précieux....à conserver)
    {"access_token":"2b..........................................eb",
       "token_type":"Bearer",
       "athlete":{"id":XXXXXXX,"username":"pcornillon","resource_state":3,"fir........}
    
    


 

En environnement virtuel
  • creation de l'environnement (voir article precedent)
    #creation
    python3 -m venv /tmp/strava/
    
    #activation
    source /tmp/strava/bin/activate
    
    #installation de stravalib (ne pas oublier les export de proxy si necessaire)
    pip install stravalib
    
    # testage
    python
    from stravalib.client import Client
    client = Client()
    client.access_token = '3x...........................f'
    athlete = client.get_athlete()
    print(athlete.weight)
    for activity in client.get_activities(): print(activity.name)
    
    # a la fin sortir de l'env
    deactivate
    



 

Installation sans environnement virtuel
  • utilisation de 'pip' en python2 (pas trouvé de rpm)
    #installation de pip si necesaire
    sudo dnf install python-pip
    #maj de pip
    pip install --upgrade pip
    #si proxy (ex:192.168.1.254)
    pip --proxy=192.168.1.254:8080 install --upgrade pip
    pip install stravalib
    #si proxy
    pip --proxy=192.168.1.254:8080 install stravalib
  • pareil en python3
    #installation de pip si necesaire
    sudo dnf install python3-pip
    #maj de pip
    pip3 install --upgrade pip
    #si proxy (ex:192.168.1.254)
    pip3 --proxy=192.168.1.254:8080 install --upgrade pip
    #installation de stravalib
    pip install stravalib
    #si proxy
    pip --proxy=192.168.1.254:8080 install stravalib


 

Ex d'utilisation pythonesque
#import de la lib
from stravalib import Client

#instanciation d'un Client avec le jeton obtenu ci-dessus)
client = Client(access_token='58...........................eb')

#l'objet Client dispose d'un bon paquet de méthode
client.get_athlete()
client.get_athlete()
for f in client.get_athlete_followers(): print(f)

#c'est tout  :-)

 

Ou alors...(largement à modifier !)
#!/usr/bin/python3
# -*- coding: utf8
#
#####################################################
#
import os
import socket
from datetime import datetime, timedelta
from stravalib import Client
from stravalib import model, exc, attributes, unithelper as uh
# from urllib2 import urlopen
# voir requests qui a l'air plus performant
# http://fr.python-requests.org/en/latest/
#import requests
#from urllib.request import urlopen, ProxyHandler
#
#####################################################
# globales
# import pdb; pdb.set_trace()
BOLD = "\033[1m"
RESET = "\033[0;0m"
CLIENT_TOKEN='xxxxcx785245b289xxxxxx'
#
#####################################################
# classes
#
# fonctions
#
#####################################################
#

def new_run1(client):
    #creation d'un run avec elapsed_time
    now = datetime.now().replace(microsecond=0)
    a = client.create_activity("[fake] test_api_strava from canapé",
        activity_type=model.Activity.RUN,
        start_date_local=now,
        elapsed_time=str(timedelta(hours=1, minutes=4, seconds=5).total_seconds()).replace('.0', ''),
        description = 'creve = pas courir = testage api strava en mode pythonesque',
        distance=uh.kilometers(15.2))
        #distance=uh.miles(15.2))
    return a.id

def new_run2(client):
    #creation d'un run 
    now = datetime.now().replace(microsecond=0)
    a = client.create_activity("A_Virer",
        activity_type=model.Activity.RUN,
        start_date_local=now,
        elapsed_time=3600,
        description = 'strava lib',
        distance=uh.kilometers(1.2))
        #distance=uh.miles(15.2))
    return a.id

def new_run1_gpx(client):
    #le fchier gpx doit être au bon format...faudra ptet le bricoler un peu...
    now = datetime.now().replace(microsecond=0)
    with open('stl.gpx') as fp:
        uploader = client.upload_activity(fp, data_type = 'gpx',
            name = 'fake_stl_from_canapé',
            description = 'création activité avec gps façon python, ça va envoyer du segment..., tout ça dans un fauteuil ;-)',
            activity_type=model.Activity.RUN)
        #a = uploader.wait()
    return uploader


def main():
    #au taf, je dois passer par un proxy (mon ip = xxx.227.xxx.xxx
    ip = socket.gethostbyname(socket.getfqdn())
    if '227' in ip:
        if not 'proxy' in os.environ.keys():
            os.environ['http_proxy']  = '192.168.1.254:8080'
            os.environ['https_proxy'] = '192.168.1.254:8080'
    client= Client(access_token=CLIENT_TOKEN)
    moi=client.get_athlete()
    # print(moi.id)
    # print(moi.shoes)
    # print(moi.email)
    # for f in client.get_athlete_followers(): print(f.lastname, f.firstname, f.city, f.sex)
    a = new_run1_gpx(client)
    print(a)
#
#####################################################
#
if __name__ == '__main__':
    main()
#
#####################################################


 

En vrac :
  • recuperer un gpx (a priori on ne récupère que les gpx de ses sorties....)
    #http://www.strava.com/activities/:id/export_gpx en remplaçant :id par le numero de l'activité
    https://www.strava.com/activities/:793113726/export_gpx

     

Source :

- http://pythonhosted.org/stravalib/api.html
- https://strava.github.io/api/
- https://developers.strava.com/docs/

 

Les commentaires sont fermés.