diff --git a/src/main/java/kz/konturai/parser/controller/FacebookWebhookController.java b/src/main/java/kz/konturai/parser/controller/FacebookWebhookController.java index a5cfd6a..befcabc 100644 --- a/src/main/java/kz/konturai/parser/controller/FacebookWebhookController.java +++ b/src/main/java/kz/konturai/parser/controller/FacebookWebhookController.java @@ -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 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 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); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6ed03c5..6fe7b22 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -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 \ No newline at end of file