This commit is contained in:
arys
2026-01-29 12:15:14 +05:00
parent 5d5657b941
commit 50dcdad58b
2 changed files with 29 additions and 41 deletions
@@ -1,6 +1,5 @@
package kz.konturai.parser.controller;
import kz.konturai.parser.service.FacebookPostingService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
@@ -19,56 +18,55 @@ public class FacebookWebhookController {
@Value("${facebook.verify.token}")
private String verifyToken;
@Value("${facebook.page.access.token}")
private String pageAccessToken;
private final FacebookPostingService facebookService;
private final ObjectMapper objectMapper;
public FacebookWebhookController(FacebookPostingService facebookService) {
this.facebookService = facebookService;
public FacebookWebhookController() {
this.objectMapper = new ObjectMapper();
}
// Подтверждение вебхука для Фейсбука
@GetMapping
public ResponseEntity<String> verifyWebhook(
@RequestParam("hub.mode") String mode,
@RequestParam("hub.verify_token") String token,
@RequestParam("hub.challenge") String challenge) {
if ("subscribe".equals(mode) && verifyToken.equals(token)) {
logger.info(">>> WEBHOOK VERIFIED SUCCESSFULLY!");
return ResponseEntity.ok(challenge);
} else {
logger.error(">>> WEBHOOK VERIFICATION FAILED. Token mismatch.");
return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
}
}
// Сюда приходят сообщения
@PostMapping
public ResponseEntity<Void> receiveEvent(@RequestBody String payload) {
try {
JsonNode root = objectMapper.readTree(payload);
if (root.has("entry")) {
for (JsonNode entry : root.get("entry")) {
if (entry.has("messaging")) {
for (JsonNode event : entry.get("messaging")) {
// Если это сообщение от юзера
if (event.has("message") && !event.get("message").has("is_echo")) {
// === ВОТ ЭТО САМОЕ ГЛАВНОЕ ===
String senderId = event.get("sender").get("id").asText();
String text = event.get("message").has("text") ? event.get("message").get("text").asText() : "";
String text = event.get("message").has("text") ?
event.get("message").get("text").asText() : "";
// Логируем ID, чтобы ты мог его скопировать
logger.info(">>> ТЕСТЕР НАПИСАЛ СООБЩЕНИЕ! ID (PSID): {}", senderId);
logger.info(">>> Текст: {}", text);
// Можно сразу отправить автоответ для проверки связи
facebookService.sendPrivateMessage(pageAccessToken, senderId, "ID получен: " + senderId + ". Жди уведомления о посте!");
// === ВОТ ЭТОТ ID ТЕБЕ НУЖЕН ===
logger.info("============================================");
logger.info(">>> ПОЙМАН ID ТЕСТЕРА: " + senderId);
logger.info(">>> ТЕКСТ СООБЩЕНИЯ: " + text);
logger.info(">>> СКОПИРУЙ ЭТОТ ID В PostingTaskService!");
logger.info("============================================");
}
}
}
}
}
// Всегда возвращаем 200 OK, чтобы Фейсбук не слал повторы
return ResponseEntity.ok().build();
} catch (Exception e) {
logger.error("Error processing webhook", e);
+14 -24
View File
@@ -14,7 +14,6 @@ java.awt.headless=true
spring.application.name=parser
# MongoDB Configuration
# Option 1: Individual properties
spring.data.mongodb.host=92.38.48.166
spring.data.mongodb.port=27017
spring.data.mongodb.database=parser_db
@@ -22,9 +21,6 @@ spring.data.mongodb.username=konturai
spring.data.mongodb.password=konturai2024
spring.data.mongodb.authentication-database=admin
# Option 2: Connection URI (uncomment if individual properties don't work)
# spring.data.mongodb.uri=mongodb://parser_user:parser_password@92.38.48.166:27017/parser_db?authSource=admin
# RSS Feed URLs
rss.feed.url=https://kursiv.media/feed/
rss.kapital.url=https://kapital.kz/rss/
@@ -51,7 +47,6 @@ logging.level.kz.konturai.parser.service.VedomostiParserService=INFO
logging.level.org.springframework.scheduling=DEBUG
logging.level.org.springframework.data.mongodb=INFO
logging.level.com.mongodb=WARN
logging.level.kz.konturai.parser.service.OllamaAnalyticsService=INFO
logging.level.kz.konturai.parser.controller.MarketingController=DEBUG
logging.level.kz.konturai.parser.service.MarketingAnalysisService=DEBUG
@@ -59,7 +54,6 @@ logging.level.kz.konturai.parser.config.MongoConfig=DEBUG
logging.level.org.springframework.data.mongodb.core.convert=DEBUG
# OpenAI Configuration
# openai.api.key=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
openai.api.key=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
openai.api.url=https://api.openai.com/v1/chat/completions
openai.model.name=gpt-4o-mini
@@ -91,15 +85,12 @@ openai.image.quality=hd
openai.image.style=natural
# Image Generation Provider Selection
# Options: 'openai' (default) or 'nano-banana'
# Set to 'nano-banana' to use Google Gemini Nano Banana for image generation
image.generation.provider=nano-banana
image.generation.delayBetweenRequestsMs=3000
google.cloud.project-id=data-totality-483616-t5
google.cloud.location=us-central1
google.gemini.image.model=imagen-3.0-generate-001
google.gemini.timeoutMs=120000
google.gemini.retry.maxAttempts=3
google.gemini.retry.initialDelayMs=10000
@@ -107,11 +98,6 @@ google.gemini.retry.maxDelayMs=120000
google.gemini.retry.multiplier=2.0
google.gemini.rateLimit.delayMs=12000
# Delay between image generation requests (in milliseconds)
# Helps prevent rate limiting when generating multiple images sequentially
# Set to 0 to disable delay
image.generation.delayBetweenRequestsMs=3000
# Email Configuration
spring.mail.host=smtp.gmail.com
spring.mail.port=587
@@ -126,21 +112,25 @@ deep-research.api.url=http://185.35.223.45:3051
deep-research.api.timeout=1800000
# JWT Configuration
# Используйте тот же secret-base64, что и в сервисе, выдающем токены
# Формат: base64-encoded secret key
security.jwt.secret-base64=ZmFrZV9zZWNyZXRfMTIzNDU2Nzg5MGFiY2RlZmFrZV9zZWNyZXRfMTIzNDU2Nzg5MGFiY2Rl
# Encryption Configuration for Social Media Credentials
# Base64-encoded AES-256 key (32 bytes = 256 bits)
# Generate a key: openssl rand -base64 32
# IMPORTANT: Change this in production!
# Encryption Configuration
encryption.secret-key=ZmFrZV9zZWNyZXRfMTIzNDU2Nzg5MGFiY2RlZmFrZV9zZWNyZXRfMTIzNDU2Nzg5MGFiY2Rl
# Posting Scheduler Configuration
posting.scheduler.enabled=true
# Facebook API Configuration
facebook.api.timeout=30000
# Telegram API Configuration
telegram.api.timeout=30000
# ==========================================
# FACEBOOK MESSENGER CONFIGURATION
# ==========================================
facebook.api.timeout=30000
# ??? ????? ?????, ??????? ?? ???? ?? ????? FACEBOOK (??? ?? ?????????)
facebook.verify.token=my_test_secret_123
# ???? ?????? ??????? ????? ???????? (Page Access Token)
# ?????? ??? ? Meta Developers -> Messenger -> Settings -> Access Tokens (Generate Token)
facebook.page.access.token=EAAaocqgT3JoBQtNeU4uqBrywSRwGmFZBQDZBnd1ynWjX070wAa09QBKebjrd9vyjAZCiJuZAZCU8266VlJYTAfwue20QNvENgM3wpjWNmCrTO0gTMAkmPZBKZBXKvZA8eCA4aZCUhmU2jsBRluYqKUyqpYV3ZCK928OVqLqCNZCUhqU6nUU0xP0DOzk90x58tmxpS2y1i7hjQZDZD