Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
*.pyc
.tox
.coverage
withings.conf
withings.egg-info
nokia.conf
nokia.egg-info
27 changes: 12 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,35 +1,32 @@
# Python library for the Withings API
# Python library for the Nokia Health API

[![Build Status](https://travis-ci.org/orcasgit/python-withings.svg?branch=master)](https://travis-ci.org/orcasgit/python-withings) [![Coverage Status](https://coveralls.io/repos/orcasgit/python-withings/badge.png?branch=master)](https://coveralls.io/r/orcasgit/python-withings?branch=master) [![Requirements Status](https://requires.io/github/orcasgit/python-withings/requirements.svg?branch=requires-io-master)](https://requires.io/github/orcasgit/python-withings/requirements/?branch=requires-io-master)
[![Build Status](https://travis-ci.org/orcasgit/python-nokia.svg?branch=master)](https://travis-ci.org/orcasgit/python-nokia) [![Coverage Status](https://coveralls.io/repos/orcasgit/python-nokia/badge.png?branch=master)](https://coveralls.io/r/orcasgit/python-nokia?branch=master) [![Requirements Status](https://requires.io/github/orcasgit/python-nokia/requirements.svg?branch=requires-io-master)](https://requires.io/github/orcasgit/python-nokia/requirements/?branch=requires-io-master)

Withings Body metrics Services API
<http://oauth.withings.com/api/doc>
Nokia Health API
<https://developer.health.nokia.com/api/doc>

Uses Oauth 1.0 to authentify. You need to obtain a consumer key
and consumer secret from Withings by creating an application
here: <https://oauth.withings.com/partner/add>

This is a maintained fork of the `python-withings` library, the origin version
is [here](https://github.com/maximebf/python-withings).
and consumer secret from Nokia by creating an application
here: <https://developer.health.nokia.com/en/partner/add>

Installation:

pip install pywithings
pip install nokia

Usage:

``` python
from withings import WithingsAuth, WithingsApi
from nokia import NokiaAuth, NokiaApi
from settings import CONSUMER_KEY, CONSUMER_SECRET

auth = WithingsAuth(CONSUMER_KEY, CONSUMER_SECRET)
auth = NokiaAuth(CONSUMER_KEY, CONSUMER_SECRET)
authorize_url = auth.get_authorize_url()
print "Go to %s allow the app and copy your oauth_verifier" % authorize_url
print("Go to %s allow the app and copy your oauth_verifier" % authorize_url)

oauth_verifier = raw_input('Please enter your oauth_verifier: ')
creds = auth.get_credentials(oauth_verifier)

client = WithingsApi(creds)
client = NokiaApi(creds)
measures = client.get_measures(limit=1)
print "Your last measured weight: %skg" % measures[0].weight
print("Your last measured weight: %skg" % measures[0].weight)
```
41 changes: 21 additions & 20 deletions bin/withings → bin/nokia
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
#!/usr/bin/env python
from withings import *
from optparse import OptionParser
import sys
import os

import nokia

try:
import configparser
except ImportError: # Python 2.x fallback
Expand All @@ -28,21 +29,21 @@ command = args.pop(0)
if not options.config is None and os.path.exists(options.config):
config = configparser.ConfigParser(vars(options))
config.read(options.config)
options.consumer_key = config.get('withings', 'consumer_key')
options.consumer_secret = config.get('withings', 'consumer_secret')
options.access_token = config.get('withings', 'access_token')
options.access_token_secret = config.get('withings', 'access_token_secret')
options.user_id = config.get('withings', 'user_id')
options.consumer_key = config.get('nokia', 'consumer_key')
options.consumer_secret = config.get('nokia', 'consumer_secret')
options.access_token = config.get('nokia', 'access_token')
options.access_token_secret = config.get('nokia', 'access_token_secret')
options.user_id = config.get('nokia', 'user_id')

if options.consumer_key is None or options.consumer_secret is None:
print("You must provide a consumer key and consumer secret")
print("Create an Oauth application here: https://oauth.withings.com/partner/add")
print("Create an Oauth application here: https://developer.health.nokia.com/en/partner/add")
sys.exit(1)

if options.access_token is None or options.access_token_secret is None or options.user_id is None:
print("Missing authentification information!")
print("Starting authentification process...")
auth = WithingsAuth(options.consumer_key, options.consumer_secret)
auth = nokia.NokiaAuth(options.consumer_key, options.consumer_secret)
authorize_url = auth.get_authorize_url()
print("Go to %s allow the app and copy your oauth_verifier") % authorize_url
oauth_verifier = raw_input('Please enter your oauth_verifier: ')
Expand All @@ -52,23 +53,23 @@ if options.access_token is None or options.access_token_secret is None or option
options.user_id = creds.user_id
print("")
else:
creds = WithingsCredentials(options.access_token, options.access_token_secret,
options.consumer_key, options.consumer_secret,
options.user_id)
creds = nokia.NokiaCredentials(options.access_token, options.access_token_secret,
options.consumer_key, options.consumer_secret,
options.user_id)

client = WithingsApi(creds)
client = nokia.NokiaApi(creds)

if command == 'saveconfig':
if options.config is None:
print("Missing config filename")
sys.exit(1)
config = configparser.ConfigParser()
config.add_section('withings')
config.set('withings', 'consumer_key', options.consumer_key)
config.set('withings', 'consumer_secret', options.consumer_secret)
config.set('withings', 'access_token', options.access_token)
config.set('withings', 'access_token_secret', options.access_token_secret)
config.set('withings', 'user_id', options.user_id)
config.add_section('nokia')
config.set('nokia', 'consumer_key', options.consumer_key)
config.set('nokia', 'consumer_secret', options.consumer_secret)
config.set('nokia', 'access_token', options.access_token)
config.set('nokia', 'access_token_secret', options.access_token_secret)
config.set('nokia', 'user_id', options.user_id)
with open(options.config, 'wb') as f:
config.write(f)
print("Config file saved to %s" % options.config)
Expand All @@ -83,11 +84,11 @@ if command == 'userinfo':
if command == 'last':
m = client.get_measures(limit=1)[0]
if len(args) == 1:
for n, t in WithingsMeasureGroup.MEASURE_TYPES:
for n, t in nokia.NokiaMeasureGroup.MEASURE_TYPES:
if n == args[0]:
print(m.get_measure(t))
else:
for n, t in WithingsMeasureGroup.MEASURE_TYPES:
for n, t in nokia.NokiaMeasureGroup.MEASURE_TYPES:
print("%s: %s" % (n.replace('_', ' ').capitalize(), m.get_measure(t)))
sys.exit(0)

Expand Down
66 changes: 33 additions & 33 deletions withings/__init__.py → nokia/__init__.py
Original file line number Diff line number Diff line change
@@ -1,40 +1,40 @@
# -*- coding: utf-8 -*-
#
"""
Python library for the Withings API
Python library for the Nokia Health API
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Withings Body metrics Services API
<http://www.withings.com/en/api/wbsapiv2>
Nokia Health API
<https://developer.health.nokia.com/api>

Uses Oauth 1.0 to authentify. You need to obtain a consumer key
and consumer secret from Withings by creating an application
here: <https://oauth.withings.com/partner/add>
and consumer secret from Nokia by creating an application
here: <https://developer.health.nokia.com/en/partner/add>

Usage:

auth = WithingsAuth(CONSUMER_KEY, CONSUMER_SECRET)
auth = NokiaAuth(CONSUMER_KEY, CONSUMER_SECRET)
authorize_url = auth.get_authorize_url()
print "Go to %s allow the app and copy your oauth_verifier" % authorize_url
print("Go to %s allow the app and copy your oauth_verifier" % authorize_url)
oauth_verifier = raw_input('Please enter your oauth_verifier: ')
creds = auth.get_credentials(oauth_verifier)

client = WithingsApi(creds)
client = NokiaApi(creds)
measures = client.get_measures(limit=1)
print "Your last measured weight: %skg" % measures[0].weight
print("Your last measured weight: %skg" % measures[0].weight)

"""

from __future__ import unicode_literals

__title__ = 'pywithings'
__title__ = 'nokia'
__version__ = '0.4.0'
__author__ = 'Maxime Bouroumeau-Fuseau, and ORCAS'
__license__ = 'MIT'
__copyright__ = 'Copyright 2012-2017 Maxime Bouroumeau-Fuseau, and ORCAS'

__all__ = [str('WithingsCredentials'), str('WithingsAuth'), str('WithingsApi'),
str('WithingsMeasures'), str('WithingsMeasureGroup')]
__all__ = [str('NokiaCredentials'), str('NokiaAuth'), str('NokiaApi'),
str('NokiaMeasures'), str('NokiaMeasureGroup')]

import arrow
import datetime
Expand All @@ -45,7 +45,7 @@
from requests_oauthlib import OAuth1, OAuth1Session


class WithingsCredentials(object):
class NokiaCredentials(object):
def __init__(self, access_token=None, access_token_secret=None,
consumer_key=None, consumer_secret=None, user_id=None):
self.access_token = access_token
Expand All @@ -55,8 +55,8 @@ def __init__(self, access_token=None, access_token_secret=None,
self.user_id = user_id


class WithingsAuth(object):
URL = 'https://oauth.withings.com/account'
class NokiaAuth(object):
URL = 'https://developer.health.nokia.com/account'

def __init__(self, consumer_key, consumer_secret):
self.consumer_key = consumer_key
Expand All @@ -82,7 +82,7 @@ def get_credentials(self, oauth_verifier):
resource_owner_secret=self.oauth_secret,
verifier=oauth_verifier)
tokens = oauth.fetch_access_token('%s/access_token' % self.URL)
return WithingsCredentials(
return NokiaCredentials(
access_token=tokens['oauth_token'],
access_token_secret=tokens['oauth_token_secret'],
consumer_key=self.consumer_key,
Expand All @@ -99,8 +99,8 @@ def is_date_class(val):
return isinstance(val, (datetime.date, datetime.datetime, arrow.Arrow, ))


class WithingsApi(object):
URL = 'http://wbsapi.withings.net'
class NokiaApi(object):
URL = 'https://api.health.nokia.com'

def __init__(self, credentials):
self.credentials = credentials
Expand Down Expand Up @@ -133,15 +133,15 @@ def get_user(self):
def get_activities(self, **kwargs):
r = self.request('measure', 'getactivity', params=kwargs, version='v2')
activities = r['activities'] if 'activities' in r else [r]
return [WithingsActivity(act) for act in activities]
return [NokiaActivity(act) for act in activities]

def get_measures(self, **kwargs):
r = self.request('measure', 'getmeas', kwargs)
return WithingsMeasures(r)
return NokiaMeasures(r)

def get_sleep(self, **kwargs):
r = self.request('sleep', 'get', params=kwargs, version='v2')
return WithingsSleep(r)
return NokiaSleep(r)

def subscribe(self, callback_url, comment, **kwargs):
params = {'callbackurl': callback_url, 'comment': comment}
Expand All @@ -166,7 +166,7 @@ def list_subscriptions(self, appli=1):
return r['profiles']


class WithingsObject(object):
class NokiaObject(object):
def __init__(self, data):
self.set_attributes(data)

Expand All @@ -179,18 +179,18 @@ def set_attributes(self, data):
setattr(self, key, val)


class WithingsActivity(WithingsObject):
class NokiaActivity(NokiaObject):
pass


class WithingsMeasures(list, WithingsObject):
class NokiaMeasures(list, NokiaObject):
def __init__(self, data):
super(WithingsMeasures, self).__init__(
[WithingsMeasureGroup(g) for g in data['measuregrps']])
super(NokiaMeasures, self).__init__(
[NokiaMeasureGroup(g) for g in data['measuregrps']])
self.set_attributes(data)


class WithingsMeasureGroup(WithingsObject):
class NokiaMeasureGroup(NokiaObject):
MEASURE_TYPES = (
('weight', 1),
('height', 4),
Expand All @@ -203,7 +203,7 @@ class WithingsMeasureGroup(WithingsObject):
)

def __init__(self, data):
super(WithingsMeasureGroup, self).__init__(data)
super(NokiaMeasureGroup, self).__init__(data)
for n, t in self.MEASURE_TYPES:
self.__setattr__(n, self.get_measure(t))

Expand All @@ -223,13 +223,13 @@ def get_measure(self, measure_type):
return None


class WithingsSleepSeries(WithingsObject):
class NokiaSleepSeries(NokiaObject):
def __init__(self, data):
super(WithingsSleepSeries, self).__init__(data)
super(NokiaSleepSeries, self).__init__(data)
self.timedelta = self.enddate - self.startdate


class WithingsSleep(WithingsObject):
class NokiaSleep(NokiaObject):
def __init__(self, data):
super(WithingsSleep, self).__init__(data)
self.series = [WithingsSleepSeries(series) for series in self.series]
super(NokiaSleep, self).__init__(data)
self.series = [NokiaSleepSeries(series) for series in self.series]
12 changes: 6 additions & 6 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,18 @@
required = [line for line in open('requirements/base.txt').read().split("\n")]

setup(
name='pywithings',
name='nokia',
version='0.4.0',
description="Library for the Withings API",
description="Library for the Nokia Health API",
author='ORCAS',
author_email='developer@orcasinc.com',
url="https://github.com/orcasgit/python-withings",
url="https://github.com/orcasgit/python-nokia",
license = "MIT License",
packages = ['withings'],
packages = ['nokia'],
install_requires = required,
test_suite='tests.all_tests',
scripts=['bin/withings'],
keywords="withings",
scripts=['bin/nokia'],
keywords="withings nokia",
zip_safe = True,
classifiers=[
"Development Status :: 3 - Alpha",
Expand Down
36 changes: 18 additions & 18 deletions tests/__init__.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
import unittest

from .test_withings_activity import TestWithingsActivity
from .test_withings_api import TestWithingsApi
from .test_withings_auth import TestWithingsAuth
from .test_withings_credentials import TestWithingsCredentials
from .test_withings_measure_group import TestWithingsMeasureGroup
from .test_withings_measures import TestWithingsMeasures
from .test_withings_object import TestWithingsObject
from .test_withings_sleep import TestWithingsSleep
from .test_withings_sleep_series import TestWithingsSleepSeries
from .test_nokia_activity import TestNokiaActivity
from .test_nokia_api import TestNokiaApi
from .test_nokia_auth import TestNokiaAuth
from .test_nokia_credentials import TestNokiaCredentials
from .test_nokia_measure_group import TestNokiaMeasureGroup
from .test_nokia_measures import TestNokiaMeasures
from .test_nokia_object import TestNokiaObject
from .test_nokia_sleep import TestNokiaSleep
from .test_nokia_sleep_series import TestNokiaSleepSeries


def all_tests():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestWithingsActivity))
suite.addTest(unittest.makeSuite(TestWithingsApi))
suite.addTest(unittest.makeSuite(TestWithingsAuth))
suite.addTest(unittest.makeSuite(TestWithingsCredentials))
suite.addTest(unittest.makeSuite(TestWithingsMeasureGroup))
suite.addTest(unittest.makeSuite(TestWithingsMeasures))
suite.addTest(unittest.makeSuite(TestWithingsObject))
suite.addTest(unittest.makeSuite(TestWithingsSleep))
suite.addTest(unittest.makeSuite(TestWithingsSleepSeries))
suite.addTest(unittest.makeSuite(TestNokiaActivity))
suite.addTest(unittest.makeSuite(TestNokiaApi))
suite.addTest(unittest.makeSuite(TestNokiaAuth))
suite.addTest(unittest.makeSuite(TestNokiaCredentials))
suite.addTest(unittest.makeSuite(TestNokiaMeasureGroup))
suite.addTest(unittest.makeSuite(TestNokiaMeasures))
suite.addTest(unittest.makeSuite(TestNokiaObject))
suite.addTest(unittest.makeSuite(TestNokiaSleep))
suite.addTest(unittest.makeSuite(TestNokiaSleepSeries))
return suite
Loading