Commit 07bf3210 authored by nanahira's avatar nanahira

add retry

parent 5bb88798
...@@ -41,6 +41,12 @@ export class RetweetNotifierPluginConfig { ...@@ -41,6 +41,12 @@ export class RetweetNotifierPluginConfig {
description: '是否在截图失败时放弃发送。需要使用 Puppeteer。', description: '是否在截图失败时放弃发送。需要使用 Puppeteer。',
}) })
safe: boolean; safe: boolean;
@SchemaProperty({
description: 'Twitter 截图默认重试次数。',
default: 3,
})
retryCount: number;
} }
export type RetweetNotifierPluginConfigLike = export type RetweetNotifierPluginConfigLike =
......
...@@ -103,9 +103,18 @@ export default class RetweetNotifierPlugin extends SchedulePlugin( ...@@ -103,9 +103,18 @@ export default class RetweetNotifierPlugin extends SchedulePlugin(
return !existing?.length; return !existing?.length;
} }
private async renderTweet(url: string) { private async renderTweet(url: string, retry = 0) {
if (!this.ctx.puppeteer) return url; if (!this.ctx.puppeteer) return url;
this.logger.info(`Rendering tweet ${url}...`); if (retry > this.config.retryCount) {
this.logger.error(
`Failed to render tweet ${url} after ${this.config.retryCount} retries`,
);
return url;
} else if (retry > 0) {
this.logger.warn(`Retrying to render tweet ${url}...`);
} else {
this.logger.info(`Rendering tweet ${url}...`);
}
const page = await this.ctx.puppeteer.page(); const page = await this.ctx.puppeteer.page();
try { try {
await page.goto(url, { timeout: 300000, waitUntil: 'networkidle2' }); await page.goto(url, { timeout: 300000, waitUntil: 'networkidle2' });
...@@ -115,14 +124,14 @@ export default class RetweetNotifierPlugin extends SchedulePlugin( ...@@ -115,14 +124,14 @@ export default class RetweetNotifierPlugin extends SchedulePlugin(
// const tweetComponent = page; // const tweetComponent = page;
if (!tweetComponent) { if (!tweetComponent) {
this.logger.warn(`Component not found for tweet ${url}`); this.logger.warn(`Component not found for tweet ${url}`);
return url; return this.renderTweet(url, retry + 1);
} }
this.logger.info(`Taking screenshot of ${url}...`); this.logger.info(`Taking screenshot of ${url}...`);
const screenshot = await tweetComponent.screenshot({ fullPage: false }); const screenshot = await tweetComponent.screenshot({ fullPage: false });
return segment.image(screenshot, 'image/png').toString(); return segment.image(screenshot, 'image/png').toString();
} catch (e) { } catch (e) {
this.logger.error(`Failed to render tweet ${url}: ${e}`); this.logger.warn(`Failed to render tweet ${url}: ${e}`);
return url; return this.renderTweet(url, retry + 1);
} finally { } finally {
await page.close(); await page.close();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment