fixing ankiweb

This commit is contained in:
Alex Yatskov 2017-01-10 21:11:38 -08:00
parent 20c5ca1bf5
commit 124a2eb2b7

View File

@ -47,7 +47,8 @@ class AnkiWeb {
const data = { const data = {
data: JSON.stringify([fields, note.tags.join(' ')]), data: JSON.stringify([fields, note.tags.join(' ')]),
mid: model.id, mid: model.id,
deck: note.deckName deck: note.deckName,
csrf_token: info.token
}; };
return AnkiWeb.loadAccountPage('https://ankiweb.net/edit/save', data, this.username, this.password); return AnkiWeb.loadAccountPage('https://ankiweb.net/edit/save', data, this.username, this.password);
@ -78,8 +79,8 @@ class AnkiWeb {
return Promise.resolve(this.noteInfo); return Promise.resolve(this.noteInfo);
} }
return AnkiWeb.scrape(this.username, this.password).then(({deckNames, models}) => { return AnkiWeb.scrape(this.username, this.password).then(({deckNames, models, token}) => {
this.noteInfo = {deckNames, models}; this.noteInfo = {deckNames, models, token};
return this.noteInfo; return this.noteInfo;
}); });
} }
@ -100,8 +101,14 @@ class AnkiWeb {
return Promise.reject('failed to scrape deck data'); return Promise.reject('failed to scrape deck data');
} }
const tokenMatch = /editor\.csrf_token = \'(.*)\';/.exec(response);
if (tokenMatch === null) {
return Promise.reject('failed to acquire csrf_token');
}
const modelsJson = JSON.parse(modelsMatch[1]); const modelsJson = JSON.parse(modelsMatch[1]);
const decksJson = JSON.parse(decksMatch[1]); const decksJson = JSON.parse(decksMatch[1]);
const token = tokenMatch[1];
const deckNames = Object.keys(decksJson).map(d => decksJson[d].name); const deckNames = Object.keys(decksJson).map(d => decksJson[d].name);
const models = []; const models = [];
@ -113,16 +120,16 @@ class AnkiWeb {
}); });
} }
return {deckNames, models}; return {deckNames, models, token};
}); });
} }
static login(username, password) { static login(username, password, token) {
if (username.length === 0 || password.length === 0) { if (username.length === 0 || password.length === 0) {
return Promise.reject('login credentials not specified'); return Promise.reject('login credentials not specified');
} }
const data = {username, password, submitted: 1}; const data = {username, password, csrf_token: token, submitted: 1};
return AnkiWeb.loadPage('https://ankiweb.net/account/login', data).then(response => { return AnkiWeb.loadPage('https://ankiweb.net/account/login', data).then(response => {
if (!response.includes('class="mitem"')) { if (!response.includes('class="mitem"')) {
return Promise.reject('failed to authenticate'); return Promise.reject('failed to authenticate');
@ -133,7 +140,12 @@ class AnkiWeb {
static loadAccountPage(url, data, username, password) { static loadAccountPage(url, data, username, password) {
return AnkiWeb.loadPage(url, data).then(response => { return AnkiWeb.loadPage(url, data).then(response => {
if (response.includes('name="password"')) { if (response.includes('name="password"')) {
return AnkiWeb.login(username, password).then(() => AnkiWeb.loadPage(url, data)); const tokenMatch = /name="csrf_token" value="(.*)"/.exec(response);
if (tokenMatch === null) {
return Promise.reject('failed to acquire csrf_token');
}
return AnkiWeb.login(username, password, tokenMatch[1]).then(() => AnkiWeb.loadPage(url, data));
} else { } else {
return response; return response;
} }