strava-api-handler
Version:
Unofficial handler for Strava API
76 lines (62 loc) • 1.87 kB
JavaScript
import CookieApi from 'cookie-api-handler';
import { DefaultResponseProcessor, DefaultApiException } from 'rest-api-handler';
import StravaException from './StravaException.js';
class WebApi extends CookieApi {
constructor(session) {
super('https://www.strava.com', [new DefaultResponseProcessor(DefaultApiException)], {
'Content-Type': 'application/x-www-form-urlencoded'
});
if (session) {
this.addCookies({
_strava4_session: session
});
}
}
setSession(session) {
this.session = session;
}
getSession() {
return this.session;
}
async getCsfrToken(path) {
const {
data
} = await this.get(path);
const token = /csrf-token" content="(([A-Za-z]|\+|\d|=|\/)*)/g.exec(data);
if (!token) {
throw new StravaException('CSFR token was not found');
}
return token[1];
}
async login(email, password) {
const token = await this.getCsfrToken('login');
try {
await this.request('session', 'POST', {
body: CookieApi.convertData({
utf8: '✓',
authenticity_token: token,
plan: '',
email,
password
}, CookieApi.FORMATS.URL_ENCODED),
redirect: 'manual'
}); // eslint-disable-next-line no-empty
} catch {}
const cookies = this.getCookies();
this.setSession(cookies ? cookies._strava4_session : undefined);
}
async setPrivacy(id, privacy) {
const token = await this.getCsfrToken(`activities/${id}/edit`);
await this.request(`activities/${id}`, 'POST', {
body: CookieApi.convertData({
'utf8': '✓',
'_method': 'patch',
'authenticity_token': token,
'activity[visibility]': privacy,
'commit': 'Save'
}, CookieApi.FORMATS.URL_ENCODED),
redirect: 'manual'
});
}
}
export { WebApi as default };