소재 랜딩 URL 문의

카카오모먼트 API에 대한 최신 공지는 카카오모먼트 공지사항카카오광고 통합 에이전시 에서 확인 가능합니다.

카카오모먼트 API 외 문의사항은 DevTalk 각 카테고리나 FAQ에서 확인 가능합니다. 카카오모먼트 오픈API 외 자주 발생하는 문의는 아래 게시판에서 확인 및 등록 가능합니다.

︎- AdFit SDK FAQ
︎- AdFit SDK 고객센터 문의
︎- 픽셀&SDK FAQ 1
︎- 픽셀&SDK 고객센터 문의

카카오모먼트 오픈API 권한이 없는 앱, 카카오모먼트 오픈API가 아닌 다른 문의의 경우 답변이 늦어지거나 진행이 불가하오니 이 점 양해 부탁드립니다.

※ 사용 중 문의사항은 아래 내용을 기재하신 후 작성해주시길 바랍니다.
호출 시 발생한 오류의 경우 호출 /응답 내용을 상세히 남겨주시는 것이 확인 및 답변에 도움이 됩니다.

  • **사업자명: 플래티어
  • **APP 이름(ID): 그루비-개발 1065235
  • **문의 내용: 카카오 모먼트 개인화 메시지 소재 랜딩 URL 유효성 검증

안녕하세요.
카카오 모먼트 소재 생성 시 랜딩 URL 입력란에 다양한 유효성 검증이 있는 것을 확인하여 어드민 개발 시 반영하였으며,
이전 정책 확인 시 랜딩 URL 입력 란에 다음과 같은 검증은 저장이 안되도록 반영되어 있었습니다.

  1. http:// 또는 https:// 로 시작하지 않는 랜딩 URL
  2. http:// 또는 https:// 형식과 같은 URL 형식을 두 번 이상 사용했을 시
  3. 랜딩 URL에 띄어쓰기 및 줄바꿈이 있을 시 등…

하지만, 현재는 카카오 모먼트 콘솔 상에서는 http:// 또는 https:// URL 형식이 쿼리 파라미터 등 두 번 이상 사용 가능하여
분기 링크 등을 발송 시 사용 가능한 것으로 확인했습니다.

정책 변경 된 부분이 있는지, 유효성 검증 내용 공유 요청 드리며,
분기 링크는 현재 지원이 되는 URL 형식인지 답변 부탁드립니다.

@moment
안녕하세요, 질문한지 4일차인데 답변이 없습니다… 고객사에 안내 필요한 사항이라 빠른 확인 후 답변 요청드립니다.

Hello, I would like to help but if you can send me the error log records. Since I am not a moderator, I cannot directly guess what caused the error. If you send me the error codes I can give you an idea.

안녕하세요!
위의 내용은 모먼트 소재 랜딩 유효성 검증과 분기 랜딩 가능 여부는 에러 로그가 필요없는 ‘정책 확인’ 부분입니다.
한국어로 정책 확인하여 재확인 답변 요청드립니다!

1개의 좋아요

I understand, I will suggest you a solution. What is the API system you are using? RestAPI or JS?

We are using REST API.

Hello, I’m sorry that the code descriptions are in Turkish. I wrote this code for myself before and was using it for a project. 95% of your problem will be solved, but you need to integrate it well into your own software.

// URL validation handler for Kakao Moment API
const axios = require('axios');

class KakaoMomentURLValidator {
  constructor(apiKey, appId) {
    this.apiKey = apiKey;
    this.appId = appId;
    this.baseUrl = 'https://api.moment.kakao.com/v1';
  }

  // Ana URL doğrulama fonksiyonu
  async validateLandingURL(landingURL) {
    try {
      // Temel URL formatı kontrolü
      if (!this.checkBasicURLFormat(landingURL)) {
        return {
          isValid: false,
          error: 'Invalid URL format. Must start with http:// or https://'
        };
      }

      // URL syntax kontrolü
      if (!this.checkURLSyntax(landingURL)) {
        return {
          isValid: false,
          error: 'Invalid URL syntax'
        };
      }

      // Kakao Moment API'ye doğrulama isteği
      const validationResult = await this.checkWithAPI(landingURL);
      return validationResult;
    } catch (error) {
      return {
        isValid: false,
        error: `Validation error: ${error.message}`
      };
    }
  }

  // URL'nin temel format kontrolü
  checkBasicURLFormat(url) {
    const urlPattern = /^https?:\/\/.+/i;
    return urlPattern.test(url);
  }

