This commit is contained in:
NAME
2026-05-12 02:30:05 +00:00
parent b5cf2502be
commit c8ccb032d2
7 changed files with 194 additions and 142 deletions
+39
View File
@@ -32,3 +32,42 @@ export function buildXCookies() {
{name: "lang", value: "en"},
];
}
export function getAccount() {
return {
id: process.env.X_USERNAME!,
api: {
accessToken: '',
accessSecret: '',
appKey: process.env.TWITTER_CLIENT_ID + '',
appSecret: process.env.TWITTER_CLIENT_SECRET!,
},
cookie: {
authToken: process.env.X_COOKIE_AUTH_TOKEN!, // auth_token cookie
ct0: process.env.X_COOKIE_CT0!, // ct0 cookie (CSRF token)
kdt: process.env.X_COOKIE_KDT!, // ct0 cookie (CSRF token)
proxy: '',
},
browser: {
accountId: process.env.X_USERNAME!,
cookies: [
{
name: 'auth_token',
value: process.env.X_COOKIE_AUTH_TOKEN!,
},
{
name: 'ct0',
value: process.env.X_COOKIE_CT0!,
},
{
name: 'kdt',
value: process.env.X_COOKIE_KDT!,
},
],
proxy: '',
userAgent: process.env.BROWSER_USER_AGENT || '',
headless: Number(process.env.BROWSER_IS_HEADLESS) === 1,
},
};
}
+13 -4
View File
@@ -2,6 +2,7 @@
import {HttpException, Injectable, Logger, OnModuleDestroy, OnModuleInit,} from '@nestjs/common';
import {Browser, BrowserContext, chromium, Page} from 'playwright';
import {rand} from "../helper";
import {getAccount} from "./utils/x-headers.util";
export interface BrowserAccount {
accountId: string;
@@ -13,6 +14,7 @@ export interface BrowserAccount {
}>;
proxy?: string;
userAgent?: string;
headless?: boolean;
}
export interface BrowserTweetResult {
@@ -38,13 +40,15 @@ export class XBrowserService implements OnModuleInit, OnModuleDestroy {
setInterval(() => this.cleanupStaleContexts(), 60_000);
}
private async ensureBrowser(): Promise<Browser> {
private async ensureBrowser(headless = true): Promise<Browser> {
if (this.browser && this.browser.isConnected()) return this.browser;
this.logger.log('Launching Chromium...');
this.browser = await chromium.launch({
headless: true,
headless,
args: [
'--disable-blink-features=AutomationControlled',
'--disable-features=IsolateOrigins,site-per-process',
'--disable-infobars',
'--no-sandbox',
'--disable-dev-shm-usage',
],
@@ -76,7 +80,7 @@ export class XBrowserService implements OnModuleInit, OnModuleDestroy {
}
console.log('getOrCreateContext:3')
const browser = await this.ensureBrowser();
const browser = await this.ensureBrowser(account.headless);
console.log('getOrCreateContext:4')
const ctx = await browser.newContext({
@@ -115,7 +119,12 @@ export class XBrowserService implements OnModuleInit, OnModuleDestroy {
return ctx;
}
private async getPage(account: BrowserAccount): Promise<Page> {
async newPage(): Promise<Page> {
const account = getAccount();
return this.getPage(account.browser)
}
async getPage(account: BrowserAccount): Promise<Page> {
let ctx = await this.getOrCreateContext(account);
console.log('Đã khởi tạo ctx')
if (ctx.isClosed()) {
+2 -29
View File
@@ -5,6 +5,7 @@ import {BrowserAccount, XBrowserService} from "./x-browser.service";
import {XApiService} from "./x-api.service";
import {XCookieService} from "./x-cookie.service";
import {NotifyService} from "../notify.service";
import {getAccount} from "./utils/x-headers.util";
export enum SUPPORT_SOCIAL_PROVIDERS {
FB = 'fb',
@@ -51,35 +52,7 @@ export class XPosterRouterService {
private readonly browserSvc: XBrowserService,
private readonly notifyService: NotifyService,
) {
this.X_UNIFIED_ACCOUNT = {
id: process.env.X_USERNAME!,
api: {
accessToken: '',
accessSecret: '',
appKey: process.env.TWITTER_CLIENT_ID + '',
appSecret: process.env.TWITTER_CLIENT_SECRET!,
},
cookie: {
authToken: process.env.X_COOKIE_AUTH_TOKEN!, // auth_token cookie
ct0: process.env.X_COOKIE_CT0!, // ct0 cookie (CSRF token)
proxy: '',
},
browser: {
accountId: process.env.X_USERNAME!,
cookies: [
{
name: 'auth_token',
value: process.env.X_COOKIE_AUTH_TOKEN!,
},
{
name: 'ct0',
value: process.env.X_COOKIE_CT0!,
},
],
proxy: '',
userAgent: process.env.BROWSER_USER_AGENT || '',
},
};
this.X_UNIFIED_ACCOUNT = getAccount();
console.error(this.X_UNIFIED_ACCOUNT);