Update
This commit is contained in:
@@ -58,3 +58,5 @@ report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||
dist
|
||||
.idea
|
||||
dist.zip
|
||||
|
||||
data/*
|
||||
@@ -34,6 +34,7 @@
|
||||
"class-validator": "^0.15.1",
|
||||
"cookie": "^1.1.1",
|
||||
"https-proxy-agent": "^9.0.0",
|
||||
"keyv": "^5.6.0",
|
||||
"lodash": "^4.18.1",
|
||||
"playwright": "^1.59.1",
|
||||
"playwright-extra": "^4.3.6",
|
||||
|
||||
Generated
+943
-1298
File diff suppressed because it is too large
Load Diff
@@ -2,12 +2,15 @@ import {Controller, Get, Post} from '@nestjs/common';
|
||||
import {AppService} from './app.service';
|
||||
import {XCookieAccountDto} from "./x-poster/dto/x-cookie-account.dto";
|
||||
import {XPosterRouterService} from "./x-poster/x-poster.router.service";
|
||||
import {Context} from "node:vm";
|
||||
import {XCacheService} from "./x-cache/x-cache.service";
|
||||
|
||||
@Controller()
|
||||
export class AppController {
|
||||
constructor(
|
||||
private readonly appService: AppService,
|
||||
private readonly xPosterRouterService: XPosterRouterService,
|
||||
private readonly cache: XCacheService
|
||||
) {
|
||||
}
|
||||
|
||||
@@ -16,8 +19,8 @@ export class AppController {
|
||||
return this.xPosterRouterService.verifyCookie();
|
||||
}
|
||||
|
||||
@Post('/set-x-cookies')
|
||||
@Get('/x')
|
||||
setXCookies(dto: XCookieAccountDto) {
|
||||
|
||||
return this.cache.getCacheTwRefreshToken();
|
||||
}
|
||||
}
|
||||
|
||||
+7
-3
@@ -5,8 +5,12 @@ import {SqsModule} from "./sqs-module/sqs.module";
|
||||
import {XPosterModule} from "./x-poster/x-poster.module";
|
||||
import {ConfigModule} from "@nestjs/config";
|
||||
import {CacheModule} from "@nestjs/cache-manager";
|
||||
import KeyvRedis from "@keyv/redis";
|
||||
import {XbotFollowModule} from "./xbot-follow/xbot-follow.module";
|
||||
import * as path from 'path';
|
||||
import {XCacheService} from "./x-cache/x-cache.service";
|
||||
import KeyvRedis from "@keyv/redis";
|
||||
|
||||
console.log(`sqlite://${path.join(process.cwd(), 'cache.sqlite')}`)
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
@@ -20,7 +24,7 @@ import {XbotFollowModule} from "./xbot-follow/xbot-follow.module";
|
||||
isGlobal: true,
|
||||
useFactory: () => ({
|
||||
stores: [
|
||||
new KeyvRedis(`redis://127.0.0.1:6379/1`)
|
||||
new KeyvRedis(process.env.REDIS_URL)
|
||||
],
|
||||
}),
|
||||
}),
|
||||
@@ -29,7 +33,7 @@ import {XbotFollowModule} from "./xbot-follow/xbot-follow.module";
|
||||
XbotFollowModule,
|
||||
],
|
||||
controllers: [AppController],
|
||||
providers: [AppService],
|
||||
providers: [AppService, XCacheService,],
|
||||
})
|
||||
export class AppModule {
|
||||
}
|
||||
|
||||
@@ -2,8 +2,12 @@ import {NestFactory} from '@nestjs/core';
|
||||
import {AppModule} from './app.module';
|
||||
import {SqsPosterWorker} from "./sqs-module/sqs.poster.worker";
|
||||
import {DocumentBuilder, SwaggerModule} from "@nestjs/swagger";
|
||||
import fs from 'fs';
|
||||
|
||||
async function bootstrap() {
|
||||
|
||||
fs.mkdirSync('./data', { recursive: true });
|
||||
|
||||
const app = await NestFactory.create(AppModule);
|
||||
|
||||
// Cấu hình Swagger
|
||||
|
||||
@@ -120,7 +120,7 @@ export class SqsPosterWorker {
|
||||
let sendSuccess = false;
|
||||
if (publishTo.includes(SUPPORT_SOCIAL_PROVIDERS.FB)) {
|
||||
this.logger.log(`==> doPostTweet publish to fb`);
|
||||
await this.facebookApi.postToPage(text);
|
||||
await this.facebookApi.postToPage(text, '', false);
|
||||
await this.notifyService.sendMessageToTele(`Post to FB success`);
|
||||
sendSuccess = true;
|
||||
}
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
// src/modules/social/facebook-api.service.ts
|
||||
import {HttpException, HttpStatus, Injectable} from '@nestjs/common';
|
||||
import {HttpException, HttpStatus, Injectable, Logger} from '@nestjs/common';
|
||||
import axios from 'axios';
|
||||
|
||||
@Injectable()
|
||||
export class FacebookApi {
|
||||
private logger = new Logger('FacebookApi');
|
||||
private readonly fbBaseUrl = 'https://graph.facebook.com/v19.0';
|
||||
private readonly pageAccessToken = process.env.FB_PAGE_ACCESS_TOKEN;
|
||||
private readonly pageId = process.env.FB_PAGE_ID;
|
||||
|
||||
async postToPage(content: string, imageUrl?: string) {
|
||||
async postToPage(content: string, imageUrl?: string, throwEx = true) {
|
||||
// console.log('postToPage==>', content, imageUrl);
|
||||
try {
|
||||
let url = `${this.fbBaseUrl}/${this.pageId}/feed`;
|
||||
@@ -25,14 +26,39 @@ export class FacebookApi {
|
||||
|
||||
const response = await axios.post(url, params);
|
||||
//response.data= { id: '1010286162176053_122107818902775551' }
|
||||
return response.data; // Trả về ID bài viết nếu thành công
|
||||
// return response.data; // Trả về ID bài viết nếu thành công
|
||||
return {
|
||||
success: true,
|
||||
postId: response.data,
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('Lỗi khi đăng bài lên FB');
|
||||
console.log(error.message);
|
||||
this.logger.error('Lỗi khi đăng bài lên FB');
|
||||
this.logger.error(error.message);
|
||||
// Kiểm tra xem Facebook có trả về response lỗi không
|
||||
let fbErrormessage = error.message;;
|
||||
if (error.response && error.response.data) {
|
||||
const fbError = error.response.data.error;
|
||||
fbErrormessage = fbError.constructor
|
||||
this.logger.error('--- LỖI FACEBOOK API ---');
|
||||
this.logger.error('Message:', fbErrormessage);
|
||||
this.logger.error('Code:', fbError.code);
|
||||
this.logger.error('Subcode:', fbError.error_subcode);
|
||||
this.logger.error('FB Trace ID:', fbError.fbtrace_id);
|
||||
} else {
|
||||
// Lỗi do mạng hoặc cấu hình Axios sai
|
||||
this.logger.error('Lỗi hệ thống/mạng:', error.message);
|
||||
}
|
||||
if (throwEx) {
|
||||
throw new HttpException(
|
||||
error.response?.data || 'Lỗi khi đăng bài lên FB',
|
||||
fbErrormessage || 'Fb Lỗi khi đăng bài lên FB',
|
||||
HttpStatus.BAD_REQUEST,
|
||||
);
|
||||
}
|
||||
return {
|
||||
success: false,
|
||||
postId: 0,
|
||||
error: error.message,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user