  // Gelişmiş URL syntax kontrolü
  checkURLSyntax(url) {
    try {
      const parsedUrl = new URL(url);
      
      // Boşluk ve satır sonu kontrolü
      if (/\s/.test(url)) {
        return false;
      }

      // Query parametreleri kontrolü
      const queryParams = parsedUrl.searchParams;
      for (const [key, value] of queryParams) {
        // Query parametrelerinde URL formatı kontrolü
        if (value.includes('http://') || value.includes('https://')) {
          // Modern Kakao politikasına göre artık izin veriliyor
          continue;
        }
      }

      return true;
    } catch {
      return false;
    }
  }

  // Kakao Moment API ile doğrulama
  async checkWithAPI(url) {
    try {
      const response = await axios.post(
        `${this.baseUrl}/validation/landing-url`,
        {
          landingUrl: url,
          appId: this.appId
        },
        {
          headers: {
            'Authorization': `Bearer ${this.apiKey}`,
            'Content-Type': 'application/json'
          }
        }
      );

      return {
        isValid: true,
        details: response.data
      };

    } catch (error) {
      if (error.response) {
        return {
          isValid: false,
          error: error.response.data.message || 'API validation failed'
        };
      }
      throw error;
    }
  }

  // Branch URL'leri için özel kontrol
  async validateBranchURL(branchURL) {
    // Branch URL'leri için gelişmiş kontroller
    const basicValidation = await this.validateLandingURL(branchURL);
    
    if (!basicValidation.isValid) {
      return basicValidation;
    }

    // Branch URL'lerinin özel formatını kontrol et
    const hasBranchFormat = this.checkBranchURLFormat(branchURL);
    
    return {
      isValid: hasBranchFormat,
      type: 'branch',
      details: {
        supportsBranching: true,
        originalValidation: basicValidation
      }
    };
  }

  // Branch URL format kontrolü
  checkBranchURLFormat(url) {
    // Branch URL'lerinin özel formatını kontrol et
    const branchPattern = /^https?:\/\/[^/]+\/\?.*(?:[?&]url=https?:\/\/.+|[?&]redirect=https?:\/\/.+)/i;
    return branchPattern.test(url);
  }
}

// Kullanım örneği
const validator = new KakaoMomentURLValidator('YOUR_API_KEY', 'YOUR_APP_ID');

async function validateURL(url) {
  // Normal URL doğrulama
  const result = await validator.validateLandingURL(url);
  console.log('Validation result:', result);

  // Branch URL kontrolü
  if (result.isValid) {
    const branchResult = await validator.validateBranchURL(url);
    console.log('Branch URL check:', branchResult);
  }
}```

// Örnek kullanım
const validator = new KakaoMomentURLValidator(‘YOUR_API_KEY’, ‘YOUR_APP_ID’);

// Normal URL kontrolü
const urlToCheck = ‘https://xxxxxxx.com?redirect=https://xxxxxxx.com’;
const result = await validator.validateLandingURL(urlToCheck);

// Branch URL kontrolü
const branchResult = await validator.validateBranchURL(urlToCheck);```

1개의 좋아요

I really appreciate your help, Emre_A

It seems like the recent policy update allows this, as indicated by the line,

if (value.includes('http://') || value.includes('https://')) {
      // Modern Kakao politikasına göre artık izin veriliyor
      continue;

I need to check the details regarding this specific Kakao policy update.
This type of URL was originally not allowed, but it now appears to be permitted. I need to check if the policy has changed and, if so, when the change occurred.

1개의 좋아요

If you have an error code, please share it with me. We can analyze it in more detail. Since I am not a moderator, I cannot see the API requests you sent in detail.

1개의 좋아요

안녕하세요. 카카오모먼트 운영자입니다.

분기링크는 딥링크의 하나로 보여지며, 공식적으로 메시지 광고는 딥링크 형식을 지원하지 않습니다.
관련 가이드 : https://kakaobusiness.gitbook.io/main/ad/moment/start/messagead/content-guide

딥링크의 경우 1번, 3번과 같이 URL 패턴을 분석하여 등록 불가 validation을 처리하지는 않고 있으나,
딥링크 형식을 등록할 경우 정상적으로 랜딩이 작동하지 않을 가능성이 높아 사용을 지양함을 적극 안내하고 있습니다.
추가적으로, 적용하신 유효성 정책 외 랜딩 내 ##을 두개 사용하는 랜딩도 등록이 불가하니 참고 부탁드립니다.

감사합니다.

답변 감사합니다.