Nike+ Exporter 1.43 / 1.44

I have posted a minor update to the plugin which incorporates the most popular feature request, to have the list sorted in reverse order (i.e. most run first).

Also, I have added what might be a fix to the timezone issue. If the error occurs again, please email me your debug logging so I can diagnose further.

Update 24/01/2013: More bugs fixed with the timezone issue. Hopefully fixed now. Please try v1.44.

Please download the latest version by clicking the “Download” menu option above.

Advertisements

82 thoughts on “Nike+ Exporter 1.43 / 1.44

  1. Thanks so much for your work, i use your app a lot since i bought my Sportwatch (last week). I however have a bug since today.
    I run version 1.43 and when i try to download my last training (i just ran 20 minutes ago) in both formats, i’ve got the following error :
    “Error!
    An error occurred while creating TCX file. Details: [TypeError: Cannot call method ‘indexOf’ of undefined]”
    I would be glad to help further so don’t hesitate to use my email !
    Nicolas

  2. Thank you very much for this useful plugin.

    I would like to ask you to clarify some issues in the generated GPX file.
    I have found out that time interval between two trkpt might be 2 sec, 8 sec, 18 sec or 20 sec.
    Is it how Nike+ tracked them? Or is it calculated by your algorithm?

    Also sometimes several consecutive trkpt have the same coordinates as if I stood at the same place without moving while I definetely ran without stops.

    Could you please explain why this happens?

    • The exported file will give the exact GPS coordinates that Nike+ recorded however Nike+ does not supply the time at each GPS coordinate, so the plugin uses the split information to estimate the time at most points, however the start, splits (every km/mile), and end will be the real times. Hence how you are observing a regular time interval at each GPS coordinate between the splits. If you need better resolution than at the splits, then this plugin is not for you (bug Nike+ to provide a proper export option!).

      Also, the best way to see the real data that Nike+ has is to right-click the plugin window, choose “Inspect Element”, and look in the Console for the response from Nike+ after you export a run.

      I find the method this plugin uses works well enough for my needs (i.e. I only care about pace over each km, the start, duration, end, path, etc). Most stats after I import into Sports Tracker or Strava are very close to the figures given in Nike+, and given that all services employ different GPS smoothing routines anyway, this is adequate for me.

      Cheers.

  3. Hi, let me first congratulate you on your effort, thanks. I tried to use your exporter with no luck. I get all runs (either tcx or gpx) exported that is not the issue, but once I try to import them into runmeter, they all get today’s date and similar milleage 0.79 and 10min12. do you have any idea why this is? I used your last version 1.44
    Thanks for your help

  4. Any help would be appreciated*** An error occurred while loading activities. Details: [EvalError: Refused to evaluate a string as JavaScript because ‘unsafe-eval’ is not an allowed source of script in the following Content Security Policy directive: “script-src ‘self’ chrome-extension-resource:”. ].

  5. Hi jkili,

    Thanks a lot for your tool, it’s just awesome.
    Just one thing. I am trying to export a number of ski trips to GPX files. For the shorter trips (~25km) it’s working fine, but the longer ones (~65km) make the Exporter crash. Is there a timeout or something that I can increase in your script?

    Kind regards,
    Jeroen

      • I think you will like this one. Nike is returning an html error page which you try to parse, hence the ‘<' token. The meat of the error page is this error:

        PreparedStatementCallback; bad SQL grammar [SELECT SA.NIKE_PLUS_USER_ID, ADS.SPORT_ACTIVITY_ID, ADS.START_TIME_LOCAL, ADS.INTERVAL_SEQ_ID, ADS.TIMEZONE_NAME, MT1.NAME AS METRIC_TYPE, ADS.INTERVAL_VALUE, MT2.NAME AS INTERVAL_UNIT, ADS.TZ_OFFSET, ADS.DST_OFFSET, ADS.ACTIVITY_INTERVAL_DATA FROM ACTIVITY_DATA_STREAM ADS INNER JOIN SPORT_ACTIVITY SA ON ADS.SPORT_ACTIVITY_ID = SA.SPORT_ACTIVITY_ID INNER JOIN METRIC_TYPE MT1 ON ADS.METRIC_TYPE_ID = MT1.METRIC_TYPE_ID INNER JOIN METRIC_TYPE MT2 ON ADS.INTERVAL_METRIC_ID = MT2.METRIC_TYPE_ID WHERE SA.DELETE_IND = 0 AND ADS.SPORT_ACTIVITY_ID IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) order by sport_activity_id, ads.metric_type_id, ads.interval_seq_id asc]; nested exception is java.sql.SQLSyntaxErrorException: ORA-01795: maximum number of expressions in a list is 1000

      • Please. could you help me too with the issue :

        An error occurred while loading activities. Details: [EvalError: Refused to evaluate a string as JavaScript because ‘unsafe-eval’ is not an allowed source of script in the following Content Security Policy directive: “script-src ‘self’ chrome-extension-resource:”. ].

        Regards hubi

  6. When I try to upload my .gpx archive to RUNTASTIC it gives “error” all the time, but not with the .tcx. Where is the problem? It gives some options
    -Your file is missing location or time data and no sport activity can be generated from it.
    -The data of your file is malformed and does not match the specification for the filetype.
    -The uploaded file is not a valid TCX or GPX file.

    Sorry for my english ;P

      • Hi Miki,

        I have looked into this problem and found that it occurs when the code goes to open the “Save As” dialog box. The GPX or TCX file is actually available on the console before this, and you can set a breakpoint on the “saveAs” function and cut/paste the contents into a new file to do it manually until I find a fix.

        I will keep you posted.

        Update 19.03 – Bug raised in third party lib (FileSaver.js).

  7. Hello Justin,

    awesome work so far. Have been using your extension for a while now and i can say its epic!

    The only thing i miss is to the able to export workouts which are based on heart rate only.
    These are the workouts i recorded with the nike GPS watch + heart rate belt sensor only.
    At nike’s site they show like this: https://dl.dropbox.com/u/7819158/screenshots/heartrate.png

    Would that be possible?

    If you need any data to work with let me know =)

    Greetings!
    Harry

  8. Hey, this tool looks really useful. Unfortunately it’s not yet working for me – I get the following message from the extension:
    Error!
    An error occurred while loading activities. Details: [EvalError: Refused to evaluate a string as JavaScript because ‘unsafe-eval’ is not an allowed source of script in the following Content Security Policy directive: “script-src ‘self’ chrome-extension-resource:”. ].

    Any ideas why this is happening? I have developer mode enabled and had to install manually. I’ve had a look at the security settings to see if anything can be changed – nothing obvious. I’m using Chrome v 26.0.1410.64 (latest one).

  9. Hello,

    I have exactly the same issue as Mike:
    Error!
    An error occurred while loading activities. Details: [EvalError: Refused to evaluate a string as JavaScript because ‘unsafe-eval’ is not an allowed source of script in the following Content Security Policy directive: “script-src ‘self’ chrome-extension-resource:”. ].
    Thanks for your help

    • Looks like a few people are having trouble. Can someone please check the error is still ocurring, and then send me the debug log to my email address?

      • Hi jkili,
        I have just sent you the debug log and a screenshot.
        Thanks!

  10. I have still the same Error,

    An error occurred while loading activities. Details: [EvalError: Refused to evaluate a string as JavaScript because ‘unsafe-eval’ is not an allowed source of script in the following Content Security Policy directive: “script-src ‘self’ chrome-extension-resource:”. ].

    How to make a debugg ?

      • Is this ok so :

        Initialised nikeplus.js:33 Logging In… nikeplus.js:33

        1. Refused to set unsafe header “Content-length” nikeplus.js:48

        1. Refused to set unsafe header “Connection” nikeplus.js:49

        Req sent. Waiting… nikeplus.js:33 Response: {“serviceResponse”: { “header”: { “success”: “true”, “dateTime”: “2013-05-03 06:18:14.301 UTC”, “errorCodes”: [] }, “body”: { “@class”: “list”, “User”: { “id”: “7183613726”, “profileId”: “5f4d4566-b70c-44ef-bfd7-d85029509fb1”, “status”: “<a href=\"http://my.nike.com/ap-flow\ “>ap-flow just joined Nike!”, “screenName”: “ap-flow”, “firstName”: “Florian”, “lastName”: “Keller”, “isOwner”: “true”, “isViewer”: “true”, “profileUrl”: “http://my.nike.com//ap-flow”, “thumbnailUrl”: “http://www.nike.com/nsl/services/thumbnails/person/7183613726”, “visibility”: “SOCIAL”, “categories”: [], “locale”: “de_DE”, “height”: “0”, “weight”: “0”, “email”: “flo268@web.de”, “userType”: “defaultUser”, “dobMonth”: “8”, “dobDay”: “26”, “dobYear”: “1984”, “login”: “flo268@web.de”, “receiveEmail”: “true”, “gender”: “male”, “registrationSiteId”: “1300”, “homeAddress”: { “postalCode”: “65817”, “country”: “DE” }, “imageUrl”: “”, “userEmailSettings”: { “notifyRelationshipRequest”: true, “notifyNewFriendshipRequest”: true }, “sitePreferences”: { “dateFormat”: “m”, “distanceUnit”: “m”, “weightUnit”: “l”, “dayOfWeek”: “s” }, “broadcastProperties”: [], “autoFriend”: “false”, “displayName”: “ap-flow” } } }} nikeplus.js:33 Activities URL: http://nikeplus.nike.com/plus/activity/running/ap-flow/lifetime/activities?indexStart=0&indexEnd=1000 nikeplus.js:33 Getting activities… nikeplus.js:33 Error Occurred:EvalError: Refused to evaluate a string as JavaScript because ‘unsafe-eval’ is not an allowed source of script in the following Content Security Policy directive: “script-src ‘self’ chrome-extension-resource:”. nikeplus.js:33 EvalError: Refused to evaluate a string as JavaScript because ‘unsafe-eval’ is not an allowed source of script in the following Content Security Policy directive: “script-src ‘self’ chrome-extension-resource:”. at eval (native) at chrome-extension://ohofeplikoonfdoilfedbfmmahbccmmo/js/jquery-1.7.2.js:614:22 at Function.jQuery.extend.globalEval (chrome-extension://ohofeplikoonfdoilfedbfmmahbccmmo/js/jquery-1.7.2.js:615:7 ) at HTMLScriptElement. (chrome-extension://ohofeplikoonfdoilfedbfmmahbccmmo/js/jquery-1.7.2.js:6078:14 ) at Function.jQuery.extend.each (chrome-extension://ohofeplikoonfdoilfedbfmmahbccmmo/js/jquery-1.7.2.js:660:20 ) at jQuery.fn.extend.domManip (chrome-extension://ohofeplikoonfdoilfedbfmmahbccmmo/js/jquery-1.7.2.js:6068:12 ) at jQuery.fn.extend.append (chrome-extension://ohofeplikoonfdoilfedbfmmahbccmmo/js/jquery-1.7.2.js:5845:15 ) at null. (chrome-extension://ohofeplikoonfdoilfedbfmmahbccmmo/js/jquery-1.7.2.js:5963:18 ) at Function.jQuery.extend.access (chrome-extension://ohofeplikoonfdoilfedbfmmahbccmmo/js/jquery-1.7.2.js:855:9 ) at jQuery.fn.extend.html (chrome-extension://ohofeplikoonfdoilfedbfmmahbccmmo/js/jquery-1.7.2.js:5928:17 ) nikeplus.js:33

        1. GET chrome-extension://ohofeplikoonfdoilfedbfmmahbccmmo/plus/web/images/navigation_v2/no_avatar.png jquery-1.7.2.js:6411

        1. GET chrome-extension://ohofeplikoonfdoilfedbfmmahbccmmo/plus/web/images/footer/shop-footer.png jquery-1.7.2.js:6411

        1. GET chrome-extension://ohofeplikoonfdoilfedbfmmahbccmmo/plus/web/images/daily_goal/close_button.png jquery-1.7.2.js:6411

        1. GET chrome-extension://ohofeplikoonfdoilfedbfmmahbccmmo/plus/static/css/core/ jquery-1.7.2.js:5847

        1. GET chrome-extension://ohofeplikoonfdoilfedbfmmahbccmmo/plus/static/css/error_shareError/ jquery-1.7.2.js:5847

      • The debug log isn’t showing enough info. Talking to a few people trying to get more debug info. Standby…

  11. Just a quick update to say that it works for me now thanks to the jkill’s help.
    My issue (“[EvalError: Refused to evaluate a string as JavaScript because ‘unsafe-eval’ …”) was due to a different screen name between the nike+ website and nike+exporter. Indeed I had changed my screen name one year ago.
    So you just have to change your screen name in the nike+ website with the previous value (you can get it when you log with nike+exporter, the name in parenthesis at the right of your name). After this change, when you will log in again with nike+exporter it will work.
    Sorry for my terrible english, I hope that will help! 🙂

    • Can everyone else who has had this error to check they don’t have two different screen names (from Nike+ and maybe the actual Nike web site)? That was causing Anthony’s problem and I imagine others as well. There is no easy way to fix in code so changing your screen name to match is the easiest way.

  12. Another problem
    “Error!
    An error occurred while creating GPX file. Details: [SyntaxError: Unexpected token <]"

    is java needed?

    • No, that normally means some other error occurred (that an Error HTML screen was returned instead of JSON data). Can you try again (there is a known bug that means you might have to wait 2 hours before the run will download properly) and if the error still occurs, then can you email me the debug log (see instructions on the blog).

  13. Hello,
    This extension would be very helpful to me however I am unable to install. Is there another way to download this extension? I receive an error “Apps, extensions, and user scripts cannot be added from this website” via Chrome when I click download. Please advise.

    • You need to turn on Developer mode in order to install scripts which are not part of the chrome store. Instructions are on the blog, or google for more info.

  14. First of all, THANKS for your great work. Anyway, I have installed the plugin but when I enter my username and password it remains with the icon “thinking” like it was logging in, for ages.

    Don’t know what could be happening, but the fact is that it never stops logging in.

    • I have checked and everything seems to be working for me. You can try and send me the debug log information – see full instructions elsewhere on the blog, but here is the quick way – open the login screen, right click, choose Inspector, then click the audit/log tab. Login and copy everything in the log console out into an email for me at justink08@hotmail.com

  15. Pingback: Comment recuperer vos données Nike+ Running ? | FrenchFuel

  16. Hi, this is a great little extension, is there any chance of being able to export sessions which only have heart rate data and no gps or foot pod data? At present they don’t show up in the export list at all so I can’t use them/analyse them which is a shame.
    Thanks!

  17. Hi, very appreciate for your great work. I can import the GPX file into RunKeeper without any problem. All my GPS and heart rate is still there. I’m so exciting. I’m exporting my Nike+ data now ^^. Thank you very much !!

  18. Hello ,

    there is the possibility to export all my workouts togheter in one step ? I would like to move to Runtastic and I’ve more than 700 workouts in my Nike+….please helpme

    • It is hard to make it work since this is just a browser plugin without a server component. Basically I cannot manage memory well enough for the plugin to handle that much data without crashing. However, I will take another look at it when I get a chance.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s