mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 01:38:19 +08:00
vjudge: update codeforces handle
This commit is contained in:
1 parent
9a8557d215
commit
4e7c3077f9
3 files changed
+22
-6
No files matched your search
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@hydrooj/vjudge",
|
"name": "@hydrooj/vjudge",
|
||||||
"version": "1.5.0-next.1",
|
"version": "1.5.0-next.2",
|
||||||
"description": "Submit problems to remote oj",
|
"description": "Submit problems to remote oj",
|
||||||
"main": "package.json",
|
"main": "package.json",
|
||||||
"repository": "https://github.com/hydro-dev/Hydro.git",
|
"repository": "https://github.com/hydro-dev/Hydro.git",
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ class Service {
|
|||||||
this.api = new Provider(account, async (data) => {
|
this.api = new Provider(account, async (data) => {
|
||||||
await coll.updateOne({ _id: account._id }, { $set: data });
|
await coll.updateOne({ _id: account._id }, { $set: data });
|
||||||
});
|
});
|
||||||
this.main();
|
this.main().catch((e) => logger.error(`Error occured in ${account.type}/${account.handle}`, e));
|
||||||
}
|
}
|
||||||
|
|
||||||
async judge(task) {
|
async judge(task) {
|
||||||
@@ -36,6 +36,7 @@ class Service {
|
|||||||
await next({ status: STATUS.STATUS_JUDGING, message: `ID = ${rid}` });
|
await next({ status: STATUS.STATUS_JUDGING, message: `ID = ${rid}` });
|
||||||
await this.api.waitForSubmission(rid, next, end);
|
await this.api.waitForSubmission(rid, next, end);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
if (process.env.DEV) logger.error(e);
|
||||||
end({ status: STATUS.STATUS_SYSTEM_ERROR, message: e.message });
|
end({ status: STATUS.STATUS_SYSTEM_ERROR, message: e.message });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,6 +57,8 @@ export default class CodeforcesProvider implements IBasicProvider {
|
|||||||
|
|
||||||
async getPage() {
|
async getPage() {
|
||||||
const page = await this.puppeteer.newPage();
|
const page = await this.puppeteer.newPage();
|
||||||
|
const url = await page.openPortal();
|
||||||
|
logger.info('portal=', url);
|
||||||
for (const str of this.cookie) {
|
for (const str of this.cookie) {
|
||||||
const [name, value] = str.split(';')[0].split('=');
|
const [name, value] = str.split(';')[0].split('=');
|
||||||
await page.setCookie({ name, value, domain: 'codeforces.com' });
|
await page.setCookie({ name, value, domain: 'codeforces.com' });
|
||||||
@@ -65,7 +67,11 @@ export default class CodeforcesProvider implements IBasicProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async clearPage(page: Page) {
|
async clearPage(page: Page) {
|
||||||
const cookies = await page.cookies();
|
let cookies = await page.cookies();
|
||||||
|
while (!cookies.find((i) => i.name === 'evercookie_etag').value) {
|
||||||
|
await sleep(1000);
|
||||||
|
cookies = await page.cookies();
|
||||||
|
}
|
||||||
this.cookie = cookies.map((i) => `${i.name}=${i.value}`);
|
this.cookie = cookies.map((i) => `${i.name}=${i.value}`);
|
||||||
await this.save({ cookie: this.cookie });
|
await this.save({ cookie: this.cookie });
|
||||||
await page.close();
|
await page.close();
|
||||||
@@ -106,11 +112,19 @@ export default class CodeforcesProvider implements IBasicProvider {
|
|||||||
async checkLogin() {
|
async checkLogin() {
|
||||||
await this.ensureBrowser();
|
await this.ensureBrowser();
|
||||||
const page = await this.getPage();
|
const page = await this.getPage();
|
||||||
await page.goto(`${this.account.endpoint}/enter`);
|
await page.goto(`${this.account.endpoint}/enter`, { waitUntil: 'networkidle2' });
|
||||||
const html = await page.content();
|
const html = await page.content();
|
||||||
const cookies = await page.cookies();
|
let cookies = await page.cookies();
|
||||||
|
let c = 0;
|
||||||
|
while (!cookies.find((i) => i.name === 'evercookie_etag').value && c <= 60) {
|
||||||
|
await sleep(1000);
|
||||||
|
cookies = await page.cookies();
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
if (c < 60) {
|
||||||
this.cookie = cookies.map((i) => `${i.name}=${i.value}`);
|
this.cookie = cookies.map((i) => `${i.name}=${i.value}`);
|
||||||
await this.save({ cookie: this.cookie });
|
await this.save({ cookie: this.cookie });
|
||||||
|
}
|
||||||
const ftaa = cookies.find((i) => i.name === '70a7c28f3de')?.value;
|
const ftaa = cookies.find((i) => i.name === '70a7c28f3de')?.value;
|
||||||
const bfaa = /_bfaa = "(.{32})"/.exec(html)?.[1];
|
const bfaa = /_bfaa = "(.{32})"/.exec(html)?.[1];
|
||||||
await page.close();
|
await page.close();
|
||||||
@@ -164,7 +178,7 @@ export default class CodeforcesProvider implements IBasicProvider {
|
|||||||
async puppeteerLogin() {
|
async puppeteerLogin() {
|
||||||
if (!this.puppeteer) return false;
|
if (!this.puppeteer) return false;
|
||||||
const page = await this.puppeteer.newPage();
|
const page = await this.puppeteer.newPage();
|
||||||
await page.goto(`${this.account.endpoint}/enter`);
|
await page.goto(`${this.account.endpoint}/enter`, { waitUntil: 'networkidle2' });
|
||||||
const url = await page.openPortal();
|
const url = await page.openPortal();
|
||||||
logger.info(`Login portal opened: ${url}`);
|
logger.info(`Login portal opened: ${url}`);
|
||||||
await page.waitForRequest((req) => {
|
await page.waitForRequest((req) => {
|
||||||
@@ -184,6 +198,7 @@ export default class CodeforcesProvider implements IBasicProvider {
|
|||||||
logger.info('retry normal login');
|
logger.info('retry normal login');
|
||||||
await this.normalLogin();
|
await this.normalLogin();
|
||||||
if (await this.loggedIn) return true;
|
if (await this.loggedIn) return true;
|
||||||
|
if (!this.puppeteer) return false;
|
||||||
logger.info('starting puppeteer login');
|
logger.info('starting puppeteer login');
|
||||||
await this.puppeteerLogin();
|
await this.puppeteerLogin();
|
||||||
if (await this.loggedIn) return true;
|
if (await this.loggedIn) return true;
|
||||||
|
|||||||
Reference in new issue
Block a user