<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:media="http://search.yahoo.com/mrss/">

<channel>
	<title>인스타그램 &#8211; SNSnote</title>
	<atom:link href="https://snsnote.com/category/%EC%9D%B8%EC%8A%A4%ED%83%80%EA%B7%B8%EB%9E%A8/feed/" rel="self" type="application/rss+xml" />
	<link>https://snsnote.com</link>
	<description>SNS 운영 정보 · 무료 AI 도구 · 온라인 업무 도구</description>
	<lastBuildDate>Thu, 01 Oct 2026 08:07:27 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://snsnote.com/wp-content/uploads/2026/06/sns-thumbnail-logo-32x32.png</url>
	<title>인스타그램 &#8211; SNSnote</title>
	<link>https://snsnote.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">254946779</site>	<item>
		<title>인스타 수익화 카드뉴스 만들기 &#8211; 무료 템플릿, 설치 없이 웹 제작</title>
		<link>https://snsnote.com/cardnews-maker/</link>
					<comments>https://snsnote.com/cardnews-maker/#respond</comments>
		
		<dc:creator><![CDATA[JH]]></dc:creator>
		<pubDate>Thu, 01 Oct 2026 07:52:34 +0000</pubDate>
				<category><![CDATA[인스타그램]]></category>
		<category><![CDATA[유용한 도구]]></category>
		<guid isPermaLink="false">https://snsnote.com/?p=1771</guid>

					<description><![CDATA[인스타 수익화 카드뉴스 만들기, 사진 한 장이면 충분합니다 인스타그램에서 정보형 콘텐츠나 수익화 콘텐츠를 운영하다 보면 사진 위에 큰 제목을 넣은 카드뉴스 형식을 자주 사용하게 됩니다....]]></description>
										<content:encoded><![CDATA[<div id="cardnewsCoverMaker" class="cnm-wrap">

  <!-- =========================
       상단 헤더
  ========================== -->
  <div class="cnm-hero">

    <div class="cnm-kicker">
      SNSNOTE · CARD NEWS MAKER
    </div>

    <h2 class="cnm-main-title">
      카드뉴스 표지 만들기
    </h2>

    <p>
      사진과 제목을 넣어 SNS용 카드뉴스 표지를 바로 만들어보세요.
    </p>

  </div>



  <!-- =========================
       메인 영역
  ========================== -->
  <div class="cnm-main-grid">


    <!-- =========================
         왼쪽
    ========================== -->
    <div class="cnm-left-panel">


      <!-- =========================
           템플릿 선택
      ========================== -->
      <section class="cnm-template-section">

        <div class="cnm-panel-heading">

          <h3>
            템플릿 선택
          </h3>

          <p>
            사용할 이미지 구성을 선택하세요.
          </p>

        </div>


        <div class="cnm-template-grid">


          <!-- 이미지 1장 -->
          <button
            type="button"
            class="cnm-template-card active"
            data-template="single"
          >

            <div class="cnm-template-check">
              ✓
            </div>


            <div class="cnm-template-icon cnm-icon-single">
              <span></span>
            </div>


            <div class="cnm-template-name">
              이미지 1장
            </div>

            <div class="cnm-template-desc">
              사진 한 장으로 제작
            </div>

          </button>



          <!-- 이미지 2장 -->
          <button
            type="button"
            class="cnm-template-card"
            data-template="horizontal"
          >

            <div class="cnm-template-check">
              ✓
            </div>


            <div class="cnm-template-icon cnm-icon-double">
              <span></span>
              <span></span>
            </div>


            <div class="cnm-template-name">
              이미지 2장
            </div>

            <div class="cnm-template-desc">
              좌우 반반으로 배치
            </div>

          </button>

        </div>

      </section>



      <!-- =========================
           미리보기
      ========================== -->
      <section class="cnm-preview-section">

        <div class="cnm-panel-heading">

          <h3>
            미리보기
          </h3>

          <p>
            이미지를 직접 드래그해서 위치를 조절할 수 있어요.
          </p>

        </div>


        <div
          class="cnm-preview-wrap"
          id="cnmPreviewWrap"
        >

          <canvas
            id="cnmCanvas"
            width="1080"
            height="1350"
          ></canvas>


          <!-- 이미지 1 업로드 안내 -->
          <div
            class="cnm-slot-hint"
            id="cnmSlot1Hint"
          >

            <div class="cnm-upload-icon">
              +
            </div>

            <strong>
              이미지 선택
            </strong>

            <span>
              클릭해서 이미지를 업로드하세요
            </span>

          </div>


          <!-- 이미지 2 업로드 안내 -->
          <div
            class="cnm-slot-hint"
            id="cnmSlot2Hint"
          >

            <div class="cnm-upload-icon">
              +
            </div>

            <strong>
              이미지 2 선택
            </strong>

            <span>
              클릭해서 이미지를 업로드하세요
            </span>

          </div>

        </div>

      </section>



      <!-- =========================
           이미지 편집
      ========================== -->
      <section class="cnm-image-editor">

        <div class="cnm-panel-heading">

          <h3>
            이미지 편집
          </h3>

          <p>
            이미지 크기와 위치를 조절하세요.
          </p>

        </div>



        <!-- 이미지 1 -->
        <div
          class="cnm-image-control"
          id="cnmImage1Card"
        >

          <div
            class="cnm-image-control-title"
            id="cnmImage1Title"
          >
            이미지
          </div>


          <!-- 이미지 선택 + 초기화 한 줄 -->
          <div class="cnm-image-action-row">

            <label class="cnm-upload-button">

              <span>
                이미지 선택
              </span>

              <input
                type="file"
                id="cnmImageInput1"
                accept="image/*"
              >

            </label>


            <button
              type="button"
              class="cnm-reset-btn"
              id="cnmReset1"
            >
              위치 및 확대 초기화
            </button>

          </div>



          <!-- 확대 -->
          <div class="cnm-range-block">

            <div class="cnm-range-head">

              <span>
                확대 / 축소
              </span>

              <strong id="cnmZoom1Value">
                100%
              </strong>

            </div>


            <input
              type="range"
              id="cnmZoom1"
              min="100"
              max="300"
              value="100"
            >


            <div class="cnm-range-scale">

              <span>
                100%
              </span>

              <span>
                300%
              </span>

            </div>

          </div>

        </div>



        <!-- 이미지 2 -->
        <div
          class="cnm-image-control cnm-hidden"
          id="cnmImage2Card"
        >

          <div class="cnm-image-control-title">
            이미지 2 · 오른쪽
          </div>


          <!-- 이미지 선택 + 초기화 한 줄 -->
          <div class="cnm-image-action-row">

            <label class="cnm-upload-button">

              <span>
                이미지 선택
              </span>

              <input
                type="file"
                id="cnmImageInput2"
                accept="image/*"
              >

            </label>


            <button
              type="button"
              class="cnm-reset-btn"
              id="cnmReset2"
            >
              위치 및 확대 초기화
            </button>

          </div>



          <!-- 확대 -->
          <div class="cnm-range-block">

            <div class="cnm-range-head">

              <span>
                확대 / 축소
              </span>

              <strong id="cnmZoom2Value">
                100%
              </strong>

            </div>


            <input
              type="range"
              id="cnmZoom2"
              min="100"
              max="300"
              value="100"
            >


            <div class="cnm-range-scale">

              <span>
                100%
              </span>

              <span>
                300%
              </span>

            </div>

          </div>

        </div>

      </section>

    </div>



    <!-- =========================
         오른쪽
    ========================== -->
    <div class="cnm-right-panel">


      <!-- =========================
           텍스트 설정
      ========================== -->
      <div class="cnm-text-editor">

        <div class="cnm-panel-heading">

          <h3>
            텍스트 설정
          </h3>

          <p>
            미리보기를 확인하면서 문구와 색상을 조절하세요.
          </p>

        </div>



        <!-- =========================
             상단 핸들
        ========================== -->
        <div class="cnm-field">

          <div class="cnm-field-head">

            <label>
              상단 핸들 / 로고
            </label>


            <label class="cnm-mini-check">

              <input
                type="checkbox"
                id="cnmTopToggle"
                checked
              >

              사용

            </label>

          </div>


          <input
            type="text"
            id="cnmTopText"
            value="@mybrand"
            placeholder="@snsnote"
          >


          <div class="cnm-color-control">

            <input
              type="color"
              id="cnmTopColorPicker"
              value="#ffffff"
              title="색상 선택"
            >


            <input
              type="text"
              class="cnm-hex-input"
              id="cnmTopColor"
              value="#FFFFFF"
              maxlength="7"
              spellcheck="false"
              aria-label="상단 핸들 HEX 색상"
            >

          </div>

        </div>



        <!-- =========================
             중간 라벨
        ========================== -->
        <div class="cnm-field">

          <label>
            중간 라벨
          </label>


          <input
            type="text"
            id="cnmMidLabel"
            value="SNSnote.com"
            placeholder="SNSnote.com"
          >


          <div class="cnm-color-control">

            <input
              type="color"
              id="cnmMidColorPicker"
              value="#ff2b2b"
              title="색상 선택"
            >


            <input
              type="text"
              class="cnm-hex-input"
              id="cnmMidColor"
              value="#FF2B2B"
              maxlength="7"
              spellcheck="false"
              aria-label="중간 라벨 HEX 색상"
            >

          </div>

        </div>



        <!-- =========================
             흰 선 길이
        ========================== -->
        <div class="cnm-field">

          <div class="cnm-range-head">

            <label>
              라벨 앞 흰 선 길이
            </label>

            <strong id="cnmMidLineValue">
              585px
            </strong>

          </div>


          <input
            type="range"
            id="cnmMidLineLength"
            min="80"
            max="720"
            value="585"
          >


          <div class="cnm-range-scale">

            <span>
              80px
            </span>

            <span>
              720px
            </span>

          </div>

        </div>



        <div class="cnm-divider"></div>



        <!-- =========================
             제목 1
        ========================== -->
        <div class="cnm-field">

          <label>
            제목 1줄
          </label>


          <input
            type="text"
            id="cnmLine1"
            value="회전초밥 가게에서"
          >


          <div class="cnm-color-control">

            <input
              type="color"
              id="cnmLine1ColorPicker"
              value="#ffffff"
              title="제목 1줄 색상"
            >


            <input
              type="text"
              class="cnm-hex-input"
              id="cnmLine1Color"
              value="#FFFFFF"
              maxlength="7"
              spellcheck="false"
              aria-label="제목 1줄 HEX 색상"
            >

          </div>

        </div>



        <!-- =========================
             제목 2
        ========================== -->
        <div class="cnm-field">

          <label>
            제목 2줄
          </label>


          <input
            type="text"
            id="cnmLine2"
            value="25접시 먹은 썸남"
          >


          <div class="cnm-color-control">

            <input
              type="color"
              id="cnmLine2ColorPicker"
              value="#ffffff"
              title="제목 2줄 색상"
            >


            <input
              type="text"
              class="cnm-hex-input"
              id="cnmLine2Color"
              value="#FFFFFF"
              maxlength="7"
              spellcheck="false"
              aria-label="제목 2줄 HEX 색상"
            >

          </div>

        </div>



        <!-- =========================
             제목 3
             기본 #58FF42
        ========================== -->
        <div class="cnm-field">

          <label>
            제목 3줄
          </label>


          <input
            type="text"
            id="cnmLine3"
            value="사귈 수 있다? VS 없다?"
          >


          <div class="cnm-color-control">

            <input
              type="color"
              id="cnmLine3ColorPicker"
              value="#58ff42"
              title="제목 3줄 색상"
            >


            <input
              type="text"
              class="cnm-hex-input"
              id="cnmLine3Color"
              value="#58FF42"
              maxlength="7"
              spellcheck="false"
              aria-label="제목 3줄 HEX 색상"
            >

          </div>

        </div>



        <!-- =========================
             크기 / 그라데이션
        ========================== -->
        <div class="cnm-two-col">


          <!-- 제목 크기 -->
          <div class="cnm-field">

            <div class="cnm-range-head">

              <label>
                제목 글자 크기
              </label>

              <strong id="cnmFontSizeValue">
                72px
              </strong>

            </div>


            <input
              type="range"
              id="cnmFontSize"
              min="48"
              max="100"
              value="72"
            >


            <div class="cnm-range-scale">

              <span>
                48px
              </span>

              <span>
                100px
              </span>

            </div>

          </div>



          <!-- 그라데이션 -->
          <div class="cnm-field">

            <div class="cnm-range-head">

              <label>
                하단 그라데이션
              </label>

              <strong id="cnmGradientValue">
                50%
              </strong>

            </div>


            <input
              type="range"
              id="cnmGradientStrength"
              min="0"
              max="100"
              value="50"
            >


            <div class="cnm-range-scale">

              <span>
                0%
              </span>

              <span>
                100%
              </span>

            </div>

          </div>

        </div>

      </div>



      <!-- 다운로드 -->
      <button
        type="button"
        id="cnmDownloadBtn"
        class="cnm-download"
      >
        PNG 다운로드
      </button>


      <p class="cnm-browser-note">
        이미지는 서버에 업로드되지 않고 브라우저에서 처리됩니다.
      </p>

    </div>

  </div>

</div>



<style>

/* =========================================================
   RESET
========================================================= */

#cardnewsCoverMaker *,
#cardnewsCoverMaker *::before,
#cardnewsCoverMaker *::after {
  box-sizing: border-box;
}



#cardnewsCoverMaker {

  --accent: #16836f;
  --accent-dark: #106b5b;
  --accent-soft: #eef7f4;

  --text: #172629;
  --muted: #748488;

  --border: #dce6e3;
  --border-strong: #cbd9d5;

  --soft: #f7f9f8;

  width: 100%;
  max-width: 1380px;

  margin: 24px auto;

  color: var(--text);

  font-family:
    Arial,
    "Apple SD Gothic Neo",
    "Malgun Gothic",
    sans-serif;

}



/* =========================================================
   HEADER
========================================================= */

#cardnewsCoverMaker .cnm-hero {

  position: relative;

  padding: 32px 40px;

  margin-bottom: 26px;

  overflow: hidden;

  border:
    1px solid #dbe7e3;

  border-radius: 22px;

  background:
    linear-gradient(
      135deg,
      #f2f8f6 0%,
      #f7faf9 100%
    );

}



#cardnewsCoverMaker .cnm-hero::before {

  content: "";

  position: absolute;

  left: 0;
  top: 26px;
  bottom: 26px;

  width: 6px;

  border-radius:
    0 6px 6px 0;

  background:
    var(--accent);

}



#cardnewsCoverMaker .cnm-kicker {

  margin: 0 0 8px;

  padding: 0 !important;

  background: none !important;

  color:
    var(--accent) !important;

  font-size: 13px;

  font-weight: 900;

  letter-spacing: .16em;

}



#cardnewsCoverMaker .cnm-main-title,
#cardnewsCoverMaker .cnm-hero h2,
#cardnewsCoverMaker h2.cnm-main-title {

  display: block !important;

  width: auto !important;

  max-width: none !important;

  margin: 0 !important;

  padding: 0 !important;

  border: 0 !important;

  border-radius: 0 !important;

  outline: 0 !important;

  box-shadow: none !important;

  background: none !important;

  background-color:
    transparent !important;

  background-image:
    none !important;

  color:
    #172629 !important;

  -webkit-text-fill-color:
    #172629 !important;

  -webkit-background-clip:
    initial !important;

  background-clip:
    initial !important;

  font-size:
    36px !important;

  font-weight:
    800 !important;

  line-height:
    1.22 !important;

  letter-spacing:
    -.04em !important;

  text-decoration:
    none !important;

}



#cardnewsCoverMaker .cnm-hero p {

  margin:
    13px 0 0;

  padding: 0;

  color:
    var(--muted);

  font-size: 15px;

  line-height: 1.65;

}



/* =========================================================
   MAIN GRID
========================================================= */

#cardnewsCoverMaker .cnm-main-grid {

  display: grid;

  grid-template-columns:
    minmax(360px, 1.08fr)
    minmax(340px, .92fr);

  gap: 24px;

  align-items: start;

}



#cardnewsCoverMaker .cnm-left-panel,
#cardnewsCoverMaker .cnm-right-panel {

  min-width: 0;

}



#cardnewsCoverMaker .cnm-left-panel {

  padding: 24px;

  border:
    1px solid var(--border);

  border-radius: 22px;

  background: #ffffff;

}



#cardnewsCoverMaker .cnm-right-panel {

  display: flex;

  flex-direction: column;

  gap: 16px;

}



/* =========================================================
   SECTION HEADINGS
========================================================= */

#cardnewsCoverMaker .cnm-panel-heading {

  position: relative;

  margin-bottom: 18px;

  padding:
    15px 18px
    15px 22px;

  overflow: hidden;

  border:
    1px solid #e0ebe7;

  border-radius: 13px;

  background:
    linear-gradient(
      90deg,
      #f0f7f5 0%,
      #f7faf9 100%
    );

}



#cardnewsCoverMaker .cnm-panel-heading::before {

  content: "";

  position: absolute;

  left: 0;
  top: 0;
  bottom: 0;

  width: 5px;

  background:
    var(--accent);

}



#cardnewsCoverMaker .cnm-panel-heading h3 {

  margin: 0 !important;

  padding: 0 !important;

  border: 0 !important;

  background: none !important;

  background-image:
    none !important;

  box-shadow:
    none !important;

  color:
    #19292c !important;

  font-size:
    17px !important;

  font-weight:
    800 !important;

  line-height:
    1.3 !important;

}



#cardnewsCoverMaker .cnm-panel-heading p {

  margin: 5px 0 0;

  padding: 0;

  color:
    var(--muted);

  font-size: 12px;

  line-height: 1.5;

}



/* =========================================================
   TEMPLATE
========================================================= */

#cardnewsCoverMaker .cnm-template-section {

  margin-bottom: 26px;

}



#cardnewsCoverMaker .cnm-template-grid {

  display: grid;

  grid-template-columns:
    repeat(2, minmax(0, 1fr));

  gap: 12px;

}



#cardnewsCoverMaker .cnm-template-card {

  position: relative;

  min-height: 145px;

  padding: 18px;

  appearance: none;

  border:
    1px solid var(--border);

  border-radius: 17px;

  background: #ffffff;

  color:
    var(--text);

  cursor: pointer;

  text-align: left;

  font-family: inherit;

  transition:
    border-color .18s ease,
    background .18s ease,
    box-shadow .18s ease;

}



#cardnewsCoverMaker .cnm-template-card:hover {

  border-color:
    #a9c9c0;

  background:
    #fbfdfc;

}



#cardnewsCoverMaker .cnm-template-card.active {

  border:
    2px solid var(--accent);

  background:
    var(--accent-soft);

  box-shadow:
    0 0 0 2px
    rgba(22,131,111,.05);

}



#cardnewsCoverMaker .cnm-template-check {

  position: absolute;

  top: 14px;
  right: 14px;

  display: none;

  align-items: center;
  justify-content: center;

  width: 28px;
  height: 28px;

  border-radius: 50%;

  background:
    var(--accent);

  color: #ffffff;

  font-size: 15px;

  font-weight: 900;

}



#cardnewsCoverMaker
.cnm-template-card.active
.cnm-template-check {

  display: flex;

}



#cardnewsCoverMaker .cnm-template-icon {

  display: flex;

  width: 70px;
  height: 54px;

  margin-bottom: 14px;

  overflow: hidden;

  border:
    1px solid #cbdad6;

  border-radius: 9px;

  background: #ffffff;

}



#cardnewsCoverMaker .cnm-template-icon span {

  display: block;

  background:
    linear-gradient(
      135deg,
      #d9ece6,
      #bddad2
    );

}



#cardnewsCoverMaker .cnm-icon-single span {

  width: 100%;
  height: 100%;

}



#cardnewsCoverMaker .cnm-icon-double {

  gap: 3px;

}



#cardnewsCoverMaker .cnm-icon-double span {

  flex: 1;

  height: 100%;

}



#cardnewsCoverMaker .cnm-template-name {

  color: #19292c;

  font-size: 15px;

  font-weight: 800;

}



#cardnewsCoverMaker .cnm-template-desc {

  margin-top: 5px;

  color:
    var(--muted);

  font-size: 12px;

}



/* =========================================================
   PREVIEW
========================================================= */

#cardnewsCoverMaker .cnm-preview-section {

  padding-top: 23px;

  border-top:
    1px solid #edf1ef;

}



#cardnewsCoverMaker .cnm-preview-wrap {

  position: relative;

  width:
    min(100%, 540px);

  aspect-ratio: 4 / 5;

  margin: 0 auto;

  overflow: hidden;

  border-radius: 16px;

  background: #111111;

  box-shadow:
    0 0 0 1px
    rgba(0,0,0,.07);

  touch-action: none;

  user-select: none;

  cursor: grab;

}



#cardnewsCoverMaker .cnm-preview-wrap:active {

  cursor: grabbing;

}



#cardnewsCoverMaker canvas {

  display: block;

  width: 100%;
  height: 100%;

}



/* 업로드 안내 */

#cardnewsCoverMaker .cnm-slot-hint {

  position: absolute;

  z-index: 5;

  display: flex;

  align-items: center;
  justify-content: center;

  flex-direction: column;

  gap: 8px;

  color: #ffffff;

  text-align: center;

  pointer-events: none;

  background:
    rgba(0,0,0,.16);

}



#cardnewsCoverMaker .cnm-slot-hint strong {

  font-size: 16px;

}



#cardnewsCoverMaker .cnm-slot-hint span {

  color:
    rgba(255,255,255,.76);

  font-size: 12px;

}



#cardnewsCoverMaker .cnm-upload-icon {

  display: flex;

  align-items: center;
  justify-content: center;

  width: 48px;
  height: 48px;

  border:
    1px solid
    rgba(255,255,255,.22);

  border-radius: 15px;

  background:
    rgba(255,255,255,.15);

  font-size: 29px;

  font-weight: 300;

}



/* =========================================================
   IMAGE EDITOR
========================================================= */

#cardnewsCoverMaker .cnm-image-editor {

  margin-top: 28px;

  padding-top: 24px;

  border-top:
    1px solid #edf1ef;

}



#cardnewsCoverMaker .cnm-image-control {

  padding: 16px;

  border:
    1px solid var(--border);

  border-radius: 15px;

  background:
    var(--soft);

}



#cardnewsCoverMaker
.cnm-image-control +
.cnm-image-control {

  margin-top: 12px;

}



#cardnewsCoverMaker .cnm-image-control-title {

  margin-bottom: 11px;

  color:
    #19292c;

  font-size: 14px;

  font-weight: 800;

}



/* 이미지 선택 + 초기화 */

#cardnewsCoverMaker .cnm-image-action-row {

  display: grid;

  grid-template-columns:
    minmax(0, 1fr)
    minmax(0, 1fr);

  gap: 10px;

  margin-bottom: 14px;

}



#cardnewsCoverMaker .cnm-upload-button {

  display: flex;

  align-items: center;
  justify-content: center;

  width: 100%;

  min-height: 44px;

  margin: 0;

  padding: 9px 12px;

  border:
    1px dashed #a7c7be;

  border-radius: 10px;

  background: #ffffff;

  color:
    var(--accent-dark);

  font-size: 12px;

  font-weight: 800;

  cursor: pointer;

}



#cardnewsCoverMaker .cnm-upload-button:hover {

  background:
    var(--accent-soft);

}



#cardnewsCoverMaker .cnm-upload-button input {

  display: none;

}



#cardnewsCoverMaker .cnm-reset-btn {

  display: flex;

  align-items: center;
  justify-content: center;

  width: 100%;

  min-height: 44px;

  padding: 9px 12px;

  border:
    1px solid
    var(--border-strong);

  border-radius: 10px;

  background: #ffffff;

  color: #46575a;

  font-family: inherit;

  font-size: 12px;

  font-weight: 700;

  cursor: pointer;

}



#cardnewsCoverMaker .cnm-reset-btn:hover {

  background:
    #f1f6f4;

}



#cardnewsCoverMaker .cnm-hidden {

  display: none !important;

}



/* =========================================================
   RANGE
========================================================= */

#cardnewsCoverMaker .cnm-range-block {

  margin: 0;

}



#cardnewsCoverMaker .cnm-range-head {

  display: flex;

  align-items: center;
  justify-content: space-between;

  gap: 12px;

  margin-bottom: 7px;

}



#cardnewsCoverMaker .cnm-range-head label,
#cardnewsCoverMaker .cnm-range-head span {

  margin: 0;

  color:
    #263639;

  font-size: 13px;

  font-weight: 700;

}



#cardnewsCoverMaker .cnm-range-head strong {

  color:
    var(--accent);

  font-size: 12px;

  font-weight: 800;

}



#cardnewsCoverMaker input[type="range"] {

  display: block;

  width: 100%;

  margin: 0;

  accent-color:
    var(--accent);

  cursor: pointer;

}



#cardnewsCoverMaker .cnm-range-scale {

  display: flex;

  align-items: center;
  justify-content: space-between;

  margin-top: 4px;

  color: #9aa6a8;

  font-size: 10px;

}



/* =========================================================
   TEXT EDITOR
========================================================= */

#cardnewsCoverMaker .cnm-text-editor {

  padding: 24px;

  border:
    1px solid var(--border);

  border-radius: 22px;

  background: #ffffff;

}



#cardnewsCoverMaker .cnm-field {

  margin-bottom: 19px;

}



#cardnewsCoverMaker .cnm-field:last-child {

  margin-bottom: 0;

}



#cardnewsCoverMaker .cnm-field > label,
#cardnewsCoverMaker .cnm-field-head > label {

  display: block;

  margin:
    0 0 8px;

  color:
    #263639;

  font-size: 13px;

  font-weight: 800;

}



#cardnewsCoverMaker .cnm-field-head {

  display: flex;

  align-items: center;
  justify-content: space-between;

  gap: 10px;

}



#cardnewsCoverMaker .cnm-mini-check {

  display: flex;

  align-items: center;

  gap: 5px;

  margin-bottom: 8px;

  color:
    var(--muted);

  font-size: 12px;

  font-weight: 700;

  cursor: pointer;

}



/* 텍스트 입력 */

#cardnewsCoverMaker input[type="text"] {

  width: 100%;

  min-width: 0;

  height: 44px;

  padding:
    0 13px;

  border:
    1px solid
    var(--border-strong);

  border-radius: 10px;

  outline: none;

  background:
    #ffffff !important;

  background-image:
    none !important;

  color:
    var(--text);

  font-family: inherit;

  font-size: 13px;

}



#cardnewsCoverMaker input[type="text"]:focus {

  border-color:
    var(--accent);

  box-shadow:
    0 0 0 3px
    rgba(22,131,111,.08);

}



/* =========================================================
   HEX COLOR
========================================================= */

#cardnewsCoverMaker .cnm-color-control {

  display: grid;

  grid-template-columns:
    48px 110px;

  justify-content: end;

  gap: 8px;

  margin-top: 8px;

}



#cardnewsCoverMaker
.cnm-color-control
input[type="color"] {

  width: 48px;
  height: 40px;

  padding: 3px;

  border:
    1px solid
    var(--border-strong);

  border-radius: 9px;

  background:
    #ffffff;

  cursor: pointer;

}



#cardnewsCoverMaker
.cnm-color-control
.cnm-hex-input {

  width: 110px;

  height: 40px;

  padding:
    0 10px;

  font-family:
    Consolas,
    "Courier New",
    monospace;

  font-size: 12px;

  text-transform:
    uppercase;

}



/* =========================================================
   TWO COLUMN
========================================================= */

#cardnewsCoverMaker .cnm-two-col {

  display: grid;

  grid-template-columns:
    minmax(0, 1fr)
    minmax(0, 1fr);

  gap: 15px;

}



/* =========================================================
   DIVIDER
========================================================= */

#cardnewsCoverMaker .cnm-divider {

  height: 1px;

  margin:
    23px 0;

  background:
    #edf1ef;

}



/* =========================================================
   DOWNLOAD
========================================================= */

#cardnewsCoverMaker .cnm-download {

  width: 100%;

  min-height: 54px;

  padding:
    12px 18px;

  border: none;

  border-radius: 13px;

  background:
    var(--accent);

  color: #ffffff;

  font-family: inherit;

  font-size: 15px;

  font-weight: 900;

  cursor: pointer;

  transition:
    background .18s ease,
    transform .18s ease;

}



#cardnewsCoverMaker .cnm-download:hover {

  background:
    var(--accent-dark);

}



#cardnewsCoverMaker .cnm-download:active {

  transform:
    translateY(1px);

}



#cardnewsCoverMaker .cnm-browser-note {

  margin:
    -4px 0 0;

  color:
    var(--muted);

  text-align: center;

  font-size: 11px;

}



/* =========================================================
   TABLET
========================================================= */

@media (max-width: 960px) {

  #cardnewsCoverMaker .cnm-main-grid {

    grid-template-columns:
      1fr;

  }


  #cardnewsCoverMaker .cnm-preview-wrap {

    max-width:
      540px;

  }

}



/* =========================================================
   MOBILE
========================================================= */

@media (max-width: 650px) {

  #cardnewsCoverMaker {

    margin:
      16px 0;

  }


  #cardnewsCoverMaker .cnm-hero {

    padding:
      24px 22px;

  }


  #cardnewsCoverMaker .cnm-main-title,
  #cardnewsCoverMaker .cnm-hero h2 {

    font-size:
      28px !important;

  }


  #cardnewsCoverMaker .cnm-left-panel,
  #cardnewsCoverMaker .cnm-text-editor {

    padding:
      17px;

    border-radius:
      17px;

  }


  #cardnewsCoverMaker .cnm-template-card {

    min-height:
      138px;

    padding:
      15px;

  }


  #cardnewsCoverMaker .cnm-image-action-row {

    grid-template-columns:
      1fr;

    gap: 7px;

  }


  #cardnewsCoverMaker .cnm-two-col {

    grid-template-columns:
      1fr;

  }


  #cardnewsCoverMaker .cnm-color-control {

    grid-template-columns:
      48px 105px;

  }


  #cardnewsCoverMaker
  .cnm-color-control
  .cnm-hex-input {

    width: 105px;

  }

}

</style>



<script>

(function () {

  const root =
    document.getElementById(
      'cardnewsCoverMaker'
    );

  if (!root) return;



  /* ======================================================
     DOM
  ====================================================== */

  const canvas =
    root.querySelector(
      '#cnmCanvas'
    );


  const ctx =
    canvas.getContext(
      '2d'
    );


  const previewWrap =
    root.querySelector(
      '#cnmPreviewWrap'
    );


  const templateCards =
    root.querySelectorAll(
      '.cnm-template-card'
    );


  const slot1Hint =
    root.querySelector(
      '#cnmSlot1Hint'
    );


  const slot2Hint =
    root.querySelector(
      '#cnmSlot2Hint'
    );



  /* 이미지 */

  const imageInput1 =
    root.querySelector(
      '#cnmImageInput1'
    );


  const imageInput2 =
    root.querySelector(
      '#cnmImageInput2'
    );


  const image2Card =
    root.querySelector(
      '#cnmImage2Card'
    );


  const image1Title =
    root.querySelector(
      '#cnmImage1Title'
    );



  /* 줌 */

  const zoom1 =
    root.querySelector(
      '#cnmZoom1'
    );


  const zoom2 =
    root.querySelector(
      '#cnmZoom2'
    );


  const zoom1Value =
    root.querySelector(
      '#cnmZoom1Value'
    );


  const zoom2Value =
    root.querySelector(
      '#cnmZoom2Value'
    );


  const reset1 =
    root.querySelector(
      '#cnmReset1'
    );


  const reset2 =
    root.querySelector(
      '#cnmReset2'
    );



  /* 상단 */

  const topToggle =
    root.querySelector(
      '#cnmTopToggle'
    );


  const topText =
    root.querySelector(
      '#cnmTopText'
    );



  /* 라벨 */

  const midLabel =
    root.querySelector(
      '#cnmMidLabel'
    );


  const midLineLength =
    root.querySelector(
      '#cnmMidLineLength'
    );


  const midLineValue =
    root.querySelector(
      '#cnmMidLineValue'
    );



  /* 제목 */

  const line1 =
    root.querySelector(
      '#cnmLine1'
    );


  const line2 =
    root.querySelector(
      '#cnmLine2'
    );


  const line3 =
    root.querySelector(
      '#cnmLine3'
    );



  /* 제목 크기 */

  const fontSizeInput =
    root.querySelector(
      '#cnmFontSize'
    );


  const fontSizeValue =
    root.querySelector(
      '#cnmFontSizeValue'
    );



  /* 그라데이션 */

  const gradientStrength =
    root.querySelector(
      '#cnmGradientStrength'
    );


  const gradientValue =
    root.querySelector(
      '#cnmGradientValue'
    );



  /* 다운로드 */

  const downloadBtn =
    root.querySelector(
      '#cnmDownloadBtn'
    );



  /* ======================================================
     HEX COLOR
  ====================================================== */

  function validHex(
    value
  ) {

    return (
      /^#[0-9A-F]{6}$/i
    ).test(
      value
    );

  }



  function normalizeHex(
    value
  ) {

    let result =
      String(
        value || ''
      ).trim();


    if (
      result &&
      result.charAt(0) !== '#'
    ) {

      result =
        '#' +
        result;

    }


    return result.toUpperCase();

  }



  function setupHexColor(
    pickerId,
    textId
  ) {

    const picker =
      root.querySelector(
        '#' + pickerId
      );


    const text =
      root.querySelector(
        '#' + textId
      );


    if (
      !picker ||
      !text
    ) {
      return;
    }


    picker.addEventListener(
      'input',
      function () {

        text.value =
          picker.value
            .toUpperCase();


        draw();

      }
    );


    text.addEventListener(
      'input',
      function () {

        const value =
          normalizeHex(
            text.value
          );


        if (
          validHex(
            value
          )
        ) {

          text.value =
            value;


          picker.value =
            value
              .toLowerCase();


          draw();

        }

      }
    );


    text.addEventListener(
      'blur',
      function () {

        const value =
          normalizeHex(
            text.value
          );


        if (
          validHex(
            value
          )
        ) {

          text.value =
            value;


          picker.value =
            value
              .toLowerCase();

        } else {

          text.value =
            picker.value
              .toUpperCase();

        }


        draw();

      }
    );

  }



  setupHexColor(
    'cnmTopColorPicker',
    'cnmTopColor'
  );


  setupHexColor(
    'cnmMidColorPicker',
    'cnmMidColor'
  );


  setupHexColor(
    'cnmLine1ColorPicker',
    'cnmLine1Color'
  );


  setupHexColor(
    'cnmLine2ColorPicker',
    'cnmLine2Color'
  );


  setupHexColor(
    'cnmLine3ColorPicker',
    'cnmLine3Color'
  );



  const topColor =
    root.querySelector(
      '#cnmTopColor'
    );


  const midColor =
    root.querySelector(
      '#cnmMidColor'
    );


  const line1Color =
    root.querySelector(
      '#cnmLine1Color'
    );


  const line2Color =
    root.querySelector(
      '#cnmLine2Color'
    );


  const line3Color =
    root.querySelector(
      '#cnmLine3Color'
    );



  /* ======================================================
     STATE
  ====================================================== */

  let template =
    'single';


  const images = [
    null,
    null
  ];


  const transforms = [

    {
      zoom: 1,
      x: 0,
      y: 0
    },

    {
      zoom: 1,
      x: 0,
      y: 0
    }

  ];



  /* ======================================================
     SLOTS
  ====================================================== */

  function getSlots() {

    const W =
      canvas.width;


    const H =
      canvas.height;


    if (
      template ===
      'horizontal'
    ) {

      return [

        {
          index: 0,

          x: 0,
          y: 0,

          w:
            W / 2,

          h:
            H
        },


        {
          index: 1,

          x:
            W / 2,

          y: 0,

          w:
            W / 2,

          h:
            H
        }

      ];

    }


    return [

      {
        index: 0,

        x: 0,
        y: 0,

        w: W,
        h: H
      }

    ];

  }



  /* ======================================================
     EMPTY SLOT
  ====================================================== */

  function drawEmptySlot(
    slot
  ) {

    const grad =
      ctx.createLinearGradient(

        slot.x,
        slot.y,

        slot.x,
        slot.y +
        slot.h

      );


    grad.addColorStop(
      0,
      '#394146'
    );


    grad.addColorStop(
      1,
      '#171b1e'
    );


    ctx.fillStyle =
      grad;


    ctx.fillRect(

      slot.x,
      slot.y,

      slot.w,
      slot.h

    );

  }



  /* ======================================================
     CLAMP IMAGE
  ====================================================== */

  function clampTransform(
    index,
    slot
  ) {

    const img =
      images[index];


    if (!img) return;


    const transform =
      transforms[index];


    const baseScale =
      Math.max(

        slot.w /
        img.width,

        slot.h /
        img.height

      );


    const drawW =
      img.width *
      baseScale *
      transform.zoom;


    const drawH =
      img.height *
      baseScale *
      transform.zoom;


    const maxX =
      Math.max(

        0,

        (
          drawW -
          slot.w
        ) /
        2

      );


    const maxY =
      Math.max(

        0,

        (
          drawH -
          slot.h
        ) /
        2

      );


    transform.x =
      Math.max(

        -maxX,

        Math.min(
          maxX,
          transform.x
        )

      );


    transform.y =
      Math.max(

        -maxY,

        Math.min(
          maxY,
          transform.y
        )

      );

  }



  /* ======================================================
     DRAW IMAGE SLOT
  ====================================================== */

  function drawImageSlot(
    img,
    slot,
    transform
  ) {

    const baseScale =
      Math.max(

        slot.w /
        img.width,

        slot.h /
        img.height

      );


    const scale =
      baseScale *
      transform.zoom;


    const drawW =
      img.width *
      scale;


    const drawH =
      img.height *
      scale;


    const drawX =
      slot.x +
      (
        slot.w -
        drawW
      ) /
      2 +
      transform.x;


    const drawY =
      slot.y +
      (
        slot.h -
        drawH
      ) /
      2 +
      transform.y;


    ctx.save();


    ctx.beginPath();


    ctx.rect(

      slot.x,
      slot.y,

      slot.w,
      slot.h

    );


    ctx.clip();


    ctx.drawImage(

      img,

      drawX,
      drawY,

      drawW,
      drawH

    );


    ctx.restore();

  }



  /* ======================================================
     UPLOAD HINT
  ====================================================== */

  function updateHints() {

    if (
      template ===
      'single'
    ) {

      slot1Hint.style.left =
        '0';


      slot1Hint.style.top =
        '0';


      slot1Hint.style.width =
        '100%';


      slot1Hint.style.height =
        '100%';


      slot1Hint.style.display =
        images[0]
          ? 'none'
          : 'flex';


      slot2Hint.style.display =
        'none';


      return;

    }



    slot1Hint.style.left =
      '0';


    slot1Hint.style.top =
      '0';


    slot1Hint.style.width =
      '50%';


    slot1Hint.style.height =
      '100%';



    slot2Hint.style.left =
      '50%';


    slot2Hint.style.top =
      '0';


    slot2Hint.style.width =
      '50%';


    slot2Hint.style.height =
      '100%';



    slot1Hint.style.display =
      images[0]
        ? 'none'
        : 'flex';


    slot2Hint.style.display =
      images[1]
        ? 'none'
        : 'flex';

  }



  /* ======================================================
     GRADIENT

     50% = 이전 버전의 약 100% 수준

     0%   = 절반 수준
     50%  = 기존 기본 강도
     100% = 더 강함
  ====================================================== */

  function gradientAlpha(
    base,
    value
  ) {

    const multiplier =
      0.5 +
      (
        value /
        100
      );


    return Math.min(

      1,

      base *
      multiplier

    ).toFixed(3);

  }



  /* ======================================================
     DRAW
  ====================================================== */

  function draw() {

    const W =
      canvas.width;


    const H =
      canvas.height;


    /*
      1080 × 1350 안에서
      가운데 1080 × 1080 영역
    */

    const safeTop =
      (
        H -
        W
      ) /
      2;


    const safeBottom =
      H -
      safeTop;


    const pad =
      46;


    ctx.clearRect(
      0,
      0,
      W,
      H
    );


    const slots =
      getSlots();



    /* 이미지 */

    slots.forEach(
      function (
        slot
      ) {

        const img =
          images[
            slot.index
          ];


        if (img) {

          clampTransform(
            slot.index,
            slot
          );


          drawImageSlot(

            img,

            slot,

            transforms[
              slot.index
            ]

          );

        } else {

          drawEmptySlot(
            slot
          );

        }

      }
    );



    /* 2장 중앙 구분선 */

    if (
      template ===
      'horizontal'
    ) {

      ctx.save();


      ctx.strokeStyle =
        'rgba(255,255,255,.35)';


      ctx.lineWidth =
        2;


      ctx.beginPath();


      ctx.moveTo(
        W / 2,
        0
      );


      ctx.lineTo(
        W / 2,
        H
      );


      ctx.stroke();


      ctx.restore();

    }



    /* ==================================================
       하단 그라데이션
    ================================================== */

    const gradientLevel =
      parseInt(
        gradientStrength.value,
        10
      );


    const gradient =
      ctx.createLinearGradient(

        0,
        H * .28,

        0,
        H

      );


    gradient.addColorStop(
      0,
      'rgba(0,0,0,0)'
    );


    gradient.addColorStop(

      .20,

      'rgba(0,0,0,' +

      gradientAlpha(
        .10,
        gradientLevel
      ) +

      ')'

    );


    gradient.addColorStop(

      .42,

      'rgba(0,0,0,' +

      gradientAlpha(
        .32,
        gradientLevel
      ) +

      ')'

    );


    gradient.addColorStop(

      .64,

      'rgba(0,0,0,' +

      gradientAlpha(
        .63,
        gradientLevel
      ) +

      ')'

    );


    gradient.addColorStop(

      .82,

      'rgba(0,0,0,' +

      gradientAlpha(
        .84,
        gradientLevel
      ) +

      ')'

    );


    gradient.addColorStop(

      1,

      'rgba(0,0,0,' +

      gradientAlpha(
        .98,
        gradientLevel
      ) +

      ')'

    );


    ctx.fillStyle =
      gradient;


    ctx.fillRect(
      0,
      0,
      W,
      H
    );



    /* ==================================================
       상단 핸들
    ================================================== */

    if (
      topToggle.checked &&
      topText.value.trim()
    ) {

      ctx.save();


      ctx.font =
        '700 32px Arial, "Apple SD Gothic Neo", sans-serif';


      ctx.fillStyle =
        validHex(
          topColor.value
        )
          ? topColor.value
          : '#FFFFFF';


      ctx.textAlign =
        'center';


      ctx.textBaseline =
        'top';


      ctx.shadowColor =
        'rgba(0,0,0,.50)';


      ctx.shadowBlur =
        10;


      ctx.fillText(

        topText.value.trim(),

        W / 2,

        safeTop +
        18

      );


      ctx.restore();

    }



    /* ==================================================
       제목 데이터
    ================================================== */

    const titleData =
      [];


    if (
      line1.value.trim()
    ) {

      titleData.push({

        text:
          line1.value.trim(),

        color:
          validHex(
            line1Color.value
          )
            ? line1Color.value
            : '#FFFFFF'

      });

    }


    if (
      line2.value.trim()
    ) {

      titleData.push({

        text:
          line2.value.trim(),

        color:
          validHex(
            line2Color.value
          )
            ? line2Color.value
            : '#FFFFFF'

      });

    }


    if (
      line3.value.trim()
    ) {

      titleData.push({

        text:
          line3.value.trim(),

        color:
          validHex(
            line3Color.value
          )
            ? line3Color.value
            : '#58FF42'

      });

    }



    const fontSize =
      parseInt(
        fontSizeInput.value,
        10
      );


    const lineHeight =
      Math.round(
        fontSize *
        1.08
      );


    const titleBottomBaseline =
      safeBottom -
      60;


    const titleCount =
      Math.max(
        titleData.length,
        1
      );


    const firstBaseline =
      titleBottomBaseline -
      (
        lineHeight *
        (
          titleCount -
          1
        )
      );



    /* ==================================================
       중간 라벨 + 흰 선
    ================================================== */

    const labelText =
      midLabel.value.trim() ||
      'SNSnote.com';


    ctx.save();


    ctx.font =
      '800 30px Arial, "Apple SD Gothic Neo", sans-serif';


    const labelWidth =
      ctx.measureText(
        labelText
      ).width;


    const lineY =
      firstBaseline -
      102;


    let lineLength =
      parseInt(
        midLineLength.value,
        10
      );


    const maxLineLength =
      Math.max(

        40,

        W -
        (
          pad *
          2
        ) -
        labelWidth -
        20

      );


    lineLength =
      Math.min(
        lineLength,
        maxLineLength
      );


    const lineEndX =
      pad +
      lineLength;


    const labelX =
      lineEndX +
      16;



    /* 흰 선 */

    ctx.strokeStyle =
      'rgba(255,255,255,.96)';


    ctx.lineWidth =
      2;


    ctx.beginPath();


    ctx.moveTo(
      pad,
      lineY
    );


    ctx.lineTo(
      lineEndX,
      lineY
    );


    ctx.stroke();



    /* 라벨 */

    ctx.fillStyle =
      validHex(
        midColor.value
      )
        ? midColor.value
        : '#FF2B2B';


    ctx.textAlign =
      'left';


    ctx.textBaseline =
      'middle';


    ctx.shadowColor =
      'rgba(0,0,0,.35)';


    ctx.shadowBlur =
      6;


    ctx.fillText(

      labelText,

      labelX,
      lineY

    );


    ctx.restore();



    /* ==================================================
       제목 출력
    ================================================== */

    ctx.save();


    ctx.font =
      '900 ' +
      fontSize +
      'px Arial, "Apple SD Gothic Neo", "Malgun Gothic", sans-serif';


    ctx.textAlign =
      'left';


    ctx.textBaseline =
      'alphabetic';


    ctx.shadowColor =
      'rgba(0,0,0,.62)';


    ctx.shadowBlur =
      14;


    titleData.forEach(
      function (
        item,
        index
      ) {

        ctx.fillStyle =
          item.color;


        ctx.fillText(

          item.text,

          pad,

          firstBaseline +
          (
            lineHeight *
            index
          )

        );

      }
    );


    ctx.restore();



    updateHints();

  }



  /* ======================================================
     LOAD IMAGE
  ====================================================== */

  function loadImage(
    file,
    index
  ) {

    if (!file) return;


    const reader =
      new FileReader();


    reader.onload =
      function (
        event
      ) {

        const img =
          new Image();


        img.onload =
          function () {

            images[index] =
              img;


            transforms[index] = {

              zoom: 1,

              x: 0,

              y: 0

            };


            if (
              index ===
              0
            ) {

              zoom1.value =
                100;


              zoom1Value.textContent =
                '100%';

            } else {

              zoom2.value =
                100;


              zoom2Value.textContent =
                '100%';

            }


            draw();

          };


        img.src =
          event.target.result;

      };


    reader.readAsDataURL(
      file
    );

  }



  imageInput1.addEventListener(
    'change',
    function () {

      loadImage(
        this.files &&
        this.files[0],
        0
      );

    }
  );



  imageInput2.addEventListener(
    'change',
    function () {

      loadImage(
        this.files &&
        this.files[0],
        1
      );

    }
  );



  /* ======================================================
     TEMPLATE
  ====================================================== */

  templateCards.forEach(
    function (
      card
    ) {

      card.addEventListener(
        'click',
        function () {

          template =
            card.dataset.template;


          templateCards.forEach(
            function (
              item
            ) {

              item.classList.remove(
                'active'
              );

            }
          );


          card.classList.add(
            'active'
          );


          if (
            template ===
            'horizontal'
          ) {

            image2Card.classList.remove(
              'cnm-hidden'
            );


            image1Title.textContent =
              '이미지 1 · 왼쪽';

          } else {

            image2Card.classList.add(
              'cnm-hidden'
            );


            image1Title.textContent =
              '이미지';

          }


          draw();

        }
      );

    }
  );



  /* ======================================================
     ZOOM
  ====================================================== */

  zoom1.addEventListener(
    'input',
    function () {

      const value =
        parseInt(
          this.value,
          10
        );


      transforms[0].zoom =
        value /
        100;


      zoom1Value.textContent =
        value +
        '%';


      draw();

    }
  );



  zoom2.addEventListener(
    'input',
    function () {

      const value =
        parseInt(
          this.value,
          10
        );


      transforms[1].zoom =
        value /
        100;


      zoom2Value.textContent =
        value +
        '%';


      draw();

    }
  );



  /* ======================================================
     RESET
  ====================================================== */

  reset1.addEventListener(
    'click',
    function () {

      transforms[0] = {

        zoom: 1,

        x: 0,

        y: 0

      };


      zoom1.value =
        100;


      zoom1Value.textContent =
        '100%';


      draw();

    }
  );



  reset2.addEventListener(
    'click',
    function () {

      transforms[1] = {

        zoom: 1,

        x: 0,

        y: 0

      };


      zoom2.value =
        100;


      zoom2Value.textContent =
        '100%';


      draw();

    }
  );



  /* ======================================================
     POINTER -> CANVAS
  ====================================================== */

  function pointerToCanvas(
    clientX,
    clientY
  ) {

    const rect =
      canvas.getBoundingClientRect();


    return {

      x:
        (
          clientX -
          rect.left
        ) *
        (
          canvas.width /
          rect.width
        ),


      y:
        (
          clientY -
          rect.top
        ) *
        (
          canvas.height /
          rect.height
        )

    };

  }



  function getSlotAtPoint(
    x,
    y
  ) {

    const slots =
      getSlots();


    for (
      let i = 0;
      i < slots.length;
      i++
    ) {

      const slot =
        slots[i];


      if (

        x >=
        slot.x &&

        x <=
        slot.x +
        slot.w &&

        y >=
        slot.y &&

        y <=
        slot.y +
        slot.h

      ) {

        return slot;

      }

    }


    return null;

  }



  /* ======================================================
     DRAG
  ====================================================== */

  let dragState =
    null;



  previewWrap.addEventListener(
    'pointerdown',
    function (
      event
    ) {

      const point =
        pointerToCanvas(

          event.clientX,

          event.clientY

        );


      const slot =
        getSlotAtPoint(

          point.x,

          point.y

        );


      if (!slot) return;


      dragState = {

        pointerId:
          event.pointerId,

        slot:
          slot,

        startX:
          point.x,

        startY:
          point.y,

        originalX:
          transforms[
            slot.index
          ].x,

        originalY:
          transforms[
            slot.index
          ].y,

        moved:
          false

      };


      try {

        previewWrap.setPointerCapture(
          event.pointerId
        );

      } catch (e) {}


      event.preventDefault();

    }
  );



  previewWrap.addEventListener(
    'pointermove',
    function (
      event
    ) {

      if (!dragState) return;


      if (
        dragState.pointerId !==
        event.pointerId
      ) {
        return;
      }


      const index =
        dragState.slot.index;


      if (
        !images[index]
      ) {
        return;
      }


      const point =
        pointerToCanvas(

          event.clientX,

          event.clientY

        );


      const dx =
        point.x -
        dragState.startX;


      const dy =
        point.y -
        dragState.startY;


      if (

        Math.abs(dx) >
        3 ||

        Math.abs(dy) >
        3

      ) {

        dragState.moved =
          true;

      }


      transforms[index].x =
        dragState.originalX +
        dx;


      transforms[index].y =
        dragState.originalY +
        dy;


      clampTransform(
        index,
        dragState.slot
      );


      draw();


      event.preventDefault();

    }
  );



  function finishPointer(
    event
  ) {

    if (!dragState) return;


    if (
      dragState.pointerId !==
      event.pointerId
    ) {
      return;
    }


    const index =
      dragState.slot.index;



    /*
      빈 슬롯 클릭 시
      해당 이미지 파일 선택창
    */

    if (

      !dragState.moved &&

      !images[index]

    ) {

      if (
        index ===
        0
      ) {

        imageInput1.click();

      } else {

        imageInput2.click();

      }

    }


    try {

      previewWrap.releasePointerCapture(
        event.pointerId
      );

    } catch (e) {}


    dragState =
      null;

  }



  previewWrap.addEventListener(
    'pointerup',
    finishPointer
  );



  previewWrap.addEventListener(
    'pointercancel',
    function () {

      dragState =
        null;

    }
  );



  /* ======================================================
     RANGE VALUE
  ====================================================== */

  midLineLength.addEventListener(
    'input',
    function () {

      midLineValue.textContent =
        this.value +
        'px';


      draw();

    }
  );



  fontSizeInput.addEventListener(
    'input',
    function () {

      fontSizeValue.textContent =
        this.value +
        'px';


      draw();

    }
  );



  gradientStrength.addEventListener(
    'input',
    function () {

      gradientValue.textContent =
        this.value +
        '%';


      draw();

    }
  );



  /* ======================================================
     TEXT REALTIME
  ====================================================== */

  [

    topToggle,
    topText,

    midLabel,

    line1,
    line2,
    line3

  ].forEach(
    function (
      element
    ) {

      element.addEventListener(
        'input',
        draw
      );


      element.addEventListener(
        'change',
        draw
      );

    }
  );



  /* ======================================================
     DOWNLOAD
  ====================================================== */

  downloadBtn.addEventListener(
    'click',
    function () {

      draw();


      const link =
        document.createElement(
          'a'
        );


      link.download =
        'cardnews-cover-1080x1350.png';


      link.href =
        canvas.toDataURL(
          'image/png'
        );


      link.click();

    }
  );



  /* 최초 실행 */

  draw();

})();

</script>



<h2 class="wp-block-heading">인스타 수익화 카드뉴스 만들기, 사진 한 장이면 충분합니다</h2>



<p class="wp-block-paragraph">인스타그램에서 정보형 콘텐츠나 수익화 콘텐츠를 운영하다 보면 사진 위에 큰 제목을 넣은 <strong>카드뉴스 형식</strong>을 자주 사용하게 됩니다. 하지만 카드뉴스 한 장을 만들기 위해 매번 디자인 프로그램이나 앱을 실행하고, 글자 위치와 그라데이션을 직접 맞추는 과정은 생각보다 번거롭습니다.</p>



<p class="wp-block-paragraph">이 페이지의 <strong>인스타 카드뉴스 만들기 무료 도구</strong>를 이용하면 사진 한 장을 업로드한 뒤 제목과 핸들만 입력해 카드뉴스 이미지를 빠르게 제작할 수 있습니다.</p>



<p class="wp-block-paragraph">별도의 프로그램을 설치하거나 회원가입할 필요가 없으며, 브라우저에서 바로 사용할 수 있습니다.</p>



<p class="wp-block-paragraph">현재 기본 템플릿은 인스타그램 피드에서 많이 사용하는 4:5 세로 비율(1080×1350)을 기준으로 제작되며, 공유 화면이나 썸네일에서 중요한 내용이 잘리지 않도록 <strong>1:1 안전영역 가이드</strong>도 함께 확인할 수 있습니다.</p>



<h2 class="wp-block-heading">인스타 카드뉴스 무료 템플릿 주요 기능</h2>



<p class="wp-block-paragraph">사진을 업로드하면 하단에 자연스러운 검정 그라데이션이 적용되어 밝은 사진에서도 제목을 선명하게 표시할 수 있습니다.</p>



<p class="wp-block-paragraph">제목은 최대 3줄까지 직접 입력할 수 있으며, 글자 크기와 색상도 조절할 수 있습니다. 카드뉴스 상단에는 계정 이름이나 인스타 핸들을 넣을 수 있고, 제목 위에는 흰색 구분선과 함께 브랜드명이나 채널명을 표시할 수 있습니다.</p>



<p class="wp-block-paragraph">특히 카드뉴스를 인스타그램에 올린 뒤 프로필이나 공유 화면에서 1:1 비율로 잘려 보이는 상황을 고려해 주요 문구가 안전영역 안에 배치되도록 구성했습니다.</p>



<p class="wp-block-paragraph">완성된 이미지는 <strong>PNG 파일로 바로 저장</strong>할 수 있습니다.</p>



<h2 class="wp-block-heading">카드뉴스 만드는 방법</h2>



<ol start="1" class="wp-block-list">
<li>왼쪽 카드뉴스 미리보기 영역을 클릭해 사용할 사진을 선택합니다.</li>



<li>상단 핸들 또는 로고 문구에 자신의 인스타 계정명이나 브랜드명을 입력합니다.</li>



<li>제목 1줄, 2줄, 3줄에 카드뉴스에서 보여줄 문구를 입력합니다.</li>



<li>제목 위에 표시되는 중간 라벨에는 채널명이나 브랜드명을 입력합니다.</li>



<li>글자 색상과 크기, 하단 그라데이션 강도를 원하는 스타일로 조절합니다.</li>



<li>점선으로 표시된 <strong>1:1 안전영역</strong> 안에 중요한 제목이 들어오는지 확인합니다.</li>



<li>작업이 끝나면 <strong>PNG 다운로드</strong> 버튼을 눌러 이미지를 저장합니다.</li>
</ol>



<p class="wp-block-paragraph">별도의 디자인 프로그램을 사용할 필요 없이 사진과 문구만 준비하면 바로 카드뉴스를 만들 수 있습니다.</p>



<h2 class="wp-block-heading">왜 4:5 비율로 제작되나요?</h2>



<p class="wp-block-paragraph">인스타그램 피드에서는 세로 공간을 넓게 사용할 수 있는 <strong>4:5 비율의 이미지</strong>가 카드뉴스 제작에 많이 사용됩니다.</p>



<p class="wp-block-paragraph">이 도구는 기본적으로 <strong>1080×1350 크기</strong>로 이미지를 제작합니다.</p>



<p class="wp-block-paragraph">다만 카드뉴스가 다른 화면에서 표시되거나 정사각형 형태로 잘릴 경우 이미지의 위아래 일부가 보이지 않을 수 있습니다. 그래서 편집 화면에 <strong>1:1 안전영역</strong>을 별도로 표시해 제목과 계정명 같은 중요한 내용을 안전한 범위 안에 배치할 수 있도록 했습니다.</p>



<p class="wp-block-paragraph">안전영역 점선은 편집할 때만 보이며 다운로드한 최종 이미지에는 포함되지 않습니다.</p>



<h2 class="wp-block-heading">밝은 사진에서도 제목이 잘 보이도록</h2>



<p class="wp-block-paragraph">카드뉴스에 흰색 제목을 사용하는 경우 배경 사진이 밝으면 글자가 잘 보이지 않을 수 있습니다.</p>



<p class="wp-block-paragraph">이 도구는 이미지 하단에 검정색 그라데이션을 자동으로 추가하며, 사용자가 직접 <strong>그라데이션 강도</strong>를 조절할 수 있습니다.</p>



<p class="wp-block-paragraph">인물 사진이나 풍경 사진처럼 배경 색상이 복잡한 이미지에서도 제목 영역을 어둡게 만들어 문구의 가독성을 높일 수 있습니다.</p>



<h2 class="wp-block-heading">인스타 수익화 콘텐츠뿐 아니라 다양하게 활용할 수 있습니다</h2>



<p class="wp-block-paragraph">이 도구는 인스타 수익화 콘텐츠를 빠르게 제작하기 위해 만들었지만 반드시 인스타그램에서만 사용할 필요는 없습니다.</p>



<p class="wp-block-paragraph">완성한 카드뉴스는 <strong>Threads, X, 블로그, 커뮤니티 등 이미지 게시물을 지원하는 다양한 플랫폼</strong>에서도 사용할 수 있습니다.</p>



<p class="wp-block-paragraph">뉴스 요약, 후기, 정보성 콘텐츠, 제품 소개, 사건 정리, 연예·스포츠 콘텐츠처럼 사진 위에 강한 제목이 필요한 게시물을 만들 때 활용하기 좋습니다.</p>



<p class="wp-block-paragraph">특히 여러 게시물을 같은 디자인으로 제작하면 계정 전체의 카드뉴스 스타일을 일정하게 유지하는 데도 도움이 됩니다.</p>



<h2 class="wp-block-heading">설치와 회원가입 없이 사용할 수 있습니다</h2>



<p class="wp-block-paragraph">이 카드뉴스 제작 도구는 별도의 프로그램이나 앱을 설치할 필요가 없습니다.</p>



<p class="wp-block-paragraph">페이지에서 바로 이미지를 선택하고 문구를 입력한 뒤 결과물을 저장할 수 있습니다.</p>



<p class="wp-block-paragraph">또한 현재 버전은 이미지 편집이 사용자의 브라우저에서 처리되기 때문에 선택한 사진을 카드뉴스 제작을 위해 별도 서버에 업로드하거나 저장하지 않습니다.</p>



<p class="wp-block-paragraph">개인 사진이나 작업용 이미지를 간단하게 편집하고 싶을 때도 부담 없이 사용할 수 있습니다.</p>



<h2 class="wp-block-heading">자주 묻는 질문 FAQ</h2>



<p class="wp-block-paragraph"><strong>Q. 카드뉴스 만들기는 무료인가요?</strong><br>네. 현재 제공되는 카드뉴스 제작 기능은 무료로 사용할 수 있으며 회원가입도 필요하지 않습니다.</p>



<p class="wp-block-paragraph"><strong>Q. 프로그램이나 앱을 설치해야 하나요?</strong><br>아니요. 웹브라우저에서 바로 사용할 수 있어 별도의 프로그램이나 앱 설치가 필요하지 않습니다.</p>



<p class="wp-block-paragraph"><strong>Q. 카드뉴스 이미지 크기는 얼마인가요?</strong><br>기본 출력 크기는 <strong>1080×1350 픽셀, 4:5 비율</strong>입니다. 인스타그램 세로 피드용 이미지에 사용하기 좋은 크기입니다.</p>



<p class="wp-block-paragraph"><strong>Q. 점선으로 표시되는 영역은 무엇인가요?</strong><br>점선은 <strong>1:1 안전영역</strong>입니다. 카드뉴스가 정사각형 형태로 표시되거나 일부가 잘릴 때도 중요한 제목이 최대한 보이도록 위치를 확인하기 위한 가이드입니다. 다운로드 이미지에는 점선이 포함되지 않습니다.</p>



<p class="wp-block-paragraph"><strong>Q. 제목은 몇 줄까지 넣을 수 있나요?</strong><br>현재 기본 템플릿에서는 제목을 3줄까지 각각 입력할 수 있습니다. 글자 크기도 직접 조절할 수 있습니다.</p>



<p class="wp-block-paragraph"><strong>Q. 인스타 계정명이나 로고를 넣을 수 있나요?</strong><br>네. 상단에 계정 핸들 또는 로고 문구를 넣을 수 있으며, 제목 위에도 별도의 브랜드명이나 채널명을 표시할 수 있습니다. 색상도 각각 변경할 수 있습니다.</p>



<p class="wp-block-paragraph"><strong>Q. 밝은 사진을 사용하면 글씨가 안 보이지 않나요?</strong><br>하단 그라데이션 강도를 조절할 수 있어 밝은 사진에서도 제목 부분을 어둡게 만들어 글씨를 보다 선명하게 표시할 수 있습니다.</p>



<p class="wp-block-paragraph"><strong>Q. Threads나 X에서도 사용할 수 있나요?</strong><br>네. 완성된 이미지는 일반 PNG 파일이기 때문에 인스타그램뿐 아니라 Threads, X, 블로그 등 이미지 업로드가 가능한 서비스에서도 사용할 수 있습니다.</p>



<p class="wp-block-paragraph"><strong>Q. 업로드한 사진이 서버에 저장되나요?</strong><br>현재 카드뉴스 제작 과정은 브라우저에서 처리되며 이미지 제작을 위해 사진을 별도 서버에 저장하지 않습니다.</p>



<h2 class="wp-block-heading">빠르게 카드뉴스를 만들어보세요</h2>



<p class="wp-block-paragraph">복잡한 디자인 작업 없이 <strong>사진 한 장과 제목만으로 인스타 카드뉴스를 제작</strong>할 수 있습니다.</p>



<p class="wp-block-paragraph">사진을 업로드하고 제목, 계정 핸들, 브랜드명과 그라데이션을 설정한 뒤 PNG로 저장하면 끝입니다.</p>



<p class="wp-block-paragraph">인스타 수익화 콘텐츠, 정보형 게시물, 뉴스형 콘텐츠처럼 카드뉴스를 자주 제작한다면 매번 디자인을 새로 만드는 대신 이 무료 템플릿을 활용해 빠르게 이미지를 만들어보세요.</p>
<div class="saboxplugin-wrap" itemtype="http://schema.org/Person" itemscope itemprop="author"><div class="saboxplugin-tab"><div class="saboxplugin-gravatar"><img decoding="async" src="https://snsnote.com/wp-content/uploads/2026/06/5555.png" width="100"  height="100" alt="" itemprop="image"></div><div class="saboxplugin-authorname"><a href="https://snsnote.com/author/admin/" class="vcard author" rel="author"><span class="fn">JH</span></a></div><div class="saboxplugin-desc"><div itemprop="description"><p>SNSnote 편집 담당 JH입니다.2020년부터 SNS를 본격적으로 운영하기 시작해 현재 인스타그램, 유튜브, X를 합쳐 총 40만 팔로워를 보유하고 있습니다.영구정지 복구, 계정 성장, 수익화까지 직접 경험한 실패와 성공 사례를 바탕으로 실전에서 바로 활용할 수 있는 최신 정보를 전달하고 있습니다.최근에는 <strong>AI와 웹 기술을 활용한 브라우저 기반 도구를 직접 기획·개발하며</strong>, 사진·영상·문서·SNS 업무에 바로 사용할 수 있는 무료 온라인 도구도 함께 제공하고 있습니다.</p>
</div></div><div class="saboxplugin-web "><a href="https://snsnote.com" target="_self" >snsnote.com</a></div><div class="clearfix"></div></div></div>]]></content:encoded>
					
					<wfw:commentRss>https://snsnote.com/cardnews-maker/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
	<media:content url="https://snsnote.com/wp-content/uploads/2026/10/instagram-monetization-cardnews-maker-free-web-tool.webp" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">1771</post-id>	</item>
		<item>
		<title>사진 모자이크 온라인 무료 &#8211; AI 얼굴·번호판 자동 블러</title>
		<link>https://snsnote.com/photo-mosaic-ai/</link>
					<comments>https://snsnote.com/photo-mosaic-ai/#respond</comments>
		
		<dc:creator><![CDATA[JH]]></dc:creator>
		<pubDate>Sun, 27 Sep 2026 13:35:54 +0000</pubDate>
				<category><![CDATA[유용한 도구]]></category>
		<category><![CDATA[인스타그램]]></category>
		<guid isPermaLink="false">https://snsnote.com/?p=1758</guid>

					<description><![CDATA[사진 모자이크, AI로 얼굴과 번호판을 자동으로 가려보세요 사진을 SNS나 커뮤니티에 올리기 전에 다른 사람의 얼굴이나 자동차 번호판이 함께 찍혀 신경 쓰일 때가 있습니다. 하나씩 편집...]]></description>
										<content:encoded><![CDATA[        <div id="snpb-1" class="snpb-app">
            <style>
                #snpb-1 {
                    --snpb-blue:#4f63ff;
                    --snpb-blue2:#6f7cff;
                    --snpb-purple:#7457f5;
                    --snpb-ink:#20283a;
                    --snpb-muted:#6d7890;
                    --snpb-line:#e4e8f1;
                    --snpb-soft:#f7f8fc;
                    --snpb-green:#15a36d;
                    --snpb-red:#e44963;
                    --snpb-orange:#e88c24;
                    font-family:inherit;
                    color:var(--snpb-ink);
                    max-width:100%;
                }
                #snpb-1 *{box-sizing:border-box}
                #snpb-1 button,
                #snpb-1 input,
                #snpb-1 select{font:inherit}

                #snpb-1 .snpb-section-title{
                    display:flex;align-items:center;gap:9px;
                    margin:0 0 14px;font-size:22px;font-weight:800;letter-spacing:-.03em;
                }
                #snpb-1 .snpb-section-title:before{
                    content:"";width:9px;height:9px;border-radius:99px;background:var(--snpb-blue);flex:0 0 auto;
                }
                #snpb-1 .snpb-panel{
                    border:1px solid var(--snpb-line);background:#fff;border-radius:20px;
                    padding:22px;box-shadow:0 8px 26px rgba(37,48,78,.045);margin-bottom:22px;
                }
                #snpb-1 .snpb-upload{
                    position:relative;border:2px dashed #cfd6e7;border-radius:18px;background:#fafbff;
                    min-height:170px;display:flex;align-items:center;justify-content:center;text-align:center;
                    padding:24px;cursor:pointer;transition:.2s ease;outline:none;
                }
                #snpb-1 .snpb-upload:hover,
                #snpb-1 .snpb-upload.is-drag{
                    border-color:#7d8bff;background:#f5f6ff;transform:translateY(-1px);
                }
                #snpb-1 .snpb-upload-icon{
                    width:54px;height:54px;border-radius:16px;background:#eef1ff;color:var(--snpb-blue);
                    display:flex;align-items:center;justify-content:center;margin:0 auto 10px;font-size:26px;
                }
                #snpb-1 .snpb-upload strong{display:block;font-size:16px;margin-bottom:5px}
                #snpb-1 .snpb-upload small{color:var(--snpb-muted);font-size:13px}
                #snpb-1 .snpb-file-info{
                    margin-top:10px;color:#536079;font-size:13px;word-break:break-all;
                }
                #snpb-1 .snpb-hidden{display:none!important}

                #snpb-1 .snpb-grid{
                    display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:16px;
                }
                #snpb-1 .snpb-field{
                    border:1px solid #e5e8f0;border-radius:14px;padding:13px 14px;background:#fff;
                }
                #snpb-1 .snpb-field-label{
                    display:flex;justify-content:space-between;align-items:center;gap:10px;
                    font-size:13px;font-weight:800;color:#364158;margin-bottom:8px;
                }
                #snpb-1 .snpb-field-note{font-size:11px;color:#8a94a8;font-weight:600}
                #snpb-1 select,
                #snpb-1 .snpb-select{
                    width:100%;height:42px;border:1px solid #dfe4ee;border-radius:10px;background:#fff;
                    padding:0 11px;color:#2d374d;outline:none;
                }
                #snpb-1 input[type="range"]{width:100%;accent-color:var(--snpb-blue)}
                #snpb-1 .snpb-checks{
                    display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px;margin-top:14px;
                }
                #snpb-1 .snpb-check{
                    display:flex;align-items:flex-start;gap:9px;border:1px solid #e5e8f0;border-radius:12px;
                    padding:11px 12px;background:#fafbfe;cursor:pointer;font-size:13px;line-height:1.45;
                }
                #snpb-1 .snpb-check input{margin-top:2px;accent-color:var(--snpb-blue)}
                #snpb-1 .snpb-check b{display:block;color:#30394f}
                #snpb-1 .snpb-check span{color:#7c879c;font-size:12px}

                #snpb-1 .snpb-actions{
                    display:flex;flex-wrap:wrap;gap:9px;margin-top:16px;
                }
                #snpb-1 .snpb-btn{
                    appearance:none;border:1px solid #dfe4ef;background:#fff;color:#30394e;
                    border-radius:11px;min-height:44px;padding:0 16px;font-weight:800;font-size:14px;
                    cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:7px;
                    transition:.18s ease;line-height:1.2;
                }
                #snpb-1 .snpb-btn:hover{transform:translateY(-1px);border-color:#c9d0df}
                #snpb-1 .snpb-btn:disabled{opacity:.45;cursor:not-allowed;transform:none}
                #snpb-1 .snpb-btn-primary{
                    background:linear-gradient(135deg,var(--snpb-blue),var(--snpb-purple));
                    color:#fff;border-color:transparent;box-shadow:0 8px 20px rgba(82,92,238,.18);
                }
                #snpb-1 .snpb-btn-soft{background:#f3f5ff;color:#4659e7;border-color:#dce1ff}
                #snpb-1 .snpb-btn-danger{color:#c43e53;background:#fff7f8;border-color:#f4d7dc}
                #snpb-1 .snpb-status{
                    margin-top:14px;border-radius:13px;padding:12px 14px;background:#f7f8fc;
                    border:1px solid #e8eaf1;color:#566078;font-size:13px;line-height:1.55;
                }
                #snpb-1 .snpb-status.is-working{background:#f4f6ff;border-color:#dfe3ff;color:#4253c9}
                #snpb-1 .snpb-status.is-ok{background:#f2fbf7;border-color:#d6f0e4;color:#19734f}
                #snpb-1 .snpb-status.is-error{background:#fff5f6;border-color:#f3d8dd;color:#a63849}
                #snpb-1 .snpb-progress{
                    height:6px;background:#e8ebf4;border-radius:99px;overflow:hidden;margin-top:9px;display:none;
                }
                #snpb-1 .snpb-progress.is-on{display:block}
                #snpb-1 .snpb-progress > i{
                    display:block;height:100%;width:0;background:linear-gradient(90deg,var(--snpb-blue),var(--snpb-purple));
                    border-radius:99px;transition:width .2s ease;
                }
                #snpb-1 .snpb-privacy-note{
                    margin-top:12px;color:#7b869b;font-size:12px;line-height:1.6;
                }

                #snpb-1 .snpb-preview-grid{
                    display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px;
                }
                #snpb-1 .snpb-preview-card{
                    border:1px solid #e4e8f0;border-radius:17px;background:#fafbfe;overflow:hidden;
                }
                #snpb-1 .snpb-preview-head{
                    display:flex;align-items:center;justify-content:space-between;gap:10px;
                    padding:12px 14px;border-bottom:1px solid #e8ebf2;background:#fff;
                    font-size:13px;font-weight:800;color:#354057;
                }
                #snpb-1 .snpb-canvas-wrap{
                    position:relative;min-height:270px;display:flex;align-items:center;justify-content:center;
                    padding:12px;background:
                    linear-gradient(45deg,#f1f3f8 25%,transparent 25%),
                    linear-gradient(-45deg,#f1f3f8 25%,transparent 25%),
                    linear-gradient(45deg,transparent 75%,#f1f3f8 75%),
                    linear-gradient(-45deg,transparent 75%,#f1f3f8 75%);
                    background-size:20px 20px;background-position:0 0,0 10px,10px -10px,-10px 0;
                }
                #snpb-1 .snpb-placeholder{color:#929caf;text-align:center;font-size:13px;line-height:1.7}
                #snpb-1 canvas.snpb-canvas{
                    display:block;max-width:100%;height:auto;max-height:620px;border-radius:10px;
                    box-shadow:0 5px 18px rgba(20,31,55,.08);background:#fff;touch-action:none;
                }
                #snpb-1 .snpb-edit-stage{
                    position:relative;display:inline-block;max-width:100%;line-height:0;
                }
                #snpb-1 .snpb-edit-stage .snpb-original-canvas{
                    position:relative;z-index:1;
                }
                #snpb-1 .snpb-edit-stage .snpb-result-canvas{
                    position:absolute;z-index:2;inset:0;width:100%;height:100%;max-height:none;
                    box-shadow:none;background:transparent;
                }
                #snpb-1 .snpb-result-canvas.tool-rect{cursor:crosshair}
                #snpb-1 .snpb-result-canvas.tool-brush{cursor:crosshair}
                #snpb-1 .snpb-result-canvas.tool-restore{cursor:crosshair}

                #snpb-1 .snpb-summary{
                    display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin:15px 0;
                }
                #snpb-1 .snpb-stat{
                    border:1px solid #e4e8f0;border-radius:14px;background:#fafbfe;padding:12px;text-align:center;
                }
                #snpb-1 .snpb-stat strong{display:block;font-size:22px;line-height:1.1;color:#2e3850}
                #snpb-1 .snpb-stat span{display:block;margin-top:5px;color:#7b869a;font-size:11px;font-weight:700}

                #snpb-1 .snpb-toolbox{
                    border:1px solid #e3e7f0;border-radius:16px;padding:14px;background:#fbfcff;margin-top:14px;
                }
                #snpb-1 .snpb-tool-title{font-weight:850;font-size:14px;margin-bottom:10px;color:#303b52}
                #snpb-1 .snpb-tools{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
                #snpb-1 .snpb-tool-group{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
                #snpb-1 .snpb-tool-divider{width:1px;height:38px;background:#dfe5f0;margin:0 4px;border-radius:999px;flex:0 0 auto}
                #snpb-1 .snpb-tool.is-active{
                    background:#eef1ff;color:#4155e6;border-color:#cbd3ff;box-shadow:inset 0 0 0 1px #d7dcff;
                }
                #snpb-1 .snpb-tool-help{margin:9px 0 0;color:#7b8699;font-size:12px;line-height:1.55}

                #snpb-1 .snpb-list-head{
                    display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:16px;margin-bottom:10px;
                }
                #snpb-1 .snpb-list-head b{font-size:15px}
                #snpb-1 .snpb-list-head span{font-size:12px;color:#7b8699}
                #snpb-1 .snpb-detect-list{
                    display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px;
                }
                #snpb-1 .snpb-item{
                    display:grid;grid-template-columns:54px minmax(0,1fr) auto;gap:10px;align-items:center;
                    border:1px solid #e3e7ef;border-radius:13px;background:#fff;padding:9px;
                    transition:.15s ease;
                }
                #snpb-1 .snpb-item:hover{border-color:#cbd2e3;box-shadow:0 5px 14px rgba(32,45,72,.05)}
                #snpb-1 .snpb-thumb{
                    width:54px;height:54px;border-radius:10px;background:#eef1f6;display:block;object-fit:cover;
                }
                #snpb-1 .snpb-item-main{min-width:0}
                #snpb-1 .snpb-item-title{display:flex;align-items:center;flex-wrap:wrap;gap:5px;font-size:13px;font-weight:800;color:#303b52}
                #snpb-1 .snpb-badge{
                    display:inline-flex;align-items:center;border-radius:99px;padding:2px 6px;font-size:10px;font-weight:800;
                    background:#eef1ff;color:#4c5ee1;
                }
                #snpb-1 .snpb-badge.green{background:#ebf8f2;color:#16845a}
                #snpb-1 .snpb-badge.orange{background:#fff4e9;color:#b76519}
                #snpb-1 .snpb-item-sub{font-size:11px;color:#8490a4;margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
                #snpb-1 .snpb-toggle{
                    position:relative;width:42px;height:24px;display:inline-block;flex:0 0 auto;
                }
                #snpb-1 .snpb-toggle input{opacity:0;width:0;height:0}
                #snpb-1 .snpb-toggle i{
                    position:absolute;inset:0;border-radius:99px;background:#dfe3eb;transition:.18s;cursor:pointer;
                }
                #snpb-1 .snpb-toggle i:before{
                    content:"";position:absolute;width:18px;height:18px;left:3px;top:3px;border-radius:50%;background:#fff;
                    box-shadow:0 2px 5px rgba(0,0,0,.15);transition:.18s;
                }
                #snpb-1 .snpb-toggle input:checked + i{background:var(--snpb-blue)}
                #snpb-1 .snpb-toggle input:checked + i:before{transform:translateX(18px)}
                #snpb-1 .snpb-empty-list{
                    grid-column:1/-1;border:1px dashed #d8deea;border-radius:13px;padding:18px;text-align:center;
                    color:#8993a6;font-size:12px;background:#fafbfe;
                }
                #snpb-1 .snpb-download-row{
                    display:grid;grid-template-columns:180px 1fr;gap:10px;margin-top:15px;align-items:center;
                }
                #snpb-1 .snpb-download-row .snpb-btn{width:100%}

                @media(max-width:760px){
                    #snpb-1 .snpb-panel{padding:16px;border-radius:16px}
                    #snpb-1 .snpb-grid,
                    #snpb-1 .snpb-checks,
                    #snpb-1 .snpb-preview-grid,
                    #snpb-1 .snpb-detect-list{grid-template-columns:1fr}
                    #snpb-1 .snpb-summary{grid-template-columns:repeat(2,minmax(0,1fr))}
                    #snpb-1 .snpb-download-row{grid-template-columns:1fr}
                    #snpb-1 .snpb-canvas-wrap{min-height:220px;padding:8px}
                    #snpb-1 .snpb-actions .snpb-btn{flex:1 1 calc(50% - 8px);padding-left:10px;padding-right:10px}
                    #snpb-1 .snpb-tool-divider{display:none}
                    #snpb-1 .snpb-tool-group{width:100%}
                }
            </style>

            <h2 class="snpb-section-title">이미지 업로드</h2>
            <div class="snpb-panel">
                <input class="snpb-file snpb-hidden" type="file" accept="image/jpeg,image/png,image/webp">
                <div class="snpb-upload" tabindex="0" role="button" aria-label="이미지 업로드">
                    <div>
                        <div class="snpb-upload-icon"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5bc.png" alt="🖼" class="wp-smiley" style="height: 1em; max-height: 1em;" /></div>
                        <strong>사진을 여기 놓으세요 또는 클릭해서 파일을 선택하세요</strong>
                        <small>JPG, PNG, WebP 지원 · 권장 25MB 이하</small>
                        <div class="snpb-file-info">선택된 파일 없음</div>
                    </div>
                </div>

                <div class="snpb-checks">
                    <label class="snpb-check">
                        <input class="snpb-detect-face" type="checkbox" checked>
                        <span><b>얼굴 자동 감지</b><span>배경 인물까지 찾아 부드럽게 블러합니다.</span></span>
                    </label>
                    <label class="snpb-check">
                        <input class="snpb-detect-plate" type="checkbox" checked>
                        <span><b>자동차 번호판 감지</b><span>브라우저에서 번호판 AI 모델을 실행합니다.</span></span>
                    </label>
                    <label class="snpb-check">
                        <input class="snpb-detect-text" type="checkbox">
                        <span><b>개인정보 텍스트 검사</b><span>전화번호·이메일·긴 번호 등을 OCR로 찾습니다.</span></span>
                    </label>
                    <label class="snpb-check">
                        <input class="snpb-keep-main" type="checkbox" checked>
                        <span><b>내 얼굴 자동 유지</b><span>가장 크고 중앙에 가까운 얼굴 1개를 우선 보존합니다.</span></span>
                    </label>
                </div>


                <div class="snpb-actions">
                    <button class="snpb-btn snpb-btn-primary snpb-scan" type="button" disabled><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 다시 감지</button>
                    <button class="snpb-btn snpb-reset" type="button" disabled>↺ 초기화</button>
                </div>

                <div class="snpb-status">
                    사진을 선택하면 AI 개인정보 감지가 자동으로 시작됩니다.
                    <div class="snpb-progress"><i></i></div>
                </div>
                <div class="snpb-privacy-note">
                    ※ 사진 자체는 SNSnote 서버로 업로드하지 않고 브라우저에서 처리합니다.<br>
                    ※ 첫 실행 시 얼굴·번호판·OCR 모델 파일을 외부 CDN에서 내려받을 수 있습니다.<br>
                    ※ AI가 작은 얼굴이나 가려진 번호판을 놓칠 수 있으므로 놓친 부분은 블러 브러시로 직접 보완해 주세요.
                </div>
            </div>

            <h2 class="snpb-section-title">미리보기 · 세부 조정</h2>
            <div class="snpb-panel">
                <div class="snpb-preview-grid">
                    <div class="snpb-preview-card">
                        <div class="snpb-preview-head">
                            <span>편집 이미지</span>
                            <span class="snpb-original-size">-</span>
                        </div>
                        <div class="snpb-canvas-wrap snpb-edit-wrap">
                            <div class="snpb-placeholder">업로드한 사진이<br>여기에 표시됩니다.</div>
                            <div class="snpb-edit-stage snpb-hidden">
                                <canvas class="snpb-canvas snpb-original-canvas"></canvas>
                                <canvas class="snpb-canvas snpb-result-canvas"></canvas>
                            </div>
                        </div>
                        <div style="padding:9px 13px;border-top:1px solid #e8ebf2;background:#fff;color:#7b8698;font-size:11px;line-height:1.45">
                            AI 감지 영역 확인 · 블러 브러시 · 복구 브러시는 왼쪽에서 조정합니다.
                        </div>
                    </div>
                    <div class="snpb-preview-card">
                        <div class="snpb-preview-head">
                            <span>최종 결과</span>
                            <span style="font-size:11px;color:#7b8698;font-weight:700">원본 해상도로 저장</span>
                        </div>
                        <div class="snpb-canvas-wrap snpb-final-wrap">
                            <div class="snpb-placeholder">다운로드될 최종 결과가<br>실시간으로 표시됩니다.</div>
                            <canvas class="snpb-canvas snpb-final-canvas snpb-hidden"></canvas>
                        </div>
                    </div>
                </div>

                <div class="snpb-summary">
                    <div class="snpb-stat"><strong class="snpb-stat-ai">0</strong><span>AI 감지</span></div>
                    <div class="snpb-stat"><strong class="snpb-stat-active">0</strong><span>블러 적용</span></div>
                    <div class="snpb-stat"><strong class="snpb-stat-kept">0</strong><span>유지·복구</span></div>
                    <div class="snpb-stat"><strong class="snpb-stat-manual">0</strong><span>수동 보정</span></div>
                </div>

                <div class="snpb-toolbox">
                    <div class="snpb-tool-title">세밀한 수동 보정</div>
                    <div class="snpb-tools">
                        <div class="snpb-tool-group">
                            <button class="snpb-btn snpb-tool" data-tool="restore" type="button" disabled><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 복구 브러시</button>
                            <button class="snpb-btn snpb-tool" data-tool="brush" type="button" disabled><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f58c.png" alt="🖌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 블러 브러시</button>
                        </div>
                        <div class="snpb-tool-divider" aria-hidden="true"></div>
                        <div class="snpb-tool-group">
                            <button class="snpb-btn snpb-undo" type="button" disabled>실행 취소</button>
                            <button class="snpb-btn snpb-redo" type="button" disabled>다시 실행</button>
                            <button class="snpb-btn snpb-ai-reset" type="button" disabled>AI 결과로 되돌리기</button>
                        </div>
                    </div>
                    <p class="snpb-tool-help">AI가 놓친 부분은 왼쪽 편집 이미지에서 블러 브러시로 직접 가리고, 잘못 가려진 부분은 복구 브러시로 문질러 원본으로 되돌릴 수 있습니다.</p>
                </div>

                <div class="snpb-grid" style="margin-top:14px">
                    <div class="snpb-field">
                        <div class="snpb-field-label"><span>블러 강도</span><span class="snpb-blur-value">24 px</span></div>
                        <input class="snpb-blur" type="range" min="8" max="48" step="1" value="24">
                    </div>
                    <div class="snpb-field">
                        <div class="snpb-field-label"><span>경계 부드러움</span><span class="snpb-feather-value">14 px</span></div>
                        <input class="snpb-feather" type="range" min="0" max="32" step="1" value="14">
                    </div>
                    <div class="snpb-field">
                        <div class="snpb-field-label"><span>수동 브러시 크기</span><span class="snpb-brush-value">42 px</span></div>
                        <input class="snpb-brush-size" type="range" min="12" max="160" step="2" value="42">
                    </div>
                </div>
                <div class="snpb-privacy-note" style="margin-top:10px">※ 블러 강도와 경계 부드러움은 즉시 반영됩니다. 다운로드 파일은 업로드한 원본 해상도를 그대로 유지합니다.</div>

                <div class="snpb-list-head">
                    <b>감지·블러 목록</b>
                    <span>스위치 ON = 블러 적용 · OFF = 원본 유지</span>
                </div>
                <div class="snpb-detect-list">
                    <div class="snpb-empty-list">AI 감지 결과와 브러시 기록이 여기에 표시됩니다.</div>
                </div>

                <div class="snpb-download-row">
                    <select class="snpb-format">
                        <option value="image/png">PNG</option>
                        <option value="image/jpeg">JPG</option>
                        <option value="image/webp">WebP</option>
                    </select>
                    <button class="snpb-btn snpb-btn-primary snpb-download" type="button" disabled><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2b07.png" alt="⬇" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 결과 다운로드</button>
                </div>
            </div>
        </div>

        <script>
        (function(){
            'use strict';

            const root = document.getElementById("snpb-1");
            if (!root || root.dataset.ready === '1') return;
            root.dataset.ready = '1';

            const $ = (s) => root.querySelector(s);
            const $$ = (s) => Array.from(root.querySelectorAll(s));
            const els = {
                file: $('.snpb-file'), upload: $('.snpb-upload'), fileInfo: $('.snpb-file-info'),
                detectFace: $('.snpb-detect-face'), detectPlate: $('.snpb-detect-plate'), detectText: $('.snpb-detect-text'), keepMain: $('.snpb-keep-main'),
                blur: $('.snpb-blur'), feather: $('.snpb-feather'), brushSize: $('.snpb-brush-size'),
                blurValue: $('.snpb-blur-value'), featherValue: $('.snpb-feather-value'), brushValue: $('.snpb-brush-value'),
                scan: $('.snpb-scan'), reset: $('.snpb-reset'), status: $('.snpb-status'), progress: $('.snpb-progress'), progressBar: $('.snpb-progress > i'),
                originalCanvas: $('.snpb-original-canvas'), resultCanvas: $('.snpb-result-canvas'), finalCanvas: $('.snpb-final-canvas'), editWrap: $('.snpb-edit-wrap'), finalWrap: $('.snpb-final-wrap'), editStage: $('.snpb-edit-stage'),
                originalSize: $('.snpb-original-size'),
                statAI: $('.snpb-stat-ai'), statActive: $('.snpb-stat-active'), statKept: $('.snpb-stat-kept'), statManual: $('.snpb-stat-manual'),
                tools: $$('.snpb-tool'), guidesToggle: $('.snpb-guides-toggle'), undo: $('.snpb-undo'), redo: $('.snpb-redo'), aiReset: $('.snpb-ai-reset'),
                list: $('.snpb-detect-list'), format: $('.snpb-format'), download: $('.snpb-download')
            };

            const state = {
                file: null,
                img: null,
                width: 0,
                height: 0,
                regions: [],
                strokes: [],
                restoreStrokes: [],
                seq: 1,
                tool: null,
                drawing: false,
                draftRect: null,
                activeStroke: null,
                hoverId: null,
                showGuides: true,
                history: [],
                future: [],
                aiBaseline: null,
                busy: false,
                faceDetector: null,
                plateSession: null,
                blurCanvas: document.createElement('canvas'),
                maskCanvas: document.createElement('canvas'),
                tempCanvas: document.createElement('canvas'),
                exportCanvas: document.createElement('canvas'),
                raf: 0,
                autoScanTimer: 0
            };

            const FACE_VERSION = '0.4.1646425229';
            const ORT_VERSION = '1.30.0';
            const TESS_VERSION = '7.0.0';
            const PLATE_MODEL = 'https://huggingface.co/ml-debi/yolov8-license-plate-detection/resolve/main/best.onnx?download=true';

            function setStatus(message, kind, progress) {
                els.status.classList.remove('is-working','is-ok','is-error');
                if (kind) els.status.classList.add('is-' + kind);
                const p = Math.max(0, Math.min(100, Number(progress || 0)));
                const textNode = Array.from(els.status.childNodes).find(n => n.nodeType === Node.TEXT_NODE);
                if (textNode) textNode.textContent = message + ' ';
                else els.status.insertAdjacentText('afterbegin', message + ' ');
                if (kind === 'working') {
                    els.progress.classList.add('is-on');
                    els.progressBar.style.width = p + '%';
                } else {
                    els.progress.classList.remove('is-on');
                    els.progressBar.style.width = '0%';
                }
            }

            function humanBytes(bytes) {
                if (!Number.isFinite(bytes)) return '';
                const u = ['B','KB','MB','GB']; let i = 0, v = bytes;
                while (v >= 1024 && i < u.length - 1) { v /= 1024; i++; }
                return (i === 0 ? Math.round(v) : v.toFixed(v >= 10 ? 1 : 2)) + ' ' + u[i];
            }

            function clamp(v, min, max){ return Math.max(min, Math.min(max, v)); }
            function uid(prefix){ return prefix + '-' + (state.seq++); }
            function deepState(){ return JSON.stringify({regions: state.regions, strokes: state.strokes, restoreStrokes: state.restoreStrokes}); }
            function restoreState(json){
                const v = JSON.parse(json);
                state.regions = v.regions || [];
                state.strokes = v.strokes || [];
                state.restoreStrokes = v.restoreStrokes || [];
                renderList(); scheduleRender(); updateCounts(); updateUndoRedo();
            }
            function pushHistory(){
                const snap = deepState();
                if (state.history[state.history.length - 1] !== snap) state.history.push(snap);
                if (state.history.length > 40) state.history.shift();
                state.future = [];
                updateUndoRedo();
            }
            function resetHistory(){ state.history = [deepState()]; state.future = []; updateUndoRedo(); }
            function updateUndoRedo(){
                els.undo.disabled = state.history.length <= 1 || state.busy;
                els.redo.disabled = state.future.length === 0 || state.busy;
            }

            function setBusy(on){
                state.busy = !!on;
                els.scan.disabled = on || !state.img;
                els.reset.disabled = on || !state.img;
                els.download.disabled = on || !state.img;
                els.tools.forEach(b => b.disabled = on || !state.img);
                if (els.guidesToggle) els.guidesToggle.disabled = on || !state.img;
                els.aiReset.disabled = on || !state.aiBaseline;
                updateUndoRedo();
            }

            function loadScript(src, globalName) {
                window.__SNSPB_LIBS = window.__SNSPB_LIBS || {};
                if (globalName && window[globalName]) return Promise.resolve(window[globalName]);
                if (window.__SNSPB_LIBS[src]) return window.__SNSPB_LIBS[src];
                window.__SNSPB_LIBS[src] = new Promise((resolve, reject) => {
                    const s = document.createElement('script');
                    s.src = src; s.async = true; s.crossOrigin = 'anonymous';
                    s.onload = () => resolve(globalName ? window[globalName] : true);
                    s.onerror = () => reject(new Error('외부 라이브러리를 불러오지 못했습니다.'));
                    document.head.appendChild(s);
                });
                return window.__SNSPB_LIBS[src];
            }

            function clearCanvas(c){
                c.width = Math.max(1, state.width || 1); c.height = Math.max(1, state.height || 1);
                c.getContext('2d').clearRect(0,0,c.width,c.height);
            }

            async function loadImage(file){
                if (!file || !/^image\/(jpeg|png|webp)$/i.test(file.type)) {
                    setStatus('JPG, PNG, WebP 이미지 파일을 선택해 주세요.', 'error');
                    return;
                }
                if (file.size > 25 * 1024 * 1024) {
                    setStatus('25MB 이하 이미지를 권장합니다. 큰 이미지는 브라우저 메모리가 부족할 수 있습니다.', 'error');
                }

                const url = URL.createObjectURL(file);
                const img = new Image();
                img.decoding = 'async';
                img.onload = () => {
                    const naturalW = img.naturalWidth, naturalH = img.naturalHeight;
                    const w = naturalW, h = naturalH;

                    state.file = file; state.img = img; state.width = w; state.height = h;
                    state.regions = []; state.strokes = []; state.restoreStrokes = []; state.seq = 1; state.tool = null;
                    state.aiBaseline = null; state.hoverId = null; state.showGuides = true; window.clearTimeout(state.autoScanTimer);

                    [els.originalCanvas, els.resultCanvas, els.finalCanvas, state.blurCanvas, state.maskCanvas, state.tempCanvas, state.exportCanvas].forEach(c => { c.width = w; c.height = h; });

                    const octx = els.originalCanvas.getContext('2d');
                    octx.clearRect(0,0,w,h); octx.drawImage(img,0,0,w,h);
                    rebuildBlurCache();

                    els.editStage.classList.remove('snpb-hidden');
                    els.finalCanvas.classList.remove('snpb-hidden');
                    els.editWrap.querySelector('.snpb-placeholder')?.classList.add('snpb-hidden');
                    els.finalWrap.querySelector('.snpb-placeholder')?.classList.add('snpb-hidden');
                    if (els.guidesToggle) { els.guidesToggle.classList.add('is-active'); els.guidesToggle.textContent='◎ 블러 영역'; }
                    els.originalSize.textContent = naturalW + '×' + naturalH;
                    els.fileInfo.textContent = file.name + ' · ' + humanBytes(file.size);
                    setBusy(false); setTool(null); resetHistory(); renderList(); updateCounts(); scheduleRender();
                    setStatus('이미지를 불러왔습니다. AI 개인정보를 자동으로 감지하고 있습니다…', 'working', 4);
                    window.clearTimeout(state.autoScanTimer);
                    state.autoScanTimer = window.setTimeout(()=>{ runScan(true); }, 80);
                    URL.revokeObjectURL(url);
                };
                img.onerror = () => { URL.revokeObjectURL(url); setStatus('이미지를 읽지 못했습니다.', 'error'); };
                img.src = url;
            }

            function rebuildBlurCache(){
                if (!state.img) return;
                const c = state.blurCanvas, ctx = c.getContext('2d');
                ctx.save(); ctx.clearRect(0,0,c.width,c.height);
                ctx.filter = 'blur(' + Number(els.blur.value) + 'px)';
                ctx.drawImage(els.originalCanvas, 0, 0);
                ctx.restore();
            }

            function roundRectPath(ctx,x,y,w,h,r){
                r = Math.min(r, w/2, h/2);
                ctx.beginPath();
                if (ctx.roundRect) ctx.roundRect(x,y,w,h,r);
                else {
                    ctx.moveTo(x+r,y); ctx.lineTo(x+w-r,y); ctx.quadraticCurveTo(x+w,y,x+w,y+r);
                    ctx.lineTo(x+w,y+h-r); ctx.quadraticCurveTo(x+w,y+h,x+w-r,y+h);
                    ctx.lineTo(x+r,y+h); ctx.quadraticCurveTo(x,y+h,x,y+h-r);
                    ctx.lineTo(x,y+r); ctx.quadraticCurveTo(x,y,x+r,y);
                }
                ctx.closePath();
            }

            function drawMask(){
                const c = state.maskCanvas, ctx = c.getContext('2d');
                ctx.save(); ctx.clearRect(0,0,c.width,c.height);
                ctx.fillStyle = '#fff'; ctx.strokeStyle = '#fff';
                ctx.filter = 'blur(' + Number(els.feather.value) + 'px)';

                state.regions.filter(r => r.active).forEach(r => {
                    if (r.shape === 'ellipse') {
                        ctx.beginPath(); ctx.ellipse(r.x+r.w/2, r.y+r.h/2, r.w/2, r.h/2, 0, 0, Math.PI*2); ctx.fill();
                    } else {
                        roundRectPath(ctx,r.x,r.y,r.w,r.h,Math.min(18,Math.min(r.w,r.h)*.22)); ctx.fill();
                    }
                });

                state.strokes.filter(s => s.active && s.points.length).forEach(s => {
                    ctx.lineCap = 'round'; ctx.lineJoin = 'round'; ctx.lineWidth = s.radius*2;
                    ctx.beginPath();
                    s.points.forEach((p,i) => { if(i===0) ctx.moveTo(p.x,p.y); else ctx.lineTo(p.x,p.y); });
                    if (s.points.length === 1) { const p=s.points[0]; ctx.moveTo(p.x+0.01,p.y); ctx.lineTo(p.x,p.y); }
                    ctx.stroke();
                });

                ctx.globalCompositeOperation = 'destination-out';
                state.restoreStrokes.filter(s => s.active && s.points.length).forEach(s => {
                    ctx.lineCap = 'round'; ctx.lineJoin = 'round'; ctx.lineWidth = s.radius*2;
                    ctx.beginPath();
                    s.points.forEach((p,i) => { if(i===0) ctx.moveTo(p.x,p.y); else ctx.lineTo(p.x,p.y); });
                    if (s.points.length === 1) { const p=s.points[0]; ctx.moveTo(p.x+0.01,p.y); ctx.lineTo(p.x,p.y); }
                    ctx.stroke();
                });
                ctx.restore();
            }

            function renderComposite(target){
                if (!state.img) return;
                drawMask();
                const tctx = state.tempCanvas.getContext('2d');
                tctx.save(); tctx.clearRect(0,0,state.width,state.height); tctx.globalCompositeOperation='source-over';
                tctx.drawImage(state.blurCanvas,0,0);
                tctx.globalCompositeOperation='destination-in'; tctx.drawImage(state.maskCanvas,0,0);
                tctx.restore();

                const ctx = target.getContext('2d');
                ctx.save(); ctx.clearRect(0,0,state.width,state.height); ctx.globalCompositeOperation='source-over';
                ctx.drawImage(els.originalCanvas,0,0); ctx.drawImage(state.tempCanvas,0,0); ctx.restore();
            }

            function drawGuides(ctx){
                if (!state.showGuides) return;
                ctx.save();
                state.regions.forEach(r => {
                    const isHover = state.hoverId === r.id;
                    ctx.lineWidth = isHover ? 4 : 2;
                    ctx.strokeStyle = r.active ? (r.source === 'manual' ? '#e88c24' : '#e44963') : '#18a36f';
                    ctx.setLineDash(r.active ? [] : [8,6]);
                    if(r.shape === 'ellipse'){
                        ctx.beginPath();ctx.ellipse(r.x+r.w/2,r.y+r.h/2,r.w/2,r.h/2,0,0,Math.PI*2);ctx.stroke();
                    }else{ roundRectPath(ctx,r.x,r.y,r.w,r.h,10);ctx.stroke(); }
                });
                state.strokes.forEach(s => {
                    if(!s.points.length) return;
                    ctx.lineWidth = Math.max(2, s.radius*2 + 3); ctx.lineCap='round';ctx.lineJoin='round';
                    ctx.strokeStyle = s.active ? '#e88c24' : '#18a36f'; ctx.globalAlpha=.45;
                    ctx.beginPath(); s.points.forEach((p,i)=>i?ctx.lineTo(p.x,p.y):ctx.moveTo(p.x,p.y));ctx.stroke();ctx.globalAlpha=1;
                });
                state.restoreStrokes.forEach(s => {
                    if(!s.points.length) return;
                    ctx.lineWidth = Math.max(2, s.radius*2 + 3); ctx.lineCap='round';ctx.lineJoin='round';
                    ctx.strokeStyle = s.active ? '#18a36f' : '#a1acbf'; ctx.globalAlpha=.5;
                    ctx.beginPath(); s.points.forEach((p,i)=>i?ctx.lineTo(p.x,p.y):ctx.moveTo(p.x,p.y));ctx.stroke();ctx.globalAlpha=1;
                });
                ctx.restore();
            }

            function render(){
                state.raf = 0;
                if (!state.img) return;
                // 왼쪽은 편집용: 블러 결과 + 빨강/초록/주황 가이드
                renderComposite(els.resultCanvas);
                drawGuides(els.resultCanvas.getContext('2d'));
                // 오른쪽은 다운로드될 깨끗한 최종 결과
                renderComposite(els.finalCanvas);
            }
            function scheduleRender(){ if(!state.raf) state.raf = requestAnimationFrame(render); }

            function iou(a,b){
                const x1=Math.max(a.x,b.x), y1=Math.max(a.y,b.y), x2=Math.min(a.x+a.w,b.x+b.w), y2=Math.min(a.y+a.h,b.y+b.h);
                const inter=Math.max(0,x2-x1)*Math.max(0,y2-y1); const union=a.w*a.h+b.w*b.h-inter;
                return union>0?inter/union:0;
            }
            function dedupe(boxes, threshold){
                const out=[];
                boxes.sort((a,b)=>(b.score||0)-(a.score||0));
                boxes.forEach(b=>{ if(!out.some(o=>iou(o,b)>threshold)) out.push(b); });
                return out;
            }

            function parseFaceBox(d){
                const b = d?.boundingBox || d?.locationData?.relativeBoundingBox || d?.locationData?.relative_bounding_box;
                if (!b) return null;
                let x,y,w,h;
                if (Number.isFinite(b.xCenter) && Number.isFinite(b.yCenter)) {
                    w=b.width*state.width; h=b.height*state.height; x=(b.xCenter-b.width/2)*state.width; y=(b.yCenter-b.height/2)*state.height;
                } else if (Number.isFinite(b.xmin)) {
                    x=b.xmin*state.width; y=b.ymin*state.height; w=b.width*state.width; h=b.height*state.height;
                } else if (Number.isFinite(b.left)) {
                    const normalized = Math.abs(b.left)<=1 && Math.abs(b.width)<=1;
                    x=b.left*(normalized?state.width:1); y=b.top*(normalized?state.height:1); w=b.width*(normalized?state.width:1); h=b.height*(normalized?state.height:1);
                } else return null;
                const growX=w*.20, growY=h*.25;
                x=clamp(x-growX/2,0,state.width); y=clamp(y-growY*.58,0,state.height);
                w=clamp(w+growX,8,state.width-x); h=clamp(h+growY,8,state.height-y);
                const score = d?.score?.[0] ?? d?.score ?? d?.categories?.[0]?.score ?? .5;
                return {x,y,w,h,score:Number(score)||.5};
            }

            async function detectFaces(){
                setStatus('얼굴 AI 모델을 준비하고 있습니다…','working',12);
                await loadScript('https://cdn.jsdelivr.net/npm/@mediapipe/face_detection@'+FACE_VERSION+'/face_detection.js','FaceDetection');
                if (!state.faceDetector) {
                    state.faceDetector = new window.FaceDetection({
                        locateFile: (file) => 'https://cdn.jsdelivr.net/npm/@mediapipe/face_detection@'+FACE_VERSION+'/'+file
                    });
                    state.faceDetector.setOptions({model:'full', minDetectionConfidence:.35});
                }
                setStatus('사진 속 얼굴을 찾고 있습니다…','working',25);
                const results = await new Promise((resolve,reject)=>{
                    let settled=false;
                    const timer=setTimeout(()=>{ if(!settled){settled=true;reject(new Error('얼굴 감지 시간이 초과되었습니다.'));}},30000);
                    state.faceDetector.onResults((res)=>{ if(!settled){settled=true;clearTimeout(timer);resolve(res);}});
                    Promise.resolve(state.faceDetector.send({image:els.originalCanvas})).catch(err=>{if(!settled){settled=true;clearTimeout(timer);reject(err);}});
                });
                let boxes=(results?.detections||[]).map(parseFaceBox).filter(Boolean);
                boxes=dedupe(boxes,.48);

                let mainIndex=-1;
                if (els.keepMain.checked && boxes.length) {
                    let best=-Infinity;
                    boxes.forEach((b,i)=>{
                        const area=(b.w*b.h)/(state.width*state.height);
                        const cx=(b.x+b.w/2)/state.width, cy=(b.y+b.h/2)/state.height;
                        const dist=Math.hypot(cx-.5,cy-.48);
                        const score=area*5 + (1-Math.min(1,dist))*0.35;
                        if(score>best){best=score;mainIndex=i;}
                    });
                }
                return boxes.map((b,i)=>({
                    id:uid('face'), type:'face', source:'ai', shape:'ellipse', x:b.x,y:b.y,w:b.w,h:b.h,
                    active:i!==mainIndex, score:b.score, main:i===mainIndex
                }));
            }

            async function getPlateSession(){
                if (state.plateSession) return state.plateSession;
                setStatus('번호판 AI 엔진을 불러오고 있습니다…','working',40);
                await loadScript('https://cdn.jsdelivr.net/npm/onnxruntime-web@'+ORT_VERSION+'/dist/ort.min.js','ort');
                window.ort.env.wasm.wasmPaths='https://cdn.jsdelivr.net/npm/onnxruntime-web@'+ORT_VERSION+'/dist/';
                window.ort.env.wasm.numThreads = Math.max(1, Math.min(4, navigator.hardwareConcurrency || 2));
                state.plateSession = await window.ort.InferenceSession.create(PLATE_MODEL,{executionProviders:['wasm'],graphOptimizationLevel:'all'});
                return state.plateSession;
            }

            function letterbox640(){
                const size=640, c=document.createElement('canvas'); c.width=size;c.height=size;
                const ctx=c.getContext('2d',{willReadFrequently:true}); ctx.fillStyle='rgb(114,114,114)';ctx.fillRect(0,0,size,size);
                const ratio=Math.min(size/state.width,size/state.height);
                const nw=Math.round(state.width*ratio), nh=Math.round(state.height*ratio);
                const dx=Math.floor((size-nw)/2), dy=Math.floor((size-nh)/2);
                ctx.drawImage(els.originalCanvas,0,0,state.width,state.height,dx,dy,nw,nh);
                return {canvas:c,ratio,dx,dy,size};
            }

            function nms(boxes,threshold=.45){
                const sorted=boxes.slice().sort((a,b)=>b.score-a.score), keep=[];
                while(sorted.length){
                    const a=sorted.shift();keep.push(a);
                    for(let i=sorted.length-1;i>=0;i--) if(iou(a,sorted[i])>threshold) sorted.splice(i,1);
                }
                return keep;
            }

            async function detectPlates(){
                const session=await getPlateSession();
                setStatus('자동차 번호판을 찾고 있습니다…','working',55);
                const lb=letterbox640(), ctx=lb.canvas.getContext('2d',{willReadFrequently:true});
                const rgba=ctx.getImageData(0,0,lb.size,lb.size).data;
                const n=lb.size*lb.size, input=new Float32Array(3*n);
                for(let i=0;i<n;i++){
                    input[i]=rgba[i*4]/255; input[n+i]=rgba[i*4+1]/255; input[2*n+i]=rgba[i*4+2]/255;
                }
                const tensor=new window.ort.Tensor('float32',input,[1,3,lb.size,lb.size]);
                const feeds={}; feeds[session.inputNames[0]]=tensor;
                const result=await session.run(feeds); const out=result[session.outputNames[0]];
                const d=out.data, dims=out.dims||[]; let boxes=[];

                if (dims.length===3 && dims[2]===6 && dims[1] < 1000) {
                    for(let i=0;i<dims[1];i++){
                        const base=i*6, score=Number(d[base+4]); if(score<.25) continue;
                        const x1=d[base],y1=d[base+1],x2=d[base+2],y2=d[base+3];
                        boxes.push({cx:(x1+x2)/2,cy:(y1+y2)/2,w:x2-x1,h:y2-y1,score});
                    }
                } else if (dims.length===3 && dims[1] <= 16 && dims[2] > 100) {
                    const count=dims[2];
                    for(let i=0;i<count;i++){
                        const score=Number(d[4*count+i]); if(score<.25) continue;
                        const cx=d[i], cy=d[count+i], w=d[2*count+i], h=d[3*count+i];
                        boxes.push({cx,cy,w,h,score});
                    }
                } else if (dims.length===3 && dims[2] <= 16 && dims[1] > 100) {
                    const count=dims[1], ch=dims[2];
                    for(let i=0;i<count;i++){
                        const base=i*ch, score=Number(d[base+4]); if(score<.25) continue;
                        boxes.push({cx:d[base],cy:d[base+1],w:d[base+2],h:d[base+3],score});
                    }
                } else {
                    throw new Error('번호판 모델 출력 형식을 해석하지 못했습니다.');
                }

                boxes=boxes.map(b=>{
                    let x=(b.cx-b.w/2-lb.dx)/lb.ratio, y=(b.cy-b.h/2-lb.dy)/lb.ratio;
                    let w=b.w/lb.ratio, h=b.h/lb.ratio;
                    const gx=w*.10, gy=h*.24; x-=gx/2;y-=gy/2;w+=gx;h+=gy;
                    x=clamp(x,0,state.width);y=clamp(y,0,state.height);w=clamp(w,4,state.width-x);h=clamp(h,4,state.height-y);
                    return {x,y,w,h,score:b.score};
                }).filter(b=>b.w>8&&b.h>5&&b.x<state.width&&b.y<state.height);

                return nms(boxes,.42).slice(0,30).map(b=>({id:uid('plate'),type:'plate',source:'ai',shape:'rect',x:b.x,y:b.y,w:b.w,h:b.h,active:true,score:b.score}));
            }

            function isSensitiveText(text){
                const s=(text||'').replace(/\s+/g,' ').trim(); if(!s) return false;
                const patterns=[
                    /[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/i,
                    /01[016789][\s.\-]?\d{3,4}[\s.\-]?\d{4}/,
                    /0\d{1,2}[\s.\-]?\d{3,4}[\s.\-]?\d{4}/,
                    /\b\d{6}[\s\-]?[1-4]\d{6}\b/,
                    /\b(?:\d[\s\-]?){12,19}\b/,
                    /(?:서울|부산|대구|인천|광주|대전|울산|세종|경기|강원|충북|충남|전북|전남|경북|경남|제주)[^\n]{0,40}(?:로|길|동|읍|면)\s*\d*/
                ];
                return patterns.some(re=>re.test(s));
            }

            async function detectSensitiveText(){
                setStatus('OCR 모델을 준비하고 있습니다…','working',68);
                await loadScript('https://cdn.jsdelivr.net/npm/tesseract.js@'+TESS_VERSION+'/dist/tesseract.min.js','Tesseract');
                const OEM = window.Tesseract.OEM?.LSTM_ONLY ?? 1;
                const worker=await window.Tesseract.createWorker('kor+eng',OEM,{
                    logger:m=>{
                        if(m?.status==='recognizing text') setStatus('사진 속 개인정보 텍스트를 읽고 있습니다…','working',70+Math.round((m.progress||0)*20));
                    }
                });
                try{
                    const ret=await worker.recognize(els.originalCanvas,{}, {blocks:true});
                    const out=[];
                    (ret.data.blocks||[]).forEach(block=>(block.paragraphs||[]).forEach(p=>(p.lines||[]).forEach(line=>{
                        if(!isSensitiveText(line.text)) return;
                        const b=line.bbox; if(!b) return;
                        const pad=Math.max(4,Math.min(16,(b.y1-b.y0)*.18));
                        const x=clamp(b.x0-pad,0,state.width), y=clamp(b.y0-pad,0,state.height);
                        const w=clamp((b.x1-b.x0)+pad*2,4,state.width-x), h=clamp((b.y1-b.y0)+pad*2,4,state.height-y);
                        out.push({id:uid('text'),type:'text',source:'ai',shape:'rect',x,y,w,h,active:true,score:line.confidence||0,label:(line.text||'').trim().slice(0,44)});
                    })));
                    return dedupe(out,.55).slice(0,40);
                } finally { try{await worker.terminate();}catch(e){} }
            }

            async function runScan(isAuto){
                if(!state.img || state.busy) return;
                if(!els.detectFace.checked && !els.detectPlate.checked && !els.detectText.checked){
                    setStatus('감지할 항목을 하나 이상 선택해 주세요.','error'); return;
                }
                setTool(null);
                setBusy(true); const warnings=[]; let found=[];
                try{
                    let faceFound = [];
                    if(els.detectFace.checked){
                        let retried = false;
                        try { faceFound = await detectFaces(); } catch(e){ console.error(e); }
                        if(!faceFound.length){
                            retried = true;
                            setStatus('얼굴 감지를 다시 시도하고 있습니다…','working',32);
                            try { faceFound = await detectFaces(); } catch(e){ console.error(e); faceFound = []; }
                        }
                        if(!faceFound.length){ warnings.push('얼굴 감지 실패'); }
                        found = found.concat(faceFound);
                    }
                    if(els.detectPlate.checked){ try{found=found.concat(await detectPlates());}catch(e){warnings.push('번호판 감지 실패'); console.error(e);} }
                    if(els.detectText.checked){ try{found=found.concat(await detectSensitiveText());}catch(e){warnings.push('텍스트 감지 실패'); console.error(e);} }

                    state.regions = state.regions.filter(r=>r.source==='manual').concat(found);
                    state.aiBaseline = deepState(); resetHistory(); renderList();updateCounts();scheduleRender();
                    const preserved=found.filter(x=>!x.active).length;
                    let msg='';
                    let kind='ok';
                    if(!found.length){
                        kind='error';
                        if(warnings.includes('얼굴 감지 실패')) msg='얼굴 감지에 실패했습니다. 다시 감지하거나 블러 브러시로 직접 가릴 수 있습니다.';
                        else msg='가릴 개인정보를 찾지 못했습니다. 다시 감지하거나 블러 브러시로 직접 가릴 수 있습니다.';
                    } else {
                        msg='AI 감지 완료: '+found.length+'개 영역을 찾았습니다.';
                        if(preserved) msg+=' 내 얼굴 추정 '+preserved+'개는 우선 유지했습니다.';
                        if(warnings.length) msg+=' ('+warnings.join(' · ')+') 다시 감지하거나 블러 브러시로 보완할 수 있습니다.';
                    }
                    setStatus(msg, kind);
                } catch(e){ console.error(e); setStatus('AI 감지 중 오류가 발생했습니다. 다시 감지하거나 블러 브러시로 직접 가려 주세요.','error'); }
                finally{ setBusy(false); els.aiReset.disabled=!state.aiBaseline; }
            }

            function typeName(item){
                return {face:'얼굴',plate:'번호판',text:'개인정보',manual:'수동 영역',brush:'블러 브러시',restore:'복구 브러시'}[item.type] || '영역';
            }
            function itemBBox(item){
                if(item.kind==='region') return item.data;
                const s=item.data; if(!s.points.length) return {x:0,y:0,w:1,h:1};
                const xs=s.points.map(p=>p.x),ys=s.points.map(p=>p.y),r=s.radius;
                const x=clamp(Math.min(...xs)-r,0,state.width),y=clamp(Math.min(...ys)-r,0,state.height);
                const x2=clamp(Math.max(...xs)+r,0,state.width),y2=clamp(Math.max(...ys)+r,0,state.height);
                return {x,y,w:Math.max(1,x2-x),h:Math.max(1,y2-y)};
            }
            function allItems(){
                return state.regions.map(r=>({kind:'region',id:r.id,type:r.type,source:r.source,active:r.active,data:r}))
                    .concat(state.strokes.map(s=>({kind:'stroke',id:s.id,type:'brush',source:'manual',active:s.active,data:s})))
                    .concat(state.restoreStrokes.map(s=>({kind:'stroke',id:s.id,type:'restore',source:'manual',active:s.active,data:s})));
            }

            function makeThumb(item,canvas){
                const b=itemBBox(item), ctx=canvas.getContext('2d'); const size=54;
                canvas.width=size;canvas.height=size;ctx.clearRect(0,0,size,size);ctx.fillStyle='#eef1f6';ctx.fillRect(0,0,size,size);
                const pad=Math.max(b.w,b.h)*.35; const sx=clamp(b.x-pad,0,state.width), sy=clamp(b.y-pad,0,state.height);
                const sw=clamp(b.w+pad*2,1,state.width-sx), sh=clamp(b.h+pad*2,1,state.height-sy);
                const scale=Math.max(size/sw,size/sh), dw=sw*scale,dh=sh*scale;
                ctx.drawImage(els.originalCanvas,sx,sy,sw,sh,(size-dw)/2,(size-dh)/2,dw,dh);
            }

            function renderList(){
                const items=allItems();
                if(!items.length){els.list.innerHTML='<div class="snpb-empty-list">AI 감지 결과와 브러시 기록이 여기에 표시됩니다.</div>';return;}
                els.list.innerHTML='';
                items.forEach((item,index)=>{
                    const data=item.data, wrap=document.createElement('div');wrap.className='snpb-item';wrap.dataset.id=item.id;
                    const thumb=document.createElement('canvas');thumb.className='snpb-thumb';
                    const main=document.createElement('div');main.className='snpb-item-main';
                    const title=document.createElement('div');title.className='snpb-item-title';
                    title.append(document.createTextNode(typeName(item)+' '+(index+1)));
                    if(data.main){const b=document.createElement('span');b.className='snpb-badge green';b.textContent='내 얼굴 추정';title.appendChild(b);}
                    if(item.source==='manual'){const b=document.createElement('span');b.className='snpb-badge orange';b.textContent='수동';title.appendChild(b);}
                    const sub=document.createElement('div');sub.className='snpb-item-sub';
                    sub.textContent = data.label ? data.label : (item.type==='restore' ? (item.active ? '원본 복구 적용 중' : '복구 해제됨') : (item.active ? '블러 적용 중' : '원본 유지 · 복구됨'));
                    main.append(title,sub);
                    const label=document.createElement('label');label.className='snpb-toggle';
                    const input=document.createElement('input');input.type='checkbox';input.checked=!!item.active;input.setAttribute('aria-label',typeName(item)+(item.type==='restore' ? ' 적용' : ' 블러 적용'));
                    const sw=document.createElement('i'); label.append(input,sw);
                    input.addEventListener('change',()=>{
                        data.active=input.checked; pushHistory(); renderList();updateCounts();scheduleRender();
                    });
                    wrap.addEventListener('mouseenter',()=>{state.hoverId=item.id;scheduleRender();});
                    wrap.addEventListener('mouseleave',()=>{state.hoverId=null;scheduleRender();});
                    wrap.append(thumb,main,label);els.list.appendChild(wrap);makeThumb(item,thumb);
                });
            }

            function updateCounts(){
                const ai=state.regions.filter(r=>r.source==='ai').length;
                const manual=state.regions.filter(r=>r.source==='manual').length + state.strokes.length + state.restoreStrokes.length;
                const active=state.regions.filter(r=>r.active).length + state.strokes.filter(s=>s.active).length;
                const kept=state.regions.filter(r=>!r.active).length + state.restoreStrokes.filter(s=>s.active).length;
                els.statAI.textContent=ai;els.statActive.textContent=active;els.statKept.textContent=kept;els.statManual.textContent=manual;
            }

            function setTool(tool){
                state.tool = state.tool===tool ? null : tool;
                els.tools.forEach(b=>b.classList.toggle('is-active',b.dataset.tool===state.tool));
                els.resultCanvas.classList.remove('tool-brush','tool-restore');
                if(state.tool) els.resultCanvas.classList.add('tool-'+state.tool);
                scheduleRender();
            }

            function pointFromEvent(e){
                const r=els.resultCanvas.getBoundingClientRect();
                return {x:clamp((e.clientX-r.left)*state.width/r.width,0,state.width),y:clamp((e.clientY-r.top)*state.height/r.height,0,state.height)};
            }
            function distToSegment(p,a,b){
                const l2=(b.x-a.x)**2+(b.y-a.y)**2;if(!l2)return Math.hypot(p.x-a.x,p.y-a.y);
                let t=((p.x-a.x)*(b.x-a.x)+(p.y-a.y)*(b.y-a.y))/l2;t=clamp(t,0,1);
                return Math.hypot(p.x-(a.x+t*(b.x-a.x)),p.y-(a.y+t*(b.y-a.y)));
            }

            els.resultCanvas.addEventListener('pointerdown',e=>{
                if(!state.img||state.busy||!state.tool)return;
                const p=pointFromEvent(e); els.resultCanvas.setPointerCapture?.(e.pointerId); state.drawing=true;
                if(state.tool==='brush'){
                    state.activeStroke={id:uid('brush'),type:'brush',source:'manual',active:true,radius:Number(els.brushSize.value),points:[p]};
                    state.strokes.push(state.activeStroke);scheduleRender();
                } else if(state.tool==='restore'){
                    state.activeStroke={id:uid('restore'),type:'restore',source:'manual',active:true,radius:Number(els.brushSize.value),points:[p]};
                    state.restoreStrokes.push(state.activeStroke);scheduleRender();
                }
                e.preventDefault();
            });
            els.resultCanvas.addEventListener('pointermove',e=>{
                if(!state.drawing||!state.tool||!state.activeStroke)return;const p=pointFromEvent(e);
                const last=state.activeStroke.points[state.activeStroke.points.length-1];
                if(Math.hypot(p.x-last.x,p.y-last.y)>Math.max(2,state.activeStroke.radius*.12)){state.activeStroke.points.push(p);scheduleRender();}
                e.preventDefault();
            });
            function finishPointer(e){
                if(!state.drawing)return;state.drawing=false;
                if((state.tool==='brush'||state.tool==='restore') && state.activeStroke){state.activeStroke=null;pushHistory();renderList();updateCounts();scheduleRender();}
                try{els.resultCanvas.releasePointerCapture?.(e.pointerId);}catch(err){}
            }
            els.resultCanvas.addEventListener('pointerup',finishPointer);els.resultCanvas.addEventListener('pointercancel',finishPointer);

            els.tools.forEach(b=>b.addEventListener('click',()=>setTool(b.dataset.tool)));
            els.undo.addEventListener('click',()=>{
                if(state.history.length<=1)return;state.future.push(state.history.pop());restoreState(state.history[state.history.length-1]);
            });
            els.redo.addEventListener('click',()=>{
                if(!state.future.length)return;const snap=state.future.pop();state.history.push(snap);restoreState(snap);
            });
            els.aiReset.addEventListener('click',()=>{
                if(!state.aiBaseline)return;restoreState(state.aiBaseline);resetHistory();setStatus('AI 감지 직후 상태로 되돌렸습니다.','ok');
            });

            els.blur.addEventListener('input',()=>{els.blurValue.textContent=els.blur.value+' px';rebuildBlurCache();scheduleRender();});
            els.feather.addEventListener('input',()=>{els.featherValue.textContent=els.feather.value+' px';scheduleRender();});
            els.brushSize.addEventListener('input',()=>{els.brushValue.textContent=els.brushSize.value+' px';});

            els.scan.addEventListener('click',()=>runScan(false));
            els.reset.addEventListener('click',()=>{if(state.file)loadImage(state.file);});

            els.upload.addEventListener('click',()=>els.file.click());
            els.upload.addEventListener('keydown',e=>{if(e.key==='Enter'||e.key===' '){e.preventDefault();els.file.click();}});
            els.file.addEventListener('change',()=>{if(els.file.files?.[0])loadImage(els.file.files[0]);});
            ['dragenter','dragover'].forEach(name=>els.upload.addEventListener(name,e=>{e.preventDefault();els.upload.classList.add('is-drag');}));
            ['dragleave','drop'].forEach(name=>els.upload.addEventListener(name,e=>{e.preventDefault();els.upload.classList.remove('is-drag');}));
            els.upload.addEventListener('drop',e=>{const f=e.dataTransfer?.files?.[0];if(f)loadImage(f);});

            els.download.addEventListener('click',()=>{
                if(!state.img)return;
                renderComposite(state.exportCanvas);
                const type=els.format.value;const ext=type==='image/jpeg'?'jpg':type==='image/webp'?'webp':'png';
                state.exportCanvas.toBlob(blob=>{
                    if(!blob){setStatus('이미지 저장에 실패했습니다.','error');return;}
                    const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download='snsnote-privacy-blur.'+ext;
                    document.body.appendChild(a);a.click();a.remove();setTimeout(()=>URL.revokeObjectURL(a.href),1500);
                    setStatus('결과 이미지를 저장했습니다. 다운로드 전에 가려진 영역을 한 번 더 확인해 주세요.','ok');
                },type,(type==='image/jpeg'||type==='image/webp') ? .94 : undefined);
            });

            setBusy(false);
        })();
        </script>
        



<h2 class="wp-block-heading">사진 모자이크, AI로 얼굴과 번호판을 자동으로 가려보세요</h2>



<p class="wp-block-paragraph">사진을 SNS나 커뮤니티에 올리기 전에 다른 사람의 얼굴이나 자동차 번호판이 함께 찍혀 신경 쓰일 때가 있습니다. 하나씩 편집 프로그램으로 가리려면 번거롭지만, 이 <strong>사진 모자이크 무료 도구</strong>를 이용하면 AI가 사진 속 얼굴과 차량 번호판을 자동으로 찾아 부드럽게 블러 처리합니다.</p>



<p class="wp-block-paragraph">이미지를 선택하면 별도의 프로그램 설치 없이 브라우저에서 바로 분석이 시작됩니다. AI가 감지한 영역은 자동으로 블러 처리되며, 필요한 경우 사용자가 직접 결과를 수정할 수도 있습니다.</p>



<h2 class="wp-block-heading">AI 얼굴 모자이크 자동 감지</h2>



<p class="wp-block-paragraph">사진 속 여러 사람의 얼굴을 AI가 자동으로 감지해 블러 처리합니다.</p>



<p class="wp-block-paragraph">셀카처럼 본인이 중심에 있는 사진에서는 <strong>내 얼굴 자동 유지</strong> 기능을 사용할 수 있습니다. 가장 크고 중앙에 가까운 얼굴을 우선 보존하고, 주변 사람들의 얼굴을 가리는 방식입니다.</p>



<p class="wp-block-paragraph">단체 사진이나 여행 사진처럼 여러 사람이 함께 찍힌 이미지에서도 사용할 수 있으며, AI가 놓친 작은 얼굴은 <strong>블러 브러시</strong>를 이용해 직접 가릴 수 있습니다.</p>



<h2 class="wp-block-heading">자동차 번호판도 자동 블러 처리</h2>



<p class="wp-block-paragraph">거리 사진이나 주차장에서 찍은 사진에는 차량 번호판이 함께 노출되는 경우가 많습니다.</p>



<p class="wp-block-paragraph">이 도구는 사진 속 자동차 번호판을 AI로 감지해 자동으로 블러 처리합니다. 번호판이 작거나 각도가 심해 자동 감지가 되지 않는 경우에는 블러 브러시로 필요한 부분만 직접 가릴 수 있습니다.</p>



<p class="wp-block-paragraph">얼굴과 번호판을 한 번에 처리할 수 있어 SNS 업로드 전 개인정보를 확인할 때 편리합니다.</p>



<h2 class="wp-block-heading">잘못 가린 부분은 복구 브러시로 되돌리기</h2>



<p class="wp-block-paragraph">AI가 원하지 않는 부분까지 블러 처리했더라도 처음부터 다시 작업할 필요가 없습니다.</p>



<p class="wp-block-paragraph"><strong>복구 브러시</strong>를 선택한 뒤 잘못 가려진 부분을 문지르면 해당 영역을 다시 원본 이미지로 되돌릴 수 있습니다.</p>



<p class="wp-block-paragraph">반대로 AI가 놓친 부분은 블러 브러시를 이용해 추가로 가릴 수 있기 때문에,</p>



<p class="wp-block-paragraph"><strong>AI 자동 감지 → 직접 보정 → 최종 결과 확인</strong></p>



<p class="wp-block-paragraph">순서로 간단하게 작업할 수 있습니다.</p>



<h2 class="wp-block-heading">블러 강도와 경계를 직접 조절</h2>



<p class="wp-block-paragraph">사진에 따라 적당한 블러 강도가 다를 수 있습니다.</p>



<p class="wp-block-paragraph">블러 강도를 조절하면 얼굴이나 번호판이 얼마나 흐리게 보일지 변경할 수 있으며, <strong>경계 부드러움</strong>을 조절하면 블러 영역의 가장자리가 네모 형태로 딱 끊기지 않고 자연스럽게 퍼지도록 만들 수 있습니다.</p>



<p class="wp-block-paragraph">설정을 움직이면 결과가 바로 반영되어 원하는 정도를 확인하면서 조절할 수 있습니다.</p>



<h2 class="wp-block-heading">원본 해상도를 유지해 저장</h2>



<p class="wp-block-paragraph">AI 분석 과정에서 사진의 화질이 떨어질까 걱정할 필요가 없습니다.</p>



<p class="wp-block-paragraph">최종 이미지는 업로드한 사진의 <strong>원본 해상도를 유지해 저장</strong>하도록 만들었습니다. 블러 처리에 필요한 부분만 변경되며, 사진 전체 크기를 임의로 줄이지 않습니다.</p>



<p class="wp-block-paragraph">완성된 이미지는 최종 결과 화면에서 확인한 뒤 저장할 수 있습니다.</p>



<h2 class="wp-block-heading">설치 없이 브라우저에서 바로 사용</h2>



<p class="wp-block-paragraph">이 사진 모자이크 도구는 별도의 이미지 편집 프로그램을 설치할 필요가 없습니다.</p>



<p class="wp-block-paragraph">사진을 선택하면 웹브라우저에서 바로 사용할 수 있으며, 얼굴 감지와 번호판 감지를 비롯한 주요 이미지 처리가 브라우저에서 진행됩니다.</p>



<p class="wp-block-paragraph">사진 자체를 SNSnote 서버에 업로드해 처리하는 방식이 아니기 때문에, 개인정보가 포함된 사진을 다룰 때도 부담을 줄였습니다.</p>



<h2 class="wp-block-heading">사진 모자이크 사용 방법</h2>



<ol start="1" class="wp-block-list">
<li>모자이크 처리할 사진을 선택합니다.</li>



<li>AI가 얼굴과 차량 번호판을 자동으로 감지합니다.</li>



<li>왼쪽 편집 화면에서 감지된 영역을 확인합니다.</li>



<li>놓친 부분은 <strong>블러 브러시</strong>로 직접 가립니다.</li>



<li>잘못 가려진 부분은 <strong>복구 브러시</strong>로 되돌립니다.</li>



<li>블러 강도와 경계 부드러움을 원하는 정도로 조절합니다.</li>



<li>오른쪽 최종 결과를 확인한 뒤 이미지를 저장합니다.</li>
</ol>



<h2 class="wp-block-heading">어떤 사진에 사용할 수 있나요?</h2>



<p class="wp-block-paragraph">이 도구는 단체 사진, 여행 사진, 길거리 사진, 차량 사진, SNS 업로드용 사진 등 다양한 이미지에 사용할 수 있습니다.</p>



<p class="wp-block-paragraph">특히 다른 사람의 얼굴이 배경에 함께 찍혔거나 자동차 번호판이 노출된 사진을 공유하기 전에 빠르게 개인정보를 가리는 용도로 활용하기 좋습니다.</p>



<p class="wp-block-paragraph">다만 AI 자동 감지는 사진의 밝기, 얼굴 크기, 촬영 각도, 가려짐 정도에 따라 일부 영역을 놓칠 수 있습니다. 저장하기 전에는 최종 결과를 한 번 확인하고, 필요한 부분은 블러 브러시로 직접 보완하는 것을 권장합니다.</p>



<h2 class="wp-block-heading">자주 묻는 질문</h2>



<h3 class="wp-block-heading">얼굴이 자동으로 감지되지 않으면 어떻게 하나요?</h3>



<p class="wp-block-paragraph">AI 감지가 실패하거나 일부 얼굴을 놓쳤다면 <strong>다시 감지</strong>를 실행할 수 있습니다. 그래도 감지되지 않는 영역은 블러 브러시로 직접 가릴 수 있습니다.</p>



<h3 class="wp-block-heading">내 얼굴까지 블러 처리되면 어떻게 하나요?</h3>



<p class="wp-block-paragraph">내 얼굴 자동 유지 기능을 사용할 수 있으며, 잘못 블러 처리된 부분은 <strong>복구 브러시</strong>를 이용해 원본으로 되돌릴 수 있습니다.</p>



<h3 class="wp-block-heading">사진 화질이 줄어드나요?</h3>



<p class="wp-block-paragraph">최종 결과는 업로드한 이미지의 원본 해상도를 유지해 저장합니다.</p>



<h3 class="wp-block-heading">번호판도 자동으로 찾을 수 있나요?</h3>



<p class="wp-block-paragraph">네. 자동차 번호판 AI 감지를 활성화하면 사진 속 번호판을 찾아 자동으로 블러 처리합니다. 다만 작거나 가려진 번호판은 감지하지 못할 수 있으므로 최종 결과를 확인하는 것이 좋습니다.</p>
<div class="saboxplugin-wrap" itemtype="http://schema.org/Person" itemscope itemprop="author"><div class="saboxplugin-tab"><div class="saboxplugin-gravatar"><img decoding="async" src="https://snsnote.com/wp-content/uploads/2026/06/5555.png" width="100"  height="100" alt="" itemprop="image"></div><div class="saboxplugin-authorname"><a href="https://snsnote.com/author/admin/" class="vcard author" rel="author"><span class="fn">JH</span></a></div><div class="saboxplugin-desc"><div itemprop="description"><p>SNSnote 편집 담당 JH입니다.2020년부터 SNS를 본격적으로 운영하기 시작해 현재 인스타그램, 유튜브, X를 합쳐 총 40만 팔로워를 보유하고 있습니다.영구정지 복구, 계정 성장, 수익화까지 직접 경험한 실패와 성공 사례를 바탕으로 실전에서 바로 활용할 수 있는 최신 정보를 전달하고 있습니다.최근에는 <strong>AI와 웹 기술을 활용한 브라우저 기반 도구를 직접 기획·개발하며</strong>, 사진·영상·문서·SNS 업무에 바로 사용할 수 있는 무료 온라인 도구도 함께 제공하고 있습니다.</p>
</div></div><div class="saboxplugin-web "><a href="https://snsnote.com" target="_self" >snsnote.com</a></div><div class="clearfix"></div></div></div>]]></content:encoded>
					
					<wfw:commentRss>https://snsnote.com/photo-mosaic-ai/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
	<media:content url="https://snsnote.com/wp-content/uploads/2026/09/photo-mosaic-ai.webp" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">1758</post-id>	</item>
		<item>
		<title>SNS 게시물 위험도 검사기｜Instagram·Threads·X 이미지 사전 점검</title>
		<link>https://snsnote.com/sns-post-risk-checker/</link>
					<comments>https://snsnote.com/sns-post-risk-checker/#respond</comments>
		
		<dc:creator><![CDATA[JH]]></dc:creator>
		<pubDate>Fri, 11 Sep 2026 14:45:03 +0000</pubDate>
				<category><![CDATA[인스타그램]]></category>
		<category><![CDATA[유용한 도구]]></category>
		<guid isPermaLink="false">https://snsnote.com/?p=1617</guid>

					<description><![CDATA[SNS 게시 전, 이미지 위험요소를 미리 확인하세요 SNSNOTE의 SNS 게시물 위험도 검사기는 Instagram, Threads, X 등에 이미지를 게시하기 전 민감 콘텐츠로 판단될 가능성을 사전에 확인할...]]></description>
										<content:encoded><![CDATA[<div id="sns-risk-v8">

<style>
#sns-risk-v8,
#sns-risk-v8 * {
  box-sizing: border-box;
}

#sns-risk-v8 {
  width: 100%;
  max-width: 1100px;
  margin: 0 auto;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI",
    Roboto, "Noto Sans KR", Arial, sans-serif;
  color: #172033;
}

#sns-risk-v8 .sr-card {
  background: #fff;
  border: 1px solid #e5e7eb;
  border-radius: 20px;
  overflow: hidden;
  box-shadow: 0 6px 28px rgba(15,23,42,.06);
}

#sns-risk-v8 .sr-head {
  padding: 24px;
  background: linear-gradient(135deg,#f8faff,#fffaf4);
  border-bottom: 1px solid #eef2f7;
}

#sns-risk-v8 .sr-title-box {
  position: relative;
  display: flex;
  align-items: center;
  gap: 13px;
  padding: 17px 20px 17px 25px;
  background: #fff;
  border: 1px solid #e2e8f0;
  border-radius: 14px;
  box-shadow: 0 4px 16px rgba(15,23,42,.06);
  overflow: hidden;
}

#sns-risk-v8 .sr-title-box::before {
  content: "";
  position: absolute;
  left: 0;
  top: 12px;
  bottom: 12px;
  width: 6px;
  border-radius: 0 6px 6px 0;
  background: linear-gradient(180deg,#3b82f6,#6366f1,#8b5cf6);
}

#sns-risk-v8 .sr-title-icon {
  width: 40px;
  height: 40px;
  flex: 0 0 40px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 11px;
  background: #eef2ff;
  color: #4f46e5;
  font-size: 20px;
  font-weight: 900;
}

#sns-risk-v8 .sr-title {
  margin: 0 !important;
  padding: 0 !important;
  background: none !important;
  border: 0 !important;
  box-shadow: none !important;
  color: #172033 !important;
  font-size: 25px !important;
  font-weight: 800 !important;
  line-height: 1.35 !important;
  letter-spacing: -.5px;
}

#sns-risk-v8 .sr-desc {
  margin: 16px 0 0;
  color: #64748b;
  font-size: 14px;
  line-height: 1.7;
}

#sns-risk-v8 .sr-badges {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 16px;
}

#sns-risk-v8 .sr-badge {
  padding: 7px 10px;
  border: 1px solid #e2e8f0;
  border-radius: 999px;
  background: #fff;
  color: #475569;
  font-size: 11px;
  font-weight: 700;
}

#sns-risk-v8 .sr-body {
  padding: 24px;
}

#sns-risk-v8 .sr-drop {
  min-height: 190px;
  border: 2px dashed #cbd5e1;
  border-radius: 16px;
  background: #f8fafc;
  display: flex;
  justify-content: center;
  align-items: center;
  text-align: center;
  padding: 24px;
  cursor: pointer;
  transition: .2s;
}

#sns-risk-v8 .sr-drop:hover {
  border-color: #6366f1;
  background: #f5f3ff;
}

#sns-risk-v8 .sr-drop strong {
  display: block;
  font-size: 16px;
  color: #1e293b;
}

#sns-risk-v8 .sr-drop span {
  display: block;
  margin-top: 7px;
  color: #64748b;
  font-size: 12px;
  line-height: 1.65;
}

#sns-risk-v8 #sr8-file {
  display: none;
}

#sns-risk-v8 .sr-count {
  display: none;
  margin-top: 14px;
  padding: 11px 13px;
  border: 1px solid #e2e8f0;
  border-radius: 10px;
  background: #f8fafc;
  color: #334155;
  font-size: 13px;
  font-weight: 700;
}

#sns-risk-v8 .sr-preview {
  display: grid;
  grid-template-columns: repeat(5,minmax(0,1fr));
  gap: 10px;
  margin-top: 16px;
}

#sns-risk-v8 .sr-thumb {
  position: relative !important;
  aspect-ratio: 1/1;
  overflow: hidden;
  border-radius: 12px;
  background: #f1f5f9;
  isolation: isolate;
}

#sns-risk-v8 .sr-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

#sns-risk-v8 .sr-num {
  position: absolute !important;
  top: 8px !important;
  left: 8px !important;
  min-width: 28px !important;
  height: 28px !important;
  padding: 0 7px !important;
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  border-radius: 8px !important;
  background: rgba(15,23,42,.9) !important;
  color: #fff !important;
  font-size: 11px !important;
  font-weight: 800 !important;
  z-index: 10 !important;
}

#sns-risk-v8 button.sr-remove {
  position: absolute !important;
  top: 8px !important;
  right: 8px !important;
  left: auto !important;
  bottom: auto !important;
  width: 28px !important;
  height: 28px !important;
  min-width: 28px !important;
  min-height: 28px !important;
  max-width: 28px !important;
  max-height: 28px !important;
  margin: 0 !important;
  padding: 0 !important;
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  border: 0 !important;
  border-radius: 50% !important;
  background: rgba(15,23,42,.9) !important;
  color: #fff !important;
  font: 900 18px/1 Arial,sans-serif !important;
  cursor: pointer !important;
  box-shadow: 0 2px 7px rgba(0,0,0,.22) !important;
  transform: none !important;
  z-index: 20 !important;
}

#sns-risk-v8 button.sr-remove:hover {
  background: #ef4444 !important;
}

#sns-risk-v8 .sr-actions {
  display: flex;
  gap: 10px;
  margin-top: 18px;
}

#sns-risk-v8 .sr-start {
  flex: 1;
  min-height: 52px;
  border: 0;
  border-radius: 12px;
  background: linear-gradient(135deg,#4f46e5,#7c3aed);
  color: #fff;
  font-size: 15px;
  font-weight: 800;
  cursor: pointer;
}

#sns-risk-v8 .sr-start:disabled {
  opacity: .5;
  cursor: not-allowed;
}

#sns-risk-v8 .sr-reset {
  min-width: 95px;
  border: 1px solid #cbd5e1;
  border-radius: 12px;
  background: #fff;
  color: #475569;
  font-weight: 800;
  cursor: pointer;
}

#sns-risk-v8 .sr-status {
  display: none;
  margin-top: 16px;
  padding: 13px 14px;
  border: 1px solid #e2e8f0;
  border-radius: 12px;
  background: #f8fafc;
  color: #334155;
  font-size: 12px;
  font-weight: 700;
}

#sns-risk-v8 .sr-error {
  display: none;
  margin-top: 14px;
  padding: 13px 14px;
  border: 1px solid #fecaca;
  border-radius: 12px;
  background: #fef2f2;
  color: #b91c1c;
  font-size: 12px;
}

#sns-risk-v8 .sr-results {
  display: grid;
  gap: 14px;
  margin-top: 20px;
}

#sns-risk-v8 .sr-result {
  padding: 16px;
  border: 1px solid #e2e8f0;
  border-radius: 16px;
  background: #fff;
}

#sns-risk-v8 .sr-result-top {
  display: grid;
  grid-template-columns: 115px 1fr;
  gap: 16px;
}

#sns-risk-v8 .sr-result-img {
  width: 115px;
  height: 115px;
  object-fit: cover;
  border-radius: 11px;
}

#sns-risk-v8 .sr-result-head {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 12px;
}

#sns-risk-v8 .sr-name {
  font-size: 14px;
  font-weight: 800;
  color: #334155;
}

#sns-risk-v8 .sr-score {
  padding: 7px 11px;
  border-radius: 999px;
  font-size: 11px;
  font-weight: 900;
  white-space: nowrap;
}

#sns-risk-v8 .sr-low {
  background: #ecfdf5;
  color: #047857;
}

#sns-risk-v8 .sr-mid {
  background: #fffbeb;
  color: #b45309;
}

#sns-risk-v8 .sr-high {
  background: #fff1f2;
  color: #be123c;
}

#sns-risk-v8 .sr-critical {
  background: #be123c;
  color: #fff;
}

#sns-risk-v8 .sr-models {
  margin-top: 14px;
  border-top: 1px solid #eef2f7;
  padding-top: 14px;
}

#sns-risk-v8 .sr-model-title {
  margin-bottom: 10px;
  font-size: 12px;
  font-weight: 800;
  color: #334155;
}

#sns-risk-v8 .sr-model-row {
  display: grid;
  grid-template-columns: 72px 1fr 48px;
  gap: 10px;
  align-items: center;
  margin-top: 9px;
}

#sns-risk-v8 .sr-model-name {
  font-size: 11px;
  font-weight: 800;
  color: #475569;
}

#sns-risk-v8 .sr-bar-bg {
  height: 10px;
  border-radius: 999px;
  background: #e2e8f0;
  overflow: hidden;
}

#sns-risk-v8 .sr-bar-fill {
  height: 100%;
  border-radius: 999px;
  background: linear-gradient(90deg,#3b82f6,#7c3aed);
}

#sns-risk-v8 .sr-model-score {
  font-size: 11px;
  font-weight: 800;
  text-align: right;
  color: #334155;
}

#sns-risk-v8 .sr-summary {
  margin-top: 14px;
  padding: 11px 12px;
  border-radius: 10px;
  font-size: 11px;
  font-weight: 800;
  line-height: 1.6;
}

#sns-risk-v8 .sr-summary-low {
  background: #ecfdf5;
  color: #047857;
}

#sns-risk-v8 .sr-summary-mid {
  background: #fffbeb;
  color: #b45309;
}

#sns-risk-v8 .sr-summary-high {
  background: #fff1f2;
  color: #be123c;
}

#sns-risk-v8 .sr-note {
  margin-top: 18px;
  padding: 15px 16px;
  border: 1px solid #dbeafe;
  border-radius: 12px;
  background: #f8fbff;
  color: #475569;
  font-size: 11px;
  line-height: 1.75;
}

#sns-risk-v8 .sr-note strong {
  display: block;
  margin-bottom: 3px;
  color: #1d4ed8;
  font-size: 12px;
  font-weight: 800;
}


/* =========================
   모바일 최적화
   ========================= */

@media(max-width:700px) {

  /* 숏코드 내부 좌우 여백 축소 */
  #sns-risk-v8 .sr-head,
  #sns-risk-v8 .sr-body {
    padding-left: 12px !important;
    padding-right: 12px !important;
  }

  #sns-risk-v8 .sr-title-box {
    padding: 14px 14px 14px 18px;
    gap: 10px;
  }

  #sns-risk-v8 .sr-title {
    font-size: 21px !important;
  }

  #sns-risk-v8 .sr-title-icon {
    width: 36px;
    height: 36px;
    flex: 0 0 36px;
    font-size: 17px;
  }

  #sns-risk-v8 .sr-drop {
    padding-left: 12px;
    padding-right: 12px;
  }

  #sns-risk-v8 .sr-preview {
    grid-template-columns: repeat(4,minmax(0,1fr));
    gap: 8px;
  }

  #sns-risk-v8 .sr-result {
    padding: 12px;
  }

  #sns-risk-v8 .sr-result-top {
    grid-template-columns: 90px 1fr;
    gap: 12px;
  }

  #sns-risk-v8 .sr-result-img {
    width: 90px;
    height: 90px;
  }

  #sns-risk-v8 .sr-model-row {
    grid-template-columns: 62px 1fr 40px;
    gap: 7px;
  }

  #sns-risk-v8 .sr-model-name,
  #sns-risk-v8 .sr-model-score {
    font-size: 10px;
  }

  #sns-risk-v8 .sr-note {
    padding-left: 12px;
    padding-right: 12px;
  }
}


@media(max-width:480px) {

  #sns-risk-v8 .sr-head,
  #sns-risk-v8 .sr-body {
    padding-left: 10px !important;
    padding-right: 10px !important;
  }

  #sns-risk-v8 .sr-title-box {
    padding: 13px 11px 13px 16px;
    gap: 9px;
  }

  #sns-risk-v8 .sr-title {
    font-size: 19px !important;
    line-height: 1.3 !important;
  }

  #sns-risk-v8 .sr-title-icon {
    width: 34px;
    height: 34px;
    flex: 0 0 34px;
    font-size: 16px;
  }

  #sns-risk-v8 .sr-desc {
    font-size: 12px;
  }

  #sns-risk-v8 .sr-badges {
    gap: 5px;
  }

  #sns-risk-v8 .sr-badge {
    padding: 6px 8px;
    font-size: 10px;
  }

  #sns-risk-v8 .sr-drop {
    min-height: 160px;
    padding: 16px 8px;
  }

  #sns-risk-v8 .sr-drop strong {
    font-size: 14px;
  }

  #sns-risk-v8 .sr-drop span {
    font-size: 11px;
  }

  #sns-risk-v8 .sr-preview {
    grid-template-columns: repeat(3,minmax(0,1fr));
    gap: 7px;
  }

  #sns-risk-v8 .sr-actions {
    gap: 7px;
  }

  #sns-risk-v8 .sr-start {
    min-height: 48px;
    font-size: 13px;
  }

  #sns-risk-v8 .sr-reset {
    min-width: 72px;
    font-size: 12px;
  }

  #sns-risk-v8 .sr-result {
    padding: 10px;
  }

  #sns-risk-v8 .sr-result-top {
    grid-template-columns: 72px 1fr;
    gap: 9px;
  }

  #sns-risk-v8 .sr-result-img {
    width: 72px;
    height: 72px;
  }

  #sns-risk-v8 .sr-name {
    font-size: 12px;
  }

  #sns-risk-v8 .sr-score {
    padding: 5px 7px;
    font-size: 10px;
  }

  #sns-risk-v8 .sr-models {
    margin-top: 10px;
    padding-top: 10px;
  }

  #sns-risk-v8 .sr-model-title {
    font-size: 11px;
  }

  #sns-risk-v8 .sr-model-row {
    grid-template-columns: 52px 1fr 36px;
    gap: 5px;
    margin-top: 7px;
  }

  #sns-risk-v8 .sr-summary {
    padding: 9px 10px;
    font-size: 10px;
  }

  #sns-risk-v8 .sr-note {
    padding: 12px 10px;
  }
}
</style>


<div class="sr-card">

  <div class="sr-head">

    <div class="sr-title-box">

      <div class="sr-title-icon">
        AI
      </div>

      <h2 class="sr-title">
        SNS 게시물 위험도 검사기
      </h2>

    </div>

    <p class="sr-desc">
      서로 다른 3개의 이미지 분석 AI가 같은 이미지를 각각 검사하고,
      결과를 비교해 종합 위험도를 표시합니다.
    </p>

    <div class="sr-badges">
      <span class="sr-badge">최대 20장</span>
      <span class="sr-badge">3중 AI 분석</span>
      <span class="sr-badge">브라우저에서 처리</span>
      <span class="sr-badge">서버 업로드 없음</span>
    </div>

  </div>


  <div class="sr-body">

    <label class="sr-drop" for="sr8-file">

      <div>
        <strong>
          검사할 SNS 이미지를 선택하세요
        </strong>

        <span>
          JPG · PNG · WebP<br>
          카드뉴스·피드 이미지 등 최대 20장까지 한 번에 선택할 수 있습니다.
        </span>
      </div>

    </label>


    <input
      id="sr8-file"
      type="file"
      accept="image/jpeg,image/png,image/webp"
      multiple
    >


    <div
      class="sr-count"
      id="sr8-count"
    ></div>


    <div
      class="sr-preview"
      id="sr8-preview"
    ></div>


    <div class="sr-actions">

      <button
        type="button"
        class="sr-start"
        id="sr8-start"
        disabled
      >
        3중 AI 위험도 검사 시작
      </button>

      <button
        type="button"
        class="sr-reset"
        id="sr8-reset"
      >
        초기화
      </button>

    </div>


    <div
      class="sr-status"
      id="sr8-status"
    ></div>


    <div
      class="sr-error"
      id="sr8-error"
    ></div>


    <div
      class="sr-results"
      id="sr8-results"
    ></div>


    <div class="sr-note">

      <strong>
        검사 기준은 계속 업데이트됩니다.
      </strong>

      Instagram, Threads, X 등 주요 SNS의 정책 변화와 실제 사례를 참고해
      위험도 기준을 지속적으로 개선하고 있습니다.

    </div>

  </div>

</div>


<script type="module">
(async function () {

  const MAX_FILES = 20;

  const MODEL_A =
    "onnx-community/nsfw_image_detection-ONNX";

  const MODEL_B =
    "onnx-community/nsfw-classifier-ONNX";


  const state = {
    files: [],
    running: false,

    transformers: null,
    RawImage: null,

    modelA: null,
    modelB: null,
    modelC: null
  };


  const root =
    document.getElementById(
      "sns-risk-v8"
    );

  if (!root) return;


  const fileInput =
    root.querySelector("#sr8-file");

  const count =
    root.querySelector("#sr8-count");

  const preview =
    root.querySelector("#sr8-preview");

  const startBtn =
    root.querySelector("#sr8-start");

  const resetBtn =
    root.querySelector("#sr8-reset");

  const status =
    root.querySelector("#sr8-status");

  const errorBox =
    root.querySelector("#sr8-error");

  const results =
    root.querySelector("#sr8-results");


  function clamp(value) {
    return Math.max(
      0,
      Math.min(100,value)
    );
  }


  function showStatus(text) {
    status.style.display =
      "block";

    status.textContent =
      text;
  }


  function showError(text) {
    errorBox.style.display =
      "block";

    errorBox.textContent =
      text;
  }


  function clearError() {
    errorBox.style.display =
      "none";

    errorBox.textContent =
      "";
  }


  function getLevel(score) {

    if (score >= 85) {
      return {
        text:"매우 높음",
        cls:"sr-critical",
        summaryCls:"sr-summary-high",
        message:
          "3개 AI의 종합 결과에서 높은 민감 콘텐츠 위험 신호가 확인되었습니다."
      };
    }

    if (score >= 65) {
      return {
        text:"높음",
        cls:"sr-high",
        summaryCls:"sr-summary-high",
        message:
          "여러 AI 모델에서 민감 콘텐츠 위험 신호가 비교적 높게 감지되었습니다."
      };
    }

    if (score >= 35) {
      return {
        text:"주의",
        cls:"sr-mid",
        summaryCls:"sr-summary-mid",
        message:
          "AI 모델별 판단이 엇갈리거나 일부 민감 신호가 감지되었습니다."
      };
    }

    return {
      text:"낮음",
      cls:"sr-low",
      summaryCls:"sr-summary-low",
      message:
        "현재 3개 AI의 종합 결과에서는 강한 민감 콘텐츠 신호가 많지 않습니다."
    };
  }


  function renderPreview() {

    preview.innerHTML = "";


    state.files.forEach(
      function(item,index) {

        const box =
          document.createElement("div");

        box.className =
          "sr-thumb";


        box.innerHTML = `
          <img decoding="async" src="${item.url}" alt="">

          <span class="sr-num">
            ${index + 1}
          </span>

          <button
            type="button"
            class="sr-remove"
            data-id="${item.id}"
            aria-label="이미지 삭제"
          >
            ×
          </button>
        `;


        preview.appendChild(box);

      }
    );


    if (state.files.length) {

      count.style.display =
        "block";

      count.textContent =
        state.files.length +
        " / 20장 선택됨";

    } else {

      count.style.display =
        "none";

    }


    startBtn.disabled =
      !state.files.length ||
      state.running;


    preview
      .querySelectorAll(".sr-remove")
      .forEach(
        function(btn) {

          btn.addEventListener(
            "click",
            function(event) {

              event.preventDefault();
              event.stopPropagation();

              if (state.running) {
                return;
              }

              const id =
                btn.dataset.id;

              const found =
                state.files.find(
                  item =>
                    item.id === id
                );

              if (found) {
                URL.revokeObjectURL(
                  found.url
                );
              }

              state.files =
                state.files.filter(
                  item =>
                    item.id !== id
                );

              renderPreview();

            }
          );

        }
      );
  }


  fileInput.addEventListener(
    "change",
    function() {

      let files =
        Array.from(
          fileInput.files || []
        );


      files =
        files.filter(
          file =>
            /^image\/(jpeg|png|webp)$/i
              .test(file.type)
        );


      const remain =
        MAX_FILES -
        state.files.length;


      files =
        files.slice(
          0,
          remain
        );


      files.forEach(
        function(file) {

          state.files.push({

            id:
              Date.now().toString(36) +
              Math.random()
                .toString(36)
                .slice(2),

            file:file,

            url:
              URL.createObjectURL(file)

          });

        }
      );


      fileInput.value = "";

      renderPreview();

    }
  );


  async function loadModels() {

    if (
      state.modelA &&
      state.modelB &&
      state.modelC
    ) {
      return;
    }


    showStatus(
      "3개의 AI 모델을 처음 준비하는 중입니다..."
    );


    const transformers =
      await import(
        "https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.8.1/+esm"
      );


    state.transformers =
      transformers;

    state.RawImage =
      transformers.RawImage;


    if (!state.modelA) {

      showStatus(
        "AI 모델 A를 준비하는 중..."
      );

      state.modelA =
        await transformers.pipeline(
          "image-classification",
          MODEL_A,
          {
            device:"wasm"
          }
        );

    }


    if (!state.modelB) {

      showStatus(
        "AI 모델 B를 준비하는 중..."
      );

      state.modelB =
        await transformers.pipeline(
          "image-classification",
          MODEL_B,
          {
            device:"wasm"
          }
        );

    }


    if (!state.modelC) {

      showStatus(
        "AI 모델 C를 준비하는 중..."
      );


      const nsfwjs =
        await import(
          "https://cdn.jsdelivr.net/npm/nsfwjs@4.4.0/+esm"
        );


      state.modelC =
        await nsfwjs.load();

    }

  }


  async function getRawImage(file) {

    return await state.RawImage
      .fromBlob(file);

  }


  async function getCanvas(file) {

    return new Promise(
      function(resolve,reject) {

        const url =
          URL.createObjectURL(file);


        const img =
          new Image();


        img.onload =
          function() {

            let width =
              img.naturalWidth;

            let height =
              img.naturalHeight;


            const maxSide =
              768;


            if (
              Math.max(
                width,
                height
              ) > maxSide
            ) {

              const ratio =
                maxSide /
                Math.max(
                  width,
                  height
                );

              width =
                Math.round(
                  width * ratio
                );

              height =
                Math.round(
                  height * ratio
                );

            }


            const canvas =
              document.createElement(
                "canvas"
              );


            canvas.width =
              width;

            canvas.height =
              height;


            const ctx =
              canvas.getContext("2d");


            ctx.drawImage(
              img,
              0,
              0,
              width,
              height
            );


            URL.revokeObjectURL(url);


            resolve(canvas);

          };


        img.onerror =
          function() {

            URL.revokeObjectURL(url);

            reject(
              new Error(
                "이미지를 읽지 못했습니다."
              )
            );

          };


        img.src =
          url;

      }
    );

  }


  function parseModelA(output) {

    let nsfw = 0;


    (output || [])
      .forEach(
        function(item) {

          const label =
            String(
              item.label || ""
            ).toLowerCase();


          if (label === "nsfw") {

            nsfw =
              Number(
                item.score || 0
              ) * 100;

          }

        }
      );


    return Math.round(
      clamp(nsfw)
    );

  }


  function parseModelB(output) {

    let sexy = 0;
    let porn = 0;
    let hentai = 0;


    (output || [])
      .forEach(
        function(item) {

          const label =
            String(
              item.label || ""
            ).toLowerCase();


          const score =
            Number(
              item.score || 0
            ) * 100;


          if (label === "sexy") {
            sexy = score;
          }

          else if (label === "porn") {
            porn = score;
          }

          else if (label === "hentai") {
            hentai = score;
          }

        }
      );


    const risk =
      porn * 1.0 +
      sexy * 0.65 +
      hentai * 0.85;


    return Math.round(
      clamp(risk)
    );

  }


  function parseModelC(output) {

    let sexy = 0;
    let porn = 0;
    let hentai = 0;


    (output || [])
      .forEach(
        function(item) {

          const label =
            String(
              item.className || ""
            ).toLowerCase();


          const score =
            Number(
              item.probability || 0
            ) * 100;


          if (label === "sexy") {
            sexy = score;
          }

          else if (label === "porn") {
            porn = score;
          }

          else if (label === "hentai") {
            hentai = score;
          }

        }
      );


    const risk =
      porn * 1.0 +
      sexy * 0.55 +
      hentai * 0.8;


    return Math.round(
      clamp(risk)
    );

  }


  function median(values) {

    const arr =
      [...values]
        .sort(
          (a,b) => a - b
        );


    return arr[1];

  }


  function combinedScore(a,b,c) {

    const values =
      [a,b,c];


    const avg =
      (
        a +
        b +
        c
      ) / 3;


    const mid =
      median(values);


    let score =
      mid * 0.65 +
      avg * 0.35;


    const highCount =
      values.filter(
        v => v >= 70
      ).length;


    if (highCount >= 2) {

      score =
        Math.max(
          score,
          72
        );

    }


    const lowCount =
      values.filter(
        v => v <= 20
      ).length;


    if (lowCount >= 2) {

      score =
        Math.min(
          score,
          32
        );

    }


    return Math.round(
      clamp(score)
    );

  }


  function renderModelRow(
    name,
    score
  ) {

    return `
      <div class="sr-model-row">

        <div class="sr-model-name">
          ${name}
        </div>

        <div class="sr-bar-bg">

          <div
            class="sr-bar-fill"
            style="width:${score}%"
          ></div>

        </div>

        <div class="sr-model-score">
          ${score}%
        </div>

      </div>
    `;

  }


  function renderResult(
    fileItem,
    index,
    a,
    b,
    c
  ) {

    const total =
      combinedScore(
        a,
        b,
        c
      );


    const info =
      getLevel(total);


    const box =
      document.createElement(
        "div"
      );


    box.className =
      "sr-result";


    box.innerHTML = `

      <div class="sr-result-top">

        <img decoding="async"
          class="sr-result-img"
          src="${fileItem.url}"
          alt=""
        >


        <div>

          <div class="sr-result-head">

            <div class="sr-name">
              ${index + 1}번 이미지
            </div>


            <div
              class="sr-score ${info.cls}"
            >
              ${total}점 ·
              ${info.text}
            </div>

          </div>


          <div class="sr-models">

            <div class="sr-model-title">
              AI 모델별 검사 결과
            </div>


            ${renderModelRow(
              "모델 A",
              a
            )}


            ${renderModelRow(
              "모델 B",
              b
            )}


            ${renderModelRow(
              "모델 C",
              c
            )}

          </div>

        </div>

      </div>


      <div
        class="sr-summary ${info.summaryCls}"
      >
        ${info.message}
      </div>

    `;


    results.appendChild(box);

  }


  async function analyze() {

    if (
      state.running ||
      !state.files.length
    ) {
      return;
    }


    state.running =
      true;


    startBtn.disabled =
      true;

    resetBtn.disabled =
      true;


    results.innerHTML =
      "";


    clearError();


    try {

      await loadModels();


      for (
        let i = 0;
        i < state.files.length;
        i++
      ) {

        showStatus(
          (i + 1) +
          " / " +
          state.files.length +
          "장 3중 AI 분석 중..."
        );


        const file =
          state.files[i].file;


        const rawImage =
          await getRawImage(file);


        const outputA =
          await state.modelA(
            rawImage,
            {
              topk:2
            }
          );


        const scoreA =
          parseModelA(
            outputA
          );


        const outputB =
          await state.modelB(
            rawImage,
            {
              topk:5
            }
          );


        const scoreB =
          parseModelB(
            outputB
          );


        const canvas =
          await getCanvas(file);


        const outputC =
          await state.modelC
            .classify(canvas);


        const scoreC =
          parseModelC(
            outputC
          );


        renderResult(
          state.files[i],
          i,
          scoreA,
          scoreB,
          scoreC
        );


        canvas.width = 1;
        canvas.height = 1;

      }


      showStatus(
        "모든 이미지의 3중 AI 분석이 완료되었습니다."
      );

    }


    catch(error) {

      console.error(error);


      showError(
        "검사 중 문제가 발생했습니다. " +
        (
          error.message ||
          String(error)
        )
      );


      showStatus(
        "검사가 중단되었습니다."
      );

    }


    finally {

      state.running =
        false;


      startBtn.disabled =
        !state.files.length;


      resetBtn.disabled =
        false;

    }

  }


  startBtn.addEventListener(
    "click",
    analyze
  );


  resetBtn.addEventListener(
    "click",
    function() {

      if (state.running) {
        return;
      }


      state.files.forEach(
        function(item) {

          URL.revokeObjectURL(
            item.url
          );

        }
      );


      state.files = [];


      preview.innerHTML =
        "";


      results.innerHTML =
        "";


      count.style.display =
        "none";


      status.style.display =
        "none";


      clearError();


      startBtn.disabled =
        true;

    }
  );

})();
</script>

</div>



<h2 class="wp-block-heading">SNS 게시 전, 이미지 위험요소를 미리 확인하세요</h2>



<p class="wp-block-paragraph">SNSNOTE의 <strong>SNS 게시물 위험도 검사기</strong>는 Instagram, Threads, X 등에 이미지를 게시하기 전 민감 콘텐츠로 판단될 가능성을 사전에 확인할 수 있도록 제공하는 이미지 분석 도구입니다.<br>SNSNOTE는 Instagram과 X 등에서 <strong>총 팔로워 약 40만 규모의 SNS 계정을 운영하며 축적한 실제 게시 경험과 콘텐츠 사례</strong>를 바탕으로 서비스 기준을 지속적으로 점검하고 있습니다.<br>단순한 이미지 분석 결과만 제공하는 것이 아니라, 실제 계정 운영 과정에서 확인된 콘텐츠 유형과 주요 SNS 플랫폼의 정책 변화를 함께 참고하여 위험도 안내 기준을 지속적으로 개선합니다.<br><br>공식 정책은 아래 자료를 기준으로 지속적으로 확인하고 있습니다.<br>SNSNOTE는 Instagram과 X의 공식 정책 문서를 정기적으로 검토하며, 정책 변경이나 새로운 제한 기준이 확인될 경우 위험도 안내 기준과 서비스 설명을 지속적으로 점검·개선하고 있습니다.<br><strong>Instagram 커뮤니티 가이드라인</strong><br><a href="https://www.facebook.com/help/477434105621119" target="_blank" rel="noreferrer noopener">https://www.facebook.com/help/477434105621119</a><br><strong>X 콘텐츠 정책</strong><br><a href="https://help.x.com/ko/rules-and-policies" target="_blank" rel="noreferrer noopener">https://help.x.com/ko/rules-and-policies</a><br>SNS 플랫폼의 정책은 수시로 변경될 수 있기 때문에, SNSNOTE는 위 공식 정책과 실제 운영 사례를 함께 참고하여 검사 기준을 계속 업데이트하고 있습니다.</p>



<h2 class="wp-block-heading">SNS 게시물 위험도 검사기란?</h2>



<p class="wp-block-paragraph">SNS 게시물 위험도 검사기는 이미지에 포함된 민감 콘텐츠 가능성을 AI로 분석하여 <strong>0~100점의 위험도 점수</strong>로 표시합니다.<br>JPG, PNG, WebP 이미지를 지원하며 한 번에 <strong>최대 20장</strong>까지 검사할 수 있습니다.<br>Instagram 피드, 카드뉴스, 매거진 콘텐츠, Threads 및 X 게시용 이미지처럼 여러 장을 한 번에 게시하는 콘텐츠를 사전에 점검할 때 활용할 수 있습니다.<br>검사 결과는 각 이미지별로 구분하여 표시되므로 여러 장 중 위험도가 상대적으로 높은 이미지를 빠르게 확인할 수 있습니다.</p>



<h2 class="wp-block-heading">주요 기능</h2>



<ul class="wp-block-list">
<li>최대 20장 이미지 일괄 검사</li>



<li>JPG·PNG·WebP 지원</li>



<li>이미지별 민감 콘텐츠 위험도 표시</li>



<li>0~100점 위험도 점수 제공</li>



<li>낮음·주의·높음·매우 높음 단계별 표시</li>



<li>브라우저에서 직접 AI 분석</li>



<li>SNSNOTE 서버로 이미지 업로드 없음</li>



<li>별도 회원가입 없이 이용 가능</li>
</ul>



<h2 class="wp-block-heading">사용 방법</h2>



<h3 class="wp-block-heading">1. 검사할 이미지를 선택합니다</h3>



<p class="wp-block-paragraph">검사 영역을 눌러 SNS에 게시할 이미지를 선택합니다.<br>한 번에 최대 20장까지 추가할 수 있으며, 잘못 선택한 이미지는 오른쪽 상단의 삭제 버튼을 눌러 제외할 수 있습니다.</p>



<h3 class="wp-block-heading">2. 이미지 위험도 검사를 시작합니다</h3>



<p class="wp-block-paragraph"><strong>이미지 위험도 검사 시작</strong> 버튼을 누르면 선택한 이미지가 순서대로 분석됩니다.<br>첫 검사에서는 브라우저가 AI 분석에 필요한 데이터를 준비하기 때문에 이후 검사보다 조금 더 시간이 걸릴 수 있습니다.</p>



<h3 class="wp-block-heading">3. 이미지별 위험도를 확인합니다</h3>



<p class="wp-block-paragraph">분석이 완료되면 각 이미지에 다음과 같이 위험도가 표시됩니다.<br><strong>낮음</strong><br>강한 민감 콘텐츠 신호가 적게 감지된 이미지입니다.<br><strong>주의</strong><br>일부 민감 콘텐츠 가능성이 감지된 이미지입니다. 게시 전 직접 확인을 권장합니다.<br><strong>높음</strong><br>민감하거나 선정적인 콘텐츠로 분류될 가능성이 높게 감지된 이미지입니다.<br><strong>매우 높음</strong><br>강한 민감 콘텐츠 신호가 감지된 이미지입니다. 게시 전 이미지 재검토를 권장합니다.</p>



<h2 class="wp-block-heading">검사 기준은 계속 업데이트됩니다</h2>



<p class="wp-block-paragraph">Instagram, Threads, X를 비롯한 주요 SNS 플랫폼은 콘텐츠 정책과 추천 기준을 지속적으로 변경하고 있습니다.<br>SNSNOTE는 <strong>실제 SNS 계정 운영 과정에서 축적된 사례와 주요 플랫폼의 정책 변화를 참고하여 위험도 기준을 지속적으로 점검하고 개선하고 있습니다.</strong><br>정책 변화 또는 새로운 콘텐츠 유형이 확인되는 경우 서비스 안내 기준에도 순차적으로 반영합니다.</p>



<h2 class="wp-block-heading">이미지가 서버에 저장되나요?</h2>



<p class="wp-block-paragraph">아닙니다.<br>선택한 이미지는 SNSNOTE 서버에 업로드하여 분석하지 않습니다.<br>AI 분석에 필요한 프로그램과 모델은 브라우저에서 실행되며 실제 이미지 처리는 사용자의 기기에서 진행됩니다.<br>따라서 검사하기 위해 선택한 이미지가 SNSNOTE 서버에 별도로 저장되는 구조가 아닙니다.</p>



<h2 class="wp-block-heading">AI 분석 결과가 낮으면 반드시 안전한가요?</h2>



<p class="wp-block-paragraph">아닙니다.<br>AI 이미지 분석에는 기술적인 한계가 있습니다.<br>특히 다음과 같은 경우 민감 요소를 정확하게 인식하지 못할 수 있습니다.</p>



<ul class="wp-block-list">
<li>화면에서 매우 작게 표현된 노출 부위</li>



<li>신체 일부가 다른 물체나 문자로 가려진 이미지</li>



<li>스티커 또는 모자이크가 적용된 이미지</li>



<li>복잡한 배경과 인물이 겹쳐 있는 이미지</li>



<li>특수한 촬영 각도나 크롭 이미지</li>



<li>AI 학습 데이터에서 충분히 다뤄지지 않은 형태의 이미지</li>
</ul>



<p class="wp-block-paragraph">따라서 <strong>작은 노출 부위나 가려진 민감 요소는 위험도 점수에 충분히 반영되지 않을 수 있습니다.</strong><br>0점 또는 낮음이 표시되더라도 게시 전에는 실제 이미지를 직접 확인하는 것을 권장합니다.</p>



<h2 class="wp-block-heading">Instagram과 X의 기준은 동일한가요?</h2>



<p class="wp-block-paragraph">동일하지 않습니다.<br>각 SNS 플랫폼은 민감 콘텐츠에 대해 서로 다른 정책을 적용합니다.<br>예를 들어 특정 이미지가 한 플랫폼에서는 제한될 수 있지만 다른 플랫폼에서는 민감 콘텐츠 표시 등의 조건을 충족하면 허용될 수도 있습니다.<br>따라서 본 검사기의 점수는 여러 SNS에 공통적으로 적용되는 <strong>사전 위험 신호를 확인하기 위한 참고용 지표</strong>로 활용하는 것이 적절합니다.<br>최종 게시 여부는 반드시 이용하려는 플랫폼의 최신 정책을 함께 확인해야 합니다.</p>



<h2 class="wp-block-heading">카드뉴스도 검사할 수 있나요?</h2>



<p class="wp-block-paragraph">가능합니다.<br>한 번에 최대 20장까지 선택할 수 있기 때문에 여러 장으로 구성된 Instagram 카드뉴스나 매거진형 콘텐츠를 게시하기 전에 일괄 점검할 수 있습니다.<br>여러 이미지 중 일부만 높은 위험도로 표시되는 경우 해당 이미지를 우선적으로 재검토하는 방식으로 활용할 수 있습니다.</p>



<h2 class="wp-block-heading">검사 결과가 실제 계정 제재를 의미하나요?</h2>



<p class="wp-block-paragraph">아닙니다.<br>SNSNOTE의 위험도 점수는 Instagram, Threads, X 등 플랫폼 내부에서 사용하는 공식 심사 점수가 아닙니다.<br>실제 게시물의 삭제, 노출 제한, 추천 제외, 민감 콘텐츠 표시 또는 계정 제재 여부는 각 플랫폼이 자체 정책과 시스템에 따라 결정합니다.<br>콘텐츠의 맥락, 게시 위치, 계정 상태, 반복 게시 여부 등 여러 요소가 함께 영향을 줄 수 있습니다.</p>



<h2 class="wp-block-heading">이용 전 참고사항</h2>



<p class="wp-block-paragraph">본 서비스는 SNS 게시 전 콘텐츠를 한 번 더 확인할 수 있도록 제공되는 <strong>사전 점검 도구</strong>입니다.<br>AI 분석 결과만으로 게시 가능 여부를 확정하지 마시고, 점수가 낮더라도 중요한 게시물은 직접 확인하는 것을 권장합니다.<br>SNSNOTE는 서비스 품질 향상을 위해 주요 SNS의 정책 변화와 실제 운영 사례를 지속적으로 검토하고 위험도 안내 기준을 개선하고 있습니다.</p>



<style>
  /* 이 글에서만 본문 상단 대표 이미지 숨기기 */
  .featured-image, 
  .post-thumbnail, 
  .entry-header .post-image,
  .single-media {
    display: none !important;
  }
</style>
<div class="saboxplugin-wrap" itemtype="http://schema.org/Person" itemscope itemprop="author"><div class="saboxplugin-tab"><div class="saboxplugin-gravatar"><img decoding="async" src="https://snsnote.com/wp-content/uploads/2026/06/5555.png" width="100"  height="100" alt="" itemprop="image"></div><div class="saboxplugin-authorname"><a href="https://snsnote.com/author/admin/" class="vcard author" rel="author"><span class="fn">JH</span></a></div><div class="saboxplugin-desc"><div itemprop="description"><p>SNSnote 편집 담당 JH입니다.2020년부터 SNS를 본격적으로 운영하기 시작해 현재 인스타그램, 유튜브, X를 합쳐 총 40만 팔로워를 보유하고 있습니다.영구정지 복구, 계정 성장, 수익화까지 직접 경험한 실패와 성공 사례를 바탕으로 실전에서 바로 활용할 수 있는 최신 정보를 전달하고 있습니다.최근에는 <strong>AI와 웹 기술을 활용한 브라우저 기반 도구를 직접 기획·개발하며</strong>, 사진·영상·문서·SNS 업무에 바로 사용할 수 있는 무료 온라인 도구도 함께 제공하고 있습니다.</p>
</div></div><div class="saboxplugin-web "><a href="https://snsnote.com" target="_self">snsnote.com</a></div><div class="clearfix"></div></div></div>]]></content:encoded>
					
					<wfw:commentRss>https://snsnote.com/sns-post-risk-checker/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
	<media:content url="https://snsnote.com/wp-content/uploads/2026/09/sns-post-risk-checker.webp" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">1617</post-id>	</item>
		<item>
		<title>인스타그램 폰트 글씨체 변환기</title>
		<link>https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%ed%8f%b0%ed%8a%b8-%ea%b8%80%ec%94%a8%ec%b2%b4-%eb%b3%80%ed%99%98%ea%b8%b0/</link>
					<comments>https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%ed%8f%b0%ed%8a%b8-%ea%b8%80%ec%94%a8%ec%b2%b4-%eb%b3%80%ed%99%98%ea%b8%b0/#respond</comments>
		
		<dc:creator><![CDATA[JH]]></dc:creator>
		<pubDate>Tue, 01 Sep 2026 05:13:48 +0000</pubDate>
				<category><![CDATA[유용한 도구]]></category>
		<category><![CDATA[인스타그램]]></category>
		<guid isPermaLink="false">https://snsnote.com/?p=1525</guid>

					<description><![CDATA[인스타그램, Threads, X(트위터)에서 예쁘게 보이는 특수 글씨체를 무료로 변환해드립니다.
볼드, 이탤릭, 필기체, 더블, 전각 등 6가지 스타일 지원]]></description>
										<content:encoded><![CDATA[
<p class="has-text-align-center has-small-font-size wp-block-paragraph">인스타그램, Threads, X(트위터)에서 예쁘게 보이는 특수 글씨체를 무료로 변환해드립니다.<br>볼드, 이탤릭, 필기체, 더블, 전각 등 6가지 스타일 지원</p>



<!-- 인스타 글씨체 변환기 -->
<div style="width:100%; max-width:1200px; margin:30px auto; padding:30px 20px; background:#0f172a; border-radius:20px; box-shadow:0 10px 40px rgba(0,0,0,0.6); color:white; box-sizing:border-box; clear:both;">

  <h2 style="text-align:center; font-size:28px; margin-bottom:8px; color:#ffffff !important;">
    인스타 글씨체 변환기
  </h2>

  <p style="text-align:center; margin-bottom:30px; opacity:0.85; color:#e0f2fe;">
    영어·숫자를 다양한 글씨체로 변환합니다.
  </p>

  <textarea
    id="inputText"
    rows="3"
    style="width:100%; background:#1e2937; border:2px solid #60a5fa; border-radius:12px; padding:16px; color:white; font-size:17px; box-sizing:border-box; display:block;"
    placeholder="Hello 2026"
  ></textarea>

  <h3 style="text-align:center; margin:30px 0 20px; color:#60a5fa;">
    <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3a8.png" alt="🎨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 글씨체 미리보기
  </h3>

  <div
    id="results"
    style="display:grid; grid-template-columns:repeat(auto-fit, minmax(300px, 1fr)); gap:20px; width:100%; box-sizing:border-box;"
  ></div>


  <!-- 사용 방법 -->
  <div style="margin-top:50px; background:#1e2937; padding:25px; border-radius:16px; border:1px solid #334155; box-sizing:border-box;">

    <h4 style="color:#60a5fa; margin-bottom:15px; font-size:20px;">
      <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 사용 방법
    </h4>

    <ol style="line-height:1.7; color:#cbd5e1; padding-left:20px; font-size:15.5px;">
      <li>위 입력란에 영문 텍스트나 숫자를 입력하세요.</li>
      <li>아래에 다양한 글씨체로 자동 변환됩니다.</li>
      <li>원하는 스타일의 <strong>복사하기</strong> 버튼을 클릭하세요.</li>
      <li>인스타그램, Threads, X 등에 바로 붙여넣기 하세요! (Ctrl + V)</li>
    </ol>

  </div>


  <!-- 자주 묻는 질문 -->
  <div style="margin-top:25px; background:#1e2937; padding:25px; border-radius:16px; border:1px solid #334155; box-sizing:border-box;">

    <h4 style="color:#60a5fa; margin-bottom:15px; font-size:20px;">
      <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2753.png" alt="❓" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 자주 묻는 질문
    </h4>

    <details style="margin-bottom:12px;">
      <summary style="cursor:pointer; font-weight:bold; color:#e0f2fe; font-size:15.5px;">
        인스타그램에서 사용할 수 있나요?
      </summary>

      <p style="margin-top:8px; color:#cbd5e1; font-size:15px;">
        네, 대부분의 SNS(인스타, Threads, X, 유튜브 등)에서 정상적으로 사용할 수 있습니다.
      </p>
    </details>


    <details style="margin-bottom:12px;">
      <summary style="cursor:pointer; font-weight:bold; color:#e0f2fe; font-size:15.5px;">
        한글은 왜 안 바뀌나요?
      </summary>

      <p style="margin-top:8px; color:#cbd5e1; font-size:15px;">
        한글은 유니코드 글씨체 지원이 제한적이어서 현재 영문과 숫자를 변환합니다.
      </p>
    </details>


    <details>
      <summary style="cursor:pointer; font-weight:bold; color:#e0f2fe; font-size:15.5px;">
        모바일에서도 되나요?
      </summary>

      <p style="margin-top:8px; color:#cbd5e1; font-size:15px;">
        네, 모바일에서도 정상적으로 작동합니다.
      </p>
    </details>

  </div>

</div>


<script>
(function () {

  const upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  const lower = 'abcdefghijklmnopqrstuvwxyz';
  const digits = '0123456789';


  /* =========================================
     유니코드 범위 생성
  ========================================= */

  function unicodeRange(start, length) {

    return Array.from(
      { length: length },
      (_, i) => String.fromCodePoint(start + i)
    ).join('');

  }


  /* =========================================
     문자 변환표 생성
  ========================================= */

  function createMap(targetUpper, targetLower, targetDigits = null) {

    const map = {};

    const upperArray = Array.from(targetUpper);
    const lowerArray = Array.from(targetLower);

    Array.from(upper).forEach((char, i) => {

      if (upperArray[i]) {
        map[char] = upperArray[i];
      }

    });

    Array.from(lower).forEach((char, i) => {

      if (lowerArray[i]) {
        map[char] = lowerArray[i];
      }

    });


    if (targetDigits) {

      const digitArray = Array.from(targetDigits);

      Array.from(digits).forEach((char, i) => {

        if (digitArray[i]) {
          map[char] = digitArray[i];
        }

      });

    }

    return map;

  }


  /* =========================================
     숫자 스타일
  ========================================= */

  const boldDigits =
    unicodeRange(0x1D7CE, 10);

  const doubleDigits =
    unicodeRange(0x1D7D8, 10);

  const sansDigits =
    unicodeRange(0x1D7E2, 10);

  const sansBoldDigits =
    unicodeRange(0x1D7EC, 10);

  const monoDigits =
    unicodeRange(0x1D7F6, 10);


  /* =========================================
     1. Bold
  ========================================= */

  const boldMap = createMap(

    unicodeRange(0x1D400, 26),

    unicodeRange(0x1D41A, 26),

    boldDigits

  );


  /* =========================================
     2. Serif Italic
  ========================================= */

  const serifItalicUpper =
    '𝐴𝐵𝐶𝐷𝐸𝐹𝐺𝐻𝐼𝐽𝐾𝐿𝑀𝑁𝑂𝑃𝑄𝑅𝑆𝑇𝑈𝑉𝑊𝑋𝑌𝑍';

  const serifItalicLower =
    '𝑎𝑏𝑐𝑑𝑒𝑓𝑔ℎ𝑖𝑗𝑘𝑙𝑚𝑛𝑜𝑝𝑞𝑟𝑠𝑡𝑢𝑣𝑤𝑥𝑦𝑧';

  const serifItalicMap = createMap(

    serifItalicUpper,

    serifItalicLower,

    sansDigits

  );


  /* =========================================
     3. Serif Bold Italic
  ========================================= */

  const serifBoldItalicMap = createMap(

    unicodeRange(0x1D468, 26),

    unicodeRange(0x1D482, 26),

    boldDigits

  );


  /* =========================================
     4. Sans
  ========================================= */

  const sansMap = createMap(

    unicodeRange(0x1D5A0, 26),

    unicodeRange(0x1D5BA, 26),

    sansDigits

  );


  /* =========================================
     5. Sans Italic
     기존 f → q 오류 수정
  ========================================= */

  const sansItalicMap = createMap(

    unicodeRange(0x1D608, 26),

    unicodeRange(0x1D622, 26),

    sansDigits

  );


  /* =========================================
     6. Sans Bold
  ========================================= */

  const sansBoldMap = createMap(

    unicodeRange(0x1D5D4, 26),

    unicodeRange(0x1D5EE, 26),

    sansBoldDigits

  );


  /* =========================================
     7. Sans Bold Italic
  ========================================= */

  const sansBoldItalicMap = createMap(

    unicodeRange(0x1D63C, 26),

    unicodeRange(0x1D656, 26),

    sansBoldDigits

  );


  /* =========================================
     8. Script
  ========================================= */

  const scriptUpper =
    '𝒜ℬ𝒞𝒟ℰℱ𝒢ℋℐ𝒥𝒦ℒℳ𝒩𝒪𝒫𝒬ℛ𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵';

  const scriptLower =
    '𝒶𝒷𝒸𝒹ℯ𝒻ℊ𝒽𝒾𝒿𝓀𝓁𝓂𝓃ℴ𝓅𝓆𝓇𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏';

  const scriptMap = createMap(

    scriptUpper,

    scriptLower,

    monoDigits

  );


  /* =========================================
     9. Bold Script
  ========================================= */

  const boldScriptMap = createMap(

    unicodeRange(0x1D4D0, 26),

    unicodeRange(0x1D4EA, 26),

    boldDigits

  );


  /* =========================================
     10. Fraktur
  ========================================= */

  const frakturUpper =
    '𝔄𝔅ℭ𝔇𝔈𝔉𝔊ℌℑ𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔ℜ𝔖𝔗𝔘𝔙𝔚𝔛𝔜ℨ';

  const frakturLower =
    '𝔞𝔟𝔠𝔡𝔢𝔣𝔤𝔥𝔦𝔧𝔨𝔩𝔪𝔫𝔬𝔭𝔮𝔯𝔰𝔱𝔲𝔳𝔴𝔵𝔶𝔷';

  const frakturMap = createMap(

    frakturUpper,

    frakturLower,

    doubleDigits

  );


  /* =========================================
     11. Bold Fraktur
  ========================================= */

  const boldFrakturMap = createMap(

    unicodeRange(0x1D56C, 26),

    unicodeRange(0x1D586, 26),

    sansBoldDigits

  );


  /* =========================================
     12. Double Struck
  ========================================= */

  const doubleUpper =
    '𝔸𝔹ℂ𝔻𝔼𝔽𝔾ℍ𝕀𝕁𝕂𝕃𝕄ℕ𝕆ℙℚℝ𝕊𝕋𝕌𝕍𝕎𝕏𝕐ℤ';

  const doubleLower =
    '𝕒𝕓𝕔𝕕𝕖𝕗𝕘𝕙𝕚𝕛𝕜𝕝𝕞𝕟𝕠𝕡𝕢𝕣𝕤𝕥𝕦𝕧𝕨𝕩𝕪𝕫';

  const doubleMap = createMap(

    doubleUpper,

    doubleLower,

    doubleDigits

  );


  /* =========================================
     13. Monospace
  ========================================= */

  const monospaceMap = createMap(

    unicodeRange(0x1D670, 26),

    unicodeRange(0x1D68A, 26),

    monoDigits

  );


  /* =========================================
     공통 변환 함수
  ========================================= */

  function convertWithMap(text, map) {

    return Array.from(text)
      .map(char => map[char] || char)
      .join('');

  }


  /* =========================================
     14. Small Caps
  ========================================= */

  function smallCaps(text) {

    const map = {

      'A':'ᴀ',
      'B':'ʙ',
      'C':'ᴄ',
      'D':'ᴅ',
      'E':'ᴇ',
      'F':'ꜰ',
      'G':'ɢ',
      'H':'ʜ',
      'I':'ɪ',
      'J':'ᴊ',
      'K':'ᴋ',
      'L':'ʟ',
      'M':'ᴍ',
      'N':'ɴ',
      'O':'ᴏ',
      'P':'ᴘ',
      'Q':'ǫ',
      'R':'ʀ',
      'S':'ꜱ',
      'T':'ᴛ',
      'U':'ᴜ',
      'V':'ᴠ',
      'W':'ᴡ',
      'X':'x',
      'Y':'ʏ',
      'Z':'ᴢ',

      'a':'ᴀ',
      'b':'ʙ',
      'c':'ᴄ',
      'd':'ᴅ',
      'e':'ᴇ',
      'f':'ꜰ',
      'g':'ɢ',
      'h':'ʜ',
      'i':'ɪ',
      'j':'ᴊ',
      'k':'ᴋ',
      'l':'ʟ',
      'm':'ᴍ',
      'n':'ɴ',
      'o':'ᴏ',
      'p':'ᴘ',
      'q':'ǫ',
      'r':'ʀ',
      's':'ꜱ',
      't':'ᴛ',
      'u':'ᴜ',
      'v':'ᴠ',
      'w':'ᴡ',
      'x':'x',
      'y':'ʏ',
      'z':'ᴢ'

    };


    const digitMap = {};

    const styledDigits = Array.from(sansDigits);

    Array.from(digits).forEach((char, i) => {

      digitMap[char] = styledDigits[i];

    });


    return Array.from(text).map(char => {

      if (map[char]) {
        return map[char];
      }

      if (digitMap[char]) {
        return digitMap[char];
      }

      return char;

    }).join('');

  }


  /* =========================================
     15. Fullwidth
  ========================================= */

  function fullwidth(text) {

    return Array.from(text).map(char => {

      const code = char.charCodeAt(0);


      if (
        (code >= 65 && code <= 90) ||
        (code >= 97 && code <= 122) ||
        (code >= 48 && code <= 57)
      ) {

        return String.fromCharCode(
          code + 0xFEE0
        );

      }


      if (char === ' ') {

        return '　';

      }


      return char;

    }).join('');

  }


  /* =========================================
     16. Circled
  ========================================= */

  function circled(text) {

    return Array.from(text).map(char => {

      const code = char.charCodeAt(0);


      if (code >= 65 && code <= 90) {

        return String.fromCodePoint(
          0x24B6 + (code - 65)
        );

      }


      if (code >= 97 && code <= 122) {

        return String.fromCodePoint(
          0x24D0 + (code - 97)
        );

      }


      if (char === '0') {

        return '⓪';

      }


      if (code >= 49 && code <= 57) {

        return String.fromCodePoint(
          0x2460 + (code - 49)
        );

      }


      return char;

    }).join('');

  }


  /* =========================================
     17. Squared
  ========================================= */

  function squared(text) {

    return Array.from(text).map(char => {

      const code = char.charCodeAt(0);


      /* A-Z */
      if (code >= 65 && code <= 90) {

        return String.fromCodePoint(
          0x1F130 + (code - 65)
        );

      }


      /* a-z → 네모 대문자로 변환 */
      if (code >= 97 && code <= 122) {

        return String.fromCodePoint(
          0x1F130 + (code - 97)
        );

      }


      /* 숫자는 Combining Enclosing Square 사용 */
      if (code >= 48 && code <= 57) {

        return char + '\u20DE';

      }


      return char;

    }).join('');

  }


  /* =========================================
     18. Strikethrough
  ========================================= */

  function strikethrough(text) {

    return Array.from(text).map(char => {

      if (/[A-Za-z0-9]/.test(char)) {

        return char + '\u0336';

      }

      return char;

    }).join('');

  }


  /* =========================================
     표시 순서
     총 18종
  ========================================= */

  const styles = [

    {
      name: 'Script (필기체)',
      convert: text => convertWithMap(
        text,
        scriptMap
      )
    },

    {
      name: 'Bold Script (볼드 필기체)',
      convert: text => convertWithMap(
        text,
        boldScriptMap
      )
    },

    {
      name: 'Bold (볼드)',
      convert: text => convertWithMap(
        text,
        boldMap
      )
    },

    {
      name: 'Serif Italic (세리프 이탤릭)',
      convert: text => convertWithMap(
        text,
        serifItalicMap
      )
    },

    {
      name: 'Serif Bold Italic (세리프 볼드 이탤릭)',
      convert: text => convertWithMap(
        text,
        serifBoldItalicMap
      )
    },

    {
      name: 'Sans (산스)',
      convert: text => convertWithMap(
        text,
        sansMap
      )
    },

    {
      name: 'Sans Italic (산스 이탤릭)',
      convert: text => convertWithMap(
        text,
        sansItalicMap
      )
    },

    {
      name: 'Sans Bold (산스 볼드)',
      convert: text => convertWithMap(
        text,
        sansBoldMap
      )
    },

    {
      name: 'Sans Bold Italic (산스 볼드 이탤릭)',
      convert: text => convertWithMap(
        text,
        sansBoldItalicMap
      )
    },

    {
      name: 'Fraktur (고딕)',
      convert: text => convertWithMap(
        text,
        frakturMap
      )
    },

    {
      name: 'Bold Fraktur (볼드 고딕)',
      convert: text => convertWithMap(
        text,
        boldFrakturMap
      )
    },

    {
      name: 'Double Struck (더블)',
      convert: text => convertWithMap(
        text,
        doubleMap
      )
    },

    {
      name: 'Monospace (모노스페이스)',
      convert: text => convertWithMap(
        text,
        monospaceMap
      )
    },

    {
      name: 'Small Caps (스몰캡)',
      convert: text => smallCaps(text)
    },

    {
      name: 'Fullwidth (전각 문자)',
      convert: text => fullwidth(text)
    },

    {
      name: 'Circled (동그라미)',
      convert: text => circled(text)
    },

    {
      name: 'Squared (네모 문자)',
      convert: text => squared(text)
    },

    {
      name: 'Strikethrough (취소선)',
      convert: text => strikethrough(text)
    }

  ];


  /* =========================================
     복사 기능
  ========================================= */

  async function copyText(text, button) {

    try {

      if (
        navigator.clipboard &&
        window.isSecureContext
      ) {

        await navigator.clipboard.writeText(text);

      }

      else {

        const temp =
          document.createElement('textarea');

        temp.value = text;

        temp.style.position = 'fixed';
        temp.style.left = '-9999px';
        temp.style.top = '-9999px';
        temp.style.opacity = '0';

        document.body.appendChild(temp);

        temp.focus();
        temp.select();

        document.execCommand('copy');

        temp.remove();

      }


      button.textContent = '&#x2705; 복사됨';
      button.style.background = '#16a34a';


      setTimeout(() => {

        button.textContent = '&#x1f4cb; 복사하기';
        button.style.background = '#3b82f6';

      }, 1200);


    }

    catch (error) {

      button.textContent = '복사 실패';


      setTimeout(() => {

        button.textContent = '&#x1f4cb; 복사하기';
        button.style.background = '#3b82f6';

      }, 1200);

    }

  }


  /* =========================================
     결과 생성
  ========================================= */

  function generateResults(text) {

    const results =
      document.getElementById('results');


    if (!results) {

      return;

    }


    const displayText =
      text.trim()
        ? text
        : 'Hello 2026';


    results.innerHTML = '';


    styles.forEach(style => {

      const converted =
        style.convert(displayText);


      const card =
        document.createElement('div');


      card.style.cssText =
        'background:#1e2937;' +
        'color:#e2e8f0;' +
        'padding:20px;' +
        'border-radius:14px;' +
        'border:2px solid #60a5fa;' +
        'box-sizing:border-box;' +
        'width:100%;' +
        'display:flex;' +
        'flex-direction:column;' +
        'justify-content:space-between;';


      const content =
        document.createElement('div');


      const title =
        document.createElement('strong');


      title.textContent =
        style.name;


      title.style.cssText =
        'color:#60a5fa;' +
        'display:block;' +
        'margin-bottom:10px;';


      const preview =
        document.createElement('span');


      preview.textContent =
        converted;


      preview.style.cssText =
        'font-size:19px;' +
        'line-height:1.5;' +
        'word-break:break-all;' +
        'overflow-wrap:anywhere;' +
        'display:block;' +
        'min-height:40px;';


      const button =
        document.createElement('button');


      button.type = 'button';

      button.textContent =
        '&#x1f4cb; 복사하기';


      button.style.cssText =
        'width:100%;' +
        'background:#3b82f6;' +
        'color:white;' +
        'padding:14px;' +
        'border:none;' +
        'border-radius:10px;' +
        'cursor:pointer;' +
        'font-weight:bold;' +
        'font-size:16px;' +
        'transition:background 0.2s;' +
        'box-sizing:border-box;' +
        'margin-top:15px;';


      button.addEventListener(
        'mouseover',
        function () {

          if (
            this.textContent !==
            '&#x2705; 복사됨'
          ) {

            this.style.background =
              '#2563eb';

          }

        }
      );


      button.addEventListener(
        'mouseout',
        function () {

          if (
            this.textContent !==
            '&#x2705; 복사됨'
          ) {

            this.style.background =
              '#3b82f6';

          }

        }
      );


      button.addEventListener(
        'click',
        function () {

          copyText(
            converted,
            this
          );

        }
      );


      content.appendChild(title);

      content.appendChild(preview);

      card.appendChild(content);

      card.appendChild(button);

      results.appendChild(card);

    });

  }


  /* =========================================
     초기 실행
  ========================================= */

  function initFontConverter() {

    const input =
      document.getElementById('inputText');


    if (!input) {

      return;

    }


    input.addEventListener(
      'input',
      function () {

        generateResults(
          this.value
        );

      }
    );


    generateResults(
      input.value
    );

  }


  if (
    document.readyState === 'loading'
  ) {

    document.addEventListener(
      'DOMContentLoaded',
      initFontConverter
    );

  }

  else {

    initFontConverter();

  }

})();
</script>



<h2 class="wp-block-heading has-text-align-center has-small-font-size" style="margin-top:var(--wp--preset--spacing--70);margin-bottom:var(--wp--preset--spacing--40)">──── SNSnote 인기 글 ────</h2>



<div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="columns-3 wp-block-post-template is-layout-grid wp-container-core-post-template-is-layout-0fed8f92 wp-block-post-template-is-layout-grid"><li class="wp-block-post post-703 post type-post status-publish format-standard has-post-thumbnail hentry category-3 category-pc-tips">
<figure style="padding-top:var(--wp--preset--spacing--50);margin-right:0;margin-left:0" class="alignwide wp-block-post-featured-image"><a href="https://snsnote.com/%ec%ba%a1%ec%bb%b7-%ec%95%a0%eb%8d%a4%ea%b3%bc-%ec%83%a4%ea%b0%88-%eb%aa%a9%ec%86%8c%eb%a6%ac-%eb%93%9c%eb%94%94%ec%96%b4-pc%eb%b2%84%ec%a0%84-%ea%b8%b0%eb%8a%a5-%ec%97%85%eb%8d%b0%ec%9d%b4%ed%8a%b8/" target="_self"><img loading="lazy" decoding="async" width="772" height="435" src="https://snsnote.com/wp-content/uploads/2026/07/capcut-adam-and-chagall-voice-finally-pc-version-feature-update-2026.jpg" class="attachment-full size-full wp-post-image" alt="캡컷 애덤과 샤갈 목소리 드디어 PC버전 기능 업데이트 2026" style="border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;object-fit:cover;" srcset="https://snsnote.com/wp-content/uploads/2026/07/capcut-adam-and-chagall-voice-finally-pc-version-feature-update-2026.jpg 772w, https://snsnote.com/wp-content/uploads/2026/07/capcut-adam-and-chagall-voice-finally-pc-version-feature-update-2026-300x169.jpg 300w, https://snsnote.com/wp-content/uploads/2026/07/capcut-adam-and-chagall-voice-finally-pc-version-feature-update-2026-768x433.jpg 768w" sizes="auto, (max-width: 772px) 100vw, 772px" /></a></figure>

<h3 style="padding-bottom:var(--wp--preset--spacing--30);margin-right:var(--wp--preset--spacing--20);margin-left:var(--wp--preset--spacing--20)" class="wp-block-post-title has-small-font-size"><a href="https://snsnote.com/%ec%ba%a1%ec%bb%b7-%ec%95%a0%eb%8d%a4%ea%b3%bc-%ec%83%a4%ea%b0%88-%eb%aa%a9%ec%86%8c%eb%a6%ac-%eb%93%9c%eb%94%94%ec%96%b4-pc%eb%b2%84%ec%a0%84-%ea%b8%b0%eb%8a%a5-%ec%97%85%eb%8d%b0%ec%9d%b4%ed%8a%b8/" target="_self">캡컷 애덤과 샤갈 목소리 드디어 PC버전 기능 업데이트 2026</a></h3>
</li><li class="wp-block-post post-626 post type-post status-publish format-standard has-post-thumbnail hentry category-3">
<figure style="padding-top:var(--wp--preset--spacing--50);margin-right:0;margin-left:0" class="alignwide wp-block-post-featured-image"><a href="https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%ea%b3%84%ec%a0%95-%eb%b3%b5%ea%b5%ac-%eb%b0%a9%eb%b2%95/" target="_self"><img loading="lazy" decoding="async" width="772" height="435" src="https://snsnote.com/wp-content/uploads/2026/06/instagram-account-recovery-method-after-10-meta-support-attempts-review-2026.png" class="attachment-full size-full wp-post-image" alt="인스타그램 계정 복구 방법, 10번의 메타 상담원 시도 후기 2026" style="border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;object-fit:cover;" srcset="https://snsnote.com/wp-content/uploads/2026/06/instagram-account-recovery-method-after-10-meta-support-attempts-review-2026.png 772w, https://snsnote.com/wp-content/uploads/2026/06/instagram-account-recovery-method-after-10-meta-support-attempts-review-2026-300x169.png 300w, https://snsnote.com/wp-content/uploads/2026/06/instagram-account-recovery-method-after-10-meta-support-attempts-review-2026-768x433.png 768w" sizes="auto, (max-width: 772px) 100vw, 772px" /></a></figure>

<h3 style="padding-bottom:var(--wp--preset--spacing--30);margin-right:var(--wp--preset--spacing--20);margin-left:var(--wp--preset--spacing--20)" class="wp-block-post-title has-small-font-size"><a href="https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%ea%b3%84%ec%a0%95-%eb%b3%b5%ea%b5%ac-%eb%b0%a9%eb%b2%95/" target="_self">인스타그램 계정 복구 방법, 10번의 메타 상담원 시도 후기 2026</a></h3>
</li><li class="wp-block-post post-507 post type-post status-publish format-standard has-post-thumbnail hentry category-x- tag-x- tag-x---">
<figure style="padding-top:var(--wp--preset--spacing--50);margin-right:0;margin-left:0" class="alignwide wp-block-post-featured-image"><a href="https://snsnote.com/x-%ec%84%9c%ec%b9%98%eb%b0%b4-%ea%b3%a0%ec%8a%a4%ed%8a%b8%eb%b0%b4-%ed%99%95%ec%9d%b8-%ec%82%ac%ec%9d%b4%ed%8a%b8-24%ec%8b%9c%ea%b0%84-%ed%95%b4%ea%b2%b0%eb%b0%a9%eb%b2%95/" target="_self"><img loading="lazy" decoding="async" width="772" height="435" src="https://snsnote.com/wp-content/uploads/2026/06/how-to-remove-x-search-ban-ghost-ban-in-24-hours-real-methods-2026.webp" class="attachment-full size-full wp-post-image" alt="X 서치밴·고스트밴 확인 사이트와 24시간 푸는 방법 (2026년 최신)" style="border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;object-fit:cover;" srcset="https://snsnote.com/wp-content/uploads/2026/06/how-to-remove-x-search-ban-ghost-ban-in-24-hours-real-methods-2026.webp 772w, https://snsnote.com/wp-content/uploads/2026/06/how-to-remove-x-search-ban-ghost-ban-in-24-hours-real-methods-2026-300x169.webp 300w, https://snsnote.com/wp-content/uploads/2026/06/how-to-remove-x-search-ban-ghost-ban-in-24-hours-real-methods-2026-768x433.webp 768w" sizes="auto, (max-width: 772px) 100vw, 772px" /></a></figure>

<h3 style="padding-bottom:var(--wp--preset--spacing--30);margin-right:var(--wp--preset--spacing--20);margin-left:var(--wp--preset--spacing--20)" class="wp-block-post-title has-small-font-size"><a href="https://snsnote.com/x-%ec%84%9c%ec%b9%98%eb%b0%b4-%ea%b3%a0%ec%8a%a4%ed%8a%b8%eb%b0%b4-%ed%99%95%ec%9d%b8-%ec%82%ac%ec%9d%b4%ed%8a%b8-24%ec%8b%9c%ea%b0%84-%ed%95%b4%ea%b2%b0%eb%b0%a9%eb%b2%95/" target="_self">X 서치밴·고스트밴 확인 사이트와 24시간 푸는 방법 (2026년 최신)</a></h3>
</li></ul></div>



<style>
  /* 이 글에서만 본문 상단 대표 이미지 숨기기 */
  .featured-image, 
  .post-thumbnail, 
  .entry-header .post-image,
  .single-media {
    display: none !important;
  }
</style>
<div class="saboxplugin-wrap" itemtype="http://schema.org/Person" itemscope itemprop="author"><div class="saboxplugin-tab"><div class="saboxplugin-gravatar"><img loading="lazy" decoding="async" src="https://snsnote.com/wp-content/uploads/2026/06/5555.png" width="100"  height="100" alt="" itemprop="image"></div><div class="saboxplugin-authorname"><a href="https://snsnote.com/author/admin/" class="vcard author" rel="author"><span class="fn">JH</span></a></div><div class="saboxplugin-desc"><div itemprop="description"><p>SNSnote 편집 담당 JH입니다.2020년부터 SNS를 본격적으로 운영하기 시작해 현재 인스타그램, 유튜브, X를 합쳐 총 40만 팔로워를 보유하고 있습니다.영구정지 복구, 계정 성장, 수익화까지 직접 경험한 실패와 성공 사례를 바탕으로 실전에서 바로 활용할 수 있는 최신 정보를 전달하고 있습니다.최근에는 <strong>AI와 웹 기술을 활용한 브라우저 기반 도구를 직접 기획·개발하며</strong>, 사진·영상·문서·SNS 업무에 바로 사용할 수 있는 무료 온라인 도구도 함께 제공하고 있습니다.</p>
</div></div><div class="saboxplugin-web "><a href="https://snsnote.com" target="_self">snsnote.com</a></div><div class="clearfix"></div></div></div>]]></content:encoded>
					
					<wfw:commentRss>https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%ed%8f%b0%ed%8a%b8-%ea%b8%80%ec%94%a8%ec%b2%b4-%eb%b3%80%ed%99%98%ea%b8%b0/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
	<media:content url="https://snsnote.com/wp-content/uploads/2026/06/instagram-font-changer-text-style-converter.webp" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">1525</post-id>	</item>
		<item>
		<title>인스타그램 청소년 이용 제한 강화, 하루 2시간·심야 차단 한국은? 총정리</title>
		<link>https://snsnote.com/instagram-teen-usage-limit/</link>
					<comments>https://snsnote.com/instagram-teen-usage-limit/#respond</comments>
		
		<dc:creator><![CDATA[JH]]></dc:creator>
		<pubDate>Mon, 31 Aug 2026 11:50:51 +0000</pubDate>
				<category><![CDATA[인스타그램]]></category>
		<guid isPermaLink="false">https://snsnote.com/?p=1516</guid>

					<description><![CDATA[인스타그램을 하루에 2시간 이상 사용하면 접속이 막히고, 밤 12시가 지나면 릴스나 피드도 볼 수 없게 된다는 소식이 전해졌습니다. 처음 이 뉴스를 접하면 “이제 한국에서도 청소년은...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">인스타그램을 하루에 2시간 이상 사용하면 접속이 막히고, 밤 12시가 지나면 릴스나 피드도 볼 수 없게 된다는 소식이 전해졌습니다.</p>



<p class="wp-block-paragraph">처음 이 뉴스를 접하면 <strong>“이제 한국에서도 청소년은 인스타그램을 하루 2시간밖에 못 쓰는 건가?”</strong>라는 생각이 들 수 있습니다.</p>



<p class="wp-block-paragraph">결론부터 말씀드리면 <strong>현재 발표된 강력한 인스타그램 청소년 이용 제한은 미국의 합의 참여 지역을 대상으로 합니다. 한국 청소년 계정에 똑같은 하루 2시간 제한과 심야 접속 차단이 즉시 적용되는 것은 아닙니다.</strong></p>



<p class="wp-block-paragraph">다만 단순한 테스트 기능 정도는 아닙니다.</p>



<p class="wp-block-paragraph">메타가 미국 여러 주 정부와 대규모 법적 합의를 하면서 향후 상당 기간 유지하기로 한 정책이고, 하루 이용시간부터 심야 접속, 학교 시간 알림, 좋아요 표시, 연령 확인까지 청소년 계정 전반을 손보는 내용이 들어가 있습니다.</p>



<p class="wp-block-paragraph">이번에 정확히 무엇이 바뀌는지, 그리고 한국 인스타그램 이용자에게는 어떤 영향을 줄 수 있는지 하나씩 정리해보겠습니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">인스타그램 청소년 이용 제한, 왜 갑자기 강화됐을까?</h2>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="600" height="360" src="https://snsnote.com/wp-content/uploads/2026/08/meta-teen-safety-agreement-2026.webp" alt="메타 미국 법무장관 청소년 보호 합의 공식 발표 화면" class="wp-image-1519" srcset="https://snsnote.com/wp-content/uploads/2026/08/meta-teen-safety-agreement-2026.webp 600w, https://snsnote.com/wp-content/uploads/2026/08/meta-teen-safety-agreement-2026-300x180.webp 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /><figcaption class="wp-element-caption"><code>메타가 2026년 8월 26일 공개한 미국 주 법무장관들과의 청소년 보호 관련 합의 발표 내용</code></figcaption></figure>
</div>


<p class="wp-block-paragraph">이번 조치의 배경에는 미국에서 진행된 메타 관련 소송이 있습니다.</p>



<p class="wp-block-paragraph">미국의 여러 주 정부는 인스타그램과 페이스북이 청소년의 이용시간을 늘리고 반복적으로 서비스를 이용하도록 만드는 방식으로 설계됐으며, 이 과정에서 청소년에게 발생할 수 있는 부정적인 영향을 충분히 막지 못했다는 취지의 문제를 제기해 왔습니다.</p>



<p class="wp-block-paragraph">결국 메타는 미국 대부분의 주와 관련 소송을 해결하기 위한 합의에 도달했습니다.</p>



<p class="wp-block-paragraph">Reuters에 따르면 전체 합의 규모는 조건부 지급액 등을 포함하면 <strong>최대 약 180억 달러</strong>에 달하며, 지급은 앞으로 약 10년에 걸쳐 이루어질 예정입니다. 메타는 합의를 진행하면서 법적 잘못을 인정한 것은 아닙니다.</p>



<p class="wp-block-paragraph">중요한 것은 합의금보다 함께 결정된 <strong>청소년 이용방식의 변화</strong>입니다.</p>



<p class="wp-block-paragraph">메타 역시 공식 발표를 통해 청소년의 Facebook과 Instagram 이용시간 제한, 심야 이용 차단, 학교 시간 알림 제한 등을 직접 공개했습니다.</p>



<p class="wp-block-paragraph"><a target="_blank" rel="noopener" href="https://about.fb.com/news/2026/08/agreement-with-state-attorneys-general-supporting-teens/?utm_source=chatgpt.com">Meta 공식 발표 – 청소년 보호 관련 미국 주정부 합의 내용</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">인스타그램 하루 2시간 제한은 어떻게 적용될까?</h2>



<p class="wp-block-paragraph">가장 눈에 띄는 변화는 역시 <strong>하루 2시간 이용 제한</strong>입니다.</p>



<p class="wp-block-paragraph">미국의 합의 참여 지역에서 18세 미만 청소년에게 기본적으로 하루 2시간의 사용시간 제한이 적용됩니다.</p>



<p class="wp-block-paragraph">여기서 한 가지 주의할 점이 있습니다.</p>



<p class="wp-block-paragraph"><strong>인스타그램만 2시간을 사용할 수 있다는 의미가 아닙니다.</strong></p>



<p class="wp-block-paragraph">메타 공식 설명에 따르면 Facebook과 Instagram의 이용시간을 <strong>합산해서 하루 2시간</strong>으로 계산합니다.</p>



<p class="wp-block-paragraph">예를 들어,</p>



<p class="wp-block-paragraph">인스타그램 1시간 30분</p>



<ul class="wp-block-list">
<li>페이스북 30분</li>
</ul>



<p class="wp-block-paragraph">을 사용했다면 합계 2시간이 되는 방식입니다.</p>



<p class="wp-block-paragraph">여러 계정을 사용하는 경우에도 메타가 동일 이용자의 계정이라고 판단하면 이용시간을 합산할 수 있다고 설명하고 있습니다.</p>



<p class="wp-block-paragraph">또한 단순히 “2시간 사용했습니다”라는 알림만 보여주는 기존 사용시간 관리 기능보다 강합니다.</p>



<p class="wp-block-paragraph">청소년이 스스로 기본 2시간 제한을 해제할 수 없으며 <strong>부모의 허락이 있어야 제한을 변경할 수 있도록 하는 것이 핵심</strong>입니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">밤 12시부터 오전 6시까지 인스타그램 접속 차단</h2>



<p class="wp-block-paragraph">두 번째로 큰 변화가 <strong>Night Mode, 즉 심야 이용 차단</strong>입니다.</p>



<p class="wp-block-paragraph">기본적으로 자정부터 오전 6시까지 Instagram과 Facebook 이용이 차단됩니다.</p>



<p class="wp-block-paragraph">단순히 알림을 끄는 기능이 아닙니다.</p>



<p class="wp-block-paragraph">메타의 공식 설명에서는 이 시간 동안 청소년이 예를 들어</p>



<p class="wp-block-paragraph">피드 보기<br>릴스 보기<br>스토리 보기<br>탐색 탭 이용<br>게시물 업로드</p>



<p class="wp-block-paragraph">등을 할 수 없게 된다고 설명하고 있습니다.</p>



<p class="wp-block-paragraph">기존 청소년 계정에도 야간 알림 제한 등의 기능은 있었지만, 이번 조치는 <strong>앱 이용 자체를 제한한다는 점에서 강도가 훨씬 높습니다.</strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">학교 시간에는 대부분의 알림도 꺼진다</h2>



<p class="wp-block-paragraph">청소년이 학교에 있는 시간대의 이용을 줄이기 위한 기능도 들어갑니다.</p>



<p class="wp-block-paragraph">기본적으로 <strong>오전 8시부터 오후 3시까지 대부분의 푸시 알림이 음소거</strong>됩니다.</p>



<p class="wp-block-paragraph">다만 모든 알림이 사라지는 것은 아니며, 메타는 DM과 계정 보안 또는 안전과 관련된 알림 등은 예외로 두고 있습니다.</p>



<p class="wp-block-paragraph">또 Facebook이나 Instagram을 연속해서 15분 이용할 때마다 알림을 표시하고, 하루 누적 이용시간이 60분과 90분에 도달했을 때도 별도의 안내를 보여줍니다.</p>



<p class="wp-block-paragraph">즉 2시간이 되는 순간만 통제하는 것이 아니라 <strong>그 전에 스스로 앱에서 나올 수 있도록 계속 이용시간을 알려주는 구조</strong>입니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">좋아요 숫자도 기본적으로 숨겨진다</h2>



<p class="wp-block-paragraph">이번 인스타그램 청소년 이용 제한에는 사용시간 외의 변화도 상당히 많이 포함됐습니다.</p>



<p class="wp-block-paragraph">청소년 계정에서는 자신이 올린 게시물이나 다른 사람이 올린 게시물의 <strong>좋아요와 반응 숫자를 기본적으로 표시하지 않는 방식</strong>이 적용됩니다.</p>



<p class="wp-block-paragraph">외모 비교나 다른 이용자의 반응을 지나치게 의식하는 문제를 줄이기 위한 장치로 볼 수 있습니다.</p>



<p class="wp-block-paragraph">또 극단적인 화장 효과를 적용하는 필터 등의 이용도 제한됩니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">추천 알고리즘도 없어지는 걸까?</h2>



<p class="wp-block-paragraph">여기서는 오해하기 쉬운 부분이 있습니다.</p>



<p class="wp-block-paragraph"><strong>인스타그램 추천 알고리즘 자체가 청소년 계정에서 없어지는 것은 아닙니다.</strong></p>



<p class="wp-block-paragraph">청소년이 개인화 추천 알고리즘을 사용하지 않는 피드를 선택할 수 있도록 하고, 메타가 이 선택지를 주기적으로 안내하게 됩니다.</p>



<p class="wp-block-paragraph">부모가 자녀의 기본 환경을 이런 방식으로 변경할 수도 있습니다.</p>



<p class="wp-block-paragraph">동영상 자동재생 역시 끌 수 있도록 선택권이 제공됩니다.</p>



<p class="wp-block-paragraph">그러나 AP 보도에서도 지적했듯 추천 알고리즘을 청소년 계정에서 기본적으로 완전히 꺼버리는 내용까지 포함된 것은 아닙니다. 일부 아동·청소년 보호 전문가들이 이번 합의가 충분하지 않다고 보는 이유 중 하나입니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">나이를 성인으로 설정하면 피할 수 있을까?</h2>



<p class="wp-block-paragraph">청소년 이용 제한이 강해지면 자연스럽게 생기는 의문이 있습니다.</p>



<p class="wp-block-paragraph"><strong>생년월일을 18세 이상으로 설정하면 제한을 피할 수 있지 않을까?</strong></p>



<p class="wp-block-paragraph">메타 역시 이 문제를 상당히 중요하게 보고 있습니다.</p>



<p class="wp-block-paragraph">메타는 계정에 입력된 생년월일만 사용하는 것이 아니라 <strong>실제 청소년으로 추정되는 계정을 찾아내는 연령 확인 기술을 강화</strong>하기로 했습니다.</p>



<p class="wp-block-paragraph">13세 미만으로 판단되는 계정을 찾아내는 기술을 강화하고, 13~17세로 판단되는 사용자가 계정에는 성인의 생년월일을 입력하더라도 청소년용 환경에 배치할 수 있도록 기술을 강화한다는 계획입니다.</p>



<p class="wp-block-paragraph">결국 앞으로는 단순히 프로필 생년월일만 성인으로 바꾸는 방법으로 청소년 계정 제한을 우회하는 것이 지금보다 어려워질 가능성이 있습니다.</p>



<p class="wp-block-paragraph">인스타그램은 계정의 상태나 연령, 활동에 따라 사용할 수 있는 기능과 노출 범위를 계속 세분화하고 있습니다. 간혹 계정에 문제가 없는데도 비팔로워 추천 노출이 갑자기 막히는 경우라면 제가 따로 정리한 <a target="_blank" rel="noopener" href="https://snsnote.com/instagram-recommendation-eligibility/?utm_source=chatgpt.com">인스타그램 추천 자격 없음 해결 방법, 비팔로워 도달이 막힌 이유</a> 글도 함께 참고하시면 좋습니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">가장 중요한 부분, 한국도 하루 2시간으로 제한될까?</h2>



<p class="wp-block-paragraph">현재 기준으로는 <strong>아닙니다.</strong></p>



<p class="wp-block-paragraph">메타 공식 발표에 명확하게 <strong>합의에 참여한 미국의 주와 미국령 지역(participating US states and territories)</strong>이라는 적용 범위가 명시돼 있습니다.</p>



<p class="wp-block-paragraph">해당 지역의 18세 미만 Instagram 및 Facebook 이용자에게 이번 보호조치가 자동 적용됩니다.</p>



<p class="wp-block-paragraph">AP 역시 메타의 새로운 보호조치가 <strong>미국에서 적용된다</strong>고 확인했습니다.</p>



<p class="wp-block-paragraph">따라서 2026년 8월 31일 현재 한국에서 사용하는 청소년 인스타그램 계정이 이번 미국 합의를 이유로 갑자기</p>



<p class="wp-block-paragraph"><strong>하루 2시간만 사용할 수 있게 되거나, 자정이 되면 인스타그램 접속이 차단되는 것은 아닙니다.</strong></p>



<p class="wp-block-paragraph">이 부분은 현재 인터넷에 올라오는 제목만 보고 오해하기 쉽기 때문에 구분해서 볼 필요가 있습니다.</p>



<p class="wp-block-paragraph"><a target="_blank" rel="noopener" href="https://www.reuters.com/business/meta-reaches-18-billion-settlements-over-childrens-social-media-addiction-2026-08-26/?utm_source=chatgpt.com">Reuters – Meta 청소년 SNS 관련 합의 보도</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">그렇다면 한국에는 아무 영향도 없을까?</h2>



<p class="wp-block-paragraph">그렇다고 이번 내용을 미국만의 이야기라고 단정하기도 어렵습니다.</p>



<p class="wp-block-paragraph">메타는 기존에도 청소년 계정 관련 기능을 여러 국가로 순차 확대해 왔습니다.</p>



<p class="wp-block-paragraph">실제로 2026년 6월에도 Instagram·Facebook·Messenger 청소년 계정을 대상으로 한 새로운 13세 이상 콘텐츠 설정을 세계적으로 확대한다고 발표한 바 있습니다.</p>



<p class="wp-block-paragraph">다만 <strong>기존 글로벌 청소년 보호 기능 확대와 이번 미국 법적 합의에 따른 2시간 강제 제한은 별개의 내용</strong>입니다.</p>



<p class="wp-block-paragraph">현재 메타는 이번 2시간 제한을 한국에도 적용한다고 발표하지 않았습니다.</p>



<p class="wp-block-paragraph">향후 각국 정부가 비슷한 규제를 요구하거나 메타가 미국에서 운영해 본 결과를 바탕으로 전 세계 청소년 계정에 자발적으로 확대한다면 상황은 달라질 수 있습니다.</p>



<p class="wp-block-paragraph">따라서 앞으로 한국 적용 여부는 추가 발표를 확인할 필요가 있습니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">오히려 제한이 더 강해질 수도 있다</h2>



<p class="wp-block-paragraph">이번 합의에서 흥미로운 부분도 있습니다.</p>



<p class="wp-block-paragraph">현재 기본 설정은</p>



<p class="wp-block-paragraph"><strong>Facebook + Instagram 하루 2시간</strong><br><strong>자정~오전 6시 심야 제한</strong></p>



<p class="wp-block-paragraph">이지만 이것이 반드시 최종 단계는 아닙니다.</p>



<p class="wp-block-paragraph">메타 공식 발표에 따르면 TikTok이나 YouTube 등 다른 주요 플랫폼이 같은 기준에 동참할 경우 관련 약정 기간이 늘어나면서 기본 제한이 더 강화될 수 있습니다.</p>



<p class="wp-block-paragraph">그 경우 <strong>앱당 하루 1시간</strong>으로 줄어들고, 심야 제한도 기존 자정~오전 6시에서 <strong>밤 10시~오전 7시</strong>로 확대될 수 있습니다.</p>



<p class="wp-block-paragraph">메타가 TikTok과 YouTube에 공개적으로 동참을 요구하고 있는 것도 이런 이유입니다.</p>



<p class="wp-block-paragraph">결국 이번 일은 인스타그램 하나의 정책 변화라기보다 향후 <strong>청소년 SNS 이용시간 자체를 규제하는 흐름의 시작</strong>이 될 가능성도 있습니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">인스타그램 청소년 이용 제한 정리</h2>



<p class="wp-block-paragraph">현재까지 공개된 내용을 정리하면 미국의 18세 미만 이용자는 인스타그램과 페이스북 이용 방식이 상당히 달라지게 됩니다.</p>



<p class="wp-block-paragraph">하루 이용시간은 두 서비스를 합쳐 기본 2시간으로 제한되고, 자정부터 오전 6시까지는 기본적으로 사용할 수 없습니다. 학교 시간에는 대부분의 알림이 꺼지며 좋아요 숫자 숨김, 이용시간 알림, 연령 확인 강화 등의 조치도 함께 적용됩니다.</p>



<p class="wp-block-paragraph">하지만 <strong>한국 인스타그램 청소년 계정에는 이번 미국 합의에 따른 하루 2시간·심야 접속 차단이 현재 확정된 상태가 아닙니다.</strong></p>



<p class="wp-block-paragraph">뉴스 제목만 보고 “한국도 바로 2시간 제한이 시작됐다”고 받아들일 필요는 없습니다.</p>



<p class="wp-block-paragraph">다만 메타의 청소년 보호정책은 계속 강화되고 있고 다른 국가에서도 청소년 SNS 이용을 규제하려는 움직임이 이어지고 있기 때문에, 향후 한국에 비슷한 기능이 도입되는지는 계속 지켜볼 필요가 있겠습니다.</p>



<p class="wp-block-paragraph">인스타그램은 정책 변경이나 자동화된 시스템 때문에 정상적으로 사용하던 계정에도 예상하지 못한 문제가 생기는 경우가 있습니다. 계정 자체가 비활성화된 경우에는 제가 실제 복구 과정을 정리한 <a target="_blank" rel="noopener">인스타그램 계정 복구 방법, 10번의 메타 상담원 시도 후기 2026</a>도 참고해 보셔도 좋습니다.</p>



<p class="wp-block-paragraph">메타가 운영하는 Threads에서도 계정 정지나 강제 비활성화가 발생할 수 있는데, 관련 경험은 <a target="_blank" rel="noopener" href="https://snsnote.com/threads-account-suspension-recovery/?utm_source=chatgpt.com">쓰레드 계정 정지 강제 비활성화 복구 완료 후기</a>에 따로 정리해 두었습니다.</p>
<div class="saboxplugin-wrap" itemtype="http://schema.org/Person" itemscope itemprop="author"><div class="saboxplugin-tab"><div class="saboxplugin-gravatar"><img loading="lazy" decoding="async" src="https://snsnote.com/wp-content/uploads/2026/06/5555.png" width="100"  height="100" alt="" itemprop="image"></div><div class="saboxplugin-authorname"><a href="https://snsnote.com/author/admin/" class="vcard author" rel="author"><span class="fn">JH</span></a></div><div class="saboxplugin-desc"><div itemprop="description"><p>SNSnote 편집 담당 JH입니다.2020년부터 SNS를 본격적으로 운영하기 시작해 현재 인스타그램, 유튜브, X를 합쳐 총 40만 팔로워를 보유하고 있습니다.영구정지 복구, 계정 성장, 수익화까지 직접 경험한 실패와 성공 사례를 바탕으로 실전에서 바로 활용할 수 있는 최신 정보를 전달하고 있습니다.최근에는 <strong>AI와 웹 기술을 활용한 브라우저 기반 도구를 직접 기획·개발하며</strong>, 사진·영상·문서·SNS 업무에 바로 사용할 수 있는 무료 온라인 도구도 함께 제공하고 있습니다.</p>
</div></div><div class="saboxplugin-web "><a href="https://snsnote.com" target="_self">snsnote.com</a></div><div class="clearfix"></div></div></div>]]></content:encoded>
					
					<wfw:commentRss>https://snsnote.com/instagram-teen-usage-limit/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
	<media:content url="https://snsnote.com/wp-content/uploads/2026/08/instagram-teen-usage-limit.jpg" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">1516</post-id>	</item>
		<item>
		<title>사진에서 마음에 든 색 그대로 찾기, 이미지 HEX·RGB·HSL 색상 추출기</title>
		<link>https://snsnote.com/image-color-picker/</link>
					<comments>https://snsnote.com/image-color-picker/#respond</comments>
		
		<dc:creator><![CDATA[JH]]></dc:creator>
		<pubDate>Mon, 24 Aug 2026 11:18:34 +0000</pubDate>
				<category><![CDATA[유용한 도구]]></category>
		<category><![CDATA[인스타그램]]></category>
		<guid isPermaLink="false">https://snsnote.com/?p=1483</guid>

					<description><![CDATA[이미지 색상 추출이 필요할 때 사진의 원하는 위치를 클릭해 HEX·RGB·HSL 색상 코드를 바로 확인하세요. 서버에 이미지를 저장하지 않고 브라우저에서만 처리되며, 추출한 색상값은 클릭 한 번으로 간편하게 복사할 수 있습니다.]]></description>
										<content:encoded><![CDATA[<div id="sns-color-picker">
  <div class="scp-card">
    <h2>이미지 색상 코드 추출기</h2>

    <p class="scp-desc">
      이미지를 선택한 뒤 사진에서 원하는 위치를 클릭하세요.
      클릭한 지점의 HEX, RGB, HSL 값을 바로 확인하고 복사할 수 있습니다.
    </p>

    <div class="scp-privacy">
      업로드한 이미지는 서버로 전송되거나 저장되지 않습니다.
      모든 색상 추출 작업은 현재 브라우저 안에서만 처리됩니다.
    </div>

    <div class="scp-upload">
      <label for="snsColorFile" class="scp-file-btn">
        이미지 선택
      </label>

      <input id="snsColorFile" type="file" accept="image/*">

      <button id="snsColorReset" type="button" class="scp-reset-btn">
        초기화
      </button>
    </div>

    <div class="scp-grid">
      <div id="snsCanvasBox" class="scp-canvas-box">
        <div id="snsPlaceholder" class="scp-placeholder">
          이미지를 선택하면 여기에 표시됩니다.<br>
          원하는 색상 부분을 클릭해보세요.
        </div>

        <canvas id="snsColorCanvas"></canvas>
      </div>

      <div class="scp-panel">
        <div id="snsSwatch" class="scp-swatch"></div>

        <div class="scp-row">
          <div class="scp-label">HEX</div>

          <div class="scp-value-row">
            <div id="snsHex" class="scp-value">
              #FFFFFF
            </div>

            <button type="button" class="scp-copy" data-copy-target="snsHex">
              복사
            </button>
          </div>
        </div>

        <div class="scp-row">
          <div class="scp-label">RGB</div>

          <div class="scp-value-row">
            <div id="snsRgb" class="scp-value">
              rgb(255, 255, 255)
            </div>

            <button type="button" class="scp-copy" data-copy-target="snsRgb">
              복사
            </button>
          </div>
        </div>

        <div class="scp-row">
          <div class="scp-label">HSL</div>

          <div class="scp-value-row">
            <div id="snsHsl" class="scp-value">
              hsl(0, 0%, 100%)
            </div>

            <button type="button" class="scp-copy" data-copy-target="snsHsl">
              복사
            </button>
          </div>
        </div>

        <div class="scp-history-wrap">
          <div class="scp-history-title">
            최근 선택한 색상
          </div>

          <div id="snsHistory" class="scp-history"></div>
        </div>
      </div>
    </div>
  </div>
</div>

<style>
#sns-color-picker,
#sns-color-picker * {
  box-sizing: border-box;
}

#sns-color-picker {
  width: 100%;
  max-width: 1000px;
  margin: 30px auto;
  color: #1f2937;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Noto Sans KR", sans-serif;
}

#sns-color-picker .scp-card {
  width: 100%;
  padding: 24px;
  background: #ffffff;
  border: 1px solid #e5e7eb;
  border-radius: 18px;
  box-shadow: 0 8px 24px rgba(0,0,0,.05);
}

#sns-color-picker h2 {
  margin: 0 0 8px;
  font-size: 28px;
  line-height: 1.4;
}

#sns-color-picker .scp-desc {
  margin: 0 0 18px;
  color: #6b7280;
  line-height: 1.7;
}

#sns-color-picker .scp-privacy {
  margin-bottom: 20px;
  padding: 13px 15px;
  background: #f3f4f6;
  border-radius: 12px;
  color: #4b5563;
  font-size: 14px;
  line-height: 1.6;
}


/* 이미지 선택 / 초기화 */

#sns-color-picker .scp-upload {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 20px;
}

#sns-color-picker #snsColorFile {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0,0,0,0);
  white-space: nowrap;
  border: 0;
}

#sns-color-picker .scp-file-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 48px;
  padding: 12px 24px;
  background: #111827;
  color: #ffffff;
  border-radius: 10px;
  font-size: 15px;
  font-weight: 700;
  cursor: pointer;
  text-align: center;
}

#sns-color-picker .scp-file-btn:hover {
  opacity: .9;
}

#sns-color-picker .scp-reset-btn {
  min-height: 42px;
  padding: 9px 16px;
  background: #f3f4f6;
  color: #4b5563;
  border: 1px solid #d1d5db;
  border-radius: 10px;
  font-size: 14px;
  font-weight: 600;
  cursor: pointer;
}

#sns-color-picker .scp-reset-btn:hover {
  background: #e5e7eb;
}


/* 본문 */

#sns-color-picker .scp-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 300px;
  gap: 20px;
  align-items: start;
  width: 100%;
}

#sns-color-picker .scp-canvas-box {
  display: grid;
  place-items: center;
  width: 100%;
  min-width: 0;
  min-height: 360px;
  overflow: hidden;
  background: #fafafa;
  border: 2px dashed #d1d5db;
  border-radius: 16px;
}

#sns-color-picker .scp-placeholder {
  padding: 30px;
  color: #9ca3af;
  text-align: center;
  line-height: 1.7;
}

#snsColorCanvas {
  display: none;
  width: auto;
  height: auto;
  max-width: 100%;
  max-height: 700px;
  cursor: crosshair;
}


/* 색상 정보 패널 */

#sns-color-picker .scp-panel {
  width: 100%;
  min-width: 0;
  padding: 18px;
  background: #ffffff;
  border: 1px solid #e5e7eb;
  border-radius: 16px;
}

#sns-color-picker .scp-swatch {
  width: 100%;
  height: 90px;
  margin-bottom: 18px;
  background: #ffffff;
  border: 1px solid #d1d5db;
  border-radius: 12px;
}

#sns-color-picker .scp-row {
  margin: 14px 0;
}

#sns-color-picker .scp-label {
  margin-bottom: 6px;
  color: #6b7280;
  font-size: 13px;
  font-weight: 600;
}

#sns-color-picker .scp-value-row {
  display: flex;
  gap: 8px;
  width: 100%;
  min-width: 0;
}

#sns-color-picker .scp-value {
  flex: 1 1 auto;
  min-width: 0;
  padding: 10px 12px;
  overflow-x: auto;
  background: #f9fafb;
  border: 1px solid #d1d5db;
  border-radius: 10px;
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 14px;
  white-space: nowrap;
}

#sns-color-picker .scp-copy {
  flex: 0 0 auto;
  padding: 10px 12px;
  background: #111827;
  color: #ffffff;
  border: 0;
  border-radius: 10px;
  font-size: 13px;
  font-weight: 700;
  cursor: pointer;
}

#sns-color-picker .scp-copy:hover {
  opacity: .9;
}


/* 최근 색상 */

#sns-color-picker .scp-history-wrap {
  margin-top: 20px;
}

#sns-color-picker .scp-history-title {
  margin-bottom: 10px;
  font-size: 14px;
  font-weight: 700;
}

#sns-color-picker .scp-history {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

#sns-color-picker .scp-history button {
  width: 36px;
  height: 36px;
  padding: 0;
  border: 1px solid #d1d5db;
  border-radius: 9px;
  cursor: pointer;
}


/* 모바일 */

@media (max-width: 800px) {

  #sns-color-picker {
    width: 100%;
    max-width: 100%;
    margin: 20px 0;
  }

  #sns-color-picker .scp-card {
    padding: 16px;
    border-radius: 14px;
  }

  #sns-color-picker h2 {
    font-size: 23px;
  }

  #sns-color-picker .scp-desc {
    font-size: 15px;
  }


  /* 핵심: 이미지 선택을 가장 눈에 띄게 */

  #sns-color-picker .scp-upload {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 8px;
    width: 100%;
  }

  #sns-color-picker .scp-file-btn {
    width: 100%;
    min-height: 54px;
    padding: 14px;
    font-size: 17px;
    font-weight: 700;
  }

  #sns-color-picker .scp-reset-btn {
    width: 100%;
    min-height: 38px;
    padding: 8px;
    background: #f8f9fa;
    color: #6b7280;
    font-size: 13px;
    font-weight: 500;
  }


  #sns-color-picker .scp-grid {
    grid-template-columns: minmax(0, 1fr);
    gap: 16px;
  }

  #sns-color-picker .scp-canvas-box {
    min-height: 240px;
  }

  #snsColorCanvas {
    width: 100%;
    max-width: 100%;
    height: auto;
  }

  #sns-color-picker .scp-panel {
    padding: 14px;
  }

  #sns-color-picker .scp-value {
    padding: 9px 8px;
    font-size: 12px;
  }

  #sns-color-picker .scp-copy {
    padding: 9px 11px;
    font-size: 13px;
  }
}


@media (max-width: 420px) {

  #sns-color-picker .scp-card {
    padding: 14px;
  }

  #sns-color-picker h2 {
    font-size: 21px;
  }

  #sns-color-picker .scp-privacy {
    padding: 11px 12px;
    font-size: 13px;
  }

  #sns-color-picker .scp-value-row {
    gap: 6px;
  }

  #sns-color-picker .scp-value {
    font-size: 11px;
  }
}
</style>

<script>
(function () {

  const root = document.getElementById('sns-color-picker');

  if (!root) return;

  const fileInput = document.getElementById('snsColorFile');
  const resetBtn = document.getElementById('snsColorReset');

  const canvas = document.getElementById('snsColorCanvas');

  const ctx = canvas.getContext(
    '2d',
    { willReadFrequently: true }
  );

  const placeholder =
    document.getElementById('snsPlaceholder');

  const swatch =
    document.getElementById('snsSwatch');

  const hexBox =
    document.getElementById('snsHex');

  const rgbBox =
    document.getElementById('snsRgb');

  const hslBox =
    document.getElementById('snsHsl');

  const historyBox =
    document.getElementById('snsHistory');

  const history = [];

  let objectUrl = null;


  fileInput.addEventListener('change', function () {

    const file =
      this.files &&
      this.files[0];

    if (!file) return;


    if (!file.type.startsWith('image/')) {

      alert('이미지 파일만 선택할 수 있습니다.');

      this.value = '';

      return;
    }


    if (objectUrl) {

      URL.revokeObjectURL(objectUrl);

    }


    objectUrl =
      URL.createObjectURL(file);


    const img =
      new Image();


    img.onload = function () {

      canvas.width =
        img.naturalWidth;

      canvas.height =
        img.naturalHeight;


      ctx.clearRect(
        0,
        0,
        canvas.width,
        canvas.height
      );


      ctx.drawImage(
        img,
        0,
        0
      );


      canvas.style.display =
        'block';

      placeholder.style.display =
        'none';


      URL.revokeObjectURL(
        objectUrl
      );


      objectUrl =
        null;

    };


    img.onerror = function () {

      alert('이미지를 불러오지 못했습니다.');

    };


    img.src =
      objectUrl;

  });


  canvas.addEventListener('click', function (e) {

    const rect =
      canvas.getBoundingClientRect();


    const scaleX =
      canvas.width /
      rect.width;


    const scaleY =
      canvas.height /
      rect.height;


    let x =
      Math.floor(
        (e.clientX - rect.left) *
        scaleX
      );


    let y =
      Math.floor(
        (e.clientY - rect.top) *
        scaleY
      );


    x =
      Math.max(
        0,
        Math.min(
          canvas.width - 1,
          x
        )
      );


    y =
      Math.max(
        0,
        Math.min(
          canvas.height - 1,
          y
        )
      );


    const pixel =
      ctx.getImageData(
        x,
        y,
        1,
        1
      ).data;


    const r =
      pixel[0];

    const g =
      pixel[1];

    const b =
      pixel[2];


    updateColor(
      r,
      g,
      b
    );

  });


  function updateColor(r, g, b) {

    const hex =
      rgbToHex(
        r,
        g,
        b
      );


    const hsl =
      rgbToHsl(
        r,
        g,
        b
      );


    swatch.style.background =
      hex;


    hexBox.textContent =
      hex;


    rgbBox.textContent =
      `rgb(${r}, ${g}, ${b})`;


    hslBox.textContent =
      `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;


    addHistory(
      hex,
      r,
      g,
      b,
      hsl
    );

  }


  function rgbToHex(r, g, b) {

    return '#' +

      [r, g, b]

      .map(function (v) {

        return v
          .toString(16)
          .padStart(2, '0');

      })

      .join('')

      .toUpperCase();

  }


  function rgbToHsl(r, g, b) {

    r /= 255;

    g /= 255;

    b /= 255;


    const max =
      Math.max(r, g, b);


    const min =
      Math.min(r, g, b);


    let h = 0;

    let s = 0;


    const l =
      (max + min) / 2;


    if (max !== min) {

      const d =
        max - min;


      s =
        l > 0.5

        ? d /
          (2 - max - min)

        : d /
          (max + min);


      switch (max) {

        case r:

          h =
            (g - b) / d +
            (g < b ? 6 : 0);

          break;


        case g:

          h =
            (b - r) / d + 2;

          break;


        case b:

          h =
            (r - g) / d + 4;

          break;

      }


      h /= 6;

    }


    return {

      h:
        Math.round(h * 360),

      s:
        Math.round(s * 100),

      l:
        Math.round(l * 100)

    };

  }


  function addHistory(
    hex,
    r,
    g,
    b,
    hsl
  ) {

    if (
      history.length &&
      history[0].hex === hex
    ) {
      return;
    }


    history.unshift({

      hex: hex,

      r: r,

      g: g,

      b: b,

      hsl: hsl

    });


    if (
      history.length > 8
    ) {

      history.pop();

    }


    historyBox.innerHTML =
      '';


    history.forEach(function (item) {

      const btn =
        document.createElement(
          'button'
        );


      btn.type =
        'button';


      btn.title =
        item.hex;


      btn.style.background =
        item.hex;


      btn.addEventListener(
        'click',
        function () {

          swatch.style.background =
            item.hex;


          hexBox.textContent =
            item.hex;


          rgbBox.textContent =
            `rgb(${item.r}, ${item.g}, ${item.b})`;


          hslBox.textContent =
            `hsl(${item.hsl.h}, ${item.hsl.s}%, ${item.hsl.l}%)`;

        }
      );


      historyBox.appendChild(
        btn
      );

    });

  }


  root
  .querySelectorAll(
    '[data-copy-target]'
  )
  .forEach(function (button) {

    button.addEventListener(
      'click',
      async function () {

        const target =
          document.getElementById(
            this.dataset.copyTarget
          );


        const text =
          target.textContent;


        const oldText =
          this.textContent;


        try {

          await navigator
            .clipboard
            .writeText(text);

        }

        catch (e) {

          const textarea =
            document.createElement(
              'textarea'
            );


          textarea.value =
            text;


          textarea.style.position =
            'fixed';


          textarea.style.opacity =
            '0';


          document.body.appendChild(
            textarea
          );


          textarea.select();


          document.execCommand(
            'copy'
          );


          textarea.remove();

        }


        this.textContent =
          '완료';


        setTimeout(() => {

          this.textContent =
            oldText;

        }, 1000);

      }
    );

  });


  resetBtn.addEventListener(
    'click',
    function () {

      fileInput.value =
        '';


      canvas.style.display =
        'none';


      placeholder.style.display =
        'block';


      ctx.clearRect(
        0,
        0,
        canvas.width,
        canvas.height
      );


      canvas.width =
        0;


      canvas.height =
        0;


      swatch.style.background =
        '#FFFFFF';


      hexBox.textContent =
        '#FFFFFF';


      rgbBox.textContent =
        'rgb(255, 255, 255)';


      hslBox.textContent =
        'hsl(0, 0%, 100%)';


      history.length =
        0;


      historyBox.innerHTML =
        '';


      if (objectUrl) {

        URL.revokeObjectURL(
          objectUrl
        );


        objectUrl =
          null;

      }

    }
  );

})();
</script>



<p class="wp-block-paragraph">사진이나 이미지에서 정확한 색상 코드를 확인하고 싶을 때는 위의 이미지 색상 코드 추출기를 이용하면 됩니다.</p>



<p class="wp-block-paragraph">사진에서 원하는 색상 코드를 찾았다면 이미지 파일 형식이나 크기도 바로 변경할 수 있습니다.<br>JPG·PNG·WebP 변환이나 이미지 크기 조절이 필요하다면 <a href="https://snsnote.com/image-converter/">무료 이미지 변환기</a>도 함께 이용해보세요.</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-snsnote wp-block-embed-snsnote"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="Omq2sjtJYm"><a href="https://snsnote.com/image-converter/">무료 이미지 변환기 – JPG·PNG·WebP 변환 및 크기 조절</a></blockquote><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="“무료 이미지 변환기 – JPG·PNG·WebP 변환 및 크기 조절” — SNSnote" src="https://snsnote.com/image-converter/embed/#?secret=M2NDsmwJSl#?secret=Omq2sjtJYm" data-secret="Omq2sjtJYm" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<p class="wp-block-paragraph">별도의 프로그램을 설치하거나 이미지를 서버에 업로드할 필요 없이, 브라우저에서 이미지를 선택한 뒤 원하는 부분을 클릭하면 해당 위치의 색상값을 바로 확인할 수 있습니다.</p>



<ol class="wp-block-list">
<li>색상을 확인할 이미지를 선택합니다.</li>



<li>화면에 표시된 이미지에서 원하는 위치를 클릭합니다.</li>



<li>클릭한 지점의 HEX, RGB, HSL 색상 코드가 자동으로 표시됩니다.</li>



<li>필요한 색상 코드 옆의 복사 버튼을 누르면 클립보드에 바로 복사됩니다.</li>



<li>다른 위치의 색상을 확인하고 싶다면 이미지의 원하는 부분을 다시 클릭하면 됩니다.</li>
</ol>



<p class="wp-block-paragraph">최근 선택한 색상도 함께 표시되기 때문에 한 이미지에서 여러 색상을 비교할 때 편리합니다.</p>



<h2 class="wp-block-heading">HEX, RGB, HSL은 어떤 차이가 있나요?</h2>



<p class="wp-block-paragraph">사진에서 색상을 추출하면 같은 색상이라도 HEX, RGB, HSL처럼 여러 방식으로 표시할 수 있습니다.</p>



<h3 class="wp-block-heading">HEX 색상 코드</h3>



<p class="wp-block-paragraph">HEX는 웹사이트나 디자인 작업에서 가장 많이 사용되는 색상 표현 방식 중 하나입니다.</p>



<p class="wp-block-paragraph">예를 들어 흰색은 <code>#FFFFFF</code>, 검은색은 <code>#000000</code>처럼 표시됩니다.</p>



<p class="wp-block-paragraph">CSS나 웹디자인에서 색상을 지정할 때 간단하게 사용할 수 있어 블로그 꾸미기나 웹사이트 디자인 작업에서 특히 많이 사용됩니다.</p>



<h3 class="wp-block-heading">RGB 색상 코드</h3>



<p class="wp-block-paragraph">RGB는 Red, Green, Blue의 세 가지 색상값을 조합해서 색상을 표현하는 방식입니다.</p>



<p class="wp-block-paragraph">예를 들어 흰색은 <code>rgb(255, 255, 255)</code>로 표시되고 검은색은 <code>rgb(0, 0, 0)</code>으로 표시됩니다.</p>



<p class="wp-block-paragraph">이미지 편집이나 웹디자인 프로그램에서 색상을 직접 입력해야 할 때 자주 사용됩니다.</p>



<h3 class="wp-block-heading">HSL 색상 코드</h3>



<p class="wp-block-paragraph">HSL은 Hue(색상), Saturation(채도), Lightness(명도)를 기준으로 색상을 표현합니다.</p>



<p class="wp-block-paragraph">RGB나 HEX보다 사람이 색상의 밝기나 채도를 조절하기 쉽게 이해할 수 있다는 장점이 있습니다.</p>



<p class="wp-block-paragraph">예를 들어 같은 색상을 조금 더 밝게 만들거나 채도를 낮추고 싶을 때 HSL 값을 이용하면 편리합니다.</p>



<h2 class="wp-block-heading">사진에서 색상 코드를 추출하면 언제 유용할까?</h2>



<p class="wp-block-paragraph">이미지 색상 추출 기능은 단순히 사진의 색을 확인하는 용도 외에도 여러 상황에서 사용할 수 있습니다.</p>



<p class="wp-block-paragraph">예를 들어 마음에 드는 사진에서 배경색과 비슷한 색상을 웹사이트에 적용하거나, 로고 이미지에서 정확한 브랜드 색상을 확인할 때 유용합니다.</p>



<p class="wp-block-paragraph">인스타그램 피드나 블로그 디자인을 꾸밀 때도 사진 속 색상을 추출해 제목이나 버튼, 배경색에 적용하면 전체적인 분위기를 자연스럽게 맞출 수 있습니다.</p>



<p class="wp-block-paragraph">또한 디자인 작업 중 참고 이미지에서 원하는 색상을 발견했지만 정확한 HEX 코드나 RGB 값을 모를 때도 이미지에서 직접 클릭해 빠르게 확인할 수 있습니다.</p>



<h2 class="wp-block-heading">이미지는 서버에 업로드되나요?</h2>



<p class="wp-block-paragraph">이 색상 코드 추출기는 이미지를 서버로 전송하지 않습니다.</p>



<p class="wp-block-paragraph">사용자가 선택한 이미지는 현재 사용 중인 브라우저에서만 불러오며, 색상 추출 과정 역시 브라우저 내부에서 처리됩니다.</p>



<p class="wp-block-paragraph">이미지를 클릭하면 브라우저가 해당 위치의 픽셀 색상값을 읽어 HEX, RGB, HSL 형식으로 변환해서 보여주는 방식입니다.</p>



<p class="wp-block-paragraph">따라서 선택한 사진과 색상 추출 결과가 SNSnote 서버에 저장되지 않습니다.</p>



<p class="wp-block-paragraph">페이지를 닫거나 새로고침하면 선택했던 이미지도 브라우저 화면에서 사라집니다.</p>



<h2 class="wp-block-heading">자주 묻는 질문</h2>



<h3 class="wp-block-heading">이미지 색상 코드 추출은 무료인가요?</h3>



<p class="wp-block-paragraph">네. 별도의 회원가입이나 프로그램 설치 없이 무료로 사용할 수 있습니다.</p>



<p class="wp-block-paragraph">이미지를 선택하고 원하는 부분을 클릭하면 HEX, RGB, HSL 색상값을 바로 확인할 수 있습니다.</p>



<h3 class="wp-block-heading">업로드한 사진이 서버에 저장되나요?</h3>



<p class="wp-block-paragraph">아니요.</p>



<p class="wp-block-paragraph">이미지는 서버로 업로드되거나 저장되지 않으며 사용자의 브라우저에서만 처리됩니다.</p>



<h3 class="wp-block-heading">사진의 원하는 위치를 직접 선택할 수 있나요?</h3>



<p class="wp-block-paragraph">네.</p>



<p class="wp-block-paragraph">이미지가 화면에 표시되면 색상을 알고 싶은 위치를 직접 클릭하면 됩니다.</p>



<p class="wp-block-paragraph">클릭한 픽셀의 색상을 기준으로 HEX, RGB, HSL 값이 자동으로 표시됩니다.</p>



<h3 class="wp-block-heading">휴대폰에서도 사용할 수 있나요?</h3>



<p class="wp-block-paragraph">네.</p>



<p class="wp-block-paragraph">모바일 브라우저에서도 이미지를 선택한 뒤 화면에 표시된 사진의 원하는 부분을 터치해서 색상을 확인할 수 있습니다.</p>



<p class="wp-block-paragraph">다만 작은 영역의 색상을 정확하게 선택하려면 화면을 크게 사용하는 PC 환경이 조금 더 편할 수 있습니다.</p>



<h3 class="wp-block-heading">JPG, PNG, WebP 이미지도 사용할 수 있나요?</h3>



<p class="wp-block-paragraph">브라우저에서 정상적으로 표시할 수 있는 일반적인 이미지 파일이라면 사용할 수 있습니다.</p>



<p class="wp-block-paragraph">JPG, PNG, WebP 등 대부분의 이미지 형식을 브라우저에서 바로 불러와 색상을 확인할 수 있습니다.</p>



<h3 class="wp-block-heading">이미지 품질이 낮으면 색상 코드가 달라질 수 있나요?</h3>



<p class="wp-block-paragraph">가능합니다.</p>



<p class="wp-block-paragraph">특히 JPG처럼 압축이 적용된 이미지는 원본 이미지와 픽셀 색상이 조금 달라질 수 있습니다.</p>



<p class="wp-block-paragraph">정확한 색상을 확인해야 한다면 가능한 한 원본에 가까운 이미지 파일을 사용하는 것이 좋습니다.</p>



<h3 class="wp-block-heading">같은 이미지에서 여러 색상을 확인할 수 있나요?</h3>



<p class="wp-block-paragraph">네.</p>



<p class="wp-block-paragraph">원하는 위치를 계속 클릭하면 색상값이 즉시 변경됩니다.</p>



<p class="wp-block-paragraph">최근 선택한 색상이 표시되기 때문에 이미지 안에서 여러 색상을 비교하기에도 편리합니다.</p>



<h3 class="wp-block-heading">HEX 색상 코드만 복사할 수 있나요?</h3>



<p class="wp-block-paragraph">아니요.</p>



<p class="wp-block-paragraph">HEX뿐만 아니라 RGB와 HSL 값도 각각 복사할 수 있습니다.</p>



<p class="wp-block-paragraph">사용하려는 프로그램이나 작업 환경에 맞는 형식을 선택하면 됩니다.</p>



<h2 class="wp-block-heading">마무리</h2>



<p class="wp-block-paragraph">사진이나 이미지에서 정확한 색상 코드를 확인해야 할 때 별도의 그래픽 프로그램을 실행할 필요는 없습니다.</p>



<p class="wp-block-paragraph">위의 이미지 색상 코드 추출기를 이용하면 원하는 위치를 클릭하는 것만으로 HEX, RGB, HSL 값을 바로 확인할 수 있습니다.</p>



<p class="wp-block-paragraph">특히 웹사이트 디자인, 블로그 꾸미기, SNS 이미지 제작처럼 기존 이미지와 비슷한 색상을 찾아야 할 때 간단하게 활용할 수 있습니다.</p>



<style>
  /* 이 글에서만 본문 상단 대표 이미지 숨기기 */
  .featured-image, 
  .post-thumbnail, 
  .entry-header .post-image,
  .single-media {
    display: none !important;
  }
</style>
<div class="saboxplugin-wrap" itemtype="http://schema.org/Person" itemscope itemprop="author"><div class="saboxplugin-tab"><div class="saboxplugin-gravatar"><img loading="lazy" decoding="async" src="https://snsnote.com/wp-content/uploads/2026/06/5555.png" width="100"  height="100" alt="" itemprop="image"></div><div class="saboxplugin-authorname"><a href="https://snsnote.com/author/admin/" class="vcard author" rel="author"><span class="fn">JH</span></a></div><div class="saboxplugin-desc"><div itemprop="description"><p>SNSnote 편집 담당 JH입니다.2020년부터 SNS를 본격적으로 운영하기 시작해 현재 인스타그램, 유튜브, X를 합쳐 총 40만 팔로워를 보유하고 있습니다.영구정지 복구, 계정 성장, 수익화까지 직접 경험한 실패와 성공 사례를 바탕으로 실전에서 바로 활용할 수 있는 최신 정보를 전달하고 있습니다.최근에는 <strong>AI와 웹 기술을 활용한 브라우저 기반 도구를 직접 기획·개발하며</strong>, 사진·영상·문서·SNS 업무에 바로 사용할 수 있는 무료 온라인 도구도 함께 제공하고 있습니다.</p>
</div></div><div class="saboxplugin-web "><a href="https://snsnote.com" target="_self">snsnote.com</a></div><div class="clearfix"></div></div></div>]]></content:encoded>
					
					<wfw:commentRss>https://snsnote.com/image-color-picker/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
	<media:content url="https://snsnote.com/wp-content/uploads/2026/08/image-color-picker.jpg" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">1483</post-id>	</item>
		<item>
		<title>인스타그램 셀카 동영상 인증 실패 해결 방법, 계정 복구 전 확인할 것</title>
		<link>https://snsnote.com/instagram-video-selfie-verification-failed/</link>
					<comments>https://snsnote.com/instagram-video-selfie-verification-failed/#respond</comments>
		
		<dc:creator><![CDATA[JH]]></dc:creator>
		<pubDate>Sat, 22 Aug 2026 11:28:45 +0000</pubDate>
				<category><![CDATA[인스타그램]]></category>
		<guid isPermaLink="false">https://snsnote.com/?p=1450</guid>

					<description><![CDATA[인스타그램 셀카 동영상 인증 실패 원인과 재촬영 전 준비, 반복 실패 시 계정 복구 대응 순서를 실제 운영 경험과 함께 정리합니다.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>인스타그램 셀카 동영상 인증 실패</strong>가 반복되면 계정 복구 화면에서 더 이상 진행되지 않거나 다시 촬영하라는 안내만 나타날 수 있습니다. 이때 같은 환경에서 무작정 재시도하기보다 카메라 권한, 조명, 얼굴 가림, 계정 사진과 본인 식별 가능성부터 차례로 확인해야 합니다.</p>



<p class="wp-block-paragraph">저는 인스타그램을 6년 이상 운영했고, 여러 계정의 팔로워를 합하면 약 40만 명이며 현재도 계정을 통해 수익화하고 있습니다. 운영 기간 동안 계정 영구정지를 두 차례 복구하면서 느낀 점은 하나입니다. 복구 화면이 급하다고 손에 잡히는 버튼을 전부 누르는 것보다, 지금 Instagram이 무엇을 확인하려는 단계인지 먼저 구분해야 해결 가능성이 높아집니다.</p>



<p class="wp-block-paragraph">다만 제가 영구정지를 복구한 경험과 셀카 동영상 인증 실패는 같은 사건이라고 꾸며서 말하지 않겠습니다. 계정마다 표시되는 인증 방식과 복구 경로가 다르기 때문입니다. 이 글은 Meta 공식 안내를 바탕으로 실패 가능성을 줄이는 촬영 조건과 다음 대응 순서를 정리한 내용입니다.</p>



<h2 class="wp-block-heading">인스타그램은 왜 셀카 동영상 인증을 요구할까?</h2>



<p class="wp-block-paragraph">인스타그램은 계정에 다시 접근하려는 사람이 실제 소유자인지 확인하거나 사칭과 자동화 계정을 걸러내기 위해 셀카 동영상을 요청할 수 있습니다. 정지 이의 제기, 해킹 계정 복구, 로그인 과정의 본인 확인, Meta Verified 또는 연령 확인 등 상황에 따라 비슷한 촬영 화면이 나타날 수 있지만 목적과 이후 절차는 서로 다를 수 있습니다.</p>



<p class="wp-block-paragraph">메타는 사진과 신분증이 디지털 방식으로 변형될 수 있기 때문에 고개를 여러 방향으로 움직이는 동영상으로 실제 사람인지 확인한다고 설명합니다. 화면의 지시에 따라 얼굴 각도를 바꾸는 과정은 프로필에 올릴 영상을 만드는 것이 아니라 신원 확인을 위한 절차입니다.</p>



<p class="wp-block-paragraph">따라서 인스타그램 셀카 동영상 인증 실패가 발생했다고 곧바로 계정이 영구정지됐다고 단정할 필요는 없습니다. 반대로 촬영 제출 화면이 떴다는 이유만으로 복구가 확정된 것도 아닙니다. 현재 화면이 해킹 복구인지, 정지 이의 제기인지, 연령 또는 결제 인증인지 먼저 확인해야 합니다.</p>



<h2 class="wp-block-heading">인스타그램 셀카 동영상 인증 실패 원인</h2>



<h3 class="wp-block-heading">얼굴이 어둡거나 역광이 심한 경우</h3>



<p class="wp-block-paragraph">창문이나 밝은 조명을 등지고 촬영하면 화면에는 얼굴보다 배경이 더 밝게 잡힐 수 있습니다. 눈, 코, 입과 얼굴 윤곽이 선명하게 보이도록 정면에서 빛을 받는 장소가 좋습니다. 너무 어두운 방에서 휴대전화 화면 밝기만 높이는 것보다 낮 시간의 실내나 균일한 조명을 사용하는 편이 안정적입니다.</p>



<h3 class="wp-block-heading">모자·마스크·선글라스·머리카락이 얼굴을 가린 경우</h3>



<p class="wp-block-paragraph">얼굴 일부가 가려지면 화면의 움직임을 따라 했더라도 식별이 어려울 수 있습니다. 모자, 마스크, 선글라스를 벗고 앞머리가 눈을 가리지 않게 정리하세요. 미용 필터, 얼굴 보정, 카메라 효과도 사용하지 않는 편이 좋습니다. 안경에 조명이 심하게 반사된다면 잠시 벗고 촬영하는 방법도 고려할 수 있습니다.</p>



<h3 class="wp-block-heading">카메라 권한이나 앱 상태에 문제가 있는 경우</h3>



<p class="wp-block-paragraph">카메라 화면이 검게 나오거나 촬영 버튼이 작동하지 않는다면 본인 얼굴보다 앱 권한 문제일 수 있습니다. 휴대전화 설정에서 Instagram의 카메라 접근이 허용되어 있는지 확인하고 앱을 최신 버전으로 업데이트하세요. 업데이트 직후에도 멈춘다면 앱을 완전히 종료하고 휴대전화를 다시 시작한 뒤 동일한 계정으로 접속해 봅니다.</p>



<h3 class="wp-block-heading">계정에서 본인을 비교할 자료가 부족한 경우</h3>



<p class="wp-block-paragraph">Meta가 모든 판정 기준을 공개한 것은 아닙니다. 다만 프로필과 기존 게시물에 본인 얼굴이 전혀 없는 브랜드·큐레이션·반려동물 계정은 얼굴 중심 개인 계정보다 소유자를 영상으로 확인하기 어려울 수 있습니다. 이런 계정이라고 복구가 불가능하다는 뜻은 아니지만, 셀카 영상만으로 충분하지 않을 가능성을 생각하고 가입 이메일, 전화번호, 이전 사용자 이름과 사용 기기 같은 소유 증빙 정보를 정리해 두는 것이 좋습니다.</p>



<h3 class="wp-block-heading">불안정한 네트워크와 반복 제출</h3>



<p class="wp-block-paragraph">촬영은 끝났는데 업로드에서 멈춘다면 와이파이 또는 모바일 데이터 상태를 확인하세요. VPN이나 프록시를 사용 중이라면 평소 계정에 접속하던 안정적인 네트워크 환경으로 돌아가는 편이 낫습니다. 짧은 시간에 같은 제출을 계속 반복하면 기술 오류와 심사 실패를 구분하기 더 어려워지므로, 화면 문구와 시간을 캡처한 뒤 환경을 바꿔 재시도하는 것이 좋습니다.</p>



<h2 class="wp-block-heading">다시 촬영하기 전 체크리스트</h2>



<ul class="wp-block-list">
<li>Instagram 앱을 최신 버전으로 업데이트합니다.</li>



<li>휴대전화 설정에서 카메라 권한이 허용되어 있는지 확인합니다.</li>



<li>얼굴 정면에 빛이 오도록 하고 역광을 피합니다.</li>



<li>모자, 마스크, 선글라스와 얼굴 보정 필터를 제거합니다.</li>



<li>휴대전화를 얼굴 높이에 두고 화면 안내보다 너무 빠르게 움직이지 않습니다.</li>



<li>와이파이나 모바일 데이터가 안정적인지 확인합니다.</li>



<li>평소 계정에 사용하던 기기와 접속 환경을 우선 사용합니다.</li>



<li>실패 화면, 제출 시간과 표시된 오류 문구를 캡처합니다.</li>
</ul>



<p class="wp-block-paragraph">촬영 중에는 화면에 표시되는 방향을 끝까지 따라가되 고개를 갑자기 크게 돌릴 필요는 없습니다. 얼굴이 프레임 밖으로 벗어나지 않는 범위에서 천천히 움직이고, 카메라 렌즈가 더럽다면 먼저 닦아 주세요. 사소해 보이지만 얼굴 윤곽을 명확하게 전달하는 것이 우선입니다.</p>



<h2 class="wp-block-heading">인스타그램 셀카 동영상 인증 실패 후 대응 순서</h2>



<h3 class="wp-block-heading">1. 실패 문구와 복구 경로를 기록하기</h3>



<p class="wp-block-paragraph">‘인증할 수 없음’, ‘나중에 다시 시도’, ‘동영상을 제출하세요’처럼 실제 표시된 문구를 그대로 캡처하세요. 해킹 복구에서 나온 화면인지, 정지 이의 제기 중 나온 화면인지도 함께 기록해야 합니다. 나중에 고객센터나 문제 신고를 이용할 때 단순히 로그인이 안 된다고 쓰는 것보다 상황을 정확하게 전달할 수 있습니다.</p>



<h3 class="wp-block-heading">2. 같은 조건의 연속 재시도를 멈추기</h3>



<p class="wp-block-paragraph">조명, 카메라 권한, 앱 버전이 그대로인데 촬영만 반복하면 같은 결과가 나올 수 있습니다. 먼저 환경을 하나씩 바꾸고 무엇을 변경했는지 기록하세요. Meta는 모든 계정에 공통으로 적용되는 정확한 재시도 횟수나 고정된 검토 시간을 공개하지 않으므로, 인터넷에서 본 특정 횟수와 시간을 절대 기준으로 믿지 않는 것이 좋습니다.</p>



<h3 class="wp-block-heading">3. 해킹 계정이라면 공식 복구 페이지 이용하기</h3>



<p class="wp-block-paragraph">이메일이나 전화번호가 변경됐거나 비밀번호를 빼앗긴 상황이라면 일반 로그인 화면만 반복하지 말고 Instagram의 해킹 계정 복구 페이지를 이용하세요. 가입 이메일, 이전 비밀번호, 사용자 이름과 계정을 사용했던 기기 정보를 미리 정리해 두면 좋습니다. 보다 넓은 복구 과정은 <a href="https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%ea%b3%84%ec%a0%95-%eb%b3%b5%ea%b5%ac-%eb%b0%a9%eb%b2%95/">인스타그램 계정 복구 방법과 메타 상담 시도 후기</a>에서 확인할 수 있습니다.</p>



<h3 class="wp-block-heading">4. 다른 인증 수단이 제공되는지 확인하기</h3>



<p class="wp-block-paragraph">계정과 상황에 따라 신분증 제출이나 다른 본인 확인 방법이 제공될 수 있습니다. 모든 이용자가 원하는 인증 방식을 직접 선택할 수 있는 것은 아니므로 화면에 실제로 나타난 공식 선택지만 사용하세요. 신분증 제출 화면이 나온다면 이름과 사진이 선명한 Meta 허용 신분증인지 확인하고, 비공식 복구 업자에게 신분증이나 인증 코드를 보내서는 안 됩니다.</p>



<h3 class="wp-block-heading">5. 복구 화면이 멈추면 기술 문제로 신고하기</h3>



<p class="wp-block-paragraph">영상 제출 자체가 되지 않거나 버튼이 반복해서 멈춘다면 로그인 가능한 다른 계정의 설정에서 기술 문제 신고를 이용할 수 있습니다. 오류 화면, 계정 사용자 이름, 발생 시각, 휴대전화 기종, 앱 버전과 이미 시도한 방법을 간단히 정리하세요. 직접 상담이 필요한 경우에는 <a href="https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%ea%b3%a0%ea%b0%9d%ec%84%bc%ed%84%b0-%ec%83%81%eb%8b%b4%ec%9b%90-%ec%97%b0%ea%b2%b0/">인스타그램 고객센터 상담원 연결 경험</a>도 참고할 수 있습니다.</p>



<h2 class="wp-block-heading">40만 팔로워 계정을 운영하며 느낀 복구의 핵심</h2>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="471" height="1024" src="https://snsnote.com/wp-content/uploads/2026/06/6-471x1024.png" alt="인스타그램 셀카 동영상 인증 실패 원인과 재촬영 전 준비, 반복 실패 시 계정 복구 대응 순서를 실제 운영 경험과 함께 정리합니다." class="wp-image-570" srcset="https://snsnote.com/wp-content/uploads/2026/06/6-471x1024.png 471w, https://snsnote.com/wp-content/uploads/2026/06/6-138x300.png 138w, https://snsnote.com/wp-content/uploads/2026/06/6-768x1670.png 768w, https://snsnote.com/wp-content/uploads/2026/06/6-706x1536.png 706w, https://snsnote.com/wp-content/uploads/2026/06/6-942x2048.png 942w, https://snsnote.com/wp-content/uploads/2026/06/6-scaled.png 1177w" sizes="auto, (max-width: 471px) 100vw, 471px" /><figcaption class="wp-element-caption">인스타그램 계정 운영 중 생길 수 있는 무고 영구정지 해제 알림</figcaption></figure>
</div>


<p class="wp-block-paragraph">팔로워가 많은 계정이라고 복구 과정에서 특별히 자동 통과되는 것은 아닙니다. 저 역시 6년 넘게 인스타그램을 운영하고 수익화해 왔지만, 영구정지를 두 번 겪었을 때 결국 중요했던 것은 계정 규모를 강조하는 말보다 계정 소유와 정상 운영을 설명할 수 있는 기록이었습니다.</p>



<p class="wp-block-paragraph">제가 권하고 싶은 것은 평소부터 가입 이메일, 연결된 전화번호, 이전 사용자 이름, 비즈니스 관련 자료와 Meta에서 받은 메일을 정리해 두는 것입니다. 계정이 막힌 뒤 기억에 의존하면 정보가 엇갈리기 쉽습니다. 영구정지 복구 과정과 내용증명까지 사용했던 경험은 <a href="https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%ec%98%81%ea%b5%ac%ec%a0%95%ec%a7%80-%eb%b3%b5%ea%b5%ac-%ec%84%b1%ea%b3%b5%ed%95%9c-%ec%8d%b0%ea%b3%bc-%eb%82%b4%ec%9a%a9%ec%a6%9d%eb%aa%85-%eb%b3%b4/">인스타그램 영구정지 계정 복구 성공 후기</a>에 별도로 정리해 두었습니다.</p>



<p class="wp-block-paragraph">인스타그램 셀카 동영상 인증 실패가 발생했을 때도 마찬가지입니다. “몇 번 더 하면 되겠지”보다 실패 화면과 계정 정보를 남기고, 공식 경로 안에서 다음 선택지를 확인하는 편이 훨씬 현실적입니다. 인증 코드나 로그인 링크를 요구하는 외부 업체는 복구가 아니라 추가 해킹의 원인이 될 수 있습니다.</p>



<h2 class="wp-block-heading">셀카 동영상은 어디에 사용되고 언제 삭제될까?</h2>



<p class="wp-block-paragraph">Meta 공식 도움말에 따르면 제출한 셀카는 프로필에 공개되지 않고 신원 확인에 사용됩니다. Meta는 셀카 정보를 안전하게 저장하며 경우에 따라 최대 180일 동안 보관할 수 있다고 안내합니다. 정확한 처리와 보관 방식은 인증 목적과 설정에 따라 달라질 수 있으므로 제출 화면의 개인정보 안내를 직접 확인한 뒤 진행하세요.</p>



<h2 class="wp-block-heading">자주 묻는 질문</h2>



<h3 class="wp-block-heading">셀카 인증에 실패하면 계정이 바로 영구정지되나요?</h3>



<p class="wp-block-paragraph">실패 한 번만으로 모든 계정이 즉시 영구정지된다고 단정할 수 없습니다. 다만 계정 상태와 기존 제한에 따라 다음에 제공되는 절차가 다를 수 있으므로 실패 문구를 저장하고 공식 복구 화면의 안내를 따라야 합니다.</p>



<h3 class="wp-block-heading">프로필에 얼굴 사진이 없으면 인증할 수 없나요?</h3>



<p class="wp-block-paragraph">무조건 불가능하다고 말할 수는 없습니다. 하지만 얼굴이 없는 브랜드·큐레이션 계정은 영상만으로 소유자를 확인하기 어려울 수 있으므로 가입 이메일, 전화번호, 이전 사용자 이름 등 다른 계정 소유 정보를 준비하는 것이 좋습니다.</p>



<h3 class="wp-block-heading">신분증 인증으로 직접 바꿀 수 있나요?</h3>



<p class="wp-block-paragraph">계정마다 제공되는 선택지가 다릅니다. 화면에 신분증 제출 옵션이 나타난 경우에만 공식 안내를 따라 진행하고, 임의의 이메일 주소나 외부 업체에는 신분증을 보내지 마세요.</p>



<h3 class="wp-block-heading">인증 결과는 몇 시간 만에 나오나요?</h3>



<p class="wp-block-paragraph">Meta가 모든 복구 상황에 공통으로 적용되는 고정 시간을 보장하지는 않습니다. 제출 화면이나 이메일에 표시된 안내를 우선 확인하고, 결과가 오지 않는다면 스팸함과 계정에 연결된 이메일 주소를 확인하세요.</p>



<h2 class="wp-block-heading">정리</h2>



<p class="wp-block-paragraph">인스타그램 셀카 동영상 인증 실패는 얼굴이 실제 본인인지의 문제만이 아니라 조명, 얼굴 가림, 앱 권한, 네트워크, 계정에서 확인할 수 있는 정보 부족 등 여러 원인으로 발생할 수 있습니다. 같은 조건에서 촬영만 반복하지 말고 실패 문구를 저장한 뒤 환경을 하나씩 점검하세요.</p>



<p class="wp-block-paragraph">저처럼 계정을 장기간 운영했거나 팔로워가 많은 경우에도 계정 규모가 복구를 대신해 주지는 않습니다. 공식 복구 경로, 일관된 계정 정보와 제출 기록이 핵심입니다. 인스타그램 셀카 동영상 인증 실패가 계속된다면 화면에 제공되는 다른 인증 방법과 기술 문제 신고를 확인하고, 로그인 정보와 인증 코드는 누구에게도 넘기지 마세요.</p>



<h2 class="wp-block-heading">공식 참고자료</h2>



<ul class="wp-block-list">
<li><a href="https://help.instagram.com/1053588012132894/" target="_blank" rel="noopener">Instagram이 셀카 동영상 인증을 요청하는 이유</a></li>



<li><a href="https://www.facebook.com/help/instagram/149494825257596" target="_blank" rel="noopener">Instagram 해킹 계정 문제 해결</a></li>



<li><a href="https://help.instagram.com/271237319690904/" target="_blank" rel="noopener">Instagram에서 허용하는 신분증 종류</a></li>



<li><a href="https://help.instagram.com/2150090125809724/" target="_blank" rel="noopener">Meta에 제출한 셀카의 처리 방법</a></li>
</ul>
<div class="saboxplugin-wrap" itemtype="http://schema.org/Person" itemscope itemprop="author"><div class="saboxplugin-tab"><div class="saboxplugin-gravatar"><img loading="lazy" decoding="async" src="https://snsnote.com/wp-content/uploads/2026/06/5555.png" width="100"  height="100" alt="" itemprop="image"></div><div class="saboxplugin-authorname"><a href="https://snsnote.com/author/admin/" class="vcard author" rel="author"><span class="fn">JH</span></a></div><div class="saboxplugin-desc"><div itemprop="description"><p>SNSnote 편집 담당 JH입니다.2020년부터 SNS를 본격적으로 운영하기 시작해 현재 인스타그램, 유튜브, X를 합쳐 총 40만 팔로워를 보유하고 있습니다.영구정지 복구, 계정 성장, 수익화까지 직접 경험한 실패와 성공 사례를 바탕으로 실전에서 바로 활용할 수 있는 최신 정보를 전달하고 있습니다.최근에는 <strong>AI와 웹 기술을 활용한 브라우저 기반 도구를 직접 기획·개발하며</strong>, 사진·영상·문서·SNS 업무에 바로 사용할 수 있는 무료 온라인 도구도 함께 제공하고 있습니다.</p>
</div></div><div class="saboxplugin-web "><a href="https://snsnote.com" target="_self">snsnote.com</a></div><div class="clearfix"></div></div></div>]]></content:encoded>
					
					<wfw:commentRss>https://snsnote.com/instagram-video-selfie-verification-failed/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
	<media:content url="https://snsnote.com/wp-content/uploads/2026/08/instagram-video-selfie-verification-failed.jpg" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">1450</post-id>	</item>
		<item>
		<title>인스타그램 추천 자격 없음 해결 방법, 비팔로워 도달이 막힌 이유</title>
		<link>https://snsnote.com/instagram-recommendation-eligibility/</link>
					<comments>https://snsnote.com/instagram-recommendation-eligibility/#respond</comments>
		
		<dc:creator><![CDATA[JH]]></dc:creator>
		<pubDate>Sat, 22 Aug 2026 08:50:57 +0000</pubDate>
				<category><![CDATA[인스타그램]]></category>
		<guid isPermaLink="false">https://snsnote.com/?p=1443</guid>

					<description><![CDATA[인스타그램 추천 자격 없음이 표시되는 원인과 계정 상태 확인 방법, 문제 게시물 처리 및 검토 요청 순서를 알아봅니다.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>인스타그램 추천 자격 없음</strong>이 표시되면 계정이 정지된 것은 아니지만, 릴스·탐색 탭·피드 추천처럼 팔로워가 아닌 사람에게 콘텐츠가 노출될 기회가 크게 줄어들 수 있습니다. 게시물 반응이 갑자기 떨어졌다면 알고리즘만 탓하기 전에 계정 상태에서 추천 자격부터 확인해야 합니다.</p>



<p class="wp-block-paragraph">인스타그램 계정을 오래 운영하다 보면 평소와 비슷한 콘텐츠를 올렸는데도 조회수와 비팔로워 도달이 갑자기 꺾이는 시기가 있습니다. 이때 무작정 더 자주 올리거나 해시태그를 바꾸는 것보다 먼저 볼 곳은 <strong>계정 상태</strong>입니다. 이 글에서는 인스타그램 추천 자격 없음의 의미, 문제가 되는 항목을 찾는 방법, 수정·삭제·검토 요청 중 무엇을 선택해야 하는지 순서대로 정리합니다.</p>



<h2 class="wp-block-heading">인스타그램 추천 자격 없음은 무슨 뜻일까?</h2>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="591" height="591" src="https://snsnote.com/wp-content/uploads/2026/08/인스타그램-추천-자격-없음은-무슨-뜻일까.jpg" alt="인스타그램 추천 자격 없음이 표시되면 계정이 정지된 것은 아니지만, 릴스·탐색 탭·피드 추천처럼 팔로워가 아닌 사람에게 콘텐츠가 노출될 기회가 크게 줄어들 수 있습니다. 게시물 반응이 갑자기 떨어졌다면 알고리즘만 탓하기 전에 계정 상태에서 추천 자격부터 확인해야 합니다." class="wp-image-1448" srcset="https://snsnote.com/wp-content/uploads/2026/08/인스타그램-추천-자격-없음은-무슨-뜻일까.jpg 591w, https://snsnote.com/wp-content/uploads/2026/08/인스타그램-추천-자격-없음은-무슨-뜻일까-300x300.jpg 300w, https://snsnote.com/wp-content/uploads/2026/08/인스타그램-추천-자격-없음은-무슨-뜻일까-150x150.jpg 150w" sizes="auto, (max-width: 591px) 100vw, 591px" /></figure>
</div>


<p class="wp-block-paragraph">인스타그램은 탐색 탭, 릴스, 검색, 추천 계정과 피드 추천 등을 통해 팔로우하지 않은 이용자에게 콘텐츠를 보여줄 수 있습니다. 다만 모든 공개 계정과 게시물이 자동으로 추천되는 것은 아닙니다. 인스타그램의 추천 가이드라인을 충족한 공개 계정만 비팔로워 추천 대상이 될 수 있습니다.</p>



<p class="wp-block-paragraph">따라서 인스타그램 추천 자격 없음은 보통 계정 자체가 삭제되거나 로그인이 차단됐다는 뜻이 아닙니다. 기존 팔로워는 게시물을 볼 수 있고 게시물 작성도 가능하지만, 새로운 이용자에게 추천되는 범위가 제한될 수 있다는 의미에 가깝습니다. 팔로워에게는 정상적으로 보이기 때문에 운영자가 문제를 늦게 알아차리기도 합니다.</p>



<p class="wp-block-paragraph">중요한 점은 커뮤니티 가이드라인과 추천 가이드라인이 완전히 같지 않다는 것입니다. 삭제될 정도의 위반은 아니더라도 민감하거나 부적절하다고 판단된 콘텐츠는 추천 대상에서 제외될 수 있습니다. 계정이 정상적으로 살아 있다는 이유만으로 추천 자격도 정상이라고 볼 수는 없습니다.</p>



<h2 class="wp-block-heading">계정 상태에서 추천 자격 확인하는 방법</h2>



<ol start="1" class="wp-block-list">
<li>인스타그램 앱에서 오른쪽 아래 프로필 사진을 누릅니다.</li>



<li>오른쪽 위 메뉴를 열고 설정 및 활동으로 이동합니다.</li>



<li>메뉴에서 계정 상태를 선택합니다.</li>



<li>추천될 수 있는 콘텐츠 또는 추천 자격 관련 항목을 확인합니다.</li>



<li>문제가 표시되면 해당 게시물, 프로필 정보 또는 기능 제한의 상세 사유를 엽니다.</li>
</ol>



<p class="wp-block-paragraph">앱 버전이나 계정 유형에 따라 메뉴 이름과 위치가 조금 다를 수 있습니다. 메뉴가 보이지 않으면 앱을 최신 버전으로 업데이트한 뒤 설정 검색창에서 ‘계정 상태’를 검색해 보세요. 프로페셔널 계정에서는 비팔로워 추천 가능 여부와 문제가 된 콘텐츠를 비교적 자세히 확인할 수 있습니다.</p>



<h2 class="wp-block-heading">추천 자격이 사라지는 대표적인 원인</h2>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="531" height="1024" src="https://snsnote.com/wp-content/uploads/2026/08/추천-자격이-사라지는-대표적인-원인-531x1024.jpg" alt="인스타그램 추천 자격 없음이 표시되면 계정이 정지된 것은 아니지만, 릴스·탐색 탭·피드 추천처럼 팔로워가 아닌 사람에게 콘텐츠가 노출될 기회가 크게 줄어들 수 있습니다. 게시물 반응이 갑자기 떨어졌다면 알고리즘만 탓하기 전에 계정 상태에서 추천 자격부터 확인해야 합니다." class="wp-image-1445" srcset="https://snsnote.com/wp-content/uploads/2026/08/추천-자격이-사라지는-대표적인-원인-531x1024.jpg 531w, https://snsnote.com/wp-content/uploads/2026/08/추천-자격이-사라지는-대표적인-원인-156x300.jpg 156w, https://snsnote.com/wp-content/uploads/2026/08/추천-자격이-사라지는-대표적인-원인.jpg 591w" sizes="auto, (max-width: 531px) 100vw, 531px" /></figure>
</div>


<h3 class="wp-block-heading">재사용 콘텐츠와 독창성 부족</h3>



<p class="wp-block-paragraph">다른 사람이 만든 영상을 거의 그대로 다시 올리거나 워터마크가 있는 짧은 영상을 반복해서 게시하면 추천에 불리할 수 있습니다. 단순히 자막이나 테두리만 추가했다고 항상 독창적인 콘텐츠로 인정되는 것도 아닙니다. 원본 촬영, 의미 있는 편집, 해설이나 새로운 정보처럼 계정만의 기여가 드러나야 합니다.</p>



<p class="wp-block-paragraph">특히 영상 큐레이션 계정은 저작권 문제와 추천 자격 문제를 따로 생각해야 합니다. 저작권 신고가 없더라도 추천 시스템에서 재사용 콘텐츠로 판단될 수 있습니다. 관련 기준과 대응은 기존의 <a href="https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%eb%8f%85%ec%b0%bd%ec%84%b1-%ea%b0%80%ec%9d%b4%eb%93%9c%eb%9d%bc%ec%9d%b8-%ec%9c%84%eb%b0%98-%ea%b2%8c%ec%8b%9c%eb%ac%bc-%ec%82%ad%ec%a0%9c-%eb%8c%80/">인스타그램 독창성 가이드라인 위반 대처 방법</a>에서 더 자세히 확인할 수 있습니다.</p>



<h3 class="wp-block-heading">민감한 내용이나 추천 제한 콘텐츠</h3>



<p class="wp-block-paragraph">커뮤니티 가이드라인을 직접 위반하지 않더라도 폭력적이거나 선정적으로 보이는 장면, 자해·섭식장애처럼 민감한 주제, 규제 상품을 다루는 콘텐츠는 추천 범위가 제한될 수 있습니다. 정보 전달이나 뉴스 목적이 있더라도 썸네일, 영상의 첫 장면, 자막 표현 때문에 자동 시스템이 다르게 판단할 가능성이 있습니다.</p>



<h3 class="wp-block-heading">프로필 사진·소개·링크 문제</h3>



<p class="wp-block-paragraph">추천 자격 문제는 게시물에만 생기는 것이 아닙니다. 프로필 사진, 사용자 이름, 소개 문구 또는 외부 링크가 추천 가이드라인에 맞지 않는다고 표시될 수 있습니다. 계정 상태에 특정 게시물이 보이지 않는데도 계정 전체가 추천될 수 없다고 나온다면 프로필 영역까지 확인해야 합니다.</p>



<h3 class="wp-block-heading">반복된 경고와 계정 무결성 문제</h3>



<p class="wp-block-paragraph">게시물 삭제, 기능 제한, 스팸으로 의심되는 활동이 반복되면 계정 상태의 여러 항목에 문제가 함께 표시될 수 있습니다. 팔로우·좋아요·댓글을 짧은 시간에 지나치게 반복하거나 외부 자동화 도구를 사용했다면 활동 제한 여부도 확인해야 합니다. 계정 상태 전반의 의미는 <a href="https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%ea%b3%84%ec%a0%95-%eb%ac%b4%ea%b2%b0%ec%84%b1-%ec%9c%84%eb%b0%98-2026-%ec%a0%95%ec%b1%85-%ec%97%85%eb%8d%b0%ec%9d%b4%ed%8a%b8/">인스타그램 계정 무결성 위반 안내</a>도 함께 참고하세요.</p>



<h2 class="wp-block-heading">인스타그램 추천 자격 없음 해결 순서</h2>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="497" height="1024" src="https://snsnote.com/wp-content/uploads/2026/08/인스타그램-추천-자격-없음-해결-순서-497x1024.jpg" alt="" class="wp-image-1447" srcset="https://snsnote.com/wp-content/uploads/2026/08/인스타그램-추천-자격-없음-해결-순서-497x1024.jpg 497w, https://snsnote.com/wp-content/uploads/2026/08/인스타그램-추천-자격-없음-해결-순서-146x300.jpg 146w, https://snsnote.com/wp-content/uploads/2026/08/인스타그램-추천-자격-없음-해결-순서.jpg 591w" sizes="auto, (max-width: 497px) 100vw, 497px" /></figure>
</div>


<h3 class="wp-block-heading">1. 문제가 된 위치와 사유를 캡처하기</h3>



<p class="wp-block-paragraph">게시물을 바로 삭제하기 전에 계정 상태 화면, 문제가 된 콘텐츠, 표시된 사유와 날짜를 캡처해 두는 것이 좋습니다. 삭제 후에는 어떤 항목이 문제였는지 다시 확인하기 어려울 수 있고, 검토 요청이나 기술 문제 신고 때 설명할 자료도 사라질 수 있습니다.</p>



<h3 class="wp-block-heading">2. 명백한 문제인지 오탐인지 구분하기</h3>



<p class="wp-block-paragraph">워터마크가 있는 재업로드 영상, 과도하게 선정적인 썸네일, 오해를 부르는 프로필 문구처럼 원인을 알 수 있다면 수정 또는 삭제를 고려할 수 있습니다. 반대로 직접 제작한 정상 콘텐츠인데 이유가 맞지 않는다면 성급히 삭제하기보다 검토 요청을 먼저 살펴보는 편이 낫습니다.</p>



<h3 class="wp-block-heading">3. 검토 요청은 구체적인 항목에서 진행하기</h3>



<p class="wp-block-paragraph">계정 상태에서 문제가 된 콘텐츠를 열었을 때 검토 요청 버튼이 제공된다면 해당 경로를 이용합니다. 단순히 “아무 문제 없다”라고 생각하는 것보다 콘텐츠의 제작 방식, 원본 보유 여부, 정보 제공 목적처럼 판단에 필요한 근거를 정리해 두는 것이 좋습니다. 버튼과 제출 가능한 내용은 계정마다 다를 수 있습니다.</p>



<h3 class="wp-block-heading">4. 기술적 오류라면 앱에서 문제 신고하기</h3>



<p class="wp-block-paragraph">문제가 해결됐는데 계정 상태가 갱신되지 않거나 검토 요청 버튼이 작동하지 않는다면 설정의 도움말에서 문제 신고를 이용할 수 있습니다. 신고할 때는 사용자 이름, 발생 날짜, 계정 상태 화면과 시도한 조치를 간단히 적고 캡처 이미지를 첨부하는 편이 좋습니다.</p>



<p class="wp-block-paragraph">경고 자체가 커뮤니티 가이드라인과 연결되어 있다면 <a href="https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%ec%bb%a4%eb%ae%a4%eb%8b%88%ed%8b%b0%ea%b0%80%ec%9d%b4%eb%93%9c%eb%9d%bc%ec%9d%b8-%ea%b2%bd%ea%b3%a0%ec%a0%9c%ed%95%9c-%ed%92%80%eb%a6%ac%eb%8a%94/">커뮤니티 가이드라인 경고와 제한 기간</a>을 먼저 확인하면 추천 제한과 기능 제한을 혼동하는 일을 줄일 수 있습니다.</p>



<h2 class="wp-block-heading">게시물을 전부 삭제하면 빨리 풀릴까?</h2>



<p class="wp-block-paragraph">인스타그램 추천 자격 없음이 표시됐다고 최근 게시물을 전부 지우는 것은 권장하기 어렵습니다. 계정 상태에 표시된 문제 항목부터 확인하지 않으면 정상 콘텐츠까지 잃을 수 있고, 어떤 조치가 실제로 영향을 줬는지도 알기 어려워집니다. 문제가 명확한 콘텐츠만 개별적으로 판단하고 나머지는 그대로 두는 편이 관리하기 쉽습니다.</p>



<p class="wp-block-paragraph">또한 게시물을 삭제했다고 추천 자격이 즉시 돌아온다고 보장할 수 없습니다. 자동 시스템이 계정 상태를 다시 평가하고 화면에 반영하는 데 시간이 걸릴 수 있으며, 공식적으로 모든 계정에 적용되는 고정된 회복 시간도 안내되어 있지 않습니다. 인터넷에 떠도는 ‘24시간’, ‘7일’, ‘90일’을 모든 계정에 동일하게 적용해서는 안 됩니다.</p>



<h2 class="wp-block-heading">추천 자격이 돌아오기 전 운영할 때 주의할 점</h2>



<ul class="wp-block-list">
<li>문제를 해결하려고 게시물을 한꺼번에 삭제하거나 다시 올리지 않습니다.</li>



<li>검토 중에는 유사한 재사용 콘텐츠를 반복 게시하지 않습니다.</li>



<li>출처 표기만 하면 재사용 콘텐츠 문제가 모두 해결된다고 생각하지 않습니다.</li>



<li>추천 자격 복구를 보장한다는 비공식 업체에 로그인 정보나 인증 코드를 넘기지 않습니다.</li>



<li>계정 상태를 매시간 확인하기보다 변경한 내용과 확인 날짜를 기록합니다.</li>
</ul>



<p class="wp-block-paragraph">로그인이 불가능하거나 계정 자체가 비활성화됐다면 추천 자격 문제와는 다른 절차가 필요합니다. 그 경우에는 <a href="https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%ea%b3%84%ec%a0%95-%eb%b3%b5%ea%b5%ac-%eb%b0%a9%eb%b2%95/">인스타그램 계정 복구 방법과 메타 상담 시도 후기</a>를 확인하는 편이 맞습니다.</p>



<h2 class="wp-block-heading">자주 묻는 질문</h2>



<h3 class="wp-block-heading">추천 자격 없음이면 기존 팔로워에게도 안 보이나요?</h3>



<p class="wp-block-paragraph">반드시 그런 것은 아닙니다. 추천 자격은 주로 비팔로워에게 추천되는 노출과 관련됩니다. 기존 팔로워 도달도 콘텐츠 반응이나 피드 순위에 따라 달라질 수 있지만, 추천 자격 없음만으로 계정 전체가 비공개되거나 모든 팔로워에게 숨겨지는 것은 아닙니다.</p>



<h3 class="wp-block-heading">문제 게시물을 삭제하면 바로 정상으로 바뀌나요?</h3>



<p class="wp-block-paragraph">즉시 반영된다고 보장할 수 없습니다. 문제가 된 항목을 처리한 뒤에도 재검토와 상태 갱신 시간이 필요할 수 있습니다. 삭제 전에 사유를 캡처하고, 검토 요청이 가능한지 먼저 확인하세요.</p>



<h3 class="wp-block-heading">추천 자격 없음과 섀도우밴은 같은 건가요?</h3>



<p class="wp-block-paragraph">완전히 같은 표현은 아닙니다. ‘섀도우밴’은 이용자들이 도달 감소를 설명할 때 넓게 사용하는 비공식 용어입니다. 반면 추천 자격은 Instagram이 계정 상태에서 직접 확인할 수 있도록 제공하는 항목이므로, 추측보다 해당 화면을 기준으로 판단하는 것이 정확합니다.</p>



<h2 class="wp-block-heading">정리</h2>



<p class="wp-block-paragraph">인스타그램 추천 자격 없음은 계정 정지와 같지는 않지만 비팔로워 도달에 직접 영향을 줄 수 있는 중요한 신호입니다. 조회수가 떨어졌다고 새 콘텐츠를 무작정 늘리기 전에 계정 상태에서 문제가 된 게시물과 프로필 항목을 확인하세요. 명백한 문제는 수정하거나 삭제하고, 오탐으로 보인다면 제공되는 검토 요청을 이용하는 순서가 안전합니다.</p>



<p class="wp-block-paragraph">무엇보다 고정된 해제 기간을 믿고 기다리거나 게시물을 전부 삭제하지 않는 것이 중요합니다. 인스타그램 추천 자격 없음의 원인과 조치 내역을 기록하면서 계정 상태의 변화를 확인해야 이후에 같은 문제가 생겨도 훨씬 빠르게 대응할 수 있습니다.</p>



<h2 class="wp-block-heading">공식 참고자료</h2>



<ul class="wp-block-list">
<li><a href="https://www.facebook.com/help/instagram/653964212890722?locale=ko_KR" target="_blank" rel="noopener">Instagram 추천 자격 요건</a></li>



<li><a href="https://creators.instagram.com/blog/tips-for-improving-your-reach?locale=ko_KR" target="_blank" rel="noopener">Instagram 도달 성과를 개선하기 위한 팁</a></li>



<li><a href="https://help.instagram.com/381579045265733/?helpref=search&amp;locale=ko_KR" target="_blank" rel="noopener">Instagram 기술 문제 신고 방법</a></li>
</ul>
<div class="saboxplugin-wrap" itemtype="http://schema.org/Person" itemscope itemprop="author"><div class="saboxplugin-tab"><div class="saboxplugin-gravatar"><img loading="lazy" decoding="async" src="https://snsnote.com/wp-content/uploads/2026/06/5555.png" width="100"  height="100" alt="" itemprop="image"></div><div class="saboxplugin-authorname"><a href="https://snsnote.com/author/admin/" class="vcard author" rel="author"><span class="fn">JH</span></a></div><div class="saboxplugin-desc"><div itemprop="description"><p>SNSnote 편집 담당 JH입니다.2020년부터 SNS를 본격적으로 운영하기 시작해 현재 인스타그램, 유튜브, X를 합쳐 총 40만 팔로워를 보유하고 있습니다.영구정지 복구, 계정 성장, 수익화까지 직접 경험한 실패와 성공 사례를 바탕으로 실전에서 바로 활용할 수 있는 최신 정보를 전달하고 있습니다.최근에는 <strong>AI와 웹 기술을 활용한 브라우저 기반 도구를 직접 기획·개발하며</strong>, 사진·영상·문서·SNS 업무에 바로 사용할 수 있는 무료 온라인 도구도 함께 제공하고 있습니다.</p>
</div></div><div class="saboxplugin-web "><a href="https://snsnote.com" target="_self">snsnote.com</a></div><div class="clearfix"></div></div></div>]]></content:encoded>
					
					<wfw:commentRss>https://snsnote.com/instagram-recommendation-eligibility/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
	<media:content url="https://snsnote.com/wp-content/uploads/2026/08/instagram-recommendation-eligibility.jpg" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">1443</post-id>	</item>
		<item>
		<title>쓰레드 링크 스팸으로 글 삭제될 때? 안전하게 링크 남기는 4가지 팁</title>
		<link>https://snsnote.com/threads-link-spam-guide/</link>
					<comments>https://snsnote.com/threads-link-spam-guide/#respond</comments>
		
		<dc:creator><![CDATA[JH]]></dc:creator>
		<pubDate>Sun, 16 Aug 2026 18:35:35 +0000</pubDate>
				<category><![CDATA[인스타그램]]></category>
		<guid isPermaLink="false">https://snsnote.com/?p=1377</guid>

					<description><![CDATA[외부 URL을 올렸다가 쓰레드 링크 스팸으로 글이 삭제되거나 계정이 제재되는 이유를 상세히 분석합니다. 메타 알고리즘이 차단하는 주요 원인부터 단축 주소의 위험성, 첫 댓글 활용법, 섀도우반 증상 진단 및 복구 대처법, 그리고 SNSnote의 대형 운영자 13명 설문 기반 실전 마케팅 가이드까지 한눈에 확인하세요.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">쓰레드(Threads)에 정성껏 작성한 게시글에 블로그나 웹사이트 링크를 남겼다가, 몇 초 만에 <strong>&#8216;스팸 또는 커뮤니티 가이드라인 위반&#8217;</strong> 알림과 함께 글이 순식간에 삭제된 적 있으신가요?</p>



<p class="wp-block-paragraph">최근 메타(Meta) 알고리즘의 스팸 모니터링 기준이 대폭 강화되면서, 순수한 정보 공유 목적으로 외부 링크를 첨부한 일반 사용자들까지 억울하게 <strong>&#8216;쓰레드 링크 스팸&#8217;</strong> 계정으로 분류되어 글이 삭제되거나 계정이 shadowban(쉐도우벤) 당하는 피해가 급증하고 있습니다.</p>



<p class="wp-block-paragraph">특히 외부 유입을 노리는 블로거나 마케터 입장에서는 링크 작성 자체가 차단되면 활동에 큰 타격을 입을 수밖에 없는데요.</p>



<p class="wp-block-paragraph">이번 글에서는 쓰레드 알고리즘이 링크를 스팸으로 인지하는 진짜 이유와 함께, 시스템의 제재를 피하고 <strong>안전하게 외부 링크를 전달하는 4가지 실전 우회 팁</strong>을 상세히 정리해 드립니다.</p>





<h2 class="wp-block-heading"><strong>쓰레드 링크 스팸 알고리즘이 외부 URL을 차단하는 원인</strong></h2>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="630" height="1024" src="https://snsnote.com/wp-content/uploads/2026/08/쓰레드-링크-스팸-알고리즘이-외부-URL을-차단하는-원인-630x1024.jpg" alt="쓰레드 링크 스팸 차단 이의 신청 후 복원 불가 판정 알림 화면. 2026년 8월 16일에 게시물이 삭제되었으며 이의 신청 결과 복원되지 않았다는 내용의 알림 메시지." class="wp-image-1380" style="width:400px" srcset="https://snsnote.com/wp-content/uploads/2026/08/쓰레드-링크-스팸-알고리즘이-외부-URL을-차단하는-원인-630x1024.jpg 630w, https://snsnote.com/wp-content/uploads/2026/08/쓰레드-링크-스팸-알고리즘이-외부-URL을-차단하는-원인-185x300.jpg 185w, https://snsnote.com/wp-content/uploads/2026/08/쓰레드-링크-스팸-알고리즘이-외부-URL을-차단하는-원인-768x1248.jpg 768w, https://snsnote.com/wp-content/uploads/2026/08/쓰레드-링크-스팸-알고리즘이-외부-URL을-차단하는-원인-946x1536.jpg 946w, https://snsnote.com/wp-content/uploads/2026/08/쓰레드-링크-스팸-알고리즘이-외부-URL을-차단하는-원인.jpg 972w" sizes="auto, (max-width: 630px) 100vw, 630px" /><figcaption class="wp-element-caption">실제 쓰레드 링크 스팸 알고리즘에 의해 삭제된 게시물의 복원 불가 판정 알림 화면입니다. 이의 신청을 하더라도 &#8216;스팸에 관한 커뮤니티 규정 위반&#8217;으로 최종 판단되면 글이 영구적으로 복구되지 않을 수 있습니다.</figcaption></figure>
</div>


<p class="wp-block-paragraph">메타(Meta)가 운영하는 쓰레드(Threads)는 플랫폼 내부의 진정성 있는 소통을 보호하고 외부 서비스로의 무분별한 트래픽 유출을 막기 위해 고도화된 스팸 감지 시스템을 운영하고 있습니다. 단순히 블로그 주소나 웹사이트 링크를 올렸을 뿐인데 글이 즉시 삭제되거나 제재를 받는 것은 <strong>메타 커뮤니티 가이드라인의 스팸 및 도메인 차단 알고리즘</strong>에 저촉되었기 때문입니다. 대표적인 차단 원인 4가지는 다음과 같습니다.</p>



<ul class="wp-block-list">
<li><strong>단시간 내 동일 URL 및 반복 링크 게시:</strong> 동일한 웹사이트 도메인이나 게시글 URL을 짧은 시간 내에 여러 번 연속으로 올리면, 알고리즘은 이를 매크로 프로그램이나 봇(Bot)을 이용한 스팸 행위로 단정합니다. 게시 빈도가 높지 않더라도 반복된 링크 게시 패턴 자체가 감지되면 시스템은 즉시 해당 글을 삭제하고 계정 활동에 제한을 둡니다.</li>



<li><strong>텍스트 대비 높은 링크 비중:</strong> 본문 설명이나 맥락 정보가 거의 없이 단순 외부 URL만 덩그러니 포함된 게시물은 &#8216;기만적인 클릭 유도(Clickbait)&#8217; 또는 &#8216;수익형 스팸&#8217;으로 분류될 가능성이 매우 높습니다. 메타 정책상 이용자 경험을 저해하는 일방적인 외부 유인 목적의 콘텐츠는 스팸 모니터링 1순위 대상입니다.</li>



<li><strong>신규 계정 및 활동 지표 부족 상태에서의 링크 첨부:</strong> 계정을 생성한 지 얼마 되지 않았거나, 평소 다른 사용자들과의 상호작용(좋아요, 댓글, 팔로우 등)이 적은 상태에서 외부 링크를 발송하면 알고리즘의 위험 인지 점수가 급격히 상승합니다. 정상적인 소통 계정이 아닌 &#8216;홍보 전용 부계정&#8217;으로 판단되기 때문입니다.</li>



<li><strong>단축 URL 및 클로킹(Cloaking) 시스템 오인:</strong> Meta 투명성 센터의 스팸 정책에 따르면, 최종 도메인을 숨기거나 리다이렉트하는 기만적 URL 구조를 엄격히 금지합니다. Bitly나 TinyURL 같은 단축 주소 서비스를 사용하는 경우, 실제 랜딩 페이지를 가리는 &#8216;클로킹(Cloaking)&#8217; 기법으로 오인받아 수초 만에 필터링 및 자동 삭제 처리될 수 있습니다.</li>
</ul>



<h3 class="wp-block-heading">클로킹(Cloaking) 기법이란? 왜 가장 위험한가</h3>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="962" height="1024" src="https://snsnote.com/wp-content/uploads/2026/08/클로킹Cloaking-기법이란-왜-가장-위험한가-962x1024.png" alt="클로킹 기법의 위험성과 메타 공식 뉴스룸의 게시물 위장 문제 해결 대응 정책 안내 화면" class="wp-image-1382" style="width:500px" srcset="https://snsnote.com/wp-content/uploads/2026/08/클로킹Cloaking-기법이란-왜-가장-위험한가-962x1024.png 962w, https://snsnote.com/wp-content/uploads/2026/08/클로킹Cloaking-기법이란-왜-가장-위험한가-282x300.png 282w, https://snsnote.com/wp-content/uploads/2026/08/클로킹Cloaking-기법이란-왜-가장-위험한가-768x818.png 768w, https://snsnote.com/wp-content/uploads/2026/08/클로킹Cloaking-기법이란-왜-가장-위험한가-1443x1536.png 1443w, https://snsnote.com/wp-content/uploads/2026/08/클로킹Cloaking-기법이란-왜-가장-위험한가.png 1488w" sizes="auto, (max-width: 962px) 100vw, 962px" /><figcaption class="wp-element-caption">메타 공식 뉴스룸에 명시된 클로킹(Cloaking) 기법 대응 정책입니다. 시스템을 속여 실제와 다른 위험 사이트로 이동시키는 행위는 페이스북 및 쓰레드에서 최고 수준의 계정 정지 및 도메인 차단 제재를 받게 됩니다.</figcaption></figure>
</div>


<p class="wp-block-paragraph"><a target="_blank" rel="noreferrer noopener" href="https://transparency.meta.com/policies/community-standards/spam/">Meta 투명성 센터의 스팸 커뮤니티 규정</a>에 따르면, 클로킹(Cloaking)은 보안 검사 시스템을 속여 플랫폼 가이드라인을 우회하는 대표적인 기만행위로 정의되어 있습니다. 쉽게 말해, 쓰레드 시스템이나 검토자(Bot/Human Reviewer)가 링크를 클릭할 때 보여주는 페이지와, 일반 사용자가 실제 앱에서 링크를 누를 때 이동하는 랜딩 페이지를 <strong>서로 다르게 표시하는 눈속임 기술</strong>을 의미합니다.</p>



<p class="wp-block-paragraph"><a target="_blank" rel="noreferrer noopener" href="https://about.fb.com/news/2017/08/news-feed-fyi-addressing-cloaking-so-people-see-more-authentic-posts/">Meta 공식 뉴스룸의 클로킹 대응 정책</a>에 명시된 주요 모니터링 및 제재 기준은 다음과 같습니다.</p>



<ul class="wp-block-list">
<li><strong>동적 리다이렉트(Redirect)를 통한 눈속임:</strong> 검토 시스템 IP 접속 시에는 평범한 블로그나 가이드라인을 준수한 정상 페이지로 이동시키고, 실제 사용자(In-App Browser)가 접속할 때는 불법 유료 결제, 성인, 다이어트 약물 등 위험성 높은 외부 사이트로 강제 전환시키는 방식입니다.</li>



<li><strong>단축 URL 및 도메인 포워딩의 오인 위험:</strong> 일반 사용자가 단순히 링크 길이를 줄이기 위해 <strong>Bitly, TinyURL</strong>과 같은 단축 주소 서비스나 개인 도메인 단축 포워딩을 사용할 때 발생합니다. 알고리즘이 최종 랜딩 페이지 도메인을 명확히 파악하기 어렵게 만들어 &#8220;클로킹 시도&#8221;로 오인할 확률이 극도로 높아집니다.</li>



<li><strong>메타(Meta) 플랫폼 최고 수준의 강력한 제재:</strong> 메타 정책상 클로킹은 단순 스팸을 넘어 시스템을 의도적으로 방해하는 <strong>고의적 기만행위</strong>로 간주합니다. 이에 적발될 경우 해당 게시물 삭제 수준을 넘어 <strong>링크 도메인 차단, 쓰레드 계정 영구 동결, 연동된 페이스북 및 인스타그램 계정까지 연쇄 정지</strong>되는 가장 강력한 계정 제재 조치가 즉시 적용됩니다.</li>
</ul>



<h2 class="wp-block-heading"><strong>쓰레드 링크 스팸 판정을 피하고 안전하게 외부 링크를 남기는 4가지 실전 팁</strong></h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="456" src="https://snsnote.com/wp-content/uploads/2026/08/쓰레드-링크-스팸-판정을-피하고-안전하게-외부-링크를-남기는-4가지-실전-팁-1024x456.png" alt="메타 쓰레드 앱의 스팸 방지 커뮤니티 규정 안내 화면. 허용되지 않는 행위로 표시되거나 전송된 내용과 다른 웹사이트 연결, 반복 리디렉션 또는 클로킹 사용 등이 명시되어 있다." class="wp-image-1383" srcset="https://snsnote.com/wp-content/uploads/2026/08/쓰레드-링크-스팸-판정을-피하고-안전하게-외부-링크를-남기는-4가지-실전-팁-1024x456.png 1024w, https://snsnote.com/wp-content/uploads/2026/08/쓰레드-링크-스팸-판정을-피하고-안전하게-외부-링크를-남기는-4가지-실전-팁-300x134.png 300w, https://snsnote.com/wp-content/uploads/2026/08/쓰레드-링크-스팸-판정을-피하고-안전하게-외부-링크를-남기는-4가지-실전-팁-768x342.png 768w, https://snsnote.com/wp-content/uploads/2026/08/쓰레드-링크-스팸-판정을-피하고-안전하게-외부-링크를-남기는-4가지-실전-팁-1536x684.png 1536w, https://snsnote.com/wp-content/uploads/2026/08/쓰레드-링크-스팸-판정을-피하고-안전하게-외부-링크를-남기는-4가지-실전-팁.png 1610w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">쓰레드의 스팸 관련 커뮤니티 규정 안내 화면입니다. 본문과 무관하거나, 사용자를 오도하는 클로킹 기법을 사용하여 외부 유입을 유도할 경우 시스템에 의해 즉시 스팸으로 분류되어 글이 삭제되고 계정이 제재될 수 있습니다.</figcaption></figure>



<p class="wp-block-paragraph">앞서 살펴본 것처럼 쓰레드 알고리즘은 외부 URL에 대해 매우 까다로운 검증 기준을 적용하고 있습니다. 그렇다고 해서 외부 링크 공유가 완전히 불가능한 것은 아닙니다. 쓰레드 링크 스팸 시스템의 감지망을 우회하고, 계정 안전을 지키면서 원하는 트래픽을 가져오는 4가지 실전 전략을 정리해 드립니다.</p>



<h3 class="wp-block-heading"><strong>1. 본문이 아닌 첫 번째 댓글(Reply)에 링크 남기기</strong></h3>



<p class="wp-block-paragraph">가장 안전하고 검증된 우회법은 메인 게시글 본문이 아닌 첫 번째 댓글 영역에 외부 링크를 남기는 방식입니다.<sup></sup></p>



<ul class="wp-block-list">
<li>본문과 댓글에 적용되는 알고리즘 차이: 쓰레드 피드 알고리즘은 메인 게시글 본문에 외부 URL이 포함되어 있을 때 스팸 감지 점수를 가장 높게 부여합니다. 반면 댓글 영역은 상대적으로 스팸 모니터링 가중치가 낮게 설정되어 있어 쓰레드 링크 스팸 제재 확률을 크게 낮출 수 있습니다.</li>



<li>실전 작성 요령: 본문에는 유익한 카드뉴스 형태의 요약글이나 호기심을 자극하는 서사를 작성한 뒤, 자세한 내용과 원본 출처는 아래 첫 댓글 링크를 확인해 주세요라는 문구를 남기는 방식으로 유저 이동을 유도하세요.</li>
</ul>



<h3 class="wp-block-heading"><strong>2. 텍스트 비율을 높여 진정성 있는 콘텐츠로 포장하기</strong></h3>



<p class="wp-block-paragraph">링크만 단독으로 올리거나 성의 없는 짧은 문장에 URL을 덧붙이는 행위는 쓰레드 링크 스팸으로 분류되는 지름길입니다.</p>



<ul class="wp-block-list">
<li>충실한 본문 분량 확보: 최소 3~5줄 이상의 충실한 요약 내용과 개인적 견해, 설명 텍스트를 함께 작성해야 합니다. 알고리즘이 해당 글을 단순 홍보물이 아닌 유저 간의 진정성 있는 정보 공유로 판단하도록 만드는 것이 핵심입니다.</li>



<li>단축 URL 절대 금지: Bitly, TinyURL 등 단축 주소 서비스나 리다이렉션 도메인은 사용하지 마세요. 도메인의 원래 주소가 그대로 드러나는 풀(Full) URL을 사용하여 클로킹 오인을 방지해야 합니다.</li>
</ul>



<h3 class="wp-block-heading"><strong>3. 링크 공유 빈도 조절 및 계정 신뢰도(Trust Score) 확보</strong></h3>



<p class="wp-block-paragraph">아무리 유용한 정보라도 연속해서 링크를 올리면 시스템은 이를 쓰레드 링크 스팸 패턴으로 인지합니다.<sup></sup></p>



<ul class="wp-block-list">
<li>게시글 비율 유지 (8:2 법칙): 전체 게시글 중 외부 링크가 들어간 글의 비중을 20% 이하로 관리하세요. 4~5개의 일반 텍스트나 이미지 포스팅 사이에 1개 정도의 링크 포스팅을 섞어주는 것이 가장 안전합니다.</li>



<li>계정 활동성 강화: 링크를 올리기 전과 후에 다른 유저들의 쓰레드 글에 좋아요를 누르거나, 댓글을 남기고, 인용하기(Re-quote)를 진행하세요. 정상적인 유저 활동 지표가 지속적으로 수집되어야 쓰레드 링크 스팸 필터링 기준이 완화됩니다.</li>
</ul>



<h3 class="wp-block-heading"><strong>4. 링크 프로필 바이오(Bio)로 일원화하기</strong></h3>



<p class="wp-block-paragraph">외부 유입 전환이 목적이라면 매번 게시글마다 URL을 첨부하는 위험을 감수할 필요가 없습니다.</p>



<ul class="wp-block-list">
<li>프로필 링크 활용: 쓰레드 프로필의 링크란에 대표 블로그 주소나 Linktree(링크트리) 같은 멀티 링크 페이지를 미리 등록해 두세요.</li>



<li>자연스러운 행동 유도(CTA): 쓰레드 게시글 끝에 더 많은 정보는 프로필 상단 링크를 참고해 주세요라는 안내 문구를 추가하여, 쓰레드 링크 스팸 제재 위험을 0%로 만들면서도 자연스럽게 프로필 방문과 사이트 유입을 유도할 수 있습니다.</li>
</ul>



<h2 class="wp-block-heading">쓰레드 링크 스팸 조치 발생 시 단계별 대처 및 복구 방법</h2>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="806" src="https://snsnote.com/wp-content/uploads/2026/08/쓰레드-링크-스팸-조치-발생-시-단계별-대처-및-복구-방법-1024x806.png" alt="메타의 정책 상세 정보 화면. 시청자 수를 인위적으로 늘리기 위해 사용자를 속이거나 오도하는 콘텐츠를 허용하지 않는 스팸 정책 근거 안내." class="wp-image-1384" style="width:600px" srcset="https://snsnote.com/wp-content/uploads/2026/08/쓰레드-링크-스팸-조치-발생-시-단계별-대처-및-복구-방법-1024x806.png 1024w, https://snsnote.com/wp-content/uploads/2026/08/쓰레드-링크-스팸-조치-발생-시-단계별-대처-및-복구-방법-300x236.png 300w, https://snsnote.com/wp-content/uploads/2026/08/쓰레드-링크-스팸-조치-발생-시-단계별-대처-및-복구-방법-768x605.png 768w, https://snsnote.com/wp-content/uploads/2026/08/쓰레드-링크-스팸-조치-발생-시-단계별-대처-및-복구-방법-1536x1209.png 1536w, https://snsnote.com/wp-content/uploads/2026/08/쓰레드-링크-스팸-조치-발생-시-단계별-대처-및-복구-방법.png 1673w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">메타 공식 정책 상세 정보 페이지입니다. 시스템 및 사용자를 속이거나 인위적인 트래픽을 유도하는 기만적 링크와 스팸 행위에 대해 가해지는 강력한 모니터링 기준을 확인할 수 있습니다.</figcaption></figure>
</div>


<p class="wp-block-paragraph">정성껏 작성한 포스팅이 쓰레드 링크 스팸 알고리즘에 감지되어 게시물이 즉시 삭제되거나 계정에 기능 제한이 적용되었다면, 당황해서 잘못된 조치를 취하지 않는 것이 무엇보다 중요합니다. 메타 알고리즘의 스팸 모니터링 시스템은 오작동(False Positive) 가능성을 항상 내포하고 있으므로, 계정의 신뢰도를 유지하면서 쓰레드 링크 스팸 제재를 안전하게 해제하는 4단계 실전 복구 가이드를 순서대로 적용해 보시기 바랍니다.</p>



<h3 class="wp-block-heading">1단계: 즉시 동일 URL 재게시 중단 및 24시간 쿨타임 대기</h3>



<p class="wp-block-paragraph">글이 삭제되자마자 억울한 마음에 똑같은 웹사이트 주소나 약간만 수정한 텍스트를 이용해 연속으로 글을 올리는 행위는 쓰레드 링크 스팸 제재 수위를 최악으로 끌어올리는 주원인입니다.</p>



<ul class="wp-block-list">
<li>연속 게시의 위험성: 게시물이 차단된 직후 동일한 URL을 반복 업로드하면, 쓰레드 링크 스팸 감지 시스템은 이를 단순 실수가 아닌 악의적인 자동화 매크로 프로그램의 스팸 공격으로 최종 인지합니다. 이 경우 단락 삭제 수준에서 그치지 않고 계정 쉐도우벤(Shadowban)이나 일시 정지 조치로 제재가 격상됩니다.</li>



<li>최소 24시간 자정 대기: 스팸 알고리즘의 임시 모니터링 쿨타임이 초기화될 때까지 최소 24시간 동안은 어떠한 외부 URL도 게시글이나 댓글에 첨부하지 않아야 합니다. 이 기간에는 순수 텍스트 포스팅이나 이미지 포스팅만 진행하며 시스템의 경계 점수를 낮춰야 합니다.</li>
</ul>



<h3 class="wp-block-heading">2단계: 쓰레드 앱 내 &#8216;기술 문제 신고&#8217;를 통한 공식 이의 신청</h3>



<p class="wp-block-paragraph">쓰레드 앱 내부에 탑재되어 있는 공식 소명 채널을 통해 본인의 게시물이 쓰레드 링크 스팸 알고리즘에 오작동으로 차단되었음을 적극적으로 피력해야 합니다.</p>



<ul class="wp-block-list">
<li>이의 신청 접근 경로: 쓰레드 앱의 본인 프로필 페이지 우측 상단 메뉴(줄 두 개 버튼)를 누른 뒤, 설정 페이지의 도움말 메뉴로 이동합니다. 여기서 기술 문제 신고(Report a Problem) 항목을 선택합니다.</li>



<li>소명 문구 작성 노하우: 단순한 감정적 항의나 비방은 도움이 되지 않습니다. &#8220;본 게시물은 메타 커뮤니티 가이드라인을 철저히 준수한 순수 정보 공유 콘텐츠입니다. 쓰레드 링크 스팸 필터링 알고리즘의 오작동으로 판단되니, 삭제된 글의 복구 및 관련 도메인의 차단 해제를 정중히 요청합니다&#8221;라는 내용을 정리하여 영문과 한글로 동시에 작성하여 제출하세요.</li>
</ul>



<h3 class="wp-block-heading">3단계: 연동된 인스타그램 계정 상태(Account Status) 점검</h3>



<p class="wp-block-paragraph">쓰레드는 인스타그램의 인프라 및 메타 계정 센터와 완전히 연동되어 작동합니다. 따라서 쓰레드 링크 스팸 제재가 발생했다면 인스타그램 계정의 가이드라인 위반 상태를 반드시 함께 점검해야 합니다.</p>



<ul class="wp-block-list">
<li>계정 상태 확인 방법: 인스타그램 앱 프로필의 설정 및 개인정보 메뉴에서 계정 상태(Account Status) 탭으로 진입합니다.</li>



<li>연쇄 제재 차단: 해당 메뉴에서 과거 누적된 커뮤니티 가이드라인 위반 내역이 있는지 확인하세요. 인스타그램 측에 남아 있는 제재 이력이 존재할 경우, 쓰레드 링크 스팸 시스템이 본인을 위험 계정으로 분류하는 가중치가 올라가므로 연동 계정의 제한 내역부터 해결 및 이의 신청을 진행해야 합니다.</li>
</ul>



<h3 class="wp-block-heading">4단계: 계정 신뢰도(Trust Score) 복구를 위한 유기적 활동 수행</h3>



<p class="wp-block-paragraph">스팸 필터링 알고리즘이 나를 정상적인 사용자라고 재인식하도록 유기적인 유저 반응 지표를 꾸준히 수집해야 합니다.</p>



<ul class="wp-block-list">
<li>피드 상호작용 강화: 다른 쓰레드 유저들의 포스팅에 정성스러운 댓글을 남기고, 좋아요를 누르며, 유용한 글을 인용하기(Re-quote)하여 실제 인간 사용자의 동작 패턴 지표를 생성하세요.</li>



<li>안전한 게시물 작성: 외부 링크가 없는 일상적인 이야기나 카드뉴스 형태의 글을 3~5개 이상 꾸준히 올려 계정 활동성을 증명한 뒤, 앞서 설명해 드린 첫 번째 댓글 링크 방식이나 프로필 바이오 링크를 활용해 외부 유입 활동을 안전하게 재개하시기 바랍니다.</li>
</ul>



<h2 class="wp-block-heading">쓰레드 쉐도우벤(Shadowban) 증상 확인과 대처법</h2>



<p class="wp-block-paragraph">쓰레드 링크 스팸 알고리즘에 자주 노출되다 보면 계정이 완전히 정지되지는 않더라도 피드 노출이 제한되는 쉐도우벤(Shadowban) 상태에 빠질 수 있습니다. 게시글을 올려도 조회수나 좋아요가 평소보다 90% 이상 급감한다면 쉐도우벤을 의심해야 합니다.</p>



<h3 class="wp-block-heading">1. 쉐도우벤 진단 방법</h3>



<ul class="wp-block-list">
<li>타인 계정으로 검색 테스트: 다른 계정이나 로그인되지 않은 상태에서 본인 쓰레드 계정의 아이디나 주요 키워드를 검색했을 때 검색 결과에 나오지 않는다면 노출 제한 상태입니다.</li>



<li>인사이트 피드 노출 비율 확인: 게시글별 인사이트의 내 팔로워가 아닌 유저(Non-followers) 노출 비중이 0%에 가깝게 떨어진 경우 시스템이 피드 추천에서 제외한 것입니다.</li>
</ul>



<h3 class="wp-block-heading">2. 쉐도우벤 상태에서의 안전한 대처</h3>



<ul class="wp-block-list">
<li>3일간 링크 완전 중단: 최소 72시간 동안은 외부 링크, 단축 주소, 프로필 링크 수정 등을 일절 하지 않고 일반 순수 텍스트와 이미지 포스팅만 진행하세요.</li>



<li>유기적 미디어 상호작용: 알고리즘이 매크로가 아닌 실제 사용자임을 인지하도록 다른 유저의 쓰레드 글에 댓글을 달고 인용하기를 수행하며 자연스러운 계정 지표를 회복해야 합니다.</li>
</ul>



<h2 class="wp-block-heading">외부 유입과 계정 성장(팔로워)을 동시에 잡는 쓰레드 마케팅 전략</h2>



<p class="wp-block-paragraph">쓰레드를 활용하는 많은 블로거나 마케터들이 범하는 가장 큰 실수는 계정 성장이나 유저와의 상호작용 없이 오직 외부 유입만을 노리고 주소를 올리다가 쓰레드 링크 스팸 제재를 받는 것입니다. 쓰레드 알고리즘은 플랫폼 내부의 사용자 체류 시간을 유지하려는 경향이 강하기 때문에, 단순히 외부 사이트로 사용자를 빼나가는 계정을 선호하지 않습니다. 따라서 쓰레드 링크 스팸 알고리즘의 감지망을 완벽히 피하면서 계정 팔로워 성장과 블로그/웹사이트 유입이라는 두 마리 토끼를 모두 잡는 실전 마케팅 전략을 제시합니다.</p>



<h3 class="wp-block-heading">1. 밸런스 포스팅 전략 (8:2 및 9:1 법칙 준수)</h3>



<p class="wp-block-paragraph">계정의 모든 포스팅에 링크가 들어가는 순간, 알고리즘은 해당 계정을 순수한 사용자가 아닌 상업적 홍보용 봇으로 간주하고 쓰레드 링크 스팸 필터링 대상에 포함시킵니다.</p>



<ul class="wp-block-list">
<li>콘텐츠 비율 최적화: 전체 게시물 중 외부 URL이 포함된 글의 비중을 10~20% 수준으로 철저히 제한해야 합니다. 나머지 80~90%의 콘텐츠는 유저들이 댓글을 달고 싶어 하는 질문형 글, 카드뉴스 형태의 지식 정보, 공감대를 형성하는 일상 및 경험담으로 채워야 합니다.</li>



<li>알고리즘 가중치 확보: 외부 링크가 없는 순수 정보성 게시물로 좋아요, 인용하기, 댓글 등의 지표를 끌어올려 계정의 신뢰도 점수(Trust Score)를 먼저 확보해 두면, 간헐적으로 외부 링크를 포스팅하더라도 쓰레드 링크 스팸으로 분류될 확률이 대폭 감소합니다.</li>
</ul>



<h3 class="wp-block-heading">2. &#8216;지식 가치 전달 후 전환&#8217; 구조 설계</h3>



<p class="wp-block-paragraph">단순히 &#8220;제 블로그에 오시면 자세한 내용을 볼 수 있습니다&#8221;라는 짧은 문장에 링크를 덧붙이는 방식은 쓰레드 링크 스팸 기준에 정확히 부합하는 위험한 형태입니다.</p>



<ul class="wp-block-list">
<li>본문 완결성 강화: 쓰레드 본문 자체만으로도 읽는 이가 완벽한 유익함이나 지식적 가치를 느낄 수 있도록 텍스트 분량을 충분히 작성해야 합니다. 핵심 요약과 결론을 쓰레드 본문에 다 보여준 뒤, &#8220;더 깊이 있는 분석 자료나 상세 가이드는 첫 댓글에 남겨둔 원문 포스팅을 참고하세요&#8221; 형태로 전환을 유도해야 합니다.</li>



<li>유저 체류 시간 증가: 본문 텍스트가 충실할수록 사용자가 쓰레드 앱 내에서 해당 글을 읽으며 머무르는 시간이 길어지며, 이는 알고리즘이 해당 포스팅을 고품질 콘텐츠로 인식하게 만들어 쓰레드 링크 스팸 제재를 예방함과 동시에 피드 추천 노출(For You) 확률을 비약적으로 높여줍니다.</li>
</ul>



<h3 class="wp-block-heading">3. 멀티 링크 플랫폼 및 프로필 펀넬(Funnel) 구축</h3>



<p class="wp-block-paragraph">매번 게시글 본문에 링크를 첨부하여 쓰레드 링크 스팸 제재 위험을 감수하는 대신, 모든 유입 트래픽을 계정 프로필 바이오 영역으로 모으는 펀넬 구조를 구축하는 것이 가장 현명합니다.</p>



<ul class="wp-block-list">
<li>프로필 상단 링크 활용: 쓰레드 프로필의 웹사이트 등록란에 대표 블로그 주소나 Linktree(링크트리) 같은 멀티 링크 도메인을 등록해 두세요. 프로필에 등록된 링크는 피드 포스팅에 올리는 주소와 달리 쓰레드 링크 스팸 검출 필터링에서 훨씬 자유롭습니다.</li>



<li>행동 유도(CTA) 배치: 쓰레드 본문 마지막 문장에 &#8220;프로필 상단 링크를 클릭하시면 더 많은 정보와 노하우를 확인하실 수 있습니다&#8221;라는 행동 유도 문구를 지속적으로 노출하세요. 이를 통해 쓰레드 링크 스팸 제재 위험을 완전한 0%로 만들면서도 자연스럽게 프로필 방문과 팔로워 증가, 외부 사이트 유입을 동시에 달성할 수 있습니다.</li>
</ul>



<h2 class="wp-block-heading">쓰레드 링크 스팸 관련 자주 묻는 질문 (FAQ)</h2>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1786903444637" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Q1. 네이버 블로그나 티스토리, 외부 사이트 주소도 쓰레드 링크 스팸 대상이 되나요?</strong></h3>
<div class="rank-math-answer ">

<p>네, 도메인 종류와 관계없이 동일하게 적용됩니다. 네이버 블로그, 티스토리, 개인 워드프레스, 노션 등 국내외 플랫폼을 가리지 않고, 단시간 내에 반복 업로드되거나 본문 텍스트 없이 외부 URL만 올릴 경우 쓰레드 링크 스팸 시스템에 의해 즉시 감지되어 글이 삭제될 수 있습니다.</p>

</div>
</div>
<div id="faq-question-1786903455054" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Q2. 한 번 쓰레드 링크 스팸으로 삭제된 URL은 영구적으로 올리지 못하나요?</strong></h3>
<div class="rank-math-answer ">

<p>아닙니다. 특정 도메인이 메타의 블랙리스트에 완전히 등록된 상태가 아니라면, 보통 3일에서 7일 정도의 자정 유예 기간을 거친 후 본문 텍스트 비율을 충분히 늘리거나 첫 번째 댓글 방식을 활용해 다시 업로드하면 정상 포스팅이 가능합니다.</p>

</div>
</div>
<div id="faq-question-1786903463266" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Q3. 프로필 상단 바이오에 등록하는 링크도 쓰레드 링크 스팸 제재를 받나요?</strong></h3>
<div class="rank-math-answer ">

<p>프로필 바이오에 등록하는 웹사이트 링크는 일반 피드 게시글이나 댓글에 들어가는 링크와 감지 알고리즘이 완전히 다릅니다. 클로킹이나 불법 사이트 연결이 아니라면 프로필 상단 링크 등록만으로는 쓰레드 링크 스팸 제재를 받을 확률이 매우 낮으므로 안심하고 활용하셔도 됩니다.</p>

</div>
</div>
<div id="faq-question-1786903473568" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Q4. Bitly나 TinyURL 같은 단축 주소 서비스를 사용하는 것은 왜 위험한가요?</strong></h3>
<div class="rank-math-answer ">

<p>메타 투명성 센터의 스팸 규정에 따르면, 단축 URL은 최종 랜딩 페이지 도메인을 가리는 특성이 있어 쓰레드 시스템이 이를 기만적인 클로킹 기법으로 오인할 가능성이 매우 높습니다. 이로 인해 쓰레드 링크 스팸으로 분류되어 순식간에 글이 삭제되거나 도메인이 차단될 수 있으므로 반드시 원본 풀 URL을 사용해야 합니다.</p>

</div>
</div>
<div id="faq-question-1786903483907" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Q5. 이미 글이 삭제되었다면 똑같은 글을 약간 수정해서 바로 다시 올려도 되나요?</strong></h3>
<div class="rank-math-answer ">

<p>절대 금물입니다. 삭제 직후 동일하거나 유사한 URL을 연속해서 올리면 쓰레드 링크 스팸 감지 시스템은 이를 악의적인 매크로 프로그램의 스팸 공격으로 최종 인지합니다. 이 경우 단락 삭제 수준에서 그치지 않고 계정 쉐도우벤이나 일시 정지 조치로 제재 수위가 격상될 수 있습니다.</p>

</div>
</div>
<div id="faq-question-1786903495301" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Q6. 쓰레드 링크 스팸 제재를 받았을 때 계정 노출(쉐도우벤) 여부는 어떻게 확인하나요?</strong></h3>
<div class="rank-math-answer ">

<p>본인 계정이 아닌 다른 타인 계정이나 로그아웃 상태에서 본인의 쓰레드 아이디 및 작성한 주요 키워드를 검색해 보세요. 검색 결과에 계정이나 게시글이 전혀 노출되지 않거나, 인사이트에서 팔로워가 아닌 유저(Non-followers) 노출 비율이 0%에 가깝다면 쉐도우벤 상태일 확률이 높습니다.</p>

</div>
</div>
<div id="faq-question-1786903502240" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Q7. 안전한 링크 포스팅 비율인 8:2 법칙이란 무엇인가요?</strong></h3>
<div class="rank-math-answer ">

<p>SNSnote가 조사한 쓰레드 대형 운영자 13명의 공통적인 운영 노하우로, 전체 게시물 중 외부 URL이 들어간 포스팅의 비율을 20% 이하로 유지하는 원칙입니다. 4~5개의 일반 정보성 텍스트나 이미지 게시물 사이에 1개 정도의 링크 포스팅을 섞어주어야 쓰레드 링크 스팸 알고리즘의 경계 점수를 낮출 수 있습니다.</p>

</div>
</div>
<div id="faq-question-1786903506820" class="rank-math-list-item">
<h3 class="rank-math-question "><strong><strong>Q8. 외부 유입 전환을 늘리면서 스팸 제재를 피하는 가장 추천하는 작성법은 무엇인가요?</strong></strong></h3>
<div class="rank-math-answer ">

<p>메인 본문에는 핵심 요약과 완결성 있는 텍스트만 작성하고, 외부 URL은 첫 번째 댓글에 남기거나 프로필 바이오 상단 링크로 유도하는 것입니다. 이러한 방식으로 작성하면 쓰레드 링크 스팸 감지 점수를 최소화하면서 자연스럽게 블로그 및 웹사이트 유입을 이끌어낼 수 있습니다.</p>

</div>
</div>
</div>
</div>


<p class="wp-block-paragraph">본 FAQ 가이드의 실전 팁과 통계 자료는 SNSnote가 SNS 채널을 통해 실제 팔로워 1만 명 이상의 쓰레드 대형 운영자 13명을 대상으로 실시한 설문조사 결과를 바탕으로 작성되었습니다.</p>



<h2 class="wp-block-heading">쓰레드 관련 최근 이슈 참고 정보</h2>



<p class="wp-block-paragraph">메타 알고리즘의 강력해진 제재 정책은 단순 링크 차단에 그치지 않고, 심할 경우 계정 자체의 강제 정지나 비활성화 조치로 이어지기도 합니다. 최근 잇따라 발생한 메타 AI 오판 정지 사태와 실제 셀카 인증을 통한 계정 복구 후기가 궁금하시다면 아래 글을 참고해 보시기 바랍니다.<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a href="https://snsnote.com/threads-account-suspension-recovery/" target="_blank" rel="noreferrer noopener">쓰레드 계정 정지 강제 비활성화 복구 완료 후기</a></p>



<p class="wp-block-paragraph">또한, 쓰레드 글을 올릴 때 기존 인스타그램 팔로워나 인친들의 눈치가 보여 독립적인 계정(부캐)으로 안전하게 운영하고 싶다면, 아래 연동 해제 가이드를 통해 1분 만에 계정을 분리해 보시기 바랍니다.<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a href="https://snsnote.com/%ec%93%b0%eb%a0%88%eb%93%9c-%ec%9d%b8%ec%8a%a4%ed%83%80-%ec%97%b0%eb%8f%99-%ed%95%b4%ec%a0%9c-%eb%b0%a9%eb%b2%95-1%eb%b6%84-%eb%a7%8c%ec%97%90-%ea%b9%94%eb%81%94%ed%95%98%ea%b2%8c-%eb%81%8a%ea%b8%b0/" target="_blank" rel="noreferrer noopener">쓰레드 인스타 연동 해제 방법, 1분 만에 깔끔하게 끊기</a></p>



<h2 class="wp-block-heading">마치며: 계정 안전과 외부 유입을 모두 잡는 쓰레드 운영 전략</h2>



<p class="wp-block-paragraph">쓰레드 플랫폼에서 블로그나 웹사이트 주소를 공유할 때 발생하는 쓰레드 링크 스팸 문제는 메타 알고리즘의 동작 방식과 모니터링 기준을 정확히 이해하면 얼마든지 예방할 수 있습니다.</p>



<p class="wp-block-paragraph">단순히 외부 유입 트래픽만을 얻기 위해 무분별하게 URL을 업로드하기보다는, 본문 텍스트의 가치와 완결성을 높이고 첫 댓글 영역이나 프로필 바이오 상단 링크를 적극적으로 활용하는 것이 가장 안전합니다. 특히 클로킹 기법으로 오인받을 수 있는 단축 주소 사용을 지양하고 풀 도메인을 유지하는 원칙만 지켜도 쓰레드 링크 스팸 제재 위험을 획기적으로 줄일 수 있습니다.</p>



<p class="wp-block-paragraph">오늘 정리해 드린 실전 가이드를 바탕으로, 쓰레드 링크 스팸 차단이나 계정 노출 제한 걱정 없이 계정 신뢰도를 지키면서 원하는 유입 트래픽을 지속적으로 확보해 보시기 바랍니다.</p>
<div class="saboxplugin-wrap" itemtype="http://schema.org/Person" itemscope itemprop="author"><div class="saboxplugin-tab"><div class="saboxplugin-gravatar"><img loading="lazy" decoding="async" src="https://snsnote.com/wp-content/uploads/2026/06/5555.png" width="100"  height="100" alt="" itemprop="image"></div><div class="saboxplugin-authorname"><a href="https://snsnote.com/author/admin/" class="vcard author" rel="author"><span class="fn">JH</span></a></div><div class="saboxplugin-desc"><div itemprop="description"><p>SNSnote 편집 담당 JH입니다.2020년부터 SNS를 본격적으로 운영하기 시작해 현재 인스타그램, 유튜브, X를 합쳐 총 40만 팔로워를 보유하고 있습니다.영구정지 복구, 계정 성장, 수익화까지 직접 경험한 실패와 성공 사례를 바탕으로 실전에서 바로 활용할 수 있는 최신 정보를 전달하고 있습니다.최근에는 <strong>AI와 웹 기술을 활용한 브라우저 기반 도구를 직접 기획·개발하며</strong>, 사진·영상·문서·SNS 업무에 바로 사용할 수 있는 무료 온라인 도구도 함께 제공하고 있습니다.</p>
</div></div><div class="saboxplugin-web "><a href="https://snsnote.com" target="_self">snsnote.com</a></div><div class="clearfix"></div></div></div>]]></content:encoded>
					
					<wfw:commentRss>https://snsnote.com/threads-link-spam-guide/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
	<media:content url="https://snsnote.com/wp-content/uploads/2026/08/threads-link-spam-guide.jpg" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">1377</post-id>	</item>
		<item>
		<title>Y2K 레트로 2000년대 느낌 텍스트 이모티콘 표정 특수문자 모음</title>
		<link>https://snsnote.com/emoticon-list/</link>
					<comments>https://snsnote.com/emoticon-list/#respond</comments>
		
		<dc:creator><![CDATA[JH]]></dc:creator>
		<pubDate>Thu, 06 Aug 2026 12:32:23 +0000</pubDate>
				<category><![CDATA[유용한 도구]]></category>
		<category><![CDATA[인스타그램]]></category>
		<guid isPermaLink="false">https://snsnote.com/?p=1195</guid>

					<description><![CDATA[귀여운 텍스트 이모티콘과 특수문자 모음! 클릭 한 번으로 간편하게 복사해서 인스타그램, 블로그, 유튜브 댓글에 바로 사용해 보세요.]]></description>
										<content:encoded><![CDATA[
<style>
  #emoticon-box {
    background-color: #f8fafc;
    border: 1px solid #e2e8f0;
    border-radius: 12px;
    padding: 25px 20px;
    margin: 25px 0;
    box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
    text-align: center;
  }

  #emoticon-box b.title {
    display: block;
    font-size: 22px;
    font-weight: bold;
    color: #0f172a;
    margin-bottom: 6px;
  }

  #emoticon-box p.desc {
    font-size: 14px;
    color: #64748b;
    margin-bottom: 20px;
  }

  /* 카테고리 탭 버튼 */
  .emo-tab-group {
    display: flex;
    justify-content: center;
    gap: 6px;
    flex-wrap: wrap;
    margin-bottom: 20px;
  }

  .emo-tab-btn {
    background-color: #ffffff;
    border: 1px solid #cbd5e1;
    border-radius: 20px;
    padding: 7px 14px;
    font-size: 13px;
    font-weight: 600;
    color: #475569;
    cursor: pointer;
    transition: all 0.2s;
  }

  .emo-tab-btn:hover, .emo-tab-btn.active {
    background-color: #2563eb;
    color: #ffffff;
    border-color: #2563eb;
  }

  /* 상시 스크롤바 감싸는 영구 영역 */
  .emo-scroll-wrapper {
    position: relative;
    background-color: #ffffff;
    border: 1px solid #e2e8f0;
    border-radius: 10px;
    padding: 6px;
  }

  /* 이모티콘 스크롤 영역 */
  .emo-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));
    gap: 8px;
    max-height: 500px;
    overflow-y: scroll !important;
    padding: 8px 16px 8px 8px;
    
    -ms-overflow-style: none !important;
    scrollbar-width: none !important;
  }
  
  .emo-grid::-webkit-scrollbar {
    display: none !important;
    width: 0 !important;
    height: 0 !important;
  }

  /* 모바일에서도 손을 대지 않고 상시 뜨는 스크롤 트랙 */
  .custom-scrollbar-track {
    position: absolute;
    top: 10px;
    right: 8px;
    bottom: 10px;
    width: 6px;
    background-color: #e2e8f0;
    border-radius: 10px;
    pointer-events: none;
    z-index: 99;
  }

  /* 항상 선명하게 떠 있는 파란색 손잡이 */
  .custom-scrollbar-thumb {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 25%;
    background-color: #2563eb;
    border-radius: 10px;
    will-change: transform;
  }

  .emo-item {
    background-color: #f1f5f9;
    border: 1px solid #e2e8f0;
    border-radius: 8px;
    padding: 10px 6px;
    font-size: 13px;
    color: #1e293b;
    cursor: pointer;
    transition: all 0.15s ease-in-out;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }

  .emo-item:hover {
    background-color: #e2e8f0;
    transform: translateY(-2px);
    border-color: #cbd5e1;
  }

  .emo-item:active {
    transform: scale(0.96);
  }

  /* 복사 알림 토스트 (화면 중앙 고정) */
  #emo-toast {
    display: none;
    position: fixed !important;
    top: 50% !important;
    left: 50% !important;
    transform: translate(-50%, -50%) !important;
    min-width: 220px;
    background-color: #0f172a;
    color: #ffffff;
    text-align: center;
    border-radius: 8px;
    padding: 14px 24px;
    z-index: 999999 !important;
    font-size: 14px;
    font-weight: 600;
    box-shadow: 0 8px 24px rgba(0,0,0,0.3);
  }

  #emo-toast.show {
    display: block !important;
  }

  /* 모바일 최적화 */
  @media (max-width: 600px) {
    .emo-grid {
      display: block !important;
      max-height: 380px !important;
      height: 380px !important;
      overflow-y: scroll !important;
      -webkit-overflow-scrolling: touch !important;
      padding-right: 20px !important;
    }

    .emo-item {
      display: inline-block !important;
      width: calc(50% - 8px) !important;
      margin: 4px !important;
      box-sizing: border-box !important;
      font-size: 12px !important;
      padding: 10px 2px !important;
      vertical-align: top !important;
    }
  }

  /* 아스키아트는 여러 줄을 그대로 보여주도록 넓은 카드로 표시 */
  .emo-grid.ascii-mode {
    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  }
  .emo-item.ascii-item {
    white-space: pre;
    overflow-x: auto;
    text-overflow: clip;
    text-align: left;
    font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
    line-height: 1.35;
    min-height: 82px;
    display: flex;
    align-items: center;
    justify-content: center;
  }
  .emo-grid.symbol-mode {
    grid-template-columns: repeat(auto-fill, minmax(64px, 1fr));
  }
  .emo-item.symbol-item {
    font-size: 20px;
    padding: 12px 6px;
  }
  .emo-count-note {
    font-size: 12px;
    color: #94a3b8;
    margin: -10px 0 12px;
  }
  @media (max-width: 600px) {
    .emo-grid.ascii-mode { display: grid !important; grid-template-columns: 1fr !important; }
    .emo-grid.ascii-mode .emo-item { width: auto !important; margin: 4px 0 !important; }
    .emo-grid.symbol-mode { display: grid !important; grid-template-columns: repeat(4, 1fr) !important; }
    .emo-grid.symbol-mode .emo-item { width: auto !important; margin: 2px !important; }
  }

</style>

<!-- 특수문자 이모티콘 모음 도구 -->
<div id="emoticon-box">
  <b class="title">⸜(｡˃ ᵕ ˂ )⸝ 특수문자 이모티콘 모음</b>
  <p class="desc">그림 이모지 없이 텍스트 이모티콘·아스키아트·특수기호를 클릭하면 바로 복사됩니다!</p>

  <!-- 카테고리 탭 -->
  <div class="emo-tab-group">
    <button class="emo-tab-btn" data-cat="all" onclick="filterEmo('all', this)">전체</button>
    <button class="emo-tab-btn active" data-cat="happy" onclick="filterEmo('happy', this)">기쁨/신남</button>
    <button class="emo-tab-btn" data-cat="love" onclick="filterEmo('love', this)">사랑/하트</button>
    <button class="emo-tab-btn" data-cat="sad" onclick="filterEmo('sad', this)">슬픔/눈물</button>
    <button class="emo-tab-btn" data-cat="angry" onclick="filterEmo('angry', this)">분노/황당</button>
    <button class="emo-tab-btn" data-cat="animal" onclick="filterEmo('animal', this)">동물/귀염</button>
    <button class="emo-tab-btn" data-cat="action" onclick="filterEmo('action', this)">인사/응원</button>
    <button class="emo-tab-btn" data-cat="etc" onclick="filterEmo('etc', this)">기타/특수</button>
    <button class="emo-tab-btn" data-cat="ascii" onclick="filterEmo('ascii', this)">아스키아트</button>
    <button class="emo-tab-btn" data-cat="symbols" onclick="filterEmo('symbols', this)">특수기호</button>
  </div>

  <div class="emo-count-note" id="emo-count-note"></div>

  <!-- 이모티콘 목록 그리드 & 상시 노출 스크롤바 -->
  <div class="emo-scroll-wrapper">
    <div class="emo-grid" id="emo-grid-container"></div>
    <div class="custom-scrollbar-track" id="custom-scroll-track">
      <div class="custom-scrollbar-thumb" id="custom-scroll-thumb"></div>
    </div>
  </div>
</div>

<!-- 복사 알림 토스트 -->
<div id="emo-toast">클립보드에 복사되었습니다!</div>


<script>
(function() {
  const emoData = {
  "happy": [
    "(ღ'ᴗ'ღ)", "(｡˃ ᵕ ˂ )b", "( ˶ˆᗜˆ˶ )", "(๑>ᴗ<๑)",
    "(ง ᵕᴗᵕ)ว", "( ੭ ̇ᗜ ̇ )੭", "( •̀ᴗ•́ )و", "(๑ᵔ⤙ᵔ๑)",
    "( ๑ ❛ ᴗ ❛ )", "( * ´ ` *)", "( ˃᷄˶˶̫˶˂᷅ )", "( ˆ͈̑꒳ˆ͈̑ )੭",
    "( ˶ｰ̀֊ｰ́˶ )", "(๑ᵔᗜᵔ๑)", "(๑˃̵ᴗ˂̵)و", "(◍´ꇴ`◍)",
    "(❁´▽`❁)", "(っ'ヮ'c)", "!(•̀ᴗ•́)و ̑̑", "( ᐛ )σ",
    "٩( ᐛ )و", "(๑^ ^๑)", "(⁎˃ᴗ˂⁎)", "٩(๑>◊<๑)۶",
    "₍₍ (ง ˙ω˙)ง ⁾⁾", "＼＼\\\\٩( 'ω' )و //／／", "(⑉︎• •⑉︎)♡", "٩(ˊᗜˋ*)و",
    "(*°▽°*)", "(^0^)/", "(*>∀<*)b", "＼(★^∀^★)／",
    "٩(θ‿θ)۶", "(˶◕ ‿◕˶)", "(•̀ᴗ•́)൬", "(☆▽☆)",
    "(⌒▽⌒)☆", "(o^▽^o)", "٩(◕‿◕｡)۶", "(◕‿◕)",
    "(*^▽^*)", "(´∇｀)", "(▰˘◡˘▰)", "(•̀ᴗ•́)و ̑̑",
    "(^▽^)", "(*^-^*)", "( ▔•ω•▔ )", "(^O^)",
    "(*≧▽≦)", "(⌒‿⌒)", "(〃^∇^〃)", "(≧∇≦)/",
    "(^.^)", "(╹◡╹)", "(◍‿◍)", "( •̀∀•́ )",
    "(￣▽￣)V", "( ⁀⤚⁀ )", "( ° ▽ ° )", "( ๑ ❛ ▿ ❛ ๑ )",
    "( ° ͜ʖ °)", "( -_・)", "( ⸝⸝•ᴗ•⸝⸝ )", "(｡>﹏<｡)",
    "!(•̀ᴗ•́)و", "( ´ ▽ ` )", "( ` ∇ ´ )", "( ͡~ ͜ʖ ͡~)",
    "(  •̀ - •́  )", "(｡•̀ᴗ-)✧", "(〃⌒▽⌒〃)", "٩( ๑╹ ꇴ ╹๑ )۶",
    "(^_^)", "（^_^）", "ヽ(^_^)ノ", "ヾ(^_^)ﾉ",
    "٩(^_^)۶", "⸜(^_^)⸝", "\\(^_^)/", "└(^_^)┐",
    "┌(^_^)┘", "(ﾉ^_^)ﾉ", "（^▽^）", "ヽ(^▽^)ノ",
    "ヾ(^▽^)ﾉ", "٩(^▽^)۶", "⸜(^▽^)⸝", "\\(^▽^)/",
    "└(^▽^)┐", "┌(^▽^)┘", "(ﾉ^▽^)ﾉ", "(^ω^)",
    "（^ω^）", "ヽ(^ω^)ノ", "ヾ(^ω^)ﾉ", "٩(^ω^)۶",
    "⸜(^ω^)⸝", "\\(^ω^)/", "└(^ω^)┐", "┌(^ω^)┘",
    "(ﾉ^ω^)ﾉ", "(^‿^)", "（^‿^）", "ヽ(^‿^)ノ",
    "ヾ(^‿^)ﾉ", "٩(^‿^)۶", "⸜(^‿^)⸝", "\\(^‿^)/",
    "└(^‿^)┐", "┌(^‿^)┘", "(ﾉ^‿^)ﾉ", "(^o^)",
    "（^o^）", "ヽ(^o^)ノ", "ヾ(^o^)ﾉ", "٩(^o^)۶",
    "⸜(^o^)⸝", "\\(^o^)/", "└(^o^)┐", "┌(^o^)┘",
    "(ﾉ^o^)ﾉ", "(＾▽＾)", "（＾▽＾）", "ヽ(＾▽＾)ノ",
    "ヾ(＾▽＾)ﾉ", "٩(＾▽＾)۶", "⸜(＾▽＾)⸝", "\\(＾▽＾)/",
    "└(＾▽＾)┐", "┌(＾▽＾)┘", "(ﾉ＾▽＾)ﾉ", "(＾ω＾)",
    "（＾ω＾）", "ヽ(＾ω＾)ノ", "ヾ(＾ω＾)ﾉ", "٩(＾ω＾)۶",
    "⸜(＾ω＾)⸝", "\\(＾ω＾)/", "└(＾ω＾)┐", "┌(＾ω＾)┘",
    "(ﾉ＾ω＾)ﾉ", "(≧▽≦)", "（≧▽≦）", "ヽ(≧▽≦)ノ",
    "ヾ(≧▽≦)ﾉ", "٩(≧▽≦)۶", "⸜(≧▽≦)⸝", "\\(≧▽≦)/",
    "└(≧▽≦)┐", "┌(≧▽≦)┘", "(^ᴗ^)", "（^ᴗ^）",
    "⸜(^ᴗ^)⸝", "ヽ(^ᴗ^)ノ", "ヾ(^ᴗ^)ﾉ", "٩(^ᴗ^)۶",
    "\\(^ᴗ^)/", "└(^ᴗ^)┐", "┌(^ᴗ^)┘", "(ﾉ^ᴗ^)ﾉ",
    "✧(^ᴗ^)✧", "☆(^ᴗ^)☆", "~(^ᴗ^)~", "(^ᴗᵔ)",
    "（^ᴗᵔ）", "⸜(^ᴗᵔ)⸝", "ヽ(^ᴗᵔ)ノ", "ヾ(^ᴗᵔ)ﾉ",
    "٩(^ᴗᵔ)۶", "\\(^ᴗᵔ)/", "└(^ᴗᵔ)┐", "┌(^ᴗᵔ)┘",
    "(ﾉ^ᴗᵔ)ﾉ", "✧(^ᴗᵔ)✧", "☆(^ᴗᵔ)☆", "~(^ᴗᵔ)~",
    "(^ᴗ•)", "（^ᴗ•）", "⸜(^ᴗ•)⸝", "ヽ(^ᴗ•)ノ",
    "ヾ(^ᴗ•)ﾉ", "٩(^ᴗ•)۶", "\\(^ᴗ•)/", "└(^ᴗ•)┐",
    "┌(^ᴗ•)┘", "(ﾉ^ᴗ•)ﾉ", "✧(^ᴗ•)✧", "☆(^ᴗ•)☆",
    "~(^ᴗ•)~", "(^ᴗ◕)", "（^ᴗ◕）", "⸜(^ᴗ◕)⸝",
    "ヽ(^ᴗ◕)ノ", "ヾ(^ᴗ◕)ﾉ", "٩(^ᴗ◕)۶", "\\(^ᴗ◕)/",
    "└(^ᴗ◕)┐", "┌(^ᴗ◕)┘", "(ﾉ^ᴗ◕)ﾉ", "✧(^ᴗ◕)✧",
    "☆(^ᴗ◕)☆", "~(^ᴗ◕)~", "(^ᴗ≦)", "（^ᴗ≦）",
    "⸜(^ᴗ≦)⸝", "ヽ(^ᴗ≦)ノ", "ヾ(^ᴗ≦)ﾉ", "٩(^ᴗ≦)۶",
    "\\(^ᴗ≦)/", "└(^ᴗ≦)┐", "┌(^ᴗ≦)┘", "(ﾉ^ᴗ≦)ﾉ",
    "✧(^ᴗ≦)✧", "☆(^ᴗ≦)☆", "~(^ᴗ≦)~", "(^ᴗ˶)",
    "（^ᴗ˶）", "⸜(^ᴗ˶)⸝", "ヽ(^ᴗ˶)ノ", "ヾ(^ᴗ˶)ﾉ",
    "٩(^ᴗ˶)۶", "\\(^ᴗ˶)/", "└(^ᴗ˶)┐", "┌(^ᴗ˶)┘",
    "(ﾉ^ᴗ˶)ﾉ", "✧(^ᴗ˶)✧", "☆(^ᴗ˶)☆", "~(^ᴗ˶)~",
    "(^ᴗ๑)", "（^ᴗ๑）", "⸜(^ᴗ๑)⸝", "ヽ(^ᴗ๑)ノ",
    "ヾ(^ᴗ๑)ﾉ", "٩(^ᴗ๑)۶", "\\(^ᴗ๑)/", "└(^ᴗ๑)┐",
    "┌(^ᴗ๑)┘", "(ﾉ^ᴗ๑)ﾉ", "✧(^ᴗ๑)✧", "☆(^ᴗ๑)☆",
    "~(^ᴗ๑)~", "(^ᴗ⌒)", "（^ᴗ⌒）", "⸜(^ᴗ⌒)⸝",
    "ヽ(^ᴗ⌒)ノ", "ヾ(^ᴗ⌒)ﾉ", "٩(^ᴗ⌒)۶", "\\(^ᴗ⌒)/",
    "└(^ᴗ⌒)┐", "┌(^ᴗ⌒)┘", "(ﾉ^ᴗ⌒)ﾉ", "✧(^ᴗ⌒)✧",
    "☆(^ᴗ⌒)☆", "~(^ᴗ⌒)~", "(^ᴗ`)", "（^ᴗ`）",
    "⸜(^ᴗ`)⸝", "ヽ(^ᴗ`)ノ", "ヾ(^ᴗ`)ﾉ", "٩(^ᴗ`)۶",
    "\\(^ᴗ`)/", "└(^ᴗ`)┐", "┌(^ᴗ`)┘", "(ﾉ^ᴗ`)ﾉ",
    "✧(^ᴗ`)✧", "☆(^ᴗ`)☆", "~(^ᴗ`)~", "(^ᴗˋ)",
    "（^ᴗˋ）", "⸜(^ᴗˋ)⸝", "ヽ(^ᴗˋ)ノ", "ヾ(^ᴗˋ)ﾉ",
    "٩(^ᴗˋ)۶", "\\(^ᴗˋ)/", "└(^ᴗˋ)┐", "┌(^ᴗˋ)┘",
    "(ﾉ^ᴗˋ)ﾉ", "✧(^ᴗˋ)✧", "☆(^ᴗˋ)☆", "~(^ᴗˋ)~",
    "(^ᴗ╹)", "（^ᴗ╹）", "⸜(^ᴗ╹)⸝", "ヽ(^ᴗ╹)ノ",
    "ヾ(^ᴗ╹)ﾉ", "٩(^ᴗ╹)۶", "\\(^ᴗ╹)/", "└(^ᴗ╹)┐",
    "┌(^ᴗ╹)┘", "(ﾉ^ᴗ╹)ﾉ", "✧(^ᴗ╹)✧", "☆(^ᴗ╹)☆",
    "~(^ᴗ╹)~", "(^ᴗ◍)", "（^ᴗ◍）", "⸜(^ᴗ◍)⸝",
    "ヽ(^ᴗ◍)ノ", "ヾ(^ᴗ◍)ﾉ", "٩(^ᴗ◍)۶", "\\(^ᴗ◍)/",
    "└(^ᴗ◍)┐", "┌(^ᴗ◍)┘", "(ﾉ^ᴗ◍)ﾉ", "✧(^ᴗ◍)✧",
    "☆(^ᴗ◍)☆", "~(^ᴗ◍)~", "(^ᴗᗜ)", "（^ᴗᗜ）",
    "⸜(^ᴗᗜ)⸝", "ヽ(^ᴗᗜ)ノ", "ヾ(^ᴗᗜ)ﾉ", "٩(^ᴗᗜ)۶",
    "\\(^ᴗᗜ)/", "└(^ᴗᗜ)┐", "┌(^ᴗᗜ)┘", "(ﾉ^ᴗᗜ)ﾉ",
    "✧(^ᴗᗜ)✧", "☆(^ᴗᗜ)☆", "~(^ᴗᗜ)~", "(^ᴗ˙)",
    "（^ᴗ˙）", "⸜(^ᴗ˙)⸝", "ヽ(^ᴗ˙)ノ", "ヾ(^ᴗ˙)ﾉ",
    "٩(^ᴗ˙)۶", "\\(^ᴗ˙)/", "└(^ᴗ˙)┐", "┌(^ᴗ˙)┘",
    "(ﾉ^ᴗ˙)ﾉ", "✧(^ᴗ˙)✧", "☆(^ᴗ˙)☆", "~(^ᴗ˙)~",
    "(^ᴗ◠)", "（^ᴗ◠）", "⸜(^ᴗ◠)⸝", "ヽ(^ᴗ◠)ノ",
    "ヾ(^ᴗ◠)ﾉ", "٩(^ᴗ◠)۶", "\\(^ᴗ◠)/", "└(^ᴗ◠)┐",
    "┌(^ᴗ◠)┘", "(ﾉ^ᴗ◠)ﾉ", "✧(^ᴗ◠)✧", "☆(^ᴗ◠)☆",
    "~(^ᴗ◠)~", "(^ᴗꈍ)", "（^ᴗꈍ）", "⸜(^ᴗꈍ)⸝",
    "ヽ(^ᴗꈍ)ノ", "ヾ(^ᴗꈍ)ﾉ", "٩(^ᴗꈍ)۶", "\\(^ᴗꈍ)/",
    "└(^ᴗꈍ)┐", "┌(^ᴗꈍ)┘", "(ﾉ^ᴗꈍ)ﾉ", "✧(^ᴗꈍ)✧",
    "☆(^ᴗꈍ)☆", "~(^ᴗꈍ)~", "(^ᴗᵕ)", "（^ᴗᵕ）",
    "⸜(^ᴗᵕ)⸝", "ヽ(^ᴗᵕ)ノ", "ヾ(^ᴗᵕ)ﾉ", "٩(^ᴗᵕ)۶",
    "\\(^ᴗᵕ)/", "└(^ᴗᵕ)┐", "┌(^ᴗᵕ)┘", "(ﾉ^ᴗᵕ)ﾉ",
    "✧(^ᴗᵕ)✧", "☆(^ᴗᵕ)☆", "~(^ᴗᵕ)~", "(^ᴗ｡)",
    "（^ᴗ｡）", "⸜(^ᴗ｡)⸝", "ヽ(^ᴗ｡)ノ", "ヾ(^ᴗ｡)ﾉ",
    "٩(^ᴗ｡)۶", "\\(^ᴗ｡)/", "└(^ᴗ｡)┐", "┌(^ᴗ｡)┘",
    "(ﾉ^ᴗ｡)ﾉ", "✧(^ᴗ｡)✧", "☆(^ᴗ｡)☆", "~(^ᴗ｡)~",
    "(^ᴗ◡)", "（^ᴗ◡）", "⸜(^ᴗ◡)⸝", "ヽ(^ᴗ◡)ノ",
    "ヾ(^ᴗ◡)ﾉ", "٩(^ᴗ◡)۶", "\\(^ᴗ◡)/", "└(^ᴗ◡)┐",
    "┌(^ᴗ◡)┘", "(ﾉ^ᴗ◡)ﾉ", "✧(^ᴗ◡)✧", "☆(^ᴗ◡)☆",
    "~(^ᴗ◡)~", "(^ᴗᐛ)", "（^ᴗᐛ）", "⸜(^ᴗᐛ)⸝",
    "ヽ(^ᴗᐛ)ノ", "ヾ(^ᴗᐛ)ﾉ", "٩(^ᴗᐛ)۶", "\\(^ᴗᐛ)/",
    "└(^ᴗᐛ)┐", "┌(^ᴗᐛ)┘", "(ﾉ^ᴗᐛ)ﾉ", "✧(^ᴗᐛ)✧",
    "☆(^ᴗᐛ)☆", "~(^ᴗᐛ)~", "✧(^▽^)✧", "☆(^▽^)☆",
    "~(^▽^)~", "(^▽ᵔ)", "（^▽ᵔ）", "⸜(^▽ᵔ)⸝",
    "ヽ(^▽ᵔ)ノ", "ヾ(^▽ᵔ)ﾉ", "٩(^▽ᵔ)۶", "\\(^▽ᵔ)/",
    "└(^▽ᵔ)┐", "┌(^▽ᵔ)┘", "(ﾉ^▽ᵔ)ﾉ", "✧(^▽ᵔ)✧",
    "☆(^▽ᵔ)☆", "~(^▽ᵔ)~", "(^▽•)", "（^▽•）",
    "⸜(^▽•)⸝", "ヽ(^▽•)ノ", "ヾ(^▽•)ﾉ", "٩(^▽•)۶",
    "\\(^▽•)/", "└(^▽•)┐", "┌(^▽•)┘", "(ﾉ^▽•)ﾉ",
    "✧(^▽•)✧", "☆(^▽•)☆", "~(^▽•)~", "(^▽◕)",
    "（^▽◕）", "⸜(^▽◕)⸝", "ヽ(^▽◕)ノ", "ヾ(^▽◕)ﾉ",
    "٩(^▽◕)۶", "\\(^▽◕)/", "└(^▽◕)┐", "┌(^▽◕)┘",
    "(ﾉ^▽◕)ﾉ", "✧(^▽◕)✧", "☆(^▽◕)☆", "~(^▽◕)~",
    "(^▽≦)", "（^▽≦）", "⸜(^▽≦)⸝", "ヽ(^▽≦)ノ",
    "ヾ(^▽≦)ﾉ", "٩(^▽≦)۶", "\\(^▽≦)/", "└(^▽≦)┐",
    "┌(^▽≦)┘", "(ﾉ^▽≦)ﾉ", "✧(^▽≦)✧", "☆(^▽≦)☆",
    "~(^▽≦)~", "(^▽˶)", "（^▽˶）", "⸜(^▽˶)⸝",
    "ヽ(^▽˶)ノ", "ヾ(^▽˶)ﾉ", "٩(^▽˶)۶", "\\(^▽˶)/",
    "└(^▽˶)┐", "┌(^▽˶)┘", "(ﾉ^▽˶)ﾉ", "✧(^▽˶)✧",
    "☆(^▽˶)☆", "~(^▽˶)~", "(^▽๑)", "（^▽๑）",
    "⸜(^▽๑)⸝", "ヽ(^▽๑)ノ", "ヾ(^▽๑)ﾉ", "٩(^▽๑)۶",
    "\\(^▽๑)/", "└(^▽๑)┐", "┌(^▽๑)┘", "(ﾉ^▽๑)ﾉ",
    "✧(^▽๑)✧", "☆(^▽๑)☆", "~(^▽๑)~", "(^▽⌒)",
    "（^▽⌒）", "⸜(^▽⌒)⸝", "ヽ(^▽⌒)ノ", "ヾ(^▽⌒)ﾉ",
    "٩(^▽⌒)۶", "\\(^▽⌒)/", "└(^▽⌒)┐", "┌(^▽⌒)┘"
  ],
  "love": [
    "( ´͈ ᵕ ᵕ `͈ )◞♡", "( ˘͈ ᵕ ˘͈♡)", "(..◜ᴗ◝..)", "( ⁎ᵕᴗᵕ⁎ )",
    "(´∩｡• ᵕ •｡∩`) ♡", "(ෆ`꒳´ෆ)", "( ˊ ᵕ ˋ )♡.°⑅", "( ˘▽˘)っ♡",
    "( ˭̵̵̵̵͈́◡ु͂˭̵̵̵͈̀ )ˉ̞̭♡", "( ̧⸝⸝⍢⸝⸝)ི", "( σ̴̶̷̤ .̫ σ̴̶̷̤ )♡", "( ๑ ᴖ ᴈ ᴖ)ᴖ ᴑ ᴖ๑)ෆ",
    "( ᴗ͈ˬᴗ͈)ఒ♡", "(*˘︶˘*).｡.:*♡", "(,,> <,,)♡", "( ˘ ³˘(◡‿◡˶)",
    "(´•᎑•`)♡", "(˵ •ᴗ• ˵)♡", "(๑♡ᴗ♡๑)", "( ─‿‿─ )♡",
    "(◍•ᴗ•◍)♡", "♡(˃͈ દ ˂͈ ༶ )", "(っ˘з(˘⌣˘ )", "( ˘͈ ᵕ ˘͈ )",
    "( ♡‿♡ )", "(͡° ͜ʖ ͡°)", "╰(✿´⌣`✿)╯", "(´∀｀)♡",
    "(｡･ω･｡)ﾉ♡", "♡＼(￣▽￣)／♡", "(⌒▽⌒)♡", "(*♡∀♡)",
    "( ͒ԅ( ͒ㅅ ͒ԅ)", "(っಠ‿ಠ)っ♡", "(´͈ ᵕ `͈)♡", "♡(´͈ ᵕ `͈)",
    "♡(´͈ ᵕ `͈)♡", "(´͈ ᵕ `͈)っ♡", "♡⊂(´͈ ᵕ `͈)", "(づ´͈ ᵕ `͈)づ♡",
    "♡(っ´͈ ᵕ `͈c)", "(´͈ ᵕ `͈)ノ♡", "♡ヽ(´͈ ᵕ `͈)", "(´͈ ᵕ `͈)♡♡",
    "(˘͈ ᵕ ˘͈)♡", "♡(˘͈ ᵕ ˘͈)", "♡(˘͈ ᵕ ˘͈)♡", "(˘͈ ᵕ ˘͈)っ♡",
    "♡⊂(˘͈ ᵕ ˘͈)", "(づ˘͈ ᵕ ˘͈)づ♡", "♡(っ˘͈ ᵕ ˘͈c)", "(˘͈ ᵕ ˘͈)ノ♡",
    "♡ヽ(˘͈ ᵕ ˘͈)", "(˘͈ ᵕ ˘͈)♡♡", "(˶ᵔ ᵕ ᵔ˶)♡", "♡(˶ᵔ ᵕ ᵔ˶)",
    "♡(˶ᵔ ᵕ ᵔ˶)♡", "(˶ᵔ ᵕ ᵔ˶)っ♡", "♡⊂(˶ᵔ ᵕ ᵔ˶)", "(づ˶ᵔ ᵕ ᵔ˶)づ♡",
    "♡(っ˶ᵔ ᵕ ᵔ˶c)", "(˶ᵔ ᵕ ᵔ˶)ノ♡", "♡ヽ(˶ᵔ ᵕ ᵔ˶)", "(˶ᵔ ᵕ ᵔ˶)♡♡",
    "(´• ᵕ •`)♡", "♡(´• ᵕ •`)", "♡(´• ᵕ •`)♡", "(´• ᵕ •`)っ♡",
    "♡⊂(´• ᵕ •`)", "(づ´• ᵕ •`)づ♡", "♡(っ´• ᵕ •`c)", "(´• ᵕ •`)ノ♡",
    "♡ヽ(´• ᵕ •`)", "(´• ᵕ •`)♡♡", "♡(˵ •ᴗ• ˵)", "♡(˵ •ᴗ• ˵)♡",
    "(˵ •ᴗ• ˵)っ♡", "♡⊂(˵ •ᴗ• ˵)", "(づ˵ •ᴗ• ˵)づ♡", "♡(っ˵ •ᴗ• ˵c)",
    "(˵ •ᴗ• ˵)ノ♡", "♡ヽ(˵ •ᴗ• ˵)", "(˵ •ᴗ• ˵)♡♡", "♡(◍•ᴗ•◍)",
    "♡(◍•ᴗ•◍)♡", "(◍•ᴗ•◍)っ♡", "♡⊂(◍•ᴗ•◍)", "(づ◍•ᴗ•◍)づ♡",
    "♡(っ◍•ᴗ•◍c)", "(◍•ᴗ•◍)ノ♡", "♡ヽ(◍•ᴗ•◍)", "(◍•ᴗ•◍)♡♡",
    "(๑•ᴗ•๑)♡", "♡(๑•ᴗ•๑)", "♡(๑•ᴗ•๑)♡", "(๑•ᴗ•๑)っ♡",
    "♡⊂(๑•ᴗ•๑)", "(づ๑•ᴗ•๑)づ♡", "♡(っ๑•ᴗ•๑c)", "(๑•ᴗ•๑)ノ♡",
    "♡ヽ(๑•ᴗ•๑)", "(๑•ᴗ•๑)♡♡", "(๑♡ᴗ♡๑)♡", "♡(๑♡ᴗ♡๑)",
    "♡(๑♡ᴗ♡๑)♡", "(๑♡ᴗ♡๑)っ♡", "♡⊂(๑♡ᴗ♡๑)", "(づ๑♡ᴗ♡๑)づ♡",
    "♡(っ๑♡ᴗ♡๑c)", "(๑♡ᴗ♡๑)ノ♡", "♡ヽ(๑♡ᴗ♡๑)", "(๑♡ᴗ♡๑)♡♡",
    "(˘ ³˘)♡", "♡(˘ ³˘)", "♡(˘ ³˘)♡", "(˘ ³˘)っ♡",
    "♡⊂(˘ ³˘)", "(づ˘ ³˘)づ♡", "♡(っ˘ ³˘c)", "(˘ ³˘)ノ♡",
    "♡ヽ(˘ ³˘)", "(˘ ³˘)♡♡", "(´▽`)♡", "♡(´▽`)",
    "♡(´▽`)♡", "(´▽`)っ♡", "♡⊂(´▽`)", "(づ´▽`)づ♡",
    "♡(っ´▽`c)", "(´▽`)ノ♡", "(˘ᴗ˘)♡", "♡(˘ᴗ˘)",
    "♡(˘ᴗ˘)♡", "(˘ᴗ˘)っ♡", "♡⊂(˘ᴗ˘)", "(づ˘ᴗ˘)づ♡",
    "♡(っ˘ᴗ˘c)", "(˘ᴗ˘)ノ♡", "♡ヽ(˘ᴗ˘)", "(˘ᴗ˘)♡♡",
    "୨♡୧(˘ᴗ˘)", "(˘ᴗ˘)୨♡୧", "(˘ᴗ•)♡", "♡(˘ᴗ•)",
    "♡(˘ᴗ•)♡", "(˘ᴗ•)っ♡", "♡⊂(˘ᴗ•)", "(づ˘ᴗ•)づ♡",
    "♡(っ˘ᴗ•c)", "(˘ᴗ•)ノ♡", "♡ヽ(˘ᴗ•)", "(˘ᴗ•)♡♡",
    "୨♡୧(˘ᴗ•)", "(˘ᴗ•)୨♡୧", "(˘ᴗᵕ)♡", "♡(˘ᴗᵕ)",
    "♡(˘ᴗᵕ)♡", "(˘ᴗᵕ)っ♡", "♡⊂(˘ᴗᵕ)", "(づ˘ᴗᵕ)づ♡",
    "♡(っ˘ᴗᵕc)", "(˘ᴗᵕ)ノ♡", "♡ヽ(˘ᴗᵕ)", "(˘ᴗᵕ)♡♡",
    "୨♡୧(˘ᴗᵕ)", "(˘ᴗᵕ)୨♡୧", "(˘ᴗ`)♡", "♡(˘ᴗ`)",
    "♡(˘ᴗ`)♡", "(˘ᴗ`)っ♡", "♡⊂(˘ᴗ`)", "(づ˘ᴗ`)づ♡",
    "♡(っ˘ᴗ`c)", "(˘ᴗ`)ノ♡", "♡ヽ(˘ᴗ`)", "(˘ᴗ`)♡♡",
    "୨♡୧(˘ᴗ`)", "(˘ᴗ`)୨♡୧", "(˘ᴗꈍ)♡", "♡(˘ᴗꈍ)",
    "♡(˘ᴗꈍ)♡", "(˘ᴗꈍ)っ♡", "♡⊂(˘ᴗꈍ)", "(づ˘ᴗꈍ)づ♡",
    "♡(っ˘ᴗꈍc)", "(˘ᴗꈍ)ノ♡", "♡ヽ(˘ᴗꈍ)", "(˘ᴗꈍ)♡♡",
    "୨♡୧(˘ᴗꈍ)", "(˘ᴗꈍ)୨♡୧", "(˘ᴗ◍)♡", "♡(˘ᴗ◍)",
    "♡(˘ᴗ◍)♡", "(˘ᴗ◍)っ♡", "♡⊂(˘ᴗ◍)", "(づ˘ᴗ◍)づ♡",
    "♡(っ˘ᴗ◍c)", "(˘ᴗ◍)ノ♡", "♡ヽ(˘ᴗ◍)", "(˘ᴗ◍)♡♡",
    "୨♡୧(˘ᴗ◍)", "(˘ᴗ◍)୨♡୧", "(˘ᴗ⑉)♡", "♡(˘ᴗ⑉)",
    "♡(˘ᴗ⑉)♡", "(˘ᴗ⑉)っ♡", "♡⊂(˘ᴗ⑉)", "(づ˘ᴗ⑉)づ♡",
    "♡(っ˘ᴗ⑉c)", "(˘ᴗ⑉)ノ♡", "♡ヽ(˘ᴗ⑉)", "(˘ᴗ⑉)♡♡",
    "୨♡୧(˘ᴗ⑉)", "(˘ᴗ⑉)୨♡୧", "(˘ᴗ˶)♡", "♡(˘ᴗ˶)",
    "♡(˘ᴗ˶)♡", "(˘ᴗ˶)っ♡", "♡⊂(˘ᴗ˶)", "(づ˘ᴗ˶)づ♡",
    "♡(っ˘ᴗ˶c)", "(˘ᴗ˶)ノ♡", "♡ヽ(˘ᴗ˶)", "(˘ᴗ˶)♡♡",
    "୨♡୧(˘ᴗ˶)", "(˘ᴗ˶)୨♡୧", "(˘ᴗ⸝)♡", "♡(˘ᴗ⸝)",
    "♡(˘ᴗ⸝)♡", "(˘ᴗ⸝)っ♡", "♡⊂(˘ᴗ⸝)", "(づ˘ᴗ⸝)づ♡",
    "♡(っ˘ᴗ⸝c)", "(˘ᴗ⸝)ノ♡", "♡ヽ(˘ᴗ⸝)", "(˘ᴗ⸝)♡♡",
    "୨♡୧(˘ᴗ⸝)", "(˘ᴗ⸝)୨♡୧", "(˘ᴗ｡)♡", "♡(˘ᴗ｡)",
    "♡(˘ᴗ｡)♡", "(˘ᴗ｡)っ♡", "♡⊂(˘ᴗ｡)", "(づ˘ᴗ｡)づ♡",
    "♡(っ˘ᴗ｡c)", "(˘ᴗ｡)ノ♡", "♡ヽ(˘ᴗ｡)", "(˘ᴗ｡)♡♡",
    "୨♡୧(˘ᴗ｡)", "(˘ᴗ｡)୨♡୧", "(˘ᴗ๑)♡", "♡(˘ᴗ๑)",
    "♡(˘ᴗ๑)♡", "(˘ᴗ๑)っ♡", "♡⊂(˘ᴗ๑)", "(づ˘ᴗ๑)づ♡",
    "♡(っ˘ᴗ๑c)", "(˘ᴗ๑)ノ♡", "♡ヽ(˘ᴗ๑)", "(˘ᴗ๑)♡♡",
    "୨♡୧(˘ᴗ๑)", "(˘ᴗ๑)୨♡୧", "(˘ᴗ˵)♡", "♡(˘ᴗ˵)",
    "♡(˘ᴗ˵)♡", "(˘ᴗ˵)っ♡", "♡⊂(˘ᴗ˵)", "(づ˘ᴗ˵)づ♡",
    "♡(っ˘ᴗ˵c)", "(˘ᴗ˵)ノ♡", "♡ヽ(˘ᴗ˵)", "(˘ᴗ˵)♡♡",
    "୨♡୧(˘ᴗ˵)", "(˘ᴗ˵)୨♡୧", "(˘ᴗᴗ͈)♡", "♡(˘ᴗᴗ͈)",
    "♡(˘ᴗᴗ͈)♡", "(˘ᴗᴗ͈)っ♡", "♡⊂(˘ᴗᴗ͈)", "(づ˘ᴗᴗ͈)づ♡",
    "♡(っ˘ᴗᴗ͈c)", "(˘ᴗᴗ͈)ノ♡", "♡ヽ(˘ᴗᴗ͈)", "(˘ᴗᴗ͈)♡♡",
    "୨♡୧(˘ᴗᴗ͈)", "(˘ᴗᴗ͈)୨♡୧", "(˘ᴗσ̴̶̷̤)♡", "♡(˘ᴗσ̴̶̷̤)",
    "♡(˘ᴗσ̴̶̷̤)♡", "(˘ᴗσ̴̶̷̤)っ♡", "♡⊂(˘ᴗσ̴̶̷̤)", "(づ˘ᴗσ̴̶̷̤)づ♡",
    "♡(っ˘ᴗσ̴̶̷̤c)", "(˘ᴗσ̴̶̷̤)ノ♡", "♡ヽ(˘ᴗσ̴̶̷̤)", "(˘ᴗσ̴̶̷̤)♡♡",
    "୨♡୧(˘ᴗσ̴̶̷̤)", "(˘ᴗσ̴̶̷̤)୨♡୧", "(˘ᴗෆ)♡", "♡(˘ᴗෆ)",
    "♡(˘ᴗෆ)♡", "(˘ᴗෆ)っ♡", "♡⊂(˘ᴗෆ)", "(づ˘ᴗෆ)づ♡",
    "♡(っ˘ᴗෆc)", "(˘ᴗෆ)ノ♡", "♡ヽ(˘ᴗෆ)", "(˘ᴗෆ)♡♡",
    "୨♡୧(˘ᴗෆ)", "(˘ᴗෆ)୨♡୧", "(˘ᴗ◡)♡", "♡(˘ᴗ◡)",
    "♡(˘ᴗ◡)♡", "(˘ᴗ◡)っ♡", "♡⊂(˘ᴗ◡)", "(づ˘ᴗ◡)づ♡",
    "♡(っ˘ᴗ◡c)", "(˘ᴗ◡)ノ♡", "♡ヽ(˘ᴗ◡)", "(˘ᴗ◡)♡♡",
    "୨♡୧(˘ᴗ◡)", "(˘ᴗ◡)୨♡୧", "(˘ᴗˋ)♡", "♡(˘ᴗˋ)",
    "♡(˘ᴗˋ)♡", "(˘ᴗˋ)っ♡", "♡⊂(˘ᴗˋ)", "(づ˘ᴗˋ)づ♡",
    "♡(っ˘ᴗˋc)", "(˘ᴗˋ)ノ♡", "♡ヽ(˘ᴗˋ)", "(˘ᴗˋ)♡♡",
    "୨♡୧(˘ᴗˋ)", "(˘ᴗˋ)୨♡୧", "(˘ᴗᗜ)♡", "♡(˘ᴗᗜ)",
    "♡(˘ᴗᗜ)♡", "(˘ᴗᗜ)っ♡", "♡⊂(˘ᴗᗜ)", "(づ˘ᴗᗜ)づ♡",
    "♡(っ˘ᴗᗜc)", "(˘ᴗᗜ)ノ♡", "♡ヽ(˘ᴗᗜ)", "(˘ᴗᗜ)♡♡",
    "୨♡୧(˘ᴗᗜ)", "(˘ᴗᗜ)୨♡୧", "(˘ᴗᵔ)♡", "♡(˘ᴗᵔ)",
    "♡(˘ᴗᵔ)♡", "(˘ᴗᵔ)っ♡", "♡⊂(˘ᴗᵔ)", "(づ˘ᴗᵔ)づ♡",
    "♡(っ˘ᴗᵔc)", "(˘ᴗᵔ)ノ♡", "♡ヽ(˘ᴗᵔ)", "(˘ᴗᵔ)♡♡",
    "୨♡୧(˘ᴗᵔ)", "(˘ᴗᵔ)୨♡୧", "(˘ᴗ,,)♡", "♡(˘ᴗ,,)",
    "♡(˘ᴗ,,)♡", "(˘ᴗ,,)っ♡", "♡⊂(˘ᴗ,,)", "(づ˘ᴗ,,)づ♡",
    "♡(っ˘ᴗ,,c)", "(˘ᴗ,,)ノ♡", "♡ヽ(˘ᴗ,,)", "(˘ᴗ,,)♡♡",
    "୨♡୧(˘ᴗ,,)", "(˘ᴗ,,)୨♡୧", "(˘ᵕ˘)♡", "♡(˘ᵕ˘)",
    "♡(˘ᵕ˘)♡", "(˘ᵕ˘)っ♡", "♡⊂(˘ᵕ˘)", "(づ˘ᵕ˘)づ♡",
    "♡(っ˘ᵕ˘c)", "(˘ᵕ˘)ノ♡", "♡ヽ(˘ᵕ˘)", "(˘ᵕ˘)♡♡",
    "୨♡୧(˘ᵕ˘)", "(˘ᵕ˘)୨♡୧", "(˘ᵕ•)♡", "♡(˘ᵕ•)",
    "♡(˘ᵕ•)♡", "(˘ᵕ•)っ♡", "♡⊂(˘ᵕ•)", "(づ˘ᵕ•)づ♡",
    "♡(っ˘ᵕ•c)", "(˘ᵕ•)ノ♡", "♡ヽ(˘ᵕ•)", "(˘ᵕ•)♡♡",
    "୨♡୧(˘ᵕ•)", "(˘ᵕ•)୨♡୧", "(˘ᵕᵕ)♡", "♡(˘ᵕᵕ)",
    "♡(˘ᵕᵕ)♡", "(˘ᵕᵕ)っ♡", "♡⊂(˘ᵕᵕ)", "(づ˘ᵕᵕ)づ♡",
    "♡(っ˘ᵕᵕc)", "(˘ᵕᵕ)ノ♡", "♡ヽ(˘ᵕᵕ)", "(˘ᵕᵕ)♡♡",
    "୨♡୧(˘ᵕᵕ)", "(˘ᵕᵕ)୨♡୧", "(˘ᵕ`)♡", "♡(˘ᵕ`)",
    "♡(˘ᵕ`)♡", "(˘ᵕ`)っ♡", "♡⊂(˘ᵕ`)", "(づ˘ᵕ`)づ♡",
    "♡(っ˘ᵕ`c)", "(˘ᵕ`)ノ♡", "♡ヽ(˘ᵕ`)", "(˘ᵕ`)♡♡",
    "୨♡୧(˘ᵕ`)", "(˘ᵕ`)୨♡୧", "(˘ᵕꈍ)♡", "♡(˘ᵕꈍ)",
    "♡(˘ᵕꈍ)♡", "(˘ᵕꈍ)っ♡", "♡⊂(˘ᵕꈍ)", "(づ˘ᵕꈍ)づ♡",
    "♡(っ˘ᵕꈍc)", "(˘ᵕꈍ)ノ♡", "♡ヽ(˘ᵕꈍ)", "(˘ᵕꈍ)♡♡",
    "୨♡୧(˘ᵕꈍ)", "(˘ᵕꈍ)୨♡୧", "(˘ᵕ◍)♡", "♡(˘ᵕ◍)",
    "♡(˘ᵕ◍)♡", "(˘ᵕ◍)っ♡", "♡⊂(˘ᵕ◍)", "(づ˘ᵕ◍)づ♡",
    "♡(っ˘ᵕ◍c)", "(˘ᵕ◍)ノ♡", "♡ヽ(˘ᵕ◍)", "(˘ᵕ◍)♡♡",
    "୨♡୧(˘ᵕ◍)", "(˘ᵕ◍)୨♡୧", "(˘ᵕ⑉)♡", "♡(˘ᵕ⑉)",
    "♡(˘ᵕ⑉)♡", "(˘ᵕ⑉)っ♡", "♡⊂(˘ᵕ⑉)", "(づ˘ᵕ⑉)づ♡",
    "♡(っ˘ᵕ⑉c)", "(˘ᵕ⑉)ノ♡"
  ],
  "sad": [
    "( Ĭ ^ Ĭ )", "(ᵒ̴̵̶̷ ᵒ̴̵̶̷ )", "( ɵ̷̥̥᷄﹏ɵ̷̥̥᷅ )", "( ´•̥̥̥ω•̥̥̥` )",
    "(o̴̶̷᷄𖧉o̴̶̷̥᷅)", "(.°(д。)°.)", "( ༎ຶㅂ༎ຶ )", "(இ﹏இ`｡)",
    "( 이_이 )", "( ߹~߹ )", "( -_-; )", "(;´༎ຶД༎ຶ`)",
    "(┬┬﹏┬┬)", "(｡•́︿•̀｡)", "( ; ω ; )", "(T_T)",
    "(ToT)", "(Q_Q)", "(T.T)", "(ㅠㅠ)",
    "(;_;)", "(T-T)", "(>_<)", "(;﹏;)",
    "(ó﹏ò｡)", "(｡T ω T｡)", "(; - ;)", "(; _ ;)",
    "(•_•;)", "( ; _ ; )", "(o_ _)o", "( ;∀;)",
    "( ;  ; )", "（T_T）", "(っT_T)っ", "｡･ﾟﾟ･(T_T)･ﾟﾟ･｡",
    "⊂(T_T)⊃", "(T_T)ノ", "ヽ(T_T)", "(T_T)...",
    "(T﹏T)", "（T﹏T）", "(っT﹏T)っ", "｡･ﾟﾟ･(T﹏T)･ﾟﾟ･｡",
    "⊂(T﹏T)⊃", "(T﹏T)ノ", "ヽ(T﹏T)", "(T﹏T)...",
    "(TωT)", "（TωT）", "(っTωT)っ", "｡･ﾟﾟ･(TωT)･ﾟﾟ･｡",
    "⊂(TωT)⊃", "(TωT)ノ", "ヽ(TωT)", "(TωT)...",
    "(；ω；)", "（；ω；）", "(っ；ω；)っ", "｡･ﾟﾟ･(；ω；)･ﾟﾟ･｡",
    "⊂(；ω；)⊃", "(；ω；)ノ", "ヽ(；ω；)", "(；ω；)...",
    "（;_;）", "(っ;_;)っ", "｡･ﾟﾟ･(;_;)･ﾟﾟ･｡", "⊂(;_;)⊃",
    "(;_;)ノ", "ヽ(;_;)", "(;_;)...", "（;﹏;）",
    "(っ;﹏;)っ", "｡･ﾟﾟ･(;﹏;)･ﾟﾟ･｡", "⊂(;﹏;)⊃", "(;﹏;)ノ",
    "ヽ(;﹏;)", "(;﹏;)...", "(╥﹏╥)", "（╥﹏╥）",
    "(っ╥﹏╥)っ", "｡･ﾟﾟ･(╥﹏╥)･ﾟﾟ･｡", "⊂(╥﹏╥)⊃", "(╥﹏╥)ノ",
    "ヽ(╥﹏╥)", "(╥﹏╥)...", "(ಥ﹏ಥ)", "（ಥ﹏ಥ）",
    "(っಥ﹏ಥ)っ", "｡･ﾟﾟ･(ಥ﹏ಥ)･ﾟﾟ･｡", "⊂(ಥ﹏ಥ)⊃", "(ಥ﹏ಥ)ノ",
    "ヽ(ಥ﹏ಥ)", "(ಥ﹏ಥ)...", "(ಥ_ಥ)", "（ಥ_ಥ）",
    "(っಥ_ಥ)っ", "｡･ﾟﾟ･(ಥ_ಥ)･ﾟﾟ･｡", "⊂(ಥ_ಥ)⊃", "(ಥ_ಥ)ノ",
    "ヽ(ಥ_ಥ)", "(ಥ_ಥ)...", "(இ﹏இ)", "（இ﹏இ）",
    "(っஇ﹏இ)っ", "｡･ﾟﾟ･(இ﹏இ)･ﾟﾟ･｡", "⊂(இ﹏இ)⊃", "(இ﹏இ)ノ",
    "ヽ(இ﹏இ)", "(இ﹏இ)...", "。゜(T_T)゜。", "･ﾟ･(T_T)･ﾟ･",
    "(T_;)", "（T_;）", "｡･ﾟﾟ･(T_;)･ﾟﾟ･｡", "(っT_;)っ",
    "⊂(T_;)⊃", "(T_;)...", "ヽ(T_;)", "(T_;)ノ",
    "。゜(T_;)゜。", "･ﾟ･(T_;)･ﾟ･", "(T_ಥ)", "（T_ಥ）",
    "｡･ﾟﾟ･(T_ಥ)･ﾟﾟ･｡", "(っT_ಥ)っ", "⊂(T_ಥ)⊃", "(T_ಥ)...",
    "ヽ(T_ಥ)", "(T_ಥ)ノ", "。゜(T_ಥ)゜。", "･ﾟ･(T_ಥ)･ﾟ･",
    "(T_இ)", "（T_இ）", "｡･ﾟﾟ･(T_இ)･ﾟﾟ･｡", "(っT_இ)っ",
    "⊂(T_இ)⊃", "(T_இ)...", "ヽ(T_இ)", "(T_இ)ノ",
    "。゜(T_இ)゜。", "･ﾟ･(T_இ)･ﾟ･", "(T_╥)", "（T_╥）",
    "｡･ﾟﾟ･(T_╥)･ﾟﾟ･｡", "(っT_╥)っ", "⊂(T_╥)⊃", "(T_╥)...",
    "ヽ(T_╥)", "(T_╥)ノ", "。゜(T_╥)゜。", "･ﾟ･(T_╥)･ﾟ･",
    "(T_｡)", "（T_｡）", "｡･ﾟﾟ･(T_｡)･ﾟﾟ･｡", "(っT_｡)っ",
    "⊂(T_｡)⊃", "(T_｡)...", "ヽ(T_｡)", "(T_｡)ノ",
    "。゜(T_｡)゜。", "･ﾟ･(T_｡)･ﾟ･", "(T_ᵕ̣̣̣)", "（T_ᵕ̣̣̣）",
    "｡･ﾟﾟ･(T_ᵕ̣̣̣)･ﾟﾟ･｡", "(っT_ᵕ̣̣̣)っ", "⊂(T_ᵕ̣̣̣)⊃", "(T_ᵕ̣̣̣)...",
    "ヽ(T_ᵕ̣̣̣)", "(T_ᵕ̣̣̣)ノ", "。゜(T_ᵕ̣̣̣)゜。", "･ﾟ･(T_ᵕ̣̣̣)･ﾟ･",
    "(T_༎ຶ)", "（T_༎ຶ）", "｡･ﾟﾟ･(T_༎ຶ)･ﾟﾟ･｡", "(っT_༎ຶ)っ",
    "⊂(T_༎ຶ)⊃", "(T_༎ຶ)...", "ヽ(T_༎ຶ)", "(T_༎ຶ)ノ",
    "。゜(T_༎ຶ)゜。", "･ﾟ･(T_༎ຶ)･ﾟ･", "(T_っ)", "（T_っ）",
    "｡･ﾟﾟ･(T_っ)･ﾟﾟ･｡", "(っT_っ)っ", "⊂(T_っ)⊃", "(T_っ)...",
    "ヽ(T_っ)", "(T_っ)ノ", "。゜(T_っ)゜。", "･ﾟ･(T_っ)･ﾟ･",
    "(T_つ)", "（T_つ）", "｡･ﾟﾟ･(T_つ)･ﾟﾟ･｡", "(っT_つ)っ",
    "⊂(T_つ)⊃", "(T_つ)...", "ヽ(T_つ)", "(T_つ)ノ",
    "。゜(T_つ)゜。", "･ﾟ･(T_つ)･ﾟ･", "(T_ŏ)", "（T_ŏ）",
    "｡･ﾟﾟ･(T_ŏ)･ﾟﾟ･｡", "(っT_ŏ)っ", "⊂(T_ŏ)⊃", "(T_ŏ)...",
    "ヽ(T_ŏ)", "(T_ŏ)ノ", "。゜(T_ŏ)゜。", "･ﾟ･(T_ŏ)･ﾟ･",
    "(T_；)", "（T_；）", "｡･ﾟﾟ･(T_；)･ﾟﾟ･｡", "(っT_；)っ",
    "⊂(T_；)⊃", "(T_；)...", "ヽ(T_；)", "(T_；)ノ",
    "。゜(T_；)゜。", "･ﾟ･(T_；)･ﾟ･", "(T_╰)", "（T_╰）",
    "｡･ﾟﾟ･(T_╰)･ﾟﾟ･｡", "(っT_╰)っ", "⊂(T_╰)⊃", "(T_╰)...",
    "ヽ(T_╰)", "(T_╰)ノ", "。゜(T_╰)゜。", "･ﾟ･(T_╰)･ﾟ･",
    "(T_ノ)", "（T_ノ）", "｡･ﾟﾟ･(T_ノ)･ﾟﾟ･｡", "(っT_ノ)っ",
    "⊂(T_ノ)⊃", "(T_ノ)...", "ヽ(T_ノ)", "(T_ノ)ノ",
    "。゜(T_ノ)゜。", "･ﾟ･(T_ノ)･ﾟ･", "(T_Q)", "（T_Q）",
    "｡･ﾟﾟ･(T_Q)･ﾟﾟ･｡", "(っT_Q)っ", "⊂(T_Q)⊃", "(T_Q)...",
    "ヽ(T_Q)", "(T_Q)ノ", "。゜(T_Q)゜。", "･ﾟ･(T_Q)･ﾟ･",
    "(T_ㅠ)", "（T_ㅠ）", "｡･ﾟﾟ･(T_ㅠ)･ﾟﾟ･｡", "(っT_ㅠ)っ",
    "⊂(T_ㅠ)⊃", "(T_ㅠ)...", "ヽ(T_ㅠ)", "(T_ㅠ)ノ",
    "。゜(T_ㅠ)゜。", "･ﾟ･(T_ㅠ)･ﾟ･", "(T_`)", "（T_`）",
    "｡･ﾟﾟ･(T_`)･ﾟﾟ･｡", "(っT_`)っ", "⊂(T_`)⊃", "(T_`)...",
    "ヽ(T_`)", "(T_`)ノ", "。゜(T_`)゜。", "･ﾟ･(T_`)･ﾟ･",
    "(T_◟)", "（T_◟）", "｡･ﾟﾟ･(T_◟)･ﾟﾟ･｡", "(っT_◟)っ",
    "⊂(T_◟)⊃", "(T_◟)...", "ヽ(T_◟)", "(T_◟)ノ",
    "。゜(T_◟)゜。", "･ﾟ･(T_◟)･ﾟ･", "。゜(T﹏T)゜。", "･ﾟ･(T﹏T)･ﾟ･",
    "(T﹏;)", "（T﹏;）", "｡･ﾟﾟ･(T﹏;)･ﾟﾟ･｡", "(っT﹏;)っ",
    "⊂(T﹏;)⊃", "(T﹏;)...", "ヽ(T﹏;)", "(T﹏;)ノ",
    "。゜(T﹏;)゜。", "･ﾟ･(T﹏;)･ﾟ･", "(T﹏ಥ)", "（T﹏ಥ）",
    "｡･ﾟﾟ･(T﹏ಥ)･ﾟﾟ･｡", "(っT﹏ಥ)っ", "⊂(T﹏ಥ)⊃", "(T﹏ಥ)...",
    "ヽ(T﹏ಥ)", "(T﹏ಥ)ノ", "。゜(T﹏ಥ)゜。", "･ﾟ･(T﹏ಥ)･ﾟ･",
    "(T﹏இ)", "（T﹏இ）", "｡･ﾟﾟ･(T﹏இ)･ﾟﾟ･｡", "(っT﹏இ)っ",
    "⊂(T﹏இ)⊃", "(T﹏இ)...", "ヽ(T﹏இ)", "(T﹏இ)ノ",
    "。゜(T﹏இ)゜。", "･ﾟ･(T﹏இ)･ﾟ･", "(T﹏╥)", "（T﹏╥）",
    "｡･ﾟﾟ･(T﹏╥)･ﾟﾟ･｡", "(っT﹏╥)っ", "⊂(T﹏╥)⊃", "(T﹏╥)...",
    "ヽ(T﹏╥)", "(T﹏╥)ノ", "。゜(T﹏╥)゜。", "･ﾟ･(T﹏╥)･ﾟ･",
    "(T﹏｡)", "（T﹏｡）", "｡･ﾟﾟ･(T﹏｡)･ﾟﾟ･｡", "(っT﹏｡)っ",
    "⊂(T﹏｡)⊃", "(T﹏｡)...", "ヽ(T﹏｡)", "(T﹏｡)ノ",
    "。゜(T﹏｡)゜。", "･ﾟ･(T﹏｡)･ﾟ･", "(T﹏ᵕ̣̣̣)", "（T﹏ᵕ̣̣̣）",
    "｡･ﾟﾟ･(T﹏ᵕ̣̣̣)･ﾟﾟ･｡", "(っT﹏ᵕ̣̣̣)っ", "⊂(T﹏ᵕ̣̣̣)⊃", "(T﹏ᵕ̣̣̣)...",
    "ヽ(T﹏ᵕ̣̣̣)", "(T﹏ᵕ̣̣̣)ノ", "。゜(T﹏ᵕ̣̣̣)゜。", "･ﾟ･(T﹏ᵕ̣̣̣)･ﾟ･",
    "(T﹏༎ຶ)", "（T﹏༎ຶ）", "｡･ﾟﾟ･(T﹏༎ຶ)･ﾟﾟ･｡", "(っT﹏༎ຶ)っ",
    "⊂(T﹏༎ຶ)⊃", "(T﹏༎ຶ)...", "ヽ(T﹏༎ຶ)", "(T﹏༎ຶ)ノ",
    "。゜(T﹏༎ຶ)゜。", "･ﾟ･(T﹏༎ຶ)･ﾟ･", "(T﹏っ)", "（T﹏っ）",
    "｡･ﾟﾟ･(T﹏っ)･ﾟﾟ･｡", "(っT﹏っ)っ", "⊂(T﹏っ)⊃", "(T﹏っ)...",
    "ヽ(T﹏っ)", "(T﹏っ)ノ", "。゜(T﹏っ)゜。", "･ﾟ･(T﹏っ)･ﾟ･",
    "(T﹏つ)", "（T﹏つ）", "｡･ﾟﾟ･(T﹏つ)･ﾟﾟ･｡", "(っT﹏つ)っ",
    "⊂(T﹏つ)⊃", "(T﹏つ)...", "ヽ(T﹏つ)", "(T﹏つ)ノ",
    "。゜(T﹏つ)゜。", "･ﾟ･(T﹏つ)･ﾟ･", "(T﹏ŏ)", "（T﹏ŏ）",
    "｡･ﾟﾟ･(T﹏ŏ)･ﾟﾟ･｡", "(っT﹏ŏ)っ", "⊂(T﹏ŏ)⊃", "(T﹏ŏ)...",
    "ヽ(T﹏ŏ)", "(T﹏ŏ)ノ", "。゜(T﹏ŏ)゜。", "･ﾟ･(T﹏ŏ)･ﾟ･",
    "(T﹏；)", "（T﹏；）", "｡･ﾟﾟ･(T﹏；)･ﾟﾟ･｡", "(っT﹏；)っ",
    "⊂(T﹏；)⊃", "(T﹏；)...", "ヽ(T﹏；)", "(T﹏；)ノ",
    "。゜(T﹏；)゜。", "･ﾟ･(T﹏；)･ﾟ･", "(T﹏╰)", "（T﹏╰）",
    "｡･ﾟﾟ･(T﹏╰)･ﾟﾟ･｡", "(っT﹏╰)っ", "⊂(T﹏╰)⊃", "(T﹏╰)..."
  ],
  "angry": [
    "( •̀_•́ )", "( 𝌆 𝌆 )", "( ▀ Ĺ̯ ▀ )", "(ꐦ ▔• ▔)",
    "( ⚆ _ ⚆ )", "( ͡ - ͜ʖ ͡- )", "( ʘ̆ ╭͜ʖ╮ ʘ̆ )", "( • ꈊ• )",
    "( 𝍇 𝍇 )", "(•̀⤙•́)", "( ಠ_ಠ )", "( •᷄▒•᷅ )",
    "( ` 皿 ´ )", "( ⍥ )", "( ಠ 皿 ಠ )", "( ╬▔皿▔)╯",
    "(#`Ð´)", "( `ε´ )", "(ಠ_ಠ)", "(¬_¬)",
    "(;￢_￢)", "(⊙_⊙)", "(O_o)", "(o_O)",
    "(゜Д゜)", "(;￣Д￣)", "(＃￣0￣)", "( ・_・)",
    "( ͠° ͟ʖ ͡°)", "(¬‿¬)", "(°ㅂ°╬)", "(;ಠ_ಠ)",
    "（ಠ_ಠ）", "凸(ಠ_ಠ)凸", "(╬ಠ_ಠ)", "(งಠ_ಠ)ง",
    "┗(ಠ_ಠ)┛", "┌∩┐(ಠ_ಠ)┌∩┐", "(ಠ益ಠ)", "（ಠ益ಠ）",
    "凸(ಠ益ಠ)凸", "(╬ಠ益ಠ)", "(งಠ益ಠ)ง", "┗(ಠ益ಠ)┛",
    "┌∩┐(ಠ益ಠ)┌∩┐", "(ಠ▃ಠ)", "（ಠ▃ಠ）", "凸(ಠ▃ಠ)凸",
    "(╬ಠ▃ಠ)", "(งಠ▃ಠ)ง", "┗(ಠ▃ಠ)┛", "┌∩┐(ಠ▃ಠ)┌∩┐",
    "(ಠ︵ಠ)", "（ಠ︵ಠ）", "凸(ಠ︵ಠ)凸", "(╬ಠ︵ಠ)",
    "(งಠ︵ಠ)ง", "┗(ಠ︵ಠ)┛", "┌∩┐(ಠ︵ಠ)┌∩┐", "(ಠ⌣ಠ)",
    "（ಠ⌣ಠ）", "凸(ಠ⌣ಠ)凸", "(╬ಠ⌣ಠ)", "(งಠ⌣ಠ)ง",
    "┗(ಠ⌣ಠ)┛", "┌∩┐(ಠ⌣ಠ)┌∩┐", "(눈_눈)", "（눈_눈）",
    "凸(눈_눈)凸", "(╬눈_눈)", "(ง눈_눈)ง", "┗(눈_눈)┛",
    "┌∩┐(눈_눈)┌∩┐", "（¬_¬）", "凸(¬_¬)凸", "(╬¬_¬)",
    "(ง¬_¬)ง", "┗(¬_¬)┛", "┌∩┐(¬_¬)┌∩┐", "(￢_￢)",
    "（￢_￢）", "凸(￢_￢)凸", "(╬￢_￢)", "(ง￢_￢)ง",
    "┗(￢_￢)┛", "┌∩┐(￢_￢)┌∩┐", "(•̀_•́)", "（•̀_•́）",
    "凸(•̀_•́)凸", "(╬•̀_•́)", "(ง•̀_•́)ง", "┗(•̀_•́)┛",
    "┌∩┐(•̀_•́)┌∩┐", "（•̀⤙•́）", "凸(•̀⤙•́)凸", "(╬•̀⤙•́)",
    "(ง•̀⤙•́)ง", "┗(•̀⤙•́)┛", "┌∩┐(•̀⤙•́)┌∩┐", "(`Д´)",
    "╬(ಠ_ಠ)", "(ノಠ_ಠ)ノ", "乁(ಠ_ಠ)ㄏ", "╭(ಠ_ಠ)╮",
    "(ಠ_¬)", "（ಠ_¬）", "╬(ಠ_¬)", "凸(ಠ_¬)凸",
    "(งಠ_¬)ง", "┗(ಠ_¬)┛", "┌∩┐(ಠ_¬)┌∩┐", "(ノಠ_¬)ノ",
    "乁(ಠ_¬)ㄏ", "╭(ಠ_¬)╮", "(ಠ_•́)", "（ಠ_•́）",
    "╬(ಠ_•́)", "凸(ಠ_•́)凸", "(งಠ_•́)ง", "┗(ಠ_•́)┛",
    "┌∩┐(ಠ_•́)┌∩┐", "(ノಠ_•́)ノ", "乁(ಠ_•́)ㄏ", "╭(ಠ_•́)╮",
    "(ಠ_´)", "（ಠ_´）", "╬(ಠ_´)", "凸(ಠ_´)凸",
    "(งಠ_´)ง", "┗(ಠ_´)┛", "┌∩┐(ಠ_´)┌∩┐", "(ノಠ_´)ノ",
    "乁(ಠ_´)ㄏ", "╭(ಠ_´)╮", "(ಠ_￣)", "（ಠ_￣）",
    "╬(ಠ_￣)", "凸(ಠ_￣)凸", "(งಠ_￣)ง", "┗(ಠ_￣)┛",
    "┌∩┐(ಠ_￣)┌∩┐", "(ノಠ_￣)ノ", "乁(ಠ_￣)ㄏ", "╭(ಠ_￣)╮",
    "(ಠ_눈)", "（ಠ_눈）", "╬(ಠ_눈)", "凸(ಠ_눈)凸",
    "(งಠ_눈)ง", "┗(ಠ_눈)┛", "┌∩┐(ಠ_눈)┌∩┐", "(ノಠ_눈)ノ",
    "乁(ಠ_눈)ㄏ", "╭(ಠ_눈)╮", "(ಠ_≖)", "（ಠ_≖）",
    "╬(ಠ_≖)", "凸(ಠ_≖)凸", "(งಠ_≖)ง", "┗(ಠ_≖)┛",
    "┌∩┐(ಠ_≖)┌∩┐", "(ノಠ_≖)ノ", "乁(ಠ_≖)ㄏ", "╭(ಠ_≖)╮",
    "(ಠ_╬)", "（ಠ_╬）", "╬(ಠ_╬)", "凸(ಠ_╬)凸",
    "(งಠ_╬)ง", "┗(ಠ_╬)┛", "┌∩┐(ಠ_╬)┌∩┐", "(ノಠ_╬)ノ",
    "乁(ಠ_╬)ㄏ", "╭(ಠ_╬)╮", "(ಠ_#)", "（ಠ_#）",
    "╬(ಠ_#)", "凸(ಠ_#)凸", "(งಠ_#)ง", "┗(ಠ_#)┛",
    "┌∩┐(ಠ_#)┌∩┐", "(ノಠ_#)ノ", "乁(ಠ_#)ㄏ", "╭(ಠ_#)╮",
    "(ಠ_ง)", "（ಠ_ง）", "╬(ಠ_ง)", "凸(ಠ_ง)凸",
    "(งಠ_ง)ง", "┗(ಠ_ง)┛", "┌∩┐(ಠ_ง)┌∩┐", "(ノಠ_ง)ノ",
    "乁(ಠ_ง)ㄏ", "╭(ಠ_ง)╮", "(ಠ_凸)", "（ಠ_凸）",
    "╬(ಠ_凸)", "凸(ಠ_凸)凸", "(งಠ_凸)ง", "┗(ಠ_凸)┛",
    "┌∩┐(ಠ_凸)┌∩┐", "(ノಠ_凸)ノ", "乁(ಠ_凸)ㄏ", "╭(ಠ_凸)╮",
    "(ಠ_ಠಿ)", "（ಠ_ಠಿ）", "╬(ಠ_ಠಿ)", "凸(ಠ_ಠಿ)凸",
    "(งಠ_ಠಿ)ง", "┗(ಠ_ಠಿ)┛", "┌∩┐(ಠ_ಠಿ)┌∩┐", "(ノಠ_ಠಿ)ノ",
    "乁(ಠ_ಠಿ)ㄏ", "╭(ಠ_ಠಿ)╮", "(ಠ_皿)", "（ಠ_皿）",
    "╬(ಠ_皿)", "凸(ಠ_皿)凸", "(งಠ_皿)ง", "┗(ಠ_皿)┛",
    "┌∩┐(ಠ_皿)┌∩┐", "(ノಠ_皿)ノ", "乁(ಠ_皿)ㄏ", "╭(ಠ_皿)╮",
    "(ಠ_≦)", "（ಠ_≦）", "╬(ಠ_≦)", "凸(ಠ_≦)凸",
    "(งಠ_≦)ง", "┗(ಠ_≦)┛", "┌∩┐(ಠ_≦)┌∩┐", "(ノಠ_≦)ノ",
    "乁(ಠ_≦)ㄏ", "╭(ಠ_≦)╮", "(ಠ_•̀)", "（ಠ_•̀）",
    "╬(ಠ_•̀)", "凸(ಠ_•̀)凸", "(งಠ_•̀)ง", "┗(ಠ_•̀)┛",
    "┌∩┐(ಠ_•̀)┌∩┐", "(ノಠ_•̀)ノ", "乁(ಠ_•̀)ㄏ", "╭(ಠ_•̀)╮",
    "(ಠ_￢)", "（ಠ_￢）", "╬(ಠ_￢)", "凸(ಠ_￢)凸",
    "(งಠ_￢)ง", "┗(ಠ_￢)┛", "┌∩┐(ಠ_￢)┌∩┐", "(ノಠ_￢)ノ",
    "乁(ಠ_￢)ㄏ", "╭(ಠ_￢)╮", "(ಠ_ノ)", "（ಠ_ノ）",
    "╬(ಠ_ノ)", "凸(ಠ_ノ)凸", "(งಠ_ノ)ง", "┗(ಠ_ノ)┛",
    "┌∩┐(ಠ_ノ)┌∩┐", "(ノಠ_ノ)ノ", "乁(ಠ_ノ)ㄏ", "╭(ಠ_ノ)╮",
    "(ಠ_╮)", "（ಠ_╮）", "╬(ಠ_╮)", "凸(ಠ_╮)凸",
    "(งಠ_╮)ง", "┗(ಠ_╮)┛", "┌∩┐(ಠ_╮)┌∩┐", "(ノಠ_╮)ノ",
    "乁(ಠ_╮)ㄏ", "╭(ಠ_╮)╮", "(ಠ皿ಠ)", "（ಠ皿ಠ）",
    "╬(ಠ皿ಠ)", "凸(ಠ皿ಠ)凸", "(งಠ皿ಠ)ง", "┗(ಠ皿ಠ)┛",
    "┌∩┐(ಠ皿ಠ)┌∩┐", "(ノಠ皿ಠ)ノ", "乁(ಠ皿ಠ)ㄏ", "╭(ಠ皿ಠ)╮",
    "(ಠ皿¬)", "（ಠ皿¬）", "╬(ಠ皿¬)", "凸(ಠ皿¬)凸",
    "(งಠ皿¬)ง", "┗(ಠ皿¬)┛", "┌∩┐(ಠ皿¬)┌∩┐", "(ノಠ皿¬)ノ",
    "乁(ಠ皿¬)ㄏ", "╭(ಠ皿¬)╮", "(ಠ皿•́)", "（ಠ皿•́）",
    "╬(ಠ皿•́)", "凸(ಠ皿•́)凸", "(งಠ皿•́)ง", "┗(ಠ皿•́)┛",
    "┌∩┐(ಠ皿•́)┌∩┐", "(ノಠ皿•́)ノ", "乁(ಠ皿•́)ㄏ", "╭(ಠ皿•́)╮",
    "(ಠ皿´)", "（ಠ皿´）", "╬(ಠ皿´)", "凸(ಠ皿´)凸",
    "(งಠ皿´)ง", "┗(ಠ皿´)┛", "┌∩┐(ಠ皿´)┌∩┐", "(ノಠ皿´)ノ",
    "乁(ಠ皿´)ㄏ", "╭(ಠ皿´)╮", "(ಠ皿￣)", "（ಠ皿￣）",
    "╬(ಠ皿￣)", "凸(ಠ皿￣)凸", "(งಠ皿￣)ง", "┗(ಠ皿￣)┛",
    "┌∩┐(ಠ皿￣)┌∩┐", "(ノಠ皿￣)ノ", "乁(ಠ皿￣)ㄏ", "╭(ಠ皿￣)╮",
    "(ಠ皿눈)", "（ಠ皿눈）", "╬(ಠ皿눈)", "凸(ಠ皿눈)凸",
    "(งಠ皿눈)ง", "┗(ಠ皿눈)┛", "┌∩┐(ಠ皿눈)┌∩┐", "(ノಠ皿눈)ノ",
    "乁(ಠ皿눈)ㄏ", "╭(ಠ皿눈)╮", "(ಠ皿≖)", "（ಠ皿≖）",
    "╬(ಠ皿≖)", "凸(ಠ皿≖)凸", "(งಠ皿≖)ง", "┗(ಠ皿≖)┛",
    "┌∩┐(ಠ皿≖)┌∩┐", "(ノಠ皿≖)ノ", "乁(ಠ皿≖)ㄏ", "╭(ಠ皿≖)╮",
    "(ಠ皿╬)", "（ಠ皿╬）", "╬(ಠ皿╬)", "凸(ಠ皿╬)凸",
    "(งಠ皿╬)ง", "┗(ಠ皿╬)┛"
  ],
  "animal": [
    "( ˆ ̳◝ ·̫ ◜ ̳ˆ )", "(  •᷄⌓•᷅ )", "( •̀ө•́ )", "( ≡^∇^≡ )",
    "( 𖦹> ·̫ <𖦹 )", "(^. ̫ .^)", "( ะ ื ▿ ื ะ )", "₍ᐢ.ˬ.ᐢ₎",
    "₍ᐢ. ̫ .ᐢ₎", "₍ᐢɞ̴̶̷ ·̫ ɞ̴̶̷ᐢ₎", "૮ ฅ́ ˘ ฅ̀ ა", "૮ . ̫ . ა",
    "( ´ิ(ꈊ) ´ิ)", "( =^･ω･^= )", "(≡^∇^≡)", "(=^·^=)",
    "(=^ㆍ^=)", "ʕ•ᴥ•ʔ", "ʕ •ᴥ• ʔ", "( ͒•·̫• ͒)",
    "(=^･^=)", "₍ᐢó╻òᐢ₎", "(◕ᴥ◕)", "=^･ω･^=",
    "=^･ω･^=♡", "✧=^･ω･^=✧", "~=^･ω･^=~", "ᘏ=^･ω･^=ᘏ",
    "=^･ｪ･^=", "=^･ｪ･^=♡", "✧=^･ｪ･^=✧", "~=^･ｪ･^=~",
    "ᘏ=^･ｪ･^=ᘏ", "=＾● ⋏ ●＾=", "=＾● ⋏ ●＾=♡", "✧=＾● ⋏ ●＾=✧",
    "~=＾● ⋏ ●＾=~", "ᘏ=＾● ⋏ ●＾=ᘏ", "=①ω①=", "=①ω①=♡",
    "✧=①ω①=✧", "~=①ω①=~", "ᘏ=①ω①=ᘏ", "=｀ω´=",
    "=｀ω´=♡", "✧=｀ω´=✧", "~=｀ω´=~", "ᘏ=｀ω´=ᘏ",
    "=^‥^=", "=^‥^=♡", "✧=^‥^=✧", "~=^‥^=~",
    "ᘏ=^‥^=ᘏ", "=^_^=", "=^_^=♡", "✧=^_^=✧",
    "~=^_^=~", "ᘏ=^_^=ᘏ", "=^.^=", "=^.^=♡",
    "✧=^.^=✧", "~=^.^=~", "ᘏ=^.^=ᘏ", "=^･^=",
    "=^･^=♡", "✧=^･^=✧", "~=^･^=~", "ᘏ=^･^=ᘏ",
    "ฅ^•ﻌ•^ฅ", "ฅ^•ﻌ•^ฅ♡", "✧ฅ^•ﻌ•^ฅ✧", "~ฅ^•ﻌ•^ฅ~",
    "ᘏฅ^•ﻌ•^ฅᘏ", "ฅ( ̳• ·̫ • ̳ฅ)", "ฅ( ̳• ·̫ • ̳ฅ)♡", "✧ฅ( ̳• ·̫ • ̳ฅ)✧",
    "~ฅ( ̳• ·̫ • ̳ฅ)~", "ᘏฅ( ̳• ·̫ • ̳ฅ)ᘏ", "ฅ(＾・ω・＾ฅ)", "ฅ(＾・ω・＾ฅ)♡",
    "✧ฅ(＾・ω・＾ฅ)✧", "~ฅ(＾・ω・＾ฅ)~", "ᘏฅ(＾・ω・＾ฅ)ᘏ", "ฅ(•ㅅ•❀)ฅ",
    "ฅ(•ㅅ•❀)ฅ♡", "✧ฅ(•ㅅ•❀)ฅ✧", "~ฅ(•ㅅ•❀)ฅ~", "ᘏฅ(•ㅅ•❀)ฅᘏ",
    "ฅ(=･ω･=)ฅ", "ฅ(=･ω･=)ฅ♡", "✧ฅ(=･ω･=)ฅ✧", "~ฅ(=･ω･=)ฅ~",
    "ᘏฅ(=･ω･=)ฅᘏ", "ฅ(=^･ω･^=)ฅ", "ฅ(=^･ω･^=)ฅ♡", "✧ฅ(=^･ω･^=)ฅ✧",
    "~ฅ(=^･ω･^=)ฅ~", "ᘏฅ(=^･ω･^=)ฅᘏ", "₍ᐢ. ̫ .ᐢ₎♡", "✧₍ᐢ. ̫ .ᐢ₎✧",
    "~₍ᐢ. ̫ .ᐢ₎~", "ᘏ₍ᐢ. ̫ .ᐢ₎ᘏ", "₍ᐢ.ˬ.ᐢ₎♡", "✧₍ᐢ.ˬ.ᐢ₎✧",
    "~₍ᐢ.ˬ.ᐢ₎~", "ᘏ₍ᐢ.ˬ.ᐢ₎ᘏ", "₍ᐢ._.ᐢ₎", "₍ᐢ._.ᐢ₎♡",
    "✧₍ᐢ._.ᐢ₎✧", "~₍ᐢ._.ᐢ₎~", "ᘏ₍ᐢ._.ᐢ₎ᘏ", "₍ᐢ•ﻌ•ᐢ₎",
    "₍ᐢ•ﻌ•ᐢ₎♡", "✧₍ᐢ•ﻌ•ᐢ₎✧", "~₍ᐢ•ﻌ•ᐢ₎~", "ᘏ₍ᐢ•ﻌ•ᐢ₎ᘏ",
    "₍ᐢᵔᴗᵔᐢ₎", "₍ᐢᵔᴗᵔᐢ₎♡", "✧₍ᐢᵔᴗᵔᐢ₎✧", "~₍ᐢᵔᴗᵔᐢ₎~",
    "=^•ω•^=", "ฅ^•ω•^ฅ", "₍ᐢ.•ω• .ᐢ₎", "₍ᐢ •ω• ᐢ₎",
    "ʕ•ω•ʔ", "U •ω• U", "ᘏ(•ω•)ᘏ", "ฅ(•ω•)ฅ",
    "(= •ω• =)", "(ᵔ •ω• ᵔ)", "ʕっ•ω•っʔ", "₍ᐢつ•ω•つᐢ₎",
    "=^•ω^^=", "ฅ^•ω^^ฅ", "₍ᐢ.•ω^ .ᐢ₎", "₍ᐢ •ω^ ᐢ₎",
    "ʕ•ω^ʔ", "U •ω^ U", "ᘏ(•ω^)ᘏ", "ฅ(•ω^)ฅ",
    "(= •ω^ =)", "(ᵔ •ω^ ᵔ)", "ʕっ•ω^っʔ", "₍ᐢつ•ω^つᐢ₎",
    "=^•ω=^=", "ฅ^•ω=^ฅ", "₍ᐢ.•ω= .ᐢ₎", "₍ᐢ •ω= ᐢ₎",
    "ʕ•ω=ʔ", "U •ω= U", "ᘏ(•ω=)ᘏ", "ฅ(•ω=)ฅ",
    "(= •ω= =)", "(ᵔ •ω= ᵔ)", "ʕっ•ω=っʔ", "₍ᐢつ•ω=つᐢ₎",
    "=^•ωᵔ^=", "ฅ^•ωᵔ^ฅ", "₍ᐢ.•ωᵔ .ᐢ₎", "₍ᐢ •ωᵔ ᐢ₎",
    "ʕ•ωᵔʔ", "U •ωᵔ U", "ᘏ(•ωᵔ)ᘏ", "ฅ(•ωᵔ)ฅ",
    "(= •ωᵔ =)", "(ᵔ •ωᵔ ᵔ)", "ʕっ•ωᵔっʔ", "₍ᐢつ•ωᵔつᐢ₎",
    "=^•ω◕^=", "ฅ^•ω◕^ฅ", "₍ᐢ.•ω◕ .ᐢ₎", "₍ᐢ •ω◕ ᐢ₎",
    "ʕ•ω◕ʔ", "U •ω◕ U", "ᘏ(•ω◕)ᘏ", "ฅ(•ω◕)ฅ",
    "(= •ω◕ =)", "(ᵔ •ω◕ ᵔ)", "ʕっ•ω◕っʔ", "₍ᐢつ•ω◕つᐢ₎",
    "=^•ω｡^=", "ฅ^•ω｡^ฅ", "₍ᐢ.•ω｡ .ᐢ₎", "₍ᐢ •ω｡ ᐢ₎",
    "ʕ•ω｡ʔ", "U •ω｡ U", "ᘏ(•ω｡)ᘏ", "ฅ(•ω｡)ฅ",
    "(= •ω｡ =)", "(ᵔ •ω｡ ᵔ)", "ʕっ•ω｡っʔ", "₍ᐢつ•ω｡つᐢ₎",
    "=^•ω´^=", "ฅ^•ω´^ฅ", "₍ᐢ.•ω´ .ᐢ₎", "₍ᐢ •ω´ ᐢ₎",
    "ʕ•ω´ʔ", "U •ω´ U", "ᘏ(•ω´)ᘏ", "ฅ(•ω´)ฅ",
    "(= •ω´ =)", "(ᵔ •ω´ ᵔ)", "ʕっ•ω´っʔ", "₍ᐢつ•ω´つᐢ₎",
    "=^•ω˘^=", "ฅ^•ω˘^ฅ", "₍ᐢ.•ω˘ .ᐢ₎", "₍ᐢ •ω˘ ᐢ₎",
    "ʕ•ω˘ʔ", "U •ω˘ U", "ᘏ(•ω˘)ᘏ", "ฅ(•ω˘)ฅ",
    "(= •ω˘ =)", "(ᵔ •ω˘ ᵔ)", "ʕっ•ω˘っʔ", "₍ᐢつ•ω˘つᐢ₎",
    "=^•ω≧^=", "ฅ^•ω≧^ฅ", "₍ᐢ.•ω≧ .ᐢ₎", "₍ᐢ •ω≧ ᐢ₎",
    "ʕ•ω≧ʔ", "U •ω≧ U", "ᘏ(•ω≧)ᘏ", "ฅ(•ω≧)ฅ",
    "(= •ω≧ =)", "(ᵔ •ω≧ ᵔ)", "ʕっ•ω≧っʔ", "₍ᐢつ•ω≧つᐢ₎",
    "=^•ω¬^=", "ฅ^•ω¬^ฅ", "₍ᐢ.•ω¬ .ᐢ₎", "₍ᐢ •ω¬ ᐢ₎",
    "ʕ•ω¬ʔ", "U •ω¬ U", "ᘏ(•ω¬)ᘏ", "ฅ(•ω¬)ฅ",
    "(= •ω¬ =)", "(ᵔ •ω¬ ᵔ)", "ʕっ•ω¬っʔ", "₍ᐢつ•ω¬つᐢ₎",
    "=^•ω・^=", "ฅ^•ω・^ฅ", "₍ᐢ.•ω・ .ᐢ₎", "₍ᐢ •ω・ ᐢ₎",
    "ʕ•ω・ʔ", "U •ω・ U", "ᘏ(•ω・)ᘏ", "ฅ(•ω・)ฅ",
    "(= •ω・ =)", "(ᵔ •ω・ ᵔ)", "ʕっ•ω・っʔ", "₍ᐢつ•ω・つᐢ₎",
    "=^•ω◉^=", "ฅ^•ω◉^ฅ", "₍ᐢ.•ω◉ .ᐢ₎", "₍ᐢ •ω◉ ᐢ₎",
    "ʕ•ω◉ʔ", "U •ω◉ U", "ᘏ(•ω◉)ᘏ", "ฅ(•ω◉)ฅ",
    "(= •ω◉ =)", "(ᵔ •ω◉ ᵔ)", "ʕっ•ω◉っʔ", "₍ᐢつ•ω◉つᐢ₎",
    "=^•ωᐢ^=", "ฅ^•ωᐢ^ฅ", "₍ᐢ.•ωᐢ .ᐢ₎", "₍ᐢ •ωᐢ ᐢ₎",
    "ʕ•ωᐢʔ", "U •ωᐢ U", "ᘏ(•ωᐢ)ᘏ", "ฅ(•ωᐢ)ฅ",
    "(= •ωᐢ =)", "(ᵔ •ωᐢ ᵔ)", "ʕっ•ωᐢっʔ", "₍ᐢつ•ωᐢつᐢ₎",
    "=^•ωㅅ^=", "ฅ^•ωㅅ^ฅ", "₍ᐢ.•ωㅅ .ᐢ₎", "₍ᐢ •ωㅅ ᐢ₎",
    "ʕ•ωㅅʔ", "U •ωㅅ U", "ᘏ(•ωㅅ)ᘏ", "ฅ(•ωㅅ)ฅ",
    "(= •ωㅅ =)", "(ᵔ •ωㅅ ᵔ)", "ʕっ•ωㅅっʔ", "₍ᐢつ•ωㅅつᐢ₎",
    "=^•ωω^=", "ฅ^•ωω^ฅ", "₍ᐢ.•ωω .ᐢ₎", "₍ᐢ •ωω ᐢ₎",
    "ʕ•ωωʔ", "U •ωω U", "ᘏ(•ωω)ᘏ", "ฅ(•ωω)ฅ",
    "(= •ωω =)", "(ᵔ •ωω ᵔ)", "ʕっ•ωωっʔ", "₍ᐢつ•ωωつᐢ₎",
    "=^•ωᴗ^=", "ฅ^•ωᴗ^ฅ", "₍ᐢ.•ωᴗ .ᐢ₎", "₍ᐢ •ωᴗ ᐢ₎",
    "ʕ•ωᴗʔ", "U •ωᴗ U", "ᘏ(•ωᴗ)ᘏ", "ฅ(•ωᴗ)ฅ",
    "(= •ωᴗ =)", "(ᵔ •ωᴗ ᵔ)", "ʕっ•ωᴗっʔ", "₍ᐢつ•ωᴗつᐢ₎",
    "=^•ωꈍ^=", "ฅ^•ωꈍ^ฅ", "₍ᐢ.•ωꈍ .ᐢ₎", "₍ᐢ •ωꈍ ᐢ₎",
    "ʕ•ωꈍʔ", "U •ωꈍ U", "ᘏ(•ωꈍ)ᘏ", "ฅ(•ωꈍ)ฅ",
    "(= •ωꈍ =)", "(ᵔ •ωꈍ ᵔ)", "ʕっ•ωꈍっʔ", "₍ᐢつ•ωꈍつᐢ₎",
    "=^•ω˙^=", "ฅ^•ω˙^ฅ", "₍ᐢ.•ω˙ .ᐢ₎", "₍ᐢ •ω˙ ᐢ₎",
    "ʕ•ω˙ʔ", "U •ω˙ U", "ᘏ(•ω˙)ᘏ", "ฅ(•ω˙)ฅ",
    "(= •ω˙ =)", "(ᵔ •ω˙ ᵔ)", "ʕっ•ω˙っʔ", "₍ᐢつ•ω˙つᐢ₎",
    "=^•ωಠ^=", "ฅ^•ωಠ^ฅ", "₍ᐢ.•ωಠ .ᐢ₎", "₍ᐢ •ωಠ ᐢ₎",
    "ʕ•ωಠʔ", "U •ωಠ U", "ᘏ(•ωಠ)ᘏ", "ฅ(•ωಠ)ฅ",
    "(= •ωಠ =)", "(ᵔ •ωಠ ᵔ)", "ʕっ•ωಠっʔ", "₍ᐢつ•ωಠつᐢ₎",
    "=^•ω๑^=", "ฅ^•ω๑^ฅ", "₍ᐢ.•ω๑ .ᐢ₎", "₍ᐢ •ω๑ ᐢ₎",
    "ʕ•ω๑ʔ", "U •ω๑ U", "ᘏ(•ω๑)ᘏ", "ฅ(•ω๑)ฅ",
    "(= •ω๑ =)", "(ᵔ •ω๑ ᵔ)", "ʕっ•ω๑っʔ", "₍ᐢつ•ω๑つᐢ₎",
    "=^•ᴥ•^=", "ฅ^•ᴥ•^ฅ", "₍ᐢ.•ᴥ• .ᐢ₎", "₍ᐢ •ᴥ• ᐢ₎",
    "U •ᴥ• U", "ᘏ(•ᴥ•)ᘏ", "ฅ(•ᴥ•)ฅ", "(= •ᴥ• =)",
    "(ᵔ •ᴥ• ᵔ)", "ʕっ•ᴥ•っʔ", "₍ᐢつ•ᴥ•つᐢ₎", "=^•ᴥ^^=",
    "ฅ^•ᴥ^^ฅ", "₍ᐢ.•ᴥ^ .ᐢ₎", "₍ᐢ •ᴥ^ ᐢ₎", "ʕ•ᴥ^ʔ",
    "U •ᴥ^ U", "ᘏ(•ᴥ^)ᘏ", "ฅ(•ᴥ^)ฅ", "(= •ᴥ^ =)",
    "(ᵔ •ᴥ^ ᵔ)", "ʕっ•ᴥ^っʔ", "₍ᐢつ•ᴥ^つᐢ₎", "=^•ᴥ=^=",
    "ฅ^•ᴥ=^ฅ", "₍ᐢ.•ᴥ= .ᐢ₎", "₍ᐢ •ᴥ= ᐢ₎", "ʕ•ᴥ=ʔ",
    "U •ᴥ= U", "ᘏ(•ᴥ=)ᘏ", "ฅ(•ᴥ=)ฅ", "(= •ᴥ= =)",
    "(ᵔ •ᴥ= ᵔ)", "ʕっ•ᴥ=っʔ", "₍ᐢつ•ᴥ=つᐢ₎", "=^•ᴥᵔ^=",
    "ฅ^•ᴥᵔ^ฅ", "₍ᐢ.•ᴥᵔ .ᐢ₎", "₍ᐢ •ᴥᵔ ᐢ₎", "ʕ•ᴥᵔʔ",
    "U •ᴥᵔ U", "ᘏ(•ᴥᵔ)ᘏ", "ฅ(•ᴥᵔ)ฅ", "(= •ᴥᵔ =)",
    "(ᵔ •ᴥᵔ ᵔ)", "ʕっ•ᴥᵔっʔ", "₍ᐢつ•ᴥᵔつᐢ₎", "=^•ᴥ◕^=",
    "ฅ^•ᴥ◕^ฅ", "₍ᐢ.•ᴥ◕ .ᐢ₎", "₍ᐢ •ᴥ◕ ᐢ₎", "ʕ•ᴥ◕ʔ",
    "U •ᴥ◕ U", "ᘏ(•ᴥ◕)ᘏ", "ฅ(•ᴥ◕)ฅ", "(= •ᴥ◕ =)",
    "(ᵔ •ᴥ◕ ᵔ)", "ʕっ•ᴥ◕っʔ", "₍ᐢつ•ᴥ◕つᐢ₎", "=^•ᴥ｡^=",
    "ฅ^•ᴥ｡^ฅ", "₍ᐢ.•ᴥ｡ .ᐢ₎", "₍ᐢ •ᴥ｡ ᐢ₎", "ʕ•ᴥ｡ʔ",
    "U •ᴥ｡ U", "ᘏ(•ᴥ｡)ᘏ", "ฅ(•ᴥ｡)ฅ", "(= •ᴥ｡ =)",
    "(ᵔ •ᴥ｡ ᵔ)", "ʕっ•ᴥ｡っʔ", "₍ᐢつ•ᴥ｡つᐢ₎", "=^•ᴥ´^=",
    "ฅ^•ᴥ´^ฅ", "₍ᐢ.•ᴥ´ .ᐢ₎", "₍ᐢ •ᴥ´ ᐢ₎", "ʕ•ᴥ´ʔ",
    "U •ᴥ´ U", "ᘏ(•ᴥ´)ᘏ", "ฅ(•ᴥ´)ฅ", "(= •ᴥ´ =)",
    "(ᵔ •ᴥ´ ᵔ)", "ʕっ•ᴥ´っʔ", "₍ᐢつ•ᴥ´つᐢ₎", "=^•ᴥ˘^=",
    "ฅ^•ᴥ˘^ฅ", "₍ᐢ.•ᴥ˘ .ᐢ₎", "₍ᐢ •ᴥ˘ ᐢ₎", "ʕ•ᴥ˘ʔ",
    "U •ᴥ˘ U", "ᘏ(•ᴥ˘)ᘏ"
  ],
  "action": [
    "( ੭ ᐕ)੭*⁾⁾", "(و ˃̵ᴗ˂̵)و", "(,,• ֊ •,,)੭", "( ⸝⸝•ᴗ•⸝⸝ )੭˒˒",
    "(*ˊᵕˋ*)੭", "(,,ᴗ ᴗ,,) ⁾⁾", "(*ˊᗜˋ*)ᵗʰᵃⁿᵏ ʸᵒᵘ", "| ᐕ)੭*⁾⁾",
    "└(^o^ )┐", "(っ'-')╮=͟͟͞͞♡", "(^o^)/~", "(•̀ᴗ•́)و",
    "＼(￣▽￣)／", "( ˙o˙ )", "(*￣▽￣)ノ", "ヾ(^_^)ノ",
    "ヽ(^_^)ﾉ", "(^_^)ﾉﾞ", "(^_^)/", "٩(^_^)و",
    "ᕕ(^_^)ᕗ", "ᕦ(^_^)ᕤ", "(づ^_^)づ", "⊂(^_^)⊃",
    "(^_^)っ", "(っ^_^)っ", "(^_^)ง", "ヾ(^▽^)ノ",
    "ヽ(^▽^)ﾉ", "(^▽^)ﾉﾞ", "(^▽^)/", "٩(^▽^)و",
    "ᕕ(^▽^)ᕗ", "ᕦ(^▽^)ᕤ", "(づ^▽^)づ", "⊂(^▽^)⊃",
    "(^▽^)っ", "(っ^▽^)っ", "(^▽^)ง", "ヾ(^o^)ノ",
    "ヽ(^o^)ﾉ", "(^o^)ﾉﾞ", "(^o^)/", "٩(^o^)و",
    "ᕕ(^o^)ᕗ", "ᕦ(^o^)ᕤ", "(づ^o^)づ", "⊂(^o^)⊃",
    "(^o^)っ", "(っ^o^)っ", "(^o^)ง", "ヾ(•ᴗ•)ノ",
    "ヽ(•ᴗ•)ﾉ", "(•ᴗ•)ﾉﾞ", "(•ᴗ•)/", "\\(•ᴗ•)/",
    "٩(•ᴗ•)و", "ᕕ(•ᴗ•)ᕗ", "ᕦ(•ᴗ•)ᕤ", "└(•ᴗ•)┐",
    "┌(•ᴗ•)┘", "(づ•ᴗ•)づ", "⊂(•ᴗ•)⊃", "(•ᴗ•)っ",
    "(っ•ᴗ•)っ", "(•ᴗ•)ง", "ヾ(ᵔᴗᵔ)ノ", "ヽ(ᵔᴗᵔ)ﾉ",
    "(ᵔᴗᵔ)ﾉﾞ", "(ᵔᴗᵔ)/", "\\(ᵔᴗᵔ)/", "٩(ᵔᴗᵔ)و",
    "ᕕ(ᵔᴗᵔ)ᕗ", "ᕦ(ᵔᴗᵔ)ᕤ", "└(ᵔᴗᵔ)┐", "┌(ᵔᴗᵔ)┘",
    "(づᵔᴗᵔ)づ", "⊂(ᵔᴗᵔ)⊃", "(ᵔᴗᵔ)っ", "(っᵔᴗᵔ)っ",
    "(ᵔᴗᵔ)ง", "ヾ(ˊᗜˋ)ノ", "ヽ(ˊᗜˋ)ﾉ", "(ˊᗜˋ)ﾉﾞ",
    "(ˊᗜˋ)/", "\\(ˊᗜˋ)/", "٩(ˊᗜˋ)و", "ᕕ(ˊᗜˋ)ᕗ",
    "ᕦ(ˊᗜˋ)ᕤ", "└(ˊᗜˋ)┐", "┌(ˊᗜˋ)┘", "(づˊᗜˋ)づ",
    "⊂(ˊᗜˋ)⊃", "(ˊᗜˋ)っ", "(っˊᗜˋ)っ", "(ˊᗜˋ)ง",
    "ヾ(≧▽≦)ノ", "ヽ(≧▽≦)ﾉ", "(≧▽≦)ﾉﾞ", "(≧▽≦)/",
    "٩(≧▽≦)و", "ᕕ(≧▽≦)ᕗ", "ᕦ(≧▽≦)ᕤ", "(づ≧▽≦)づ",
    "⊂(≧▽≦)⊃", "(≧▽≦)っ", "(っ≧▽≦)っ", "(≧▽≦)ง",
    "ヾ(◕‿◕)ノ", "ヽ(◕‿◕)ﾉ", "ヾ(^ᴗ^)ノ", "ヽ(^ᴗ^)ﾉ",
    "(^ᴗ^)ﾉﾞ", "(^ᴗ^)/", "٩(^ᴗ^)و", "ᕕ(^ᴗ^)ᕗ",
    "ᕦ(^ᴗ^)ᕤ", "(づ^ᴗ^)づ", "⊂(^ᴗ^)⊃", "(^ᴗ^)っ",
    "(っ^ᴗ^)っ", "(^ᴗ^)ง", "ﾉ(^ᴗ^)ﾉ", "乁(^ᴗ^)ㄏ",
    "(ง^ᴗ^)ง", "ヾ(^ᴗ•)ノ", "ヽ(^ᴗ•)ﾉ", "(^ᴗ•)ﾉﾞ",
    "(^ᴗ•)/", "٩(^ᴗ•)و", "ᕕ(^ᴗ•)ᕗ", "ᕦ(^ᴗ•)ᕤ",
    "(づ^ᴗ•)づ", "⊂(^ᴗ•)⊃", "(^ᴗ•)っ", "(っ^ᴗ•)っ",
    "(^ᴗ•)ง", "ﾉ(^ᴗ•)ﾉ", "乁(^ᴗ•)ㄏ", "(ง^ᴗ•)ง",
    "ヾ(^ᴗᵔ)ノ", "ヽ(^ᴗᵔ)ﾉ", "(^ᴗᵔ)ﾉﾞ", "(^ᴗᵔ)/",
    "٩(^ᴗᵔ)و", "ᕕ(^ᴗᵔ)ᕗ", "ᕦ(^ᴗᵔ)ᕤ", "(づ^ᴗᵔ)づ",
    "⊂(^ᴗᵔ)⊃", "(^ᴗᵔ)っ", "(っ^ᴗᵔ)っ", "(^ᴗᵔ)ง",
    "ﾉ(^ᴗᵔ)ﾉ", "乁(^ᴗᵔ)ㄏ", "(ง^ᴗᵔ)ง", "ヾ(^ᴗ´)ノ",
    "ヽ(^ᴗ´)ﾉ", "(^ᴗ´)ﾉﾞ", "(^ᴗ´)/", "\\(^ᴗ´)/",
    "٩(^ᴗ´)و", "ᕕ(^ᴗ´)ᕗ", "ᕦ(^ᴗ´)ᕤ", "└(^ᴗ´)┐",
    "┌(^ᴗ´)┘", "(づ^ᴗ´)づ", "⊂(^ᴗ´)⊃", "(^ᴗ´)っ",
    "(っ^ᴗ´)っ", "(^ᴗ´)ง", "ﾉ(^ᴗ´)ﾉ", "乁(^ᴗ´)ㄏ",
    "(ง^ᴗ´)ง", "ヾ(^ᴗ◕)ノ", "ヽ(^ᴗ◕)ﾉ", "(^ᴗ◕)ﾉﾞ",
    "(^ᴗ◕)/", "٩(^ᴗ◕)و", "ᕕ(^ᴗ◕)ᕗ", "ᕦ(^ᴗ◕)ᕤ",
    "(づ^ᴗ◕)づ", "⊂(^ᴗ◕)⊃", "(^ᴗ◕)っ", "(っ^ᴗ◕)っ",
    "(^ᴗ◕)ง", "ﾉ(^ᴗ◕)ﾉ", "乁(^ᴗ◕)ㄏ", "(ง^ᴗ◕)ง",
    "ヾ(^ᴗ≧)ノ", "ヽ(^ᴗ≧)ﾉ", "(^ᴗ≧)ﾉﾞ", "(^ᴗ≧)/",
    "\\(^ᴗ≧)/", "٩(^ᴗ≧)و", "ᕕ(^ᴗ≧)ᕗ", "ᕦ(^ᴗ≧)ᕤ",
    "└(^ᴗ≧)┐", "┌(^ᴗ≧)┘", "(づ^ᴗ≧)づ", "⊂(^ᴗ≧)⊃",
    "(^ᴗ≧)っ", "(っ^ᴗ≧)っ", "(^ᴗ≧)ง", "ﾉ(^ᴗ≧)ﾉ",
    "乁(^ᴗ≧)ㄏ", "(ง^ᴗ≧)ง", "ヾ(^ᴗ๑)ノ", "ヽ(^ᴗ๑)ﾉ",
    "(^ᴗ๑)ﾉﾞ", "(^ᴗ๑)/", "٩(^ᴗ๑)و", "ᕕ(^ᴗ๑)ᕗ",
    "ᕦ(^ᴗ๑)ᕤ", "(づ^ᴗ๑)づ", "⊂(^ᴗ๑)⊃", "(^ᴗ๑)っ",
    "(っ^ᴗ๑)っ", "(^ᴗ๑)ง", "ﾉ(^ᴗ๑)ﾉ", "乁(^ᴗ๑)ㄏ",
    "(ง^ᴗ๑)ง", "ヾ(^ᴗ˶)ノ", "ヽ(^ᴗ˶)ﾉ", "(^ᴗ˶)ﾉﾞ",
    "(^ᴗ˶)/", "٩(^ᴗ˶)و", "ᕕ(^ᴗ˶)ᕗ", "ᕦ(^ᴗ˶)ᕤ",
    "(づ^ᴗ˶)づ", "⊂(^ᴗ˶)⊃", "(^ᴗ˶)っ", "(っ^ᴗ˶)っ",
    "(^ᴗ˶)ง", "ﾉ(^ᴗ˶)ﾉ", "乁(^ᴗ˶)ㄏ", "(ง^ᴗ˶)ง",
    "ヾ(^ᴗ╹)ノ", "ヽ(^ᴗ╹)ﾉ", "(^ᴗ╹)ﾉﾞ", "(^ᴗ╹)/",
    "٩(^ᴗ╹)و", "ᕕ(^ᴗ╹)ᕗ", "ᕦ(^ᴗ╹)ᕤ", "(づ^ᴗ╹)づ",
    "⊂(^ᴗ╹)⊃", "(^ᴗ╹)っ", "(っ^ᴗ╹)っ", "(^ᴗ╹)ง",
    "ﾉ(^ᴗ╹)ﾉ", "乁(^ᴗ╹)ㄏ", "(ง^ᴗ╹)ง", "ヾ(^ᴗ◍)ノ",
    "ヽ(^ᴗ◍)ﾉ", "(^ᴗ◍)ﾉﾞ", "(^ᴗ◍)/", "٩(^ᴗ◍)و",
    "ᕕ(^ᴗ◍)ᕗ", "ᕦ(^ᴗ◍)ᕤ", "(づ^ᴗ◍)づ", "⊂(^ᴗ◍)⊃",
    "(^ᴗ◍)っ", "(っ^ᴗ◍)っ", "(^ᴗ◍)ง", "ﾉ(^ᴗ◍)ﾉ",
    "乁(^ᴗ◍)ㄏ", "(ง^ᴗ◍)ง", "ヾ(^ᴗᗜ)ノ", "ヽ(^ᴗᗜ)ﾉ",
    "(^ᴗᗜ)ﾉﾞ", "(^ᴗᗜ)/", "٩(^ᴗᗜ)و", "ᕕ(^ᴗᗜ)ᕗ",
    "ᕦ(^ᴗᗜ)ᕤ", "(づ^ᴗᗜ)づ", "⊂(^ᴗᗜ)⊃", "(^ᴗᗜ)っ",
    "(っ^ᴗᗜ)っ", "(^ᴗᗜ)ง", "ﾉ(^ᴗᗜ)ﾉ", "乁(^ᴗᗜ)ㄏ",
    "(ง^ᴗᗜ)ง", "ヾ(^ᴗ˙)ノ", "ヽ(^ᴗ˙)ﾉ", "(^ᴗ˙)ﾉﾞ",
    "(^ᴗ˙)/", "٩(^ᴗ˙)و", "ᕕ(^ᴗ˙)ᕗ", "ᕦ(^ᴗ˙)ᕤ",
    "(づ^ᴗ˙)づ", "⊂(^ᴗ˙)⊃", "(^ᴗ˙)っ", "(っ^ᴗ˙)っ",
    "(^ᴗ˙)ง", "ﾉ(^ᴗ˙)ﾉ", "乁(^ᴗ˙)ㄏ", "(ง^ᴗ˙)ง",
    "ヾ(^ᴗ◠)ノ", "ヽ(^ᴗ◠)ﾉ", "(^ᴗ◠)ﾉﾞ", "(^ᴗ◠)/",
    "٩(^ᴗ◠)و", "ᕕ(^ᴗ◠)ᕗ", "ᕦ(^ᴗ◠)ᕤ", "(づ^ᴗ◠)づ",
    "⊂(^ᴗ◠)⊃", "(^ᴗ◠)っ", "(っ^ᴗ◠)っ", "(^ᴗ◠)ง",
    "ﾉ(^ᴗ◠)ﾉ", "乁(^ᴗ◠)ㄏ", "(ง^ᴗ◠)ง", "ヾ(^ᴗꈍ)ノ",
    "ヽ(^ᴗꈍ)ﾉ", "(^ᴗꈍ)ﾉﾞ", "(^ᴗꈍ)/", "٩(^ᴗꈍ)و",
    "ᕕ(^ᴗꈍ)ᕗ", "ᕦ(^ᴗꈍ)ᕤ", "(づ^ᴗꈍ)づ", "⊂(^ᴗꈍ)⊃",
    "(^ᴗꈍ)っ", "(っ^ᴗꈍ)っ", "(^ᴗꈍ)ง", "ﾉ(^ᴗꈍ)ﾉ",
    "乁(^ᴗꈍ)ㄏ", "(ง^ᴗꈍ)ง", "ヾ(^ᴗᵕ)ノ", "ヽ(^ᴗᵕ)ﾉ",
    "(^ᴗᵕ)ﾉﾞ", "(^ᴗᵕ)/", "٩(^ᴗᵕ)و", "ᕕ(^ᴗᵕ)ᕗ",
    "ᕦ(^ᴗᵕ)ᕤ", "(づ^ᴗᵕ)づ", "⊂(^ᴗᵕ)⊃", "(^ᴗᵕ)っ",
    "(っ^ᴗᵕ)っ", "(^ᴗᵕ)ง", "ﾉ(^ᴗᵕ)ﾉ", "乁(^ᴗᵕ)ㄏ",
    "(ง^ᴗᵕ)ง", "ヾ(^ᴗ｡)ノ", "ヽ(^ᴗ｡)ﾉ", "(^ᴗ｡)ﾉﾞ",
    "(^ᴗ｡)/", "٩(^ᴗ｡)و", "ᕕ(^ᴗ｡)ᕗ", "ᕦ(^ᴗ｡)ᕤ",
    "(づ^ᴗ｡)づ", "⊂(^ᴗ｡)⊃", "(^ᴗ｡)っ", "(っ^ᴗ｡)っ",
    "(^ᴗ｡)ง", "ﾉ(^ᴗ｡)ﾉ", "乁(^ᴗ｡)ㄏ", "(ง^ᴗ｡)ง",
    "ヾ(^ᴗ◡)ノ", "ヽ(^ᴗ◡)ﾉ", "(^ᴗ◡)ﾉﾞ", "(^ᴗ◡)/",
    "٩(^ᴗ◡)و", "ᕕ(^ᴗ◡)ᕗ", "ᕦ(^ᴗ◡)ᕤ", "(づ^ᴗ◡)づ",
    "⊂(^ᴗ◡)⊃", "(^ᴗ◡)っ", "(っ^ᴗ◡)っ", "(^ᴗ◡)ง",
    "ﾉ(^ᴗ◡)ﾉ", "乁(^ᴗ◡)ㄏ", "(ง^ᴗ◡)ง", "ヾ(^ᴗᐛ)ノ",
    "ヽ(^ᴗᐛ)ﾉ", "(^ᴗᐛ)ﾉﾞ", "(^ᴗᐛ)/", "٩(^ᴗᐛ)و",
    "ᕕ(^ᴗᐛ)ᕗ", "ᕦ(^ᴗᐛ)ᕤ", "(づ^ᴗᐛ)づ", "⊂(^ᴗᐛ)⊃",
    "(^ᴗᐛ)っ", "(っ^ᴗᐛ)っ", "(^ᴗᐛ)ง", "ﾉ(^ᴗᐛ)ﾉ",
    "乁(^ᴗᐛ)ㄏ", "(ง^ᴗᐛ)ง", "ヾ(^ᴗ⌒)ノ", "ヽ(^ᴗ⌒)ﾉ",
    "(^ᴗ⌒)ﾉﾞ", "(^ᴗ⌒)/", "٩(^ᴗ⌒)و", "ᕕ(^ᴗ⌒)ᕗ",
    "ᕦ(^ᴗ⌒)ᕤ", "(づ^ᴗ⌒)づ", "⊂(^ᴗ⌒)⊃", "(^ᴗ⌒)っ",
    "(っ^ᴗ⌒)っ", "(^ᴗ⌒)ง", "ﾉ(^ᴗ⌒)ﾉ", "乁(^ᴗ⌒)ㄏ"
  ],
  "etc": [
    "★", "☆", "✦", "✧",
    "✿", "❀", "❁", "❆",
    "❥", "❦", "♩", "♪",
    "♫", "♬", "♮", "♯",
    "♭", "✢", "✣", "✤",
    "✥", "✱", "✲", "✵",
    "✶", "✷", "✸", "✹",
    "(-_-)", "（-_-）", "┐(-_-)┌", "¯\\_(-_-)_/¯",
    "(-_-)?", "(-_-)...", "✧(-_-)✧", "☆(-_-)☆",
    "(-_・)", "（-_・）", "┐(-_・)┌", "¯\\_(-_・)_/¯",
    "(-_・)?", "(-_・)...", "✧(-_・)✧", "☆(-_・)☆",
    "(・_・)", "（・_・）", "┐(・_・)┌", "¯\\_(・_・)_/¯",
    "(・_・)?", "(・_・)...", "✧(・_・)✧", "☆(・_・)☆",
    "(・へ・)", "（・へ・）", "┐(・へ・)┌", "¯\\_(・へ・)_/¯",
    "(・へ・)?", "(・へ・)...", "✧(・へ・)✧", "☆(・へ・)☆",
    "(・ω・)", "（・ω・）", "┐(・ω・)┌", "¯\\_(・ω・)_/¯",
    "(・ω・)?", "(・ω・)...", "✧(・ω・)✧", "☆(・ω・)☆",
    "(・∀・)", "（・∀・）", "┐(・∀・)┌", "¯\\_(・∀・)_/¯",
    "(・∀・)?", "(・∀・)...", "✧(・∀・)✧", "☆(・∀・)☆",
    "(・д・)", "（・д・）", "┐(・д・)┌", "¯\\_(・д・)_/¯",
    "(・д・)?", "(・д・)...", "✧(・д・)✧", "☆(・д・)☆",
    "(・ε・)", "（・ε・）", "┐(・ε・)┌", "¯\\_(・ε・)_/¯",
    "(・ε・)?", "(・ε・)...", "✧(・ε・)✧", "☆(・ε・)☆",
    "(・3・)", "（・3・）", "┐(・3・)┌", "¯\\_(・3・)_/¯",
    "(・3・)?", "(・3・)...", "✧(・3・)✧", "☆(・3・)☆",
    "(・з・)", "（・з・）", "┐(・з・)┌", "¯\\_(・з・)_/¯",
    "(・з・)?", "(・з・)...", "✧(・з・)✧", "☆(・з・)☆",
    "(・o・)", "（・o・）", "┐(・o・)┌", "¯\\_(・o・)_/¯",
    "(・o・)?", "(・o・)...", "✧(・o・)✧", "☆(・o・)☆",
    "(・Д・)", "（・Д・）", "┐(・Д・)┌", "¯\\_(・Д・)_/¯",
    "(・Д・)?", "(・Д・)...", "✧(・Д・)✧", "☆(・Д・)☆",
    "(°_°)", "（°_°）", "┐(°_°)┌", "¯\\_(°_°)_/¯",
    "(°_°)?", "(°_°)...", "✧(°_°)✧", "☆(°_°)☆",
    "~(°_°)~", "[°_°]", "(°_・)", "（°_・）",
    "┐(°_・)┌", "(°_・)?", "(°_・)...", "✧(°_・)✧",
    "☆(°_・)☆", "¯\\_(°_・)_/¯", "~(°_・)~", "[°_・]",
    "(°_⊙)", "（°_⊙）", "┐(°_⊙)┌", "(°_⊙)?",
    "(°_⊙)...", "✧(°_⊙)✧", "☆(°_⊙)☆", "¯\\_(°_⊙)_/¯",
    "~(°_⊙)~", "[°_⊙]", "(°_◔)", "（°_◔）",
    "┐(°_◔)┌", "(°_◔)?", "(°_◔)...", "✧(°_◔)✧",
    "☆(°_◔)☆", "¯\\_(°_◔)_/¯", "~(°_◔)~", "[°_◔]",
    "(°_￣)", "（°_￣）", "┐(°_￣)┌", "(°_￣)?",
    "(°_￣)...", "✧(°_￣)✧", "☆(°_￣)☆", "¯\\_(°_￣)_/¯",
    "~(°_￣)~", "[°_￣]", "(°_O)", "（°_O）",
    "┐(°_O)┌", "(°_O)?", "(°_O)...", "✧(°_O)✧",
    "☆(°_O)☆", "¯\\_(°_O)_/¯", "~(°_O)~", "[°_O]",
    "(°_o)", "（°_o）", "┐(°_o)┌", "(°_o)?",
    "(°_o)...", "✧(°_o)✧", "☆(°_o)☆", "¯\\_(°_o)_/¯",
    "~(°_o)~", "[°_o]", "(°_◎)", "（°_◎）",
    "┐(°_◎)┌", "(°_◎)?", "(°_◎)...", "✧(°_◎)✧",
    "☆(°_◎)☆", "¯\\_(°_◎)_/¯", "~(°_◎)~", "[°_◎]",
    "(°_＠)", "（°_＠）", "┐(°_＠)┌", "(°_＠)?",
    "(°_＠)...", "✧(°_＠)✧", "☆(°_＠)☆", "¯\\_(°_＠)_/¯",
    "~(°_＠)~", "[°_＠]", "(°_¬)", "（°_¬）",
    "┐(°_¬)┌", "(°_¬)?", "(°_¬)...", "✧(°_¬)✧",
    "☆(°_¬)☆", "¯\\_(°_¬)_/¯", "~(°_¬)~", "[°_¬]",
    "(°_ಠ)", "（°_ಠ）", "┐(°_ಠ)┌", "(°_ಠ)?",
    "(°_ಠ)...", "✧(°_ಠ)✧", "☆(°_ಠ)☆", "¯\\_(°_ಠ)_/¯",
    "~(°_ಠ)~", "[°_ಠ]", "(°_꒪)", "（°_꒪）",
    "┐(°_꒪)┌", "(°_꒪)?", "(°_꒪)...", "✧(°_꒪)✧",
    "☆(°_꒪)☆", "¯\\_(°_꒪)_/¯", "~(°_꒪)~", "[°_꒪]",
    "(°_๑)", "（°_๑）", "┐(°_๑)┌", "(°_๑)?",
    "(°_๑)...", "✧(°_๑)✧", "☆(°_๑)☆", "¯\\_(°_๑)_/¯",
    "~(°_๑)~", "[°_๑]", "(°_˙)", "（°_˙）",
    "┐(°_˙)┌", "(°_˙)?", "(°_˙)...", "✧(°_˙)✧",
    "☆(°_˙)☆", "¯\\_(°_˙)_/¯", "~(°_˙)~", "[°_˙]",
    "(°_￢)", "（°_￢）", "┐(°_￢)┌", "(°_￢)?",
    "(°_￢)...", "✧(°_￢)✧", "☆(°_￢)☆", "¯\\_(°_￢)_/¯",
    "~(°_￢)~", "[°_￢]", "(°_-)", "（°_-）",
    "┐(°_-)┌", "(°_-)?", "(°_-)...", "✧(°_-)✧",
    "☆(°_-)☆", "¯\\_(°_-)_/¯", "~(°_-)~", "[°_-]",
    "(°_⊃)", "（°_⊃）", "┐(°_⊃)┌", "(°_⊃)?",
    "(°_⊃)...", "✧(°_⊃)✧", "☆(°_⊃)☆", "¯\\_(°_⊃)_/¯",
    "~(°_⊃)~", "[°_⊃]", "(°_◉)", "（°_◉）",
    "┐(°_◉)┌", "(°_◉)?", "(°_◉)...", "✧(°_◉)✧",
    "☆(°_◉)☆", "¯\\_(°_◉)_/¯", "~(°_◉)~", "[°_◉]",
    "(°ω°)", "（°ω°）", "┐(°ω°)┌", "(°ω°)?",
    "(°ω°)...", "✧(°ω°)✧", "☆(°ω°)☆", "¯\\_(°ω°)_/¯",
    "~(°ω°)~", "[°ω°]", "(°ω・)", "（°ω・）",
    "┐(°ω・)┌", "(°ω・)?", "(°ω・)...", "✧(°ω・)✧",
    "☆(°ω・)☆", "¯\\_(°ω・)_/¯", "~(°ω・)~", "[°ω・]",
    "(°ω⊙)", "（°ω⊙）", "┐(°ω⊙)┌", "(°ω⊙)?",
    "(°ω⊙)...", "✧(°ω⊙)✧", "☆(°ω⊙)☆", "¯\\_(°ω⊙)_/¯",
    "~(°ω⊙)~", "[°ω⊙]", "(°ω◔)", "（°ω◔）",
    "┐(°ω◔)┌", "(°ω◔)?", "(°ω◔)...", "✧(°ω◔)✧",
    "☆(°ω◔)☆", "¯\\_(°ω◔)_/¯", "~(°ω◔)~", "[°ω◔]",
    "(°ω￣)", "（°ω￣）", "┐(°ω￣)┌", "(°ω￣)?",
    "(°ω￣)...", "✧(°ω￣)✧", "☆(°ω￣)☆", "¯\\_(°ω￣)_/¯",
    "~(°ω￣)~", "[°ω￣]", "(°ωO)", "（°ωO）",
    "┐(°ωO)┌", "(°ωO)?", "(°ωO)...", "✧(°ωO)✧",
    "☆(°ωO)☆", "¯\\_(°ωO)_/¯", "~(°ωO)~", "[°ωO]",
    "(°ωo)", "（°ωo）", "┐(°ωo)┌", "(°ωo)?",
    "(°ωo)...", "✧(°ωo)✧", "☆(°ωo)☆", "¯\\_(°ωo)_/¯",
    "~(°ωo)~", "[°ωo]", "(°ω◎)", "（°ω◎）",
    "┐(°ω◎)┌", "(°ω◎)?", "(°ω◎)...", "✧(°ω◎)✧",
    "☆(°ω◎)☆", "¯\\_(°ω◎)_/¯", "~(°ω◎)~", "[°ω◎]",
    "(°ω＠)", "（°ω＠）", "┐(°ω＠)┌", "(°ω＠)?",
    "(°ω＠)...", "✧(°ω＠)✧", "☆(°ω＠)☆", "¯\\_(°ω＠)_/¯",
    "~(°ω＠)~", "[°ω＠]", "(°ω¬)", "（°ω¬）",
    "┐(°ω¬)┌", "(°ω¬)?", "(°ω¬)...", "✧(°ω¬)✧",
    "☆(°ω¬)☆", "¯\\_(°ω¬)_/¯", "~(°ω¬)~", "[°ω¬]",
    "(°ωಠ)", "（°ωಠ）", "┐(°ωಠ)┌", "(°ωಠ)?",
    "(°ωಠ)...", "✧(°ωಠ)✧", "☆(°ωಠ)☆", "¯\\_(°ωಠ)_/¯",
    "~(°ωಠ)~", "[°ωಠ]", "(°ω꒪)", "（°ω꒪）",
    "┐(°ω꒪)┌", "(°ω꒪)?", "(°ω꒪)...", "✧(°ω꒪)✧",
    "☆(°ω꒪)☆", "¯\\_(°ω꒪)_/¯", "~(°ω꒪)~", "[°ω꒪]",
    "(°ω๑)", "（°ω๑）", "┐(°ω๑)┌", "(°ω๑)?",
    "(°ω๑)...", "✧(°ω๑)✧", "☆(°ω๑)☆", "¯\\_(°ω๑)_/¯",
    "~(°ω๑)~", "[°ω๑]", "(°ω˙)", "（°ω˙）",
    "┐(°ω˙)┌", "(°ω˙)?", "(°ω˙)...", "✧(°ω˙)✧",
    "☆(°ω˙)☆", "¯\\_(°ω˙)_/¯", "~(°ω˙)~", "[°ω˙]",
    "(°ω￢)", "（°ω￢）", "┐(°ω￢)┌", "(°ω￢)?",
    "(°ω￢)...", "✧(°ω￢)✧"
  ],
  "ascii": [
    " /\\_/\\\n( o.o )\n > ^ <", " /\\_/\\\n( o.o )\n /     \\",
    " /\\_/\\\n( o.o )\n > w <", " /\\_/\\\n( o.o )\n > - <",
    " /\\_/\\\n( o.o )\n > ~ <", " /\\_/\\\n( O.O )\n > ^ <",
    " /\\_/\\\n( O.O )\n /     \\", " /\\_/\\\n( O.O )\n > w <",
    " /\\_/\\\n( O.O )\n > - <", " /\\_/\\\n( O.O )\n > ~ <",
    " /\\_/\\\n( -.- )\n > ^ <", " /\\_/\\\n( -.- )\n /     \\",
    " /\\_/\\\n( -.- )\n > w <", " /\\_/\\\n( -.- )\n > - <",
    " /\\_/\\\n( -.- )\n > ~ <", " /\\_/\\\n( ^.^ )\n > ^ <",
    " /\\_/\\\n( ^.^ )\n /     \\", " /\\_/\\\n( ^.^ )\n > w <",
    " /\\_/\\\n( ^.^ )\n > - <", " /\\_/\\\n( ^.^ )\n > ~ <",
    " /\\_/\\\n( >.< )\n > ^ <", " /\\_/\\\n( >.< )\n /     \\",
    " /\\_/\\\n( >.< )\n > w <", " /\\_/\\\n( >.< )\n > - <",
    " /\\_/\\\n( >.< )\n > ~ <", " /\\_/\\\n( u.u )\n > ^ <",
    " /\\_/\\\n( u.u )\n /     \\", " /\\_/\\\n( u.u )\n > w <",
    " /\\_/\\\n( u.u )\n > - <", " /\\_/\\\n( u.u )\n > ~ <",
    " /\\_/\\\n( 0.0 )\n > ^ <", " /\\_/\\\n( 0.0 )\n /     \\",
    " /\\_/\\\n( 0.0 )\n > w <", " /\\_/\\\n( 0.0 )\n > - <",
    " /\\_/\\\n( 0.0 )\n > ~ <", " /\\_/\\\n( @.@ )\n > ^ <",
    " /\\_/\\\n( @.@ )\n /     \\", " /\\_/\\\n( @.@ )\n > w <",
    " /\\_/\\\n( @.@ )\n > - <", " /\\_/\\\n( @.@ )\n > ~ <",
    " /\\_/\\\n( *.* )\n > ^ <", " /\\_/\\\n( *.* )\n /     \\",
    " /\\_/\\\n( *.* )\n > w <", " /\\_/\\\n( *.* )\n > - <",
    " /\\_/\\\n( *.* )\n > ~ <", " /\\_/\\\n( x.x )\n > ^ <",
    " /\\_/\\\n( x.x )\n /     \\", " /\\_/\\\n( x.x )\n > w <",
    " /\\_/\\\n( x.x )\n > - <", " /\\_/\\\n( x.x )\n > ~ <",
    "(\\_/ )\n( o.o )\n/ > < \\", "(\\_/ )\n( O.O )\n/ > < \\",
    "(\\_/ )\n( ^.^ )\n/ > < \\", "(\\_/ )\n( -.- )\n/ > < \\",
    "(\\_/ )\n( 0.0 )\n/ > < \\", "(\\_/ )\n( >.< )\n/ > < \\",
    "(\\_/ )\n( u.u )\n/ > < \\", "  (^_^)\n  /|\\\n  / \\",
    "\\ (^_^) /\n \\|/\n  |\n / \\", "  (^_^)\n --|--\n  / \\",
    "  (^_^)\n  /|_\n  / \\", "  (o_o)\n  /|\\\n  / \\",
    "\\ (o_o) /\n \\|/\n  |\n / \\", "  (o_o)\n --|--\n  / \\",
    "  (o_o)\n  /|_\n  / \\", "  (O_O)\n  /|\\\n  / \\",
    "\\ (O_O) /\n \\|/\n  |\n / \\", "  (O_O)\n --|--\n  / \\",
    "  (O_O)\n  /|_\n  / \\", "  (-_-)\n  /|\\\n  / \\",
    "\\ (-_-) /\n \\|/\n  |\n / \\", "  (-_-)\n --|--\n  / \\",
    "  (-_-)\n  /|_\n  / \\", "  (>_<)\n  /|\\\n  / \\",
    "\\ (>_<) /\n \\|/\n  |\n / \\", "  (>_<)\n --|--\n  / \\",
    "  (>_<)\n  /|_\n  / \\", "  (^o^)\n  /|\\\n  / \\",
    "\\ (^o^) /\n \\|/\n  |\n / \\", "  (^o^)\n --|--\n  / \\",
    "  (^o^)\n  /|_\n  / \\", "  (._.)\n  /|\\\n  / \\",
    "\\ (._.) /\n \\|/\n  |\n / \\", "  (._.)\n --|--\n  / \\",
    "  (._.)\n  /|_\n  / \\", "  (T_T)\n  /|\\\n  / \\",
    "\\ (T_T) /\n \\|/\n  |\n / \\", "  (T_T)\n --|--\n  / \\",
    "  (T_T)\n  /|_\n  / \\", "  (*_*)\n  /|\\\n  / \\",
    "\\ (*_*) /\n \\|/\n  |\n / \\", "  (*_*)\n --|--\n  / \\",
    "  (*_*)\n  /|_\n  / \\", "  (x_x)\n  /|\\\n  / \\",
    "\\ (x_x) /\n \\|/\n  |\n / \\", "  (x_x)\n --|--\n  / \\",
    "  (x_x)\n  /|_\n  / \\", "+-------------+\n|    LOVE     |\n+-------------+",
    "/-------------\\\n|    LOVE     |\n\\-------------/", "+-------------+\n|    HELLO    |\n+-------------+",
    "/-------------\\\n|    HELLO    |\n\\-------------/", "+-------------+\n|  THANK YOU  |\n+-------------+",
    "/-------------\\\n|  THANK YOU  |\n\\-------------/", "+-------------+\n|  GOOD LUCK  |\n+-------------+",
    "/-------------\\\n|  GOOD LUCK  |\n\\-------------/", "+-------------+\n|    HAPPY    |\n+-------------+",
    "/-------------\\\n|    HAPPY    |\n\\-------------/", "+-------------+\n|    SMILE    |\n+-------------+",
    "/-------------\\\n|    SMILE    |\n\\-------------/", "+-------------+\n|   WELCOME   |\n+-------------+",
    "/-------------\\\n|   WELCOME   |\n\\-------------/", "+-------------+\n|  FIGHTING   |\n+-------------+",
    "/-------------\\\n|  FIGHTING   |\n\\-------------/", "+-------------+\n|    NICE     |\n+-------------+",
    "/-------------\\\n|    NICE     |\n\\-------------/", "+-------------+\n|     WOW     |\n+-------------+",
    "/-------------\\\n|     WOW     |\n\\-------------/", "========================",
    "========  ========", "=====< ====== >=====",
    "------------------------", "--------  --------",
    "-----< ------ >-----", "~~~~~~~~~~~~~~~~~~~~~~~~",
    "~~~~~~~~  ~~~~~~~~", "~~~~~< ~~~~~~ >~~~~~",
    "************************", "********  ********",
    "*****< ****** >*****", "........................",
    "........  ........", ".....< ...... >.....",
    "++++++++++++++++++++++++", "++++++++  ++++++++",
    "+++++< ++++++ >+++++", "########################",
    "########  ########", "#####< ###### >#####",
    "________________________", "________  ________",
    "_____< ______ >_____", "-->--->--->",
    "<---<---<--", "<<<=======>>>",
    "===>      <===", "  /\\\n /  \\\n/____\\",
    "  |\n--+--\n  |", "[ ]---[ ]---[ ]",
    ".------.\n|      |\n'------'", "+------+\n|      |\n+------+",
    "  ___\n / _ \\\n| |_| |\n \\___/", "  /\\\n /__\\\n |  |\n |__|",
    "  __\n /  \\\n| () |\n \\__/", "+-- NOTE --+\n|        |\n+----------+",
    "+-- TEXT --+\n|        |\n+----------+", "+-- COPY --+\n|        |\n+----------+",
    "+-- ASCII --+\n|         |\n+-----------+", "+-- SNS --+\n|       |\n+---------+",
    "+-- BLOG --+\n|        |\n+----------+", "+-- STAR --+\n|        |\n+----------+"
  ],
  "symbols": [
    "♡", "☆", "★", "✧", "✦", "✩", "✪", "✫", "✬", "✭", "✮", "✯",
    "✰", "❀", "❁", "✿", "♪", "♫", "♬", "♩", "✓", "✕", "✗", "✘",
    "※", "〒", "〄", "〓", "〠", "〶", "→", "←", "↑", "↓", "⇒", "⇐",
    "⇑", "⇓", "⇔", "⇕", "∞", "∴", "∵", "≠", "≤", "≥", "≈", "≡",
    "±", "×", "÷", "√", "∑", "∏", "∫", "∂", "∆", "∇", "⊕", "⊗",
    "⊙", "⊥", "∥", "∠", "∟", "⊂", "⊃", "⊆", "⊇", "∈", "∉", "∋",
    "∅", "⌘", "⌂", "⌃", "⌄", "⌅", "⌆", "⌇", "⌖", "⌗", "⌁", "⌑",
    "⌒", "⌓", "⌔", "⌕", "⌜", "⌝", "⌞", "⌟", "⌠", "⌡", "‐", "‑",
    "‒", "–", "—", "―", "‖", "‗", "‘", "’", "‚", "‛", "“", "”",
    "„", "‟", "†", "‡", "•", "‣", "․", "‥", "…", "‧", "‰", "‱",
    "′", "″", "‴", "‵", "‶", "‷", "‸", "‹", "›", "‽", "‾", "‿",
    "⁀", "⁁", "⁂", "⁃", "⁄", "⁅", "⁆", "⁇", "⁈", "⁊", "⁋", "⁌",
    "⁍", "⁎", "⁏", "⁐", "⁑", "⁒", "⁓", "⁔", "⁕", "⁖", "⁗", "⁘",
    "⁙", "⁚", "⁛", "⁜", "⁝", "⁞", "₠", "₡", "₢", "₣", "₤", "₥",
    "₦", "₧", "₨", "₩", "₪", "₫", "€", "₭", "₮", "₯", "₰", "₱",
    "₲", "₳", "₴", "₵", "₶", "₷", "₸", "₹", "₺", "₻", "₼", "₽",
    "₾", "₿", "⃀", "℀", "℁", "℃", "℄", "℅", "℆", "℈", "℉", "℔",
    "№", "℗", "℘", "℞", "℟", "℠", "℡", "℣", "℥", "℧", "℩", "℮",
    "℺", "℻", "⅀", "⅁", "⅂", "⅃", "⅄", "⅊", "⅋", "⅌", "⅍", "⅏",
    "↚", "↛", "↜", "↝", "↞", "↟", "↠", "↡", "↢", "↣", "↤", "↥",
    "↦", "↧", "↨", "↫", "↬", "↭", "↮", "↯", "↰", "↱", "↲", "↳",
    "↴", "↵", "↶", "↷", "↸", "↹", "↺", "↻", "↼", "↽", "↾", "↿",
    "⇀", "⇁", "⇂", "⇃", "⇄", "⇅", "⇆", "⇇", "⇈", "⇉", "⇊", "⇋",
    "⇌", "⇍", "⇎", "⇏", "⇖", "⇗", "⇘", "⇙", "⇚", "⇛", "⇜", "⇝",
    "⇞", "⇟", "⇠", "⇡", "⇢", "⇣", "⇤", "⇥", "⇦", "⇧", "⇨", "⇩",
    "⇪", "⇫", "⇬", "⇭", "⇮", "⇯", "⇰", "⇱", "⇲", "⇳", "⇴", "⇵",
    "⇶", "⇷", "⇸", "⇹", "⇺", "⇻", "⇼", "⇽", "⇾", "⇿", "∀", "∁",
    "∃", "∄", "∊", "∌", "∍", "∎", "∐", "−", "∓", "∔", "∕", "∖",
    "∗", "∘", "∙", "∛", "∜", "∝", "∡", "∢", "∣", "∤", "∦", "∧",
    "∨", "∩", "∪", "∬", "∭", "∮", "∯", "∰", "∱", "∲", "∳", "∶",
    "∷", "∸", "∹", "∺", "∻", "∼", "∽", "∾", "∿", "≀", "≁", "≂",
    "≃", "≄", "≅", "≆", "≇", "≉", "≊", "≋", "≌", "≍", "≎", "≏",
    "≐", "≑", "≒", "≓", "≔", "≕", "≖", "≗", "≘", "≙", "≚", "≛",
    "≜", "≝", "≞", "≟", "≢", "≣", "≦", "≧", "≨", "≩", "≪", "≫",
    "≬", "≭", "≮", "≯", "≰", "≱", "≲", "≳", "≴", "≵", "≶", "≷",
    "≸", "≹", "≺", "≻", "≼", "≽", "≾", "≿", "⊀", "⊁", "⊄", "⊅",
    "⊈", "⊉", "⊊", "⊋", "⊌", "⊍", "⊎", "⊏", "⊐", "⊑", "⊒", "⊓",
    "⊔", "⊖", "⊘", "⊚", "⊛", "⊜", "⊝", "⊞", "⊟", "⊠", "⊡", "⊢",
    "⊣", "⊤", "⊦", "⊧", "⊨", "⊩", "⊪", "⊫", "⊬", "⊭", "⊮", "⊯",
    "⊰", "⊱", "⊲", "⊳", "⊴", "⊵", "⊶", "⊷", "⊸", "⊹", "⊺", "⊻",
    "⊼", "⊽", "⊾", "⊿", "⋀", "⋁", "⋂", "⋃", "⋄", "⋅", "⋆", "⋇",
    "⋈", "⋉", "⋊", "⋋", "⋌", "⋍", "⋎", "⋏", "⋐", "⋑", "⋒", "⋓",
    "⋔", "⋕", "⋖", "⋗", "⋘", "⋙", "⋚", "⋛", "⋜", "⋝", "⋞", "⋟",
    "⋠", "⋡", "⋢", "⋣", "⋤", "⋥", "⋦", "⋧", "⋨", "⋩", "⋪", "⋫",
    "⋬", "⋭", "⋮", "⋯", "⋰", "⋱", "⋲", "⋳", "⋴", "⋵", "⋶", "⋷",
    "⋸", "⋹", "⋺", "⋻", "⋼", "⋽", "⋾", "⋿", "⌀", "⌈", "⌉", "⌊",
    "⌋", "⌌", "⌍", "⌎", "⌏", "⌐", "⌙", "⌢", "⌣", "⌤", "⌥", "⌦",
    "⌧", "〈", "〉", "⌫", "⌬", "⌭", "⌮", "⌯", "⌰", "⌱", "⌲", "⌳",
    "⌴", "⌵", "⌶", "⌷", "⌸", "⌹", "⌺", "⌻", "⌼", "⌽", "⌾", "⌿",
    "⍀", "⍁", "⍂", "⍃", "⍄", "⍅", "⍆", "⍇", "⍈", "⍉", "⍊", "⍋",
    "⍌", "⍍", "⍎", "⍏", "⍐", "⍑", "⍒", "⍓", "⍔", "⍕", "⍖", "⍗",
    "⍘", "⍙", "⍚", "⍛", "⍜", "⍝", "⍞", "⍟", "⍠", "⍡", "⍢", "⍣",
    "⍤", "⍥", "⍦", "⍧", "⍨", "⍩", "⍪", "⍫", "⍬", "⍭", "⍮", "⍯",
    "⍰", "⍱", "⍲", "⍳", "⍴", "⍵", "⍶", "⍷", "⍸", "⍹", "⍺", "⍻",
    "⍼", "⍽", "⍾", "⍿", "⎀", "⎁", "⎂", "⎃", "⎄", "⎅", "⎆", "⎇",
    "⎈", "⎉", "⎊", "⎋", "⎌", "⎍", "⎎", "⎏", "⎐", "⎑", "⎒", "⎓",
    "⎔", "⎕", "⎖", "⎗", "⎘", "⎙", "⎚", "⎛", "⎜", "⎝", "⎞", "⎟",
    "⎠", "⎡", "⎢", "⎣", "⎤", "⎥", "⎦", "⎧", "⎨", "⎩", "⎪", "⎫",
    "⎬", "⎭", "⎮", "⎯"
  ]
  };


  const emoCategories = ["happy", "love", "sad", "angry", "animal", "action", "etc"];
  const categoryLabels = {
    happy: "기쁨/신남", love: "사랑/하트", sad: "슬픔/눈물", angry: "분노/황당",
    animal: "동물/귀염", action: "인사/응원", etc: "기타/특수", ascii: "아스키아트", symbols: "특수기호"
  };
  const ALL_CHUNK_SIZE = 180;
  let toastTimer = null;
  let activeCategory = "happy";
  let activeList = [];
  let renderedCount = 0;

  function getItems(category) {
    if (category === "all") {
      const merged = [];
      emoCategories.forEach(cat => {
        emoData[cat].forEach(text => merged.push({ text, cat }));
      });
      return merged;
    }
    return (emoData[category] || []).map(text => ({ text, cat: category }));
  }

  function createItem(item) {
    const btn = document.createElement("div");
    btn.className = "emo-item";
    if (item.cat === "ascii") btn.classList.add("ascii-item");
    if (item.cat === "symbols") btn.classList.add("symbol-item");
    btn.textContent = item.text;
    btn.title = item.text;
    btn.onclick = function() { copyText(item.text); };
    return btn;
  }

  function appendItems(limit) {
    const container = document.getElementById("emo-grid-container");
    if (!container) return;
    const end = Math.min(renderedCount + limit, activeList.length);
    const fragment = document.createDocumentFragment();
    for (let i = renderedCount; i < end; i++) fragment.appendChild(createItem(activeList[i]));
    container.appendChild(fragment);
    renderedCount = end;
    updateCountNote();
    requestAnimationFrame(updateCustomScrollbar);
  }

  function renderEmo(category) {
    const container = document.getElementById("emo-grid-container");
    if (!container) return;
    activeCategory = category;
    activeList = getItems(category);
    renderedCount = 0;
    container.innerHTML = "";
    container.scrollTop = 0;
    container.classList.toggle("ascii-mode", category === "ascii");
    container.classList.toggle("symbol-mode", category === "symbols");

    // 전체 탭만 180개씩 추가 렌더링. 그 외에는 선택한 카테고리만 출력.
    if (category === "all") appendItems(ALL_CHUNK_SIZE);
    else appendItems(activeList.length);
  }

  function updateCountNote() {
    const note = document.getElementById("emo-count-note");
    if (!note) return;
    if (activeCategory === "all") {
      note.textContent = `전체 텍스트 이모티콘 ${activeList.length.toLocaleString()}개 중 ${renderedCount.toLocaleString()}개 표시 · 아래로 내리면 계속 불러옵니다.`;
    } else {
      note.textContent = `${categoryLabels[activeCategory] || "목록"} ${activeList.length.toLocaleString()}개`;
    }
  }

  function maybeLoadMore() {
    const container = document.getElementById("emo-grid-container");
    if (!container || activeCategory !== "all" || renderedCount >= activeList.length) return;
    if (container.scrollTop + container.clientHeight >= container.scrollHeight - 220) appendItems(ALL_CHUNK_SIZE);
  }

  function updateCustomScrollbar() {
    const container = document.getElementById("emo-grid-container");
    const thumb = document.getElementById("custom-scroll-thumb");
    const track = document.getElementById("custom-scroll-track");
    if (!container || !thumb || !track) return;
    const scrollHeight = container.scrollHeight;
    const clientHeight = container.clientHeight;
    if (scrollHeight <= clientHeight) { track.style.display = "none"; return; }
    track.style.display = "block";
    const thumbRatio = clientHeight / scrollHeight;
    const thumbHeight = Math.max(track.clientHeight * thumbRatio, 25);
    thumb.style.height = thumbHeight + "px";
    const maxScrollTop = scrollHeight - clientHeight;
    const maxTrackTop = track.clientHeight - thumbHeight;
    const translateTop = maxScrollTop > 0 ? (container.scrollTop / maxScrollTop) * maxTrackTop : 0;
    thumb.style.transform = `translateY(${translateTop}px)`;
  }

  window.filterEmo = function(category, element) {
    document.querySelectorAll(".emo-tab-group .emo-tab-btn").forEach(btn => btn.classList.remove("active"));
    if (element) element.classList.add("active");
    renderEmo(category);
  };

  function copyText(text) {
    if (navigator.clipboard && window.isSecureContext) {
      navigator.clipboard.writeText(text).then(function() { showToast('복사되었습니다!'); }).catch(function() { fallbackCopy(text); });
    } else fallbackCopy(text);
  }

  function fallbackCopy(text) {
    const textarea = document.createElement("textarea");
    textarea.value = text;
    textarea.style.position = "fixed";
    textarea.style.opacity = "0";
    document.body.appendChild(textarea);
    textarea.focus(); textarea.select();
    try { document.execCommand("copy"); showToast('복사되었습니다!'); }
    catch (err) { alert("복사에 실패했습니다."); }
    document.body.removeChild(textarea);
  }

  function showToast(msg) {
    const toast = document.getElementById("emo-toast");
    if (!toast) return;
    toast.textContent = msg;
    toast.classList.add("show");
    if (toastTimer) clearTimeout(toastTimer);
    toastTimer = setTimeout(function() { toast.classList.remove("show"); }, 1500);
  }

  function init() {
    const container = document.getElementById("emo-grid-container");
    if (container) {
      renderEmo("happy");
      const happyBtn = document.querySelector('.emo-tab-btn[data-cat="happy"]');
      if (happyBtn) happyBtn.classList.add("active");
      container.addEventListener("scroll", function() { maybeLoadMore(); updateCustomScrollbar(); }, { passive: true });
      window.addEventListener("resize", updateCustomScrollbar);
    } else setTimeout(init, 50);
  }

  if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", init);
  else init();
})();
</script>



<h2 class="wp-block-heading">클릭 한 번으로 복사해서 바로 사용하세요</h2>



<p class="wp-block-paragraph">블로그 포스팅, 인스타그램 피드, 유튜브 댓글, 오픈채팅 등에서 활용할 수 있는 <strong>텍스트 이모티콘, 아스키아트, 특수기호</strong>를 한곳에 모았습니다.</p>



<p class="wp-block-paragraph">원하는 항목을 클릭하면 클립보드에 바로 복사되기 때문에 별도로 드래그하거나 선택할 필요 없이 원하는 곳에 바로 붙여넣을 수 있습니다.</p>



<p class="wp-block-paragraph">기쁨, 사랑, 슬픔, 귀여운 동물 표현부터 다양한 아스키아트와 하트·별·화살표 등의 특수기호까지 카테고리별로 찾아보실 수 있습니다.</p>



<h3 class="wp-block-heading">SNS 글과 제목을 간단하게 꾸며보세요</h3>



<ul class="wp-block-list">
<li><strong>제목 포인트 주기:</strong> 제목이나 소제목 앞뒤에 텍스트 이모티콘이나 특수문자를 넣으면 평범한 문장을 조금 더 눈에 띄게 꾸밀 수 있습니다.</li>



<li><strong>본문 꾸미기:</strong> 문단 사이에 이모티콘이나 특수기호를 적절히 사용하면 긴 글도 조금 더 재미있게 표현할 수 있습니다.</li>



<li><strong>SNS 프로필·댓글 활용:</strong> 인스타그램, 유튜브, 커뮤니티, 메신저 등 텍스트를 입력할 수 있는 다양한 곳에서 사용할 수 있습니다.</li>



<li><strong>아스키아트 복사:</strong> 여러 줄로 구성된 아스키아트도 클릭 한 번으로 전체 내용을 복사할 수 있습니다.</li>
</ul>



<h3 class="wp-block-heading">자주 묻는 질문 (FAQ)</h3>



<p class="wp-block-paragraph"><strong>Q. 모바일에서도 사용할 수 있나요?</strong><br>A. 네. 아이폰과 안드로이드 스마트폰은 물론 Windows와 macOS에서도 사용할 수 있습니다. 대부분 유니코드 기반의 텍스트 특수문자로 구성되어 있어 별도의 앱이나 폰트 설치 없이 사용할 수 있습니다.</p>



<p class="wp-block-paragraph">다만 일부 복잡한 특수문자는 사용하는 기기, 운영체제 또는 폰트에 따라 모양이 조금 다르게 표시될 수 있습니다.</p>



<p class="wp-block-paragraph"><strong>Q. 이모티콘을 어떻게 복사하나요?</strong><br>A. 원하는 이모티콘이나 특수문자를 클릭하면 자동으로 클립보드에 복사됩니다. 이후 입력창에서 <strong>붙여넣기</strong>를 선택하거나 PC에서는 <code>Ctrl + V</code>, Mac에서는 <code>Cmd + V</code>를 사용하시면 됩니다.</p>



<p class="wp-block-paragraph"><strong>Q. 아스키아트도 그대로 복사되나요?</strong><br>A. 네. 여러 줄로 만들어진 아스키아트도 클릭하면 줄바꿈을 포함한 전체 내용이 한 번에 복사됩니다. 다만 사용하는 앱에 따라 글꼴이나 줄 간격이 달라 모양이 조금 달라질 수 있습니다.</p>



<p class="wp-block-paragraph"><strong>Q. 별도의 프로그램을 설치해야 하나요?</strong><br>A. 아니요. 웹브라우저에서 바로 사용할 수 있으며 회원가입이나 프로그램 설치도 필요하지 않습니다.</p>



<h3 class="wp-block-heading">함께 사용하면 좋은 무료 도구</h3>



<ul class="wp-block-list">
<li><a href="https://snsnote.com/image-converter/" target="_blank" rel="noreferrer noopener">무료 이미지 변환기 JPG·PNG·WebP</a></li>



<li><a href="https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%ed%8f%b0%ed%8a%b8-%ea%b8%80%ec%94%a8%ec%b2%b4-%eb%b3%80%ed%99%98%ea%b8%b0/" target="_blank" rel="noreferrer noopener">예쁜 글씨체 변환기</a></li>



<li><a href="https://snsnote.com/image-color-picker/" target="_blank" rel="noreferrer noopener">이미지 색상 추출기</a></li>
</ul>



<style>
  /* 이 글에서만 본문 상단 대표 이미지 숨기기 */
  .featured-image, 
  .post-thumbnail, 
  .entry-header .post-image,
  .single-media {
    display: none !important;
  }
</style>
<div class="saboxplugin-wrap" itemtype="http://schema.org/Person" itemscope itemprop="author"><div class="saboxplugin-tab"><div class="saboxplugin-gravatar"><img loading="lazy" decoding="async" src="https://snsnote.com/wp-content/uploads/2026/06/5555.png" width="100"  height="100" alt="" itemprop="image"></div><div class="saboxplugin-authorname"><a href="https://snsnote.com/author/admin/" class="vcard author" rel="author"><span class="fn">JH</span></a></div><div class="saboxplugin-desc"><div itemprop="description"><p>SNSnote 편집 담당 JH입니다.2020년부터 SNS를 본격적으로 운영하기 시작해 현재 인스타그램, 유튜브, X를 합쳐 총 40만 팔로워를 보유하고 있습니다.영구정지 복구, 계정 성장, 수익화까지 직접 경험한 실패와 성공 사례를 바탕으로 실전에서 바로 활용할 수 있는 최신 정보를 전달하고 있습니다.최근에는 <strong>AI와 웹 기술을 활용한 브라우저 기반 도구를 직접 기획·개발하며</strong>, 사진·영상·문서·SNS 업무에 바로 사용할 수 있는 무료 온라인 도구도 함께 제공하고 있습니다.</p>
</div></div><div class="saboxplugin-web "><a href="https://snsnote.com" target="_self">snsnote.com</a></div><div class="clearfix"></div></div></div>]]></content:encoded>
					
					<wfw:commentRss>https://snsnote.com/emoticon-list/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
	<media:content url="https://snsnote.com/wp-content/uploads/2026/08/emoticon-list.jpg" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">1195</post-id>	</item>
		<item>
		<title>인스타그램 지적재산권 계정 차단 30일만에 복구 했던 해결 방법</title>
		<link>https://snsnote.com/instagram-intellectual-property/</link>
					<comments>https://snsnote.com/instagram-intellectual-property/#respond</comments>
		
		<dc:creator><![CDATA[JH]]></dc:creator>
		<pubDate>Sat, 25 Jul 2026 13:14:59 +0000</pubDate>
				<category><![CDATA[인스타그램]]></category>
		<guid isPermaLink="false">https://snsnote.com/?p=954</guid>

					<description><![CDATA[워드프레스 오른쪽 사이드바의 [요약(Excerpt)] 칸에 바로 복사해서 붙여넣으실 수 있는 요약문입니다.

검색 결과(SERP) 노출 시 클릭률을 높이고 포커스 키워드가 자연스럽게 들어가도록 약 120~150자 내외로 깔끔하게 작성해 드립니다.

✍️ 워드프레스 요약문 (복사용)
인스타그램 지적재산권 및 저작권·상표권 위반으로 인한 계정 차단과 영구정지 발생 시 30일 만에 복구한 실전 경험담입니다. 메타 AI 오판 단속 패턴, 유료 블루뱃지 상담사의 한계, 그리고 우체국 내용증명을 활용해 실제 재검토 부서로 소명하는 법과 예방 수칙을 정리했습니다.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">인스타그램 지적재산권 관련해여 계정이 차단되거나 게시물이 삭제되는 상황이 점점 더 많아지고 있습니다.<br>저 또한 6개의 인스타그램을 6년 넘게 운영하며 지적재산권 계정 차단을 경험한 적이 있습니다.<br>정보성 관련 계정을 운영 해보신 분들이라면 꼭 지적재산권, 저작권, 상표권, 독창성 가이드라인 위반으로 인한 게시물 삭제 경험을 해보셨을거라 생각합니다.<br><br>인스타그램 메타 AI 검열이 강화됨이 따라 오류 판정 또한 많아지고 있어 이를 100% 회피 할 순 없지만 블루뱃지 수 많은 블루 뱃지 상담을 통해 메타 한국 직원에게 공식적으로 들었던 답변과 복구방법, 앞으로의 인스타그램 운영 방법에 대해 알려드리겠습니다.</p>





<h2 class="wp-block-heading">인스타그램 지적재산권으로 인한 계정 차단 및 복구 기간</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="678" src="https://snsnote.com/wp-content/uploads/2026/07/인스타그램-지적재산권으로-인한-계정-차단-및-복구-기간-1024x678.jpg" alt="인스타그램 지적재산권으로 인한 계정 차단 및 복구 기간" class="wp-image-955" srcset="https://snsnote.com/wp-content/uploads/2026/07/인스타그램-지적재산권으로-인한-계정-차단-및-복구-기간-1024x678.jpg 1024w, https://snsnote.com/wp-content/uploads/2026/07/인스타그램-지적재산권으로-인한-계정-차단-및-복구-기간-300x199.jpg 300w, https://snsnote.com/wp-content/uploads/2026/07/인스타그램-지적재산권으로-인한-계정-차단-및-복구-기간-768x509.jpg 768w, https://snsnote.com/wp-content/uploads/2026/07/인스타그램-지적재산권으로-인한-계정-차단-및-복구-기간.jpg 1170w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">인스타그램 지적재산권으로 인한 계정 차단</figcaption></figure>



<p class="wp-block-paragraph">25년 11월 14일 인스타그램 지적재산권 게시물 3개가 삭제 이후 계정 차단으로 까지 이어졌습니다.<br>이는 확실한 AI의 오판이며 다른 블루뱃지 계정으로 상담신청을 하였습니다.</p>



<h3 class="wp-block-heading">인스타그램 블루뱃지 상담사의 답변</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">요청하신 Instagram 계정(@)에 대해 확인한 결과와 관련 정책을 안내해 드립니다.<br>사용자님께서 이미 재고 요청(Appeal)을 제출하셨고, 그 결과가 &#8220;복구 불가&#8221;로 결정되었다면 이는 Meta의 최종적인 정책 결정에 해당합니다. 시스템상으로도 확인해 본 결과, 이미 최종 검토가 완료되어 해당 결정이 내려진 경우 이 지원 채널을 통해서는 추가적인 재검토나 복구 절차를 진행하는 것이 불가능합니다.</p>



<p class="wp-block-paragraph"><br>계정이 정지되는 주요 사유는 다음과 같으나, 구체적인 위반 항목은 보안 및 개인정보 보호 정책상 상세히 공개되지 않을 수 있습니다:<br>커뮤니티 가이드라인 위반: 스팸, 괴롭힘, 부적절한 콘텐츠 게시 등<br>사칭 또는 허위 정보: 타인을 사칭하거나 계정 정보를 허위로 기재한 경우<br>지적 재산권 침해: 타인의 저작권이나 상표권을 반복적으로 침해한 경우</p>



<p class="wp-block-paragraph"><br>안내 사항:<br>최종 결정: 재고 요청이 거부된 경우, 해당 계정은 영구적으로 비활성화되며 다시 활성화할 수 없습니다.<br>데이터 접근: 계정이 영구 정지되면 해당 계정의 사진, 팔로워, 메시지 등 모든 데이터에 더 이상 접근할 수 없습니다.<br>새 계정 생성: 새로운 이메일 주소로 새 계정을 만드실 수 있으나, 기존에 사용하시던 사용자명(@)은 위반 사유에 따라 다시 사용하지 못할 수도 있습니다.</p>



<p class="wp-block-paragraph"><br>자세한 내용은 를 참고해 주시기 바랍니다. 오랜 시간 운영해오신 계정이라 상심이 크시겠지만, 현재로서는 해당 결정이 번복되기 어려운 점 너그러운 양해 부탁드립니다.<br>추가로 궁금하신 점이 있으신가요?</p>
</blockquote>



<p class="wp-block-paragraph">총 10회가 넘는 유료 블루뱃지 1:1 지원 채널 상담을 시도해 본 결과, 한국인 상담사와 해외 담당자 모두 매뉴얼에 따른 동일한 답변만을 기계적으로 반복했습니다. 그들이 공통적으로 밝힌 핵심은 &#8220;블루뱃지 전담 고객센터 지원팀은 계정 제재 및 보안을 담당하는 내통 법무팀이나 재검토 승인 부서와 소통할 수 있는 권한이 완전히 차단되어 있다&#8221;는 사실이었습니다.</p>



<p class="wp-block-paragraph">즉, 블루뱃지 유료 구독을 통해 상담사에게 억울함을 호소하고 스크린샷을 보낸다 한들, 그 상담사가 직접 내 계정의 정지를 풀어주거나 담당 부서에 &#8216;부탁&#8217;을 넣어줄 수 있는 구조가 아닙니다. 이미 시스템상 &#8216;복구 불가&#8217;로 락(Lock)이 걸린 계정은 상담사 화면에서도 조작 버튼 자체가 활성화되지 않기 때문에, 일반적인 대화나 요청만으로는 한계가 명확하다는 점을 먼저 인지해야 합니다.</p>



<h3 class="wp-block-heading">인스타그램 지적재산권으로 인한 계정 복구</h3>



<div class="wp-block-group is-layout-grid wp-container-core-group-is-layout-28b052f3 wp-block-group-is-layout-grid">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="472" height="1024" src="https://snsnote.com/wp-content/uploads/2026/06/인스타그램-계정-복구-방법-블루뱃지-상담-다음에서-변환-jpg-472x1024.webp" alt="인스타그렘 계정 차단 및 영구정지 강제비활성화 이후 복구를 위한 브루뱃지 상담 신청" class="wp-image-630" srcset="https://snsnote.com/wp-content/uploads/2026/06/인스타그램-계정-복구-방법-블루뱃지-상담-다음에서-변환-jpg-472x1024.webp 472w, https://snsnote.com/wp-content/uploads/2026/06/인스타그램-계정-복구-방법-블루뱃지-상담-다음에서-변환-jpg-138x300.webp 138w, https://snsnote.com/wp-content/uploads/2026/06/인스타그램-계정-복구-방법-블루뱃지-상담-다음에서-변환-jpg.webp 590w" sizes="auto, (max-width: 472px) 100vw, 472px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="471" height="1024" src="https://snsnote.com/wp-content/uploads/2026/06/6-471x1024.png" alt="인스타그램 지적재산권 계정 차단 30일만에 복구 했던 해결 방법, 블루뱃지 상담사에게 내용증명 전달 후 복구 된 메세지" class="wp-image-570" srcset="https://snsnote.com/wp-content/uploads/2026/06/6-471x1024.png 471w, https://snsnote.com/wp-content/uploads/2026/06/6-138x300.png 138w, https://snsnote.com/wp-content/uploads/2026/06/6-768x1670.png 768w, https://snsnote.com/wp-content/uploads/2026/06/6-706x1536.png 706w, https://snsnote.com/wp-content/uploads/2026/06/6-942x2048.png 942w, https://snsnote.com/wp-content/uploads/2026/06/6-scaled.png 1177w" sizes="auto, (max-width: 471px) 100vw, 471px" /></figure>
</div>



<p class="wp-block-paragraph">하지만 계정 정지된 이후 메타에 내용증명을 작성해서 보냈고 10번이 넘는 블루뱃지 상담 끝에 1개월 후 계정 복구까지 할 수 있엇습니다.<br><br>이는 인스타그램 블루뱃지 상담사의 공식 답변과 현재까지 많은 분들이 재고 요청 이후 영구 계정 차단까지 갔을때 해결 했던 방법 총 3가지로 좁힐 수 있습니다.</p>



<h2 class="wp-block-heading">인스타그램 계정 차단 해결 방법</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="637" src="https://snsnote.com/wp-content/uploads/2026/07/인스타그램-지적재산권으로-인한-계정-차단-및-복구-완료-1024x637.jpg" alt="인스타그램 계정 차단 해결 방법, 내용증명을 통한 AI오판임을 증명하기" class="wp-image-956" srcset="https://snsnote.com/wp-content/uploads/2026/07/인스타그램-지적재산권으로-인한-계정-차단-및-복구-완료-1024x637.jpg 1024w, https://snsnote.com/wp-content/uploads/2026/07/인스타그램-지적재산권으로-인한-계정-차단-및-복구-완료-300x187.jpg 300w, https://snsnote.com/wp-content/uploads/2026/07/인스타그램-지적재산권으로-인한-계정-차단-및-복구-완료-768x478.jpg 768w, https://snsnote.com/wp-content/uploads/2026/07/인스타그램-지적재산권으로-인한-계정-차단-및-복구-완료.jpg 1170w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">인스타그램 계정 차단 해결 전 인스타그램 지적재산권이란 무엇인지 먼저 알아가야 할 필요가 있습니다.<br>너무 포괄적인 메타의 공식 정책이지만 추후 계정이 복구 되고 앞으로 조심해야할 부분이 무엇인지 알아야 영구 정지, 강제 비활성화를 예방 할 수 있기 때문입니다.</p>



<h3 class="wp-block-heading">인스타그램 지적재산권이란?</h3>



<p class="wp-block-paragraph">인스타그램에서 말하는 <strong>지적재산권(Intellectual Property, IP)</strong> 위반이란, 타인이 소유한 저작물이나 상표권을 권리자의 허가 없이 무단으로 사용, 재가공, 또는 유포했을 때 발생하는 플랫폼 가이드라인 위반 행위를 의미합니다.</p>



<p class="wp-block-paragraph">특히 정보성 계정, 큐레이션 계정, 공구/커머스 계정을 운영할 때 가장 흔하게 발생하는 지적재산권 제재는 크게 두 가지로 나뉩니다.</p>



<ul class="wp-block-list">
<li><strong>저작권(Copyright) 위반:</strong> 타인이 제작한 사진, 영상(릴스), 음악, 폰트, 디자인 템플릿, 뉴스 기사 이미지 등을 출처 표기 없이 또는 출처를 표기했더라도 무단으로 가져와 게시한 경우</li>



<li><strong>상표권(Trademark) 위반:</strong> 유명 브랜드의 로고, 로고가 박힌 제품 사진, 브랜드명이나 캐릭터를 상업적 목적(공구, 마케팅, 모방 제품 판매 등)으로 무단 도용한 경우</li>
</ul>



<p class="wp-block-paragraph">최근 메타(Meta)는 AI 단속 시스템을 지속적으로 강화하면서, 사람이 직접 신고하지 않더라도 <strong>Grok 및 메타 AI 알고리즘이 이미지 유사도와 음원, 텍스트를 실시간으로 스캔해 자동으로 게시물을 삭제하거나 계정을 일시 차단</strong>하고 있습니다. 이로 인해 단순 인용이나 억울한 오판으로 인한 제재 피해도 급증하는 추세입니다.</p>



<h4 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 메타/인스타그램 공식 지적재산권 도움말 링크</h4>



<ul class="wp-block-list">
<li>인스타그램 저작권(Copyright) 센터:<br><a href="https://help.instagram.com/745146219025379/?helpref=uf_share" target="_blank" rel="noopener">https://help.instagram.com/745146219025379/?helpref=uf_share</a></li>
</ul>



<h3 class="wp-block-heading">인스타그램 지적재산권을 침해하지 않았다는 내용증명 보내기</h3>



<p class="wp-block-paragraph">인스타그램에서 계정 차단 이후 재고 요청 화면에서 자신의 정지 관련된 소명을 작성할 수 있는 칸이 없기 때문에,<br>단순한 재고요청 이후엔 바로 영구정지로 이어질 가능성이 높습니다.<br>때문에 인스타그램의 소속인 메타커뮤니케이션에이전트에 내용증명을 보내서 소명해야합니다.<br><br>우체국 내용증명 신청란을 통해 보낼 수 있고 변호사를 통해서 보낼 수 있습니다.<br>개인으로 혼자 보내는 것도 10분이면 금방 보낼 수 있기 때문에 먼저 인스타그램 계정이 차단되었다면 즉시 온라인으로 내용증명을 보내시는걸 추천드립니다.<br><br>내용증명이 제작되고 발송되는 시간도 존재하기 때문에 온라인으로 빨리 보내는게 1순위입니다.</p>



<h4 class="wp-block-heading">우체국 내용증명 혼자 쉽게 보내는 방법</h4>



<ul class="wp-block-list">
<li><a href="https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%ec%98%81%ea%b5%ac%ec%a0%95%ec%a7%80-%eb%b3%b5%ea%b5%ac-%ec%84%b1%ea%b3%b5%ed%95%9c-%ec%8d%b0%ea%b3%bc-%eb%82%b4%ec%9a%a9%ec%a6%9d%eb%aa%85-%eb%b3%b4/">인스타그램 영구정지 내용증명 작성 매뉴얼</a></li>
</ul>



<p class="wp-block-paragraph">우체국 인터넷 내용증명 시스템을 이용하면 변호사나 법무사의 비싼 수수료를 들이지 않고도 개인 혼자서 10분 내외로 손쉽게 작성하여 발송할 수 있습니다.</p>



<p class="wp-block-paragraph">내용증명을 작성할 때 가장 중요한 핵심은 &#8216;감정적인 호소&#8217;가 아닌 &#8216;법적 소명 자격과 객관적 증빙&#8217;입니다. 내가 작성한 콘텐츠가 원작자의 저작권을 침해하지 않았다는 원본 컨텐츠라는 소명, 직접 제작한 디자인 작업 내역, 그리고 해당 계정이 메타의 커뮤니케이션 가이드라인을 준수해 온 클린 계정임을 입증하는 서식 양식이 필수적입니다.</p>



<p class="wp-block-paragraph">복잡한 법률 용어를 몰라도 바로 복사해서 내 계정 정보만 입력할 수 있도록 완벽하게 정리된 매뉴얼과 작성 양식을 제공해 드리고 있으니, 계정이 차단된 직후 더 이상 시간이 지체되기 전에 즉시 우체국 온라인 내용증명을 발송하시는 것을 강력히 권장합니다.</p>



<h3 class="wp-block-heading">인스타그램 지적재산권 블루뱃지 상담을 통해 항소하기</h3>



<p class="wp-block-paragraph">블루뱃지 상담은 첫달 무료이기 때문에 부계정으로 신청후 상담을 진행하시면 됩니다.<br>다만 블루뱃지 상담을 10번넘게 시도한 결과 블루뱃지 상담사가 계정을 조회 할 수있는 최대한의 단계가 존재하며 먼저 메타에 내용증명이 전달되고 재검토가 이뤄지고 있어야 한다는 점입니다.</p>



<p class="wp-block-paragraph">내용증명이 전달되기 전까지는 그 어떠한 문의를 해도 본 계정은 검토가 완료되어 복구가 불가능하다는 답변뿐이었지만<br><br>시간이 지나 내용증명이 전달되었는지 블루뱃지 상담사의 답변이 바뀌었습니다.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="471" height="1024" src="https://snsnote.com/wp-content/uploads/2026/07/내용증명이-전달되고-검토중이-계정일때-답변-471x1024.webp" alt="인스타그램 지적재산권 계정 차단으로 인해 블루뱃지 상담 신청, 문의 해결을 위한 계정 검토요청 성공적으로 접수 완료되었다는 답장" class="wp-image-957" srcset="https://snsnote.com/wp-content/uploads/2026/07/내용증명이-전달되고-검토중이-계정일때-답변-471x1024.webp 471w, https://snsnote.com/wp-content/uploads/2026/07/내용증명이-전달되고-검토중이-계정일때-답변-138x300.webp 138w, https://snsnote.com/wp-content/uploads/2026/07/내용증명이-전달되고-검토중이-계정일때-답변-768x1670.webp 768w, https://snsnote.com/wp-content/uploads/2026/07/내용증명이-전달되고-검토중이-계정일때-답변-707x1536.webp 707w, https://snsnote.com/wp-content/uploads/2026/07/내용증명이-전달되고-검토중이-계정일때-답변.webp 942w" sizes="auto, (max-width: 471px) 100vw, 471px" /><figcaption class="wp-element-caption">문의 해결을 위한 계정 검토요청 성공적으로 접수 완료되었다는 답장</figcaption></figure>
</div>


<p class="wp-block-paragraph">내용증명이 전달되었는지 계정 검토요청이 접수완료되었다는 내용의 메세지를 받았습니다.<br>이후 계정 복구 관련되어서 어떠한 요청으로 인해 재 검토 요청이 접수되었는지 물어봤지만 역시 블루뱃지 상담사 권한 밖이라 알려주지 않았습니다.</p>



<h4 class="wp-block-heading">블루뱃지 상담사가 조회할 수 있는 계정 상태</h4>



<p class="wp-block-paragraph">여기서 알 수 있는건 블루뱃지 상담사가 조회할 수 있는 계정 상태는 3가지입니다.</p>



<ol class="wp-block-list">
<li>계정 검토 요청을 할 수 없는 계정</li>



<li>내용증명 혹은 문제신고를 통해 검토 요청이 가능한 계정</li>



<li>내용증명 혹은 문제신고를 통해 검토 진행 중인 계정</li>
</ol>



<p class="wp-block-paragraph">인스타그램 블루뱃지 상담사는 이 3가지 유형만 조회할 수 있으며 그에 따른 매뉴얼로 기계적인 답변만 할 수 있는 듯합니다.</p>



<h2 class="wp-block-heading">인스타그램 계정 복구 매커니즘</h2>



<p class="wp-block-paragraph">결국 인스타그램 계정 복구의 진짜 핵심 메커니즘은 &#8220;상담사에게 애원하는 것&#8221;이 아니라 &#8220;메타의 실제 재검토 처리 부서로 내 소명 서류(내용증명)가 실질적으로 접수되게 만드는 것&#8221;입니다.</p>



<p class="wp-block-paragraph">내용증명이 메타 커뮤니케이션 에이전트 한국 법무 담당팀에 물리적으로 전달되면, 내부 시스템상 해당 계정의 상속 상태가 &#8216;최종 영구정지&#8217;에서 &#8216;법적 소명 재검토 진행 중&#8217; 단계로 상태값이 전환됩니다. 이 시점이 되어서야 비로소 블루뱃지 상담사가 내 계정을 조회했을 때 &#8220;검토 요청이 성공적으로 접수되어 진행 중&#8221;이라는 변경된 상태창을 확인하게 되며, 이 상태에서 비로소 상부 이관을 통한 복구 승인 절차가 이루어지게 됩니다.<br><br>때문에 나의 내용증명 혹은 문제신고가 재검토 가능한 팀에 전달 되어야만 블루뱃지 상담을 통해서 계정 상태를 체크하고 계정 차단을 풀어주는 매커니즘인듯합니다.</p>



<h2 class="wp-block-heading"><strong>인스타그램 지적재산권 정지를 예방하는 4가지 안전 운영 수칙</strong></h2>



<p class="wp-block-paragraph">계정이 어렵게 복구되었더라도, 메타 AI의 단속 알고리즘은 지속적으로 강화되고 있으므로 추후 동일한 사유로 재제출되는 것을 막아야 합니다.</p>



<ul class="wp-block-list">
<li><strong>1. 출처 표기만으로 안심하지 않기:</strong> 많은 분들이 &#8220;출처: XX&#8221;라고 적으면 괜찮을 것이라 생각하지만, 원저작권자의 서면 동의가 없는 재가공은 언제든 저작권 침해로 신고되거나 AI 스캔에 걸릴 수 있습니다.</li>



<li><strong>2. 유명 브랜드 로고 및 폰트 라이선스 점검:</strong> 상업적 목적(공구, 제품 홍보, 큐레이션)으로 제작하는 콘텐츠의 경우 무료 폰트의 상업적 이용 범위와 로고 노출 여부를 반드시 체크하세요.</li>



<li><strong>3. 2차 재가공 릴스/이미지 사용 자제:</strong> 틱톡이나 유튜브 숏폼 등 타 플랫폼에서 바이럴된 영상을 그대로 다운로드받아 인스타그램에 재업로드하는 행위는 독창성 위반 및 지적재산권 제재의 1순위 대상입니다.</li>



<li><strong>4. 주기적인 계정 상태(Account Status) 체크:</strong> [설정] > [도움말] > [계정 상태] 메뉴에 들어가 내 게시물 중 노출 제한이나 경고를 받은 내역이 있는지 주 1회 이상 점검하고, 경고가 누적되기 전에 선제적으로 수정하시기 바랍니다.</li>
</ul>



<h2 class="wp-block-heading">인스타그램 지적재산권 위반 방지를 위한 필수 체크리스트</h2>



<p class="wp-block-paragraph">콘텐츠를 제작하고 발행 버튼을 누르기 전, AI 검열 알고리즘의 오판 및 지적재산권 침해 제재를 사전에 차단하기 위한 5가지 필수 실전 체크리스트입니다.</p>



<h3 class="wp-block-heading">음원 라이선스 및 상업적 사용 권한 체크</h3>



<p class="wp-block-paragraph">음원 라이선스 및 상업적 사용 권한 체크 인스타그램 내에서 제공하는 음원(BGM)이라 할지라도 비즈니스 계정이나 크리에이터 계정의 성격에 따라 상업적 이용이 제한될 수 있습니다. 특히 음원에 저작권 경고가 발생하면 음원 삭제를 넘어 게시물 전체 삭제로 이어지므로, 비즈니스 계정은 인스타그램 사운드 컬렉션의 상업용 음원이나 무제한 라이선스를 보유한 외주 음원 사이트를 활용하세요.</p>



<h3 class="wp-block-heading">3자 브랜드 제품 및 패키징 노출 여부 체크</h3>



<p class="wp-block-paragraph">3자 브랜드 제품 및 패키징 노출 여부 체크 리뷰나 큐레이션 글을 작성할 때 특정 브랜드의 제품 패키지, 상표, 고유한 디자인 구조가 메인 화면에 크게 노출되면 상표권 침해 신고 대상이 될 수 있습니다. 상업적 협찬이나 공식 제휴 게시물이 아니라면 브랜드 로고 영역은 흐림 처리(블러)를 하거나 구도를 조정해 촬영하는 것이 안전합니다.</p>



<h3 class="wp-block-heading">텍스트 및 프롬프트의 100% 오리지널성 체크</h3>



<p class="wp-block-paragraph">텍스트 및 프롬프트의 100% 오리지널성 체크 다른 유저의 카드뉴스 텍스트나 보도자료 문장을 그대로 복사해서 배치하면 AI가 문맥 유사도를 판단하여 중복 및 도용 콘텐츠로 분류합니다. 타인의 정보나 이슈를 다룰 때는 전달하고자 하는 핵심 사실만 추출한 뒤, 본인만의 시각과 해설을 담은 완전한 새 문장으로 가공해서 작성해야 합니다.</p>



<h3 class="wp-block-heading">초상권 및 일반인 노출 보호 체크</h3>



<p class="wp-block-paragraph">초상권 및 일반인 노출 보호 체크 지적재산권(저작권 및 상표권) 외에도 타인의 얼굴이나 개인 식별 정보가 포함된 사진 및 영상을 무단 사용하는 경우 퍼블리시티권 및 초상권 침해로 신고되어 즉시 게시물이 삭제될 수 있습니다. 야외 촬영이나 뉴스 인용 시 일반인의 얼굴은 반드시 모자이크 처리 후 업로드하세요.</p>



<h3 class="wp-block-heading">백업 데이터 보존 및 EXIF 메타데이터 관리</h3>



<p class="wp-block-paragraph">백업 데이터 보존 및 EXIF 메타데이터 관리 내가 직접 제작한 콘텐츠라는 점을 추후 AI 오판 시 소명하기 위해서는 제작 원본 파일이 필수적입니다. 직접 촬영한 원본 이미지 파일(촬영 일시와 위치 데이터가 남은 EXIF 메타데이터)과 디자인 템플릿 프로젝트 파일(PSD, AI, Canva 작업 내역)은 최소 6개월 이상 별도 드라이브에 보관하는 습관을 들이시는 것이 가장 확실한 예방법입니다.</p>



<ol start="1" class="wp-block-list"></ol>



<h2 class="wp-block-heading">인스타그램 지적재산권 계정 차단 자주 묻는 질문 (FAQ)</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">SNSnote는 SNS를 통해 지적재산권 게시물 삭제와 계정 차단을 경험한 22명에게 직접 설문조사한 내용을 바탕으로 이 FAQ를 작성했습니다.</p>
</blockquote>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1784984657562" class="rank-math-list-item">
<h3 class="rank-math-question ">Q1. 인스타그램 지적재산권 계정 차단은 주요 원인이 무엇인가요?</h3>
<div class="rank-math-answer ">

<p><strong>A.</strong> 타인의 저작물(사진, 영상, 음원, 폰트 등)을 무단 사용한 저작권 위반이나, 브랜드 로고 및 명칭을 상업적으로 사용한 상표권 위반이 주된 원인입니다. 최근에는 메타 AI의 정밀 스캔 단속이 강화되면서 단순 인용이나 억울한 오판으로 인한 계정 제재 사례도 급증하고 있습니다.</p>

</div>
</div>
<div id="faq-question-1784984663071" class="rank-math-list-item">
<h3 class="rank-math-question ">Q2. 게시물 삭제 후 바로 인스타그램 지적재산권 계정 차단으로 이어지나요?</h3>
<div class="rank-math-answer ">

<p><strong>A.</strong> 일반적으로 경고나 게시물 삭제 조치가 먼저 이뤄지지만, 동일한 위반 행위가 반복되거나 AI 단속 시스템에서 치명적인 위반으로 판정한 경우 경고 없이 즉시 계정이 정지될 수 있습니다.</p>

</div>
</div>
<div id="faq-question-1784984668585" class="rank-math-list-item">
<h3 class="rank-math-question ">Q3. 블루뱃지 상담을 신청하면 인스타그램 지적재산권 계정 차단 복구가 가능한가요?</h3>
<div class="rank-math-answer ">

<p><strong>A.</strong> 블루뱃지 1:1 고객센터 상담사는 계정 제재나 재검토를 담당하는 내부 법무팀/보안팀권한을 가지고 있지 않습니다. 따라서 단순 상담 요청만으로는 복구가 어려우며, 공식적인 소명 자료와 내용증명 등 법적 증빙 절차가 병행되어야 합니다.</p>

</div>
</div>
<div id="faq-question-1784984673135" class="rank-math-list-item">
<h3 class="rank-math-question ">Q4. 재고 요청(Appeal)이 거부되면 정말 영구정지인가요?</h3>
<div class="rank-math-answer ">

<p><strong>A.</strong> 시스템상 재검토 결과가 &#8216;복구 불가&#8217;로 최종 결정되면 일반적인 앱 내 요청으로는 복구가 불가능합니다. 하지만 AI 오판임을 입증하는 내용증명을 메타 한국 대리인 측에 발송하여 소명 절차를 거치면 복구된 사례가 있습니다.</p>

</div>
</div>
<div id="faq-question-1784984679345" class="rank-math-list-item">
<h3 class="rank-math-question ">Q5. 인스타그램 지적재산권 계정 차단 해결을 위한 내용증명은 어떻게 보내나요?</h3>
<div class="rank-math-answer ">

<p><strong>A.</strong> 우체국 인터넷 내용증명 서비스를 이용하면 법무사나 변호사 없이 개인도 온라인으로 10분 내외로 작성하여 발송할 수 있습니다. 콘텐츠의 원본성, 직접 제작 내역, 가이드라인 준수 사실을 객관적으로 작성하는 것이 핵심입니다.</p>

</div>
</div>
<div id="faq-question-1784984684510" class="rank-math-list-item">
<h3 class="rank-math-question ">Q6. 내용증명을 보낸 후 인스타그램 지적재산권 계정 차단 복구까지 걸리는 기간은 얼마인가요?</h3>
<div class="rank-math-answer ">

<p><strong>A.</strong> 설문 결과 및 실제 경험에 따르면, 내용증명 발송 후 부계정 블루뱃지 상담을 통해 지속적으로 소명 상태를 확인하며 처리되기까지 약 30일(1개월) 정도의 시간이 소요됩니다.</p>

</div>
</div>
<div id="faq-question-1784984688984" class="rank-math-list-item">
<h3 class="rank-math-question ">Q7. 출처를 밝히고 게시했어도 인스타그램 지적재산권 위반에 해당하나요?</h3>
<div class="rank-math-answer ">

<p><strong>A.</strong> 네, 출처를 명시했더라도 원저작권자의 사전 동의나 허가가 없었다면 지적재산권 침해에 해당합니다. 큐레이션 및 정보성 계정 운영 시 특히 주의해야 하는 부분입니다.</p>

</div>
</div>
<div id="faq-question-1784984695186" class="rank-math-list-item">
<h3 class="rank-math-question ">Q8. 차단된 계정의 ID(사용자명)나 데이터를 다시 사용할 수 있나요?</h3>
<div class="rank-math-answer ">

<p><strong>A.</strong> 계정이 영구 비활성화 상태로 유지되면 기존 사진, 팔로워, 메시지 등의 데이터는 접근할 수 없으며 동일한 사용자명(@) 역시 재사용이 제한될 수 있습니다. 따라서 빠르게 소명하여 계정을 복구하는 것이 무엇보다 중요합니다.</p>

</div>
</div>
<div id="faq-question-1784984701504" class="rank-math-list-item">
<h3 class="rank-math-question ">Q9. 향후 인스타그램 지적재산권 계정 차단을 예방하려면 어떻게 해야 하나요?</h3>
<div class="rank-math-answer ">

<p><strong>A.</strong> 카드뉴스나 보도자료 작성 시 문장을 그대로 복사하지 않고 본인만의 시각으로 100% 가공해야 합니다. 또한 직접 촬영한 원본 이미지(EXIF 메타데이터 보유)와 작업 파일(PSD, AI, Canva 등)을 최소 6개월 이상 백업 보관해 두는 습관이 필요합니다.</p>

</div>
</div>
</div>
</div>


<h2 class="wp-block-heading">마치며</h2>



<p class="wp-block-paragraph">인스타그램을 운영하다 보면 예상치 못한 AI의 오판이나 지적재산권 관련 경고 알림에 크게 당황하기 마련입니다. 특히 오랜 시간 공들여 키워온 계정이 하루아침에 인스타그램 지적재산권으로 인한  강제 비활성화되면 무력감을 느끼기 쉽습니다.</p>



<p class="wp-block-paragraph">하지만 인스타그램 지적재산권 제재는 단순한 억지에 불과한 것이 아니라, 플랫폼 특유의 시스템 메커니즘과 내부 소명 절차가 명확히 존재합니다. 단순한 앱 내 Appeal(재고 요청) 버튼이나 블루뱃지 1:1 상담 지원에만 의존하기보다는, 객관적인 법적 소명 자료인 <strong>우체국 내용증명</strong>을 빠르게 메타 한국 대리인 측에 전달하여 실제 재검토 부서로 안건이 이관되도록 만드는 것이 계정 복구의 가장 확실한 키포인트입니다.</p>



<ul class="wp-block-list">
<li><a href="https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%ea%b3%84%ec%a0%95-%eb%b3%b5%ea%b5%ac-%eb%b0%a9%eb%b2%95/">인스타그램 계정 복구 방법, 메타에 내용증명 소명하는 방법</a></li>
</ul>



<p class="wp-block-paragraph">계정이 어렵게 복구된 이후에는 타인의 저작물과 상표를 다룰 때 원작자의 허가를 확인하고, 제작 원본 데이터(EXIF 및 디자인 프로젝트 파일)를 꼼꼼히 백업해 두는 습관이 필요합니다.</p>



<p class="wp-block-paragraph">억울하게 계정 차단을 겪고 계신 크리에이터분들께 이 글이 실질적인 도움이 되기를 바라며, 작성해 드린 내용증명 서식과 소명 가이드를 적극 활용하셔서 소중한 계정을 꼭 되찾으시길 응원합니다.</p>
<div class="saboxplugin-wrap" itemtype="http://schema.org/Person" itemscope itemprop="author"><div class="saboxplugin-tab"><div class="saboxplugin-gravatar"><img loading="lazy" decoding="async" src="https://snsnote.com/wp-content/uploads/2026/06/5555.png" width="100"  height="100" alt="" itemprop="image"></div><div class="saboxplugin-authorname"><a href="https://snsnote.com/author/admin/" class="vcard author" rel="author"><span class="fn">JH</span></a></div><div class="saboxplugin-desc"><div itemprop="description"><p>SNSnote 편집 담당 JH입니다.2020년부터 SNS를 본격적으로 운영하기 시작해 현재 인스타그램, 유튜브, X를 합쳐 총 40만 팔로워를 보유하고 있습니다.영구정지 복구, 계정 성장, 수익화까지 직접 경험한 실패와 성공 사례를 바탕으로 실전에서 바로 활용할 수 있는 최신 정보를 전달하고 있습니다.최근에는 <strong>AI와 웹 기술을 활용한 브라우저 기반 도구를 직접 기획·개발하며</strong>, 사진·영상·문서·SNS 업무에 바로 사용할 수 있는 무료 온라인 도구도 함께 제공하고 있습니다.</p>
</div></div><div class="saboxplugin-web "><a href="https://snsnote.com" target="_self">snsnote.com</a></div><div class="clearfix"></div></div></div>]]></content:encoded>
					
					<wfw:commentRss>https://snsnote.com/instagram-intellectual-property/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
	<media:content url="https://snsnote.com/wp-content/uploads/2026/07/instagram-intellectual-property.jpg" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">954</post-id>	</item>
		<item>
		<title>쓰레드 계정 정지 강제 비활성화 복구 완료 후기</title>
		<link>https://snsnote.com/threads-account-suspension-recovery/</link>
					<comments>https://snsnote.com/threads-account-suspension-recovery/#comments</comments>
		
		<dc:creator><![CDATA[JH]]></dc:creator>
		<pubDate>Fri, 17 Jul 2026 14:37:50 +0000</pubDate>
				<category><![CDATA[인스타그램]]></category>
		<guid isPermaLink="false">https://snsnote.com/?p=853</guid>

					<description><![CDATA[쓰레드 계정 정지 및 강제 비활성화 사태의 원인이 되는 메타 AI의 오판 기준과 최신 정책을 분석합니다. 직접 경험한 2번의 영구정지 복구 성공 후기를 바탕으로, 인증 셀카 재고 요청 시 주의사항부터 기기 흔들어 기술 문제 신고, 블루뱃지 대리 소명, 우체국 내용증명 발송까지 실전 대응 매뉴얼을 총정리합니다.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">쓰레드 계정 정지가 7월 15일 대대전으로 일어났습니다.<br><br>최근 1년사이에 인스타그램 메타의 대규모 정지사태에서 스레드는 정지사태가 없는듯이 지나가는듯했는데요.<br><br>결국 쓰레드 계정 정지 사태 역시 일어났습니다.<br><br>쓰레드 계정 총 6개를 운영중인 저의 계정은 6개 모두 7월 15일엔 아무 문제 없었습니다.<br><br>7월 17일인 오늘 아침 이메일에 계정 정지되었다는 메일이 와서 상당히 놀랐는데요.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="473" height="1024" src="https://snsnote.com/wp-content/uploads/2026/07/threads-계정-정지-복구-후기-473x1024.jpg" alt="7월 17일 대규모 쓰레드 계정 정지 사태 알림 화면" class="wp-image-855" srcset="https://snsnote.com/wp-content/uploads/2026/07/threads-계정-정지-복구-후기-473x1024.jpg 473w, https://snsnote.com/wp-content/uploads/2026/07/threads-계정-정지-복구-후기-139x300.jpg 139w, https://snsnote.com/wp-content/uploads/2026/07/threads-계정-정지-복구-후기.jpg 591w" sizes="auto, (max-width: 473px) 100vw, 473px" /><figcaption class="wp-element-caption">스레드 계정 정지 이메일</figcaption></figure>



<p class="wp-block-paragraph">다만 이전에 셀카인증을 통해서 쓰레드 계정 정지를 미리 대비해놨기 때문에 바로 복구 할 수 있었습니다.</p>





<h2 class="wp-block-heading">쓰레드 계정 정지가 일어나는 이유</h2>



<p class="wp-block-paragraph">최근 메타의 대규모 정지 사태가 대대적으로 일어나고 있으며, 그 안에 포함됨 인스타그램, 페이스북, 쓰레드 전부 ai 오판으로 인한 계정 정지는 더 이상 일부의 사례가 아니게되었습니다.</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-snsnote wp-block-embed-snsnote"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="ArH1aatWHD"><a href="https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%ea%b3%84%ec%a0%95-%eb%b3%b5%ea%b5%ac-%eb%b0%a9%eb%b2%95/">인스타그램 계정 복구 방법, 10번의 메타 상담원 시도 후기 2026</a></blockquote><iframe loading="lazy" class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="“인스타그램 계정 복구 방법, 10번의 메타 상담원 시도 후기 2026” — SNSnote" src="https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%ea%b3%84%ec%a0%95-%eb%b3%b5%ea%b5%ac-%eb%b0%a9%eb%b2%95/embed/#?secret=XCTDWtE44I#?secret=ArH1aatWHD" data-secret="ArH1aatWHD" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<p class="wp-block-paragraph">제 블로그에서 가장 조회수가 많은 글 역시 인스타그램 계정 복구 관련 글입니다.<br><br>이런 메타의 정책은 아무 이유없이 혹은 ai오판이여서 고객센터 직원을 줄여서가 아닌 다른 이유가 있는데요.<br><br>그건 메타의 크리에이터들을 통한 마켓플레이스 활성화를 위한 발판 때문이기도 합니다.<br><br>메타는 줄 곧 인스타그램의 정책을 따라가져했습니다.</p>



<h3 class="wp-block-heading">마켓플레이스 활성화</h3>



<p class="wp-block-paragraph">특히 원작자의 컨텐츠를 보호하면서 마켓플레이스를 활성화 시켜서 유튜브의 숏폼 시장을 따라가기 위함인데요.<br><br>하지만 아이러니 하게도 인스타그램, 메타의 성장은 저작권을 지키지 않는 크리에이터들로 인해 성장해왔습니다.<br><br>사실 똑같은 영상을 올려도 유튜브에서는 조회수 1만회도 넘기기 힘든 영상들이 인스타그램에서는 10~50만은 쉽게 달성할 수 있습니다.<br><br>이는 유튜브처럼 롱폼이 유료 결제가 없고 비교적 광고가 적었던 인스타그램 유저수가 훨씬더 많았던 이유와<br><br>특별히(?) 저작권을 보호해주지 않았던 모습으로 많은 크리에이터들이 어려운 유튜브보다 인스타에 쉽게 빠지고 더 노력했던 결과이기도 합니다.</p>



<h3 class="wp-block-heading">크리에이터 원작자 보호</h3>



<p class="wp-block-paragraph"><br>뿐만 아니라 워터마크를 넣 지않는 원작 크리에이터들은 오히려 유튜브에 올인하며 인스타에는 개인 소식알리미 정도로만 사용하는 크리에이터들이 많았습니다.<br><br>릴스 제작자들이 한번쯤은 보았을 릴스 아이디어, 정책란에서 인스타그램은 늘 워터마크를 넣지마시오 &lt;를 강조해왔습니다.<br><br>유튜브, 틱톡도 같은 정책이며 워터마크 삽입시 조회수는 일정 하락이 있을 수 밖에 없었습니다.<br><br>하지만 얼굴로 개인 브랜딩을 하지않는 계정이라면 열심히 많은 지식 컨텐츠가 하염없이 불펌되기 때문에 울며 겨자먹기로 어느정도 우회할 수 있는 워터마크 아이콘? 이미지 등등으로 지키려 애써왔습니다.<br><br>하지만 가장 좋은건 어떤 워터마크도 없는 깔끔한 원작자의 순수 이미지, 혹은 영상입니다.</p>



<p class="wp-block-paragraph">음원 저작권은 예전부터 상당히 원작자를 보호해주려는 행보를 이어왔고 이젠 영상과 이미지, 글의 차례입니다.</p>



<h2 class="wp-block-heading">메타 AI의 오판 정지가 많은 이유</h2>



<p class="wp-block-paragraph">이는 ai발전을 통해 점점 더 원작자 크리에이터들을 보호해주고 마켓플레이를 활성화해 다시 인스타그램 메타 쪽으로 원작자인 크리에이터들을 모으려는 모습입니다.</p>



<p class="wp-block-paragraph">하지만 여기서 수년간 인스타그램을 써왔던 유저들 입장에서는 상당히 낯설 수 밖에 없습니다.<br><br>그 동안 어떠한 수익화의 목적도 없이 가져와서 쓰던 이미지, 글, 영상이 제재 대상이 되고 친구들과 장난치며 썻던 DM이 계정 정지 대상이 되기 때문입니다.<br><br>이는 AI 발전의 과도기로 볼 수 있는데요.<br><br>X를 병행하고 있는 저는 외국 크리에이터들의 글과 영상을 그록 AI에게 많이 물어보고 있지만 아무리 AI가 발전했다고 하더라도 그 글쓴이의 맥락을 100% 파악하지 못합니다.<br><br><strong>특히 다른 나라의 언어라면 더욱 AI오판은 더 심할 수 밖에 없습니다.</strong><br><br>SNS시장 중 AI를 가장 늦게 도입한 메타에서는 AI 오판은 더욱 심할 수 밖에 없습니다.<br><br>추가로 유튜브 처럼 ai오판 정지를 받게 되더라도 소통의 창구가 없다 시피한 메타에서는 더욱 쓰레드 계정 정지에 대해서 복구 요청을 하기 힘든데요.</p>



<h2 class="wp-block-heading">쓰레드 계정 정지 대비하는 방법</h2>



<p class="wp-block-paragraph">하지만 인스타그램으로 7년 이상 수익을 내면서 인스타그램 영구 정지 2번도 전부 복구해본 저의 방식으로 대비할 수 있습니다.<br><br>이번 쓰레드 계정 정지 역시 이 방법으로 복구에 성공했는데요.</p>



<h3 class="wp-block-heading">쓰레드 계정 정지 복구 이메일</h3>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="473" height="1024" src="https://snsnote.com/wp-content/uploads/2026/07/threads-계정-정지-복구-후기2-473x1024.jpg" alt="7월 17일 쓰레드 계정 정지 사태 알림 이후 복구 이메일 화면" class="wp-image-858" style="width:473px;height:auto" srcset="https://snsnote.com/wp-content/uploads/2026/07/threads-계정-정지-복구-후기2-473x1024.jpg 473w, https://snsnote.com/wp-content/uploads/2026/07/threads-계정-정지-복구-후기2-139x300.jpg 139w, https://snsnote.com/wp-content/uploads/2026/07/threads-계정-정지-복구-후기2.jpg 591w" sizes="auto, (max-width: 473px) 100vw, 473px" /><figcaption class="wp-element-caption">쓰레드 계정 복구 완료 이메일 화면</figcaption></figure>



<p class="wp-block-paragraph">인증 셀카 재고 요청이후 2시간 지난 다음 복구 이메일을 받았고 실제로 모든 쓰레드의 게시물, 댓글이 복구되었습니다.</p>



<h3 class="wp-block-heading">비밀번호 및 보안 인증 셀카</h3>



<div class="wp-block-group is-layout-grid wp-container-core-group-is-layout-28b052f3 wp-block-group-is-layout-grid">
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="662" height="1024" src="https://snsnote.com/wp-content/uploads/2026/07/인스타-스레드-계정-정지-대비-셀카-인증.webp" alt="메타 계정 센터 비밀번호 및 보안 인증 셀카 등록 화면" class="wp-image-856" srcset="https://snsnote.com/wp-content/uploads/2026/07/인스타-스레드-계정-정지-대비-셀카-인증.webp 662w, https://snsnote.com/wp-content/uploads/2026/07/인스타-스레드-계정-정지-대비-셀카-인증-194x300.webp 194w" sizes="auto, (max-width: 662px) 100vw, 662px" /><figcaption class="wp-element-caption">메타 계정 복구용 인증 셀카 저장 방법</figcaption></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="609" height="1024" src="https://snsnote.com/wp-content/uploads/2026/07/인스타-스레드-계정-정지-대비-셀카-인증2-609x1024.webp" alt="메타 계정 센터 비밀번호 및 보안 인증 셀카 등록 화면" class="wp-image-857" srcset="https://snsnote.com/wp-content/uploads/2026/07/인스타-스레드-계정-정지-대비-셀카-인증2-609x1024.webp 609w, https://snsnote.com/wp-content/uploads/2026/07/인스타-스레드-계정-정지-대비-셀카-인증2-178x300.webp 178w, https://snsnote.com/wp-content/uploads/2026/07/인스타-스레드-계정-정지-대비-셀카-인증2.webp 761w" sizes="auto, (max-width: 609px) 100vw, 609px" /><figcaption class="wp-element-caption">메타 계정 복구용 인증 셀카 저장 방법</figcaption></figure>
</div>



<p class="wp-block-paragraph">계정 센터에서 비밀번호 및 보안 인증 셀카 등록을 해둬 쓰레드 계정 정지에서 복구가 가능합니다.<br><br>이번 쓰레드 계정 정지는 재고 요청에서 거의 모든 사람들에게 셀카 인증을 요구했고 저 또한 셀카인증 후 2시간이 지난 다음 바로 복구 되었습니다.</p>



<h2 class="wp-block-heading">앞으로 쓰레드 운영 방식</h2>



<p class="wp-block-paragraph">현재 sns 총 팔로워 40만 계정을 운영하면서 현재와 같은 변화에 저는 이렇게 대응하고 있습니다.</p>



<ol class="wp-block-list">
<li><strong>AI가 오판할만한 멘트 금지</strong><br>AI는 여전히 한국어의 맥락을 100% 이해하지 못합니다. 여기서 AI가 오해할만한 멘트는 아에 사용하지 않는게 좋습니다.</li>



<li><strong>광고 DM는 타 플랫폼 이용하기</strong><br>광고 및 협의 단계에서 금전적인 얘기는 DM으로 얘기하지마시고 타 플랫폼에서 대화하는게 좋습니다.<br>AI가 DM에서 나눈 금전적인 얘기를 오해할 수 있습니다.</li>



<li><strong>개인 브랜딩 계정은 워터마크 넣지말기</strong><br>이는 인스타그램 공식 정책에서 2021년 2월 부터 릴스에 워터마크를 넣으면 추천을 줄이겠다고 공식 발표했습니다.<br><a href="https://www.instagram.com/p/CLFMSunBRX1" target="_blank" rel="noopener">인스타그램 공식 인스타그램 워터마크 관련 공지</a></li>



<li><strong>중복 컨텐츠 사용 중지</strong><br>인스타그램에 원본 제작자 되어야합니다. 누군가 원본제작자가 있는 중복컨텐츠를 계속해서 재사용하게 될 경우 독창성 가이드라인 위반으로 계정 전체가 정지될 수 있습니다.</li>
</ol>



<h3 class="wp-block-heading">쓰레드에서 AI 오판 정지를 유발하는 위험 키워드/행동 리스트</h3>



<p class="wp-block-paragraph">현재 쓰레드는 인스타그램과 같은 정책으로 운영되기 때문에 인스타그램에서의 가이드라인을 참고해 조심해야할 필요가 있습니다.</p>



<ul class="wp-block-list">
<li>장난으로 라도 맞팔 유도, 쓰하리, 스하리 등등</li>



<li>타인 비방</li>



<li>오해 받기 쉬운 밈, 단어 표현</li>
</ul>



<p class="wp-block-paragraph">위 키워드는 쓰레드 계정 정지를 피하기위해 반드시 지켜야할 리스트 입니다.<br>얼마전 자동 DM 관련해 다들 쓴다고 나는 아니겠지 하면서 쓰던 계정들 역시 정지 사태에서 영구정지 판정을 받았습니다.</p>



<h2 class="wp-block-heading">실제 인증 셀카 재고 요청시 주의사항</h2>



<p class="wp-block-paragraph">셀카인증시 역시 AI가 판별하기 때문에 반드시 과거 셀카 인증과 흡사한 셀카를 제출해야합니다.<br>깔끔한 배경에 어둡고 흐릿한 셀카를 인증하게 된다면 반려당할 수 있습니다.<br>추가로 정면을 똑바로 바라보고 최대한 조명이 좋은 환경에서 찍어 제출해야합니다.</p>



<h2 class="wp-block-heading">계정 정지 시 복구하는 방법</h2>



<p class="wp-block-paragraph">현재까지 인스타그램, 페이스북, 쓰레드 계정 정지 관련해서 영구정지 판정을 받게되면 복구 할 수 있는 방법은 메타 공식 상담사 오피셜 포함해서 3가지가 유일합니다.</p>



<h3 class="wp-block-heading">기기 흔들어 기술 문제 신고</h3>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="472" height="1024" src="https://snsnote.com/wp-content/uploads/2026/06/인스타그램-계정-복구-상담-시도-10번-후기-472x1024.webp" alt="메타 계정 센터 블루뱃지 상담사 오피셜 계정 복구 소명 방법" class="wp-image-629" srcset="https://snsnote.com/wp-content/uploads/2026/06/인스타그램-계정-복구-상담-시도-10번-후기-472x1024.webp 472w, https://snsnote.com/wp-content/uploads/2026/06/인스타그램-계정-복구-상담-시도-10번-후기-138x300.webp 138w, https://snsnote.com/wp-content/uploads/2026/06/인스타그램-계정-복구-상담-시도-10번-후기.webp 590w" sizes="auto, (max-width: 472px) 100vw, 472px" /><figcaption class="wp-element-caption">메타 블루뱃지 상담 오피셜 계정 복구 소명 방법</figcaption></figure>



<p class="wp-block-paragraph">인스타그램 블루뱃지 상담을 통해 상담원에게 들었던 오피셜 답변입니다.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">기술 부서에는 한국인이 없는 관계로 번역기를 사용하셔도 무방하시니 한국어와/영어를 함께 혹은 영어로 자세히 기재해 주시면 감사하겠습니다.<br>해당 신고내,<br>1. 회원님의 계정명<br>2. 비활성화 된 날짜<br>3. 이전 비활성화 이후 활성화 되었음에도 여전히 비활성화 됨, 회원님께서 억울한 상황에 적극적 어필하여 주세요.<br>4. 이전의 비활성화에서 활성화 되었던 내역 관련 스크린샷 함께 첨부해주세요.</p>
</blockquote>



<p class="wp-block-paragraph">앱을 흔들어 기기내 기술 문제 신고를 통해 계속해서 억울함을 표현해야 한다고 합니다.<br>이는 블루뱃지 상담사의 오피셜 방법이며 쓰레드 내에서도 동일하게 작동하기 때문에 같은 방법으로 계정 정지를 소명할 수 있습니다.</p>



<h3 class="wp-block-heading">메타 베리파이드 블루뱃지 상담</h3>



<div class="wp-block-group is-layout-grid wp-container-core-group-is-layout-28b052f3 wp-block-group-is-layout-grid">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="472" height="1024" src="https://snsnote.com/wp-content/uploads/2026/06/인스타그램-계정-복구-방법-블루뱃지-상담-다음에서-변환-jpg-472x1024.webp" alt="메타 계정 센터 블루뱃지 상담 10번의 시도" class="wp-image-630" srcset="https://snsnote.com/wp-content/uploads/2026/06/인스타그램-계정-복구-방법-블루뱃지-상담-다음에서-변환-jpg-472x1024.webp 472w, https://snsnote.com/wp-content/uploads/2026/06/인스타그램-계정-복구-방법-블루뱃지-상담-다음에서-변환-jpg-138x300.webp 138w, https://snsnote.com/wp-content/uploads/2026/06/인스타그램-계정-복구-방법-블루뱃지-상담-다음에서-변환-jpg.webp 590w" sizes="auto, (max-width: 472px) 100vw, 472px" /><figcaption class="wp-element-caption">메타 블루뱃지 상담 10번의 시도 화면</figcaption></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="471" height="1024" src="https://snsnote.com/wp-content/uploads/2026/06/6-471x1024.png" alt="메타 블루뱃지 상담 계정 복구 답변" class="wp-image-570" srcset="https://snsnote.com/wp-content/uploads/2026/06/6-471x1024.png 471w, https://snsnote.com/wp-content/uploads/2026/06/6-138x300.png 138w, https://snsnote.com/wp-content/uploads/2026/06/6-768x1670.png 768w, https://snsnote.com/wp-content/uploads/2026/06/6-706x1536.png 706w, https://snsnote.com/wp-content/uploads/2026/06/6-942x2048.png 942w, https://snsnote.com/wp-content/uploads/2026/06/6-scaled.png 1177w" sizes="auto, (max-width: 471px) 100vw, 471px" /><figcaption class="wp-element-caption">메타 블루뱃지 상담 계정 복구 답변</figcaption></figure>
</div>



<p class="wp-block-paragraph">2번의 영구정지 경험 이후 저는 블루뱃지 상담을 통해 계정을 복구한 적이 있습니다.<br>이는 실제 저의 복구 사례이며 블루뱃지 상담을 통해 계정복구 되었음을 알려주는 화면입니다.<br><a href="https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%ea%b3%84%ec%a0%95-%eb%b3%b5%ea%b5%ac-%eb%b0%a9%eb%b2%95/">인스타그램 계정 복구 방법, 10번의 메타 상담원 시도 후기 2026</a><br><br>위 게시물을 통해 자세한 내용을 확인하실 수 있습니다.<br>때문에 같은 가이드라인과 운영방침을 가진 쓰레드에도 동일하게 작동합니다.<br>쓰레드 억울한 영구정지 강제비활성화 상황을 겪게 된다면 이 방법을 통해 복구를 하실 수 있습니다.</p>



<h3 class="wp-block-heading">우체국을 통해 메타에 내용증명 보내기</h3>



<p class="wp-block-paragraph">위 방법들을 시도하기 전에 우체국 내용증명을 보내서 자신의 계정의 억울함을 소명하셔야합니다.<br>이는 개인으로 보내도 법적인 효력을 가지고 있기때문에 추후 블루뱃지 상담과 기술 상담에서 우선순위로 배치될 확률이 높습니다.<br><br>때문에 개인으로 우체국 내용증명을 보내는데 비용이 크지않기 때문에 재고요청후 영구정지 되었을때 반드시 첫번째로 해야할 행동 지침입니다.<br><a href="https://snsnote.com/%ec%9d%b8%ec%8a%a4%ed%83%80%ea%b7%b8%eb%9e%a8-%ec%98%81%ea%b5%ac%ec%a0%95%ec%a7%80-%eb%b3%b5%ea%b5%ac-%ec%84%b1%ea%b3%b5%ed%95%9c-%ec%8d%b0%ea%b3%bc-%eb%82%b4%ec%9a%a9%ec%a6%9d%eb%aa%85-%eb%b3%b4/">인스타그램 영구정지 복구 성공한 썰과 내용증명 보내는 방법</a><br><br>위 게시물을 참고하시면 우체국 내용증명을 처음 보내시는 분들이라도 10분정도 시간 내시면 보낼 수 있는 매뉴얼입니다.<br>제가 처음부터 1~100까지 어디를 클릭해야하는지 전부 설명되어 있습니다.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">요약: <br>1. 계정 정지가 되었다면 반드시 우체국 내용증명을 보내야합니다.<br>2. 추 후 상담, 기술 신고시 우선배치될 확률이 높아집니다.<br>3. 블루뱃지 상담과 기술문제 신고로 억울함을 표명하셔야합니다.</p>
</blockquote>



<h2 class="wp-block-heading">쓰레드 계정 정지 관련 핵심 FAQ 9가지</h2>



<p class="wp-block-paragraph">SNSnote는 SNS통해 실제 FAQ를 설문조사 하여 작성되었습니다.</p>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1784298634223" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Q1. 쓰레드 계정이 정지되면 연동된 인스타그램 계정도 같이 정지되나요?</strong></h3>
<div class="rank-math-answer ">

<p><strong>A1.</strong> 메타 계정 센터로 묶여 있는 경우, 쓰레드 계정의 정지 사유(예: 심각한 가이드라인 위반)에 따라 인스타그램 계정까지 세트로 제한이 걸리거나 함께 비활성화될 위험이 매우 높습니다. 따라서 쓰레드에서 경고를 받았다면 즉시 계정 센터 연동 상태를 점검해야 합니다.</p>

</div>
</div>
<div id="faq-question-1784298669473" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Q2. 셀카 인증 화면이 떴는데 사진을 보낸 후 평균 얼마나 걸려요?</strong></h3>
<div class="rank-math-answer ">

<p><strong>A2.</strong> AI 알고리즘이 정상적으로 판독할 경우 <strong>최소 2시간에서 24시간 이내</strong>에 복구 메일이 도착합니다. 다만, 주말이 껴있거나 대규모 정지 사태가 터진 시기에는 판독이 밀려 2~3일 이상 소요되기도 합니다.</p>

</div>
</div>
<div id="faq-question-1784298674681" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Q3. 인증 셀카를 제출했는데 거절(반려)당했습니다. 왜 그런가요?</strong></h3>
<div class="rank-math-answer ">

<p><strong>A3.</strong> 얼굴이 흐릿하게 나오거나 어두운 조명에서 찍은 경우, 혹은 과거 메타 계정 센터에 등록된 본인 확인 정보와 일치하지 않는다고 AI가 판단하면 반려됩니다. 재요청 기회가 남아있다면 최대한 밝은 곳에서 정면을 똑바로 바라보고 다시 촬영해야 합니다.</p>

</div>
</div>
<div id="faq-question-1784298681465" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Q4. 쓰레드에서 장난으로 쓴 &#8220;너 00냐?&#8221;, &#8220;00래?&#8221; 같은 댓글도 정지 사유가 되나요?</strong></h3>
<div class="rank-math-answer ">

<p><strong>A4.</strong> 네, 그렇습니다. 한국인 친구끼리는 흔히 하는 가벼운 밈이나 장난일지라도, 문맥을 100% 이해하지 못하는 메타 AI는 이를 &#8216;괴롭힘 및 비방&#8217;으로 칼같이 오판하여 정지를 먹입니다. 쓰레드 내에서는 오해를 살 만한 거친 표현은 아예 쓰지 않는 것이 안전합니다.</p>

</div>
</div>
<div id="faq-question-1784298694229" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Q5. &#8216;스하리&#8217;, &#8216;맞팔 유도&#8217; 행위가 왜 계정 정지 대상인가요?</strong></h3>
<div class="rank-math-answer ">

<p><strong>A5.</strong> 메타는 단시간에 인위적으로 팔로워나 인게이지먼트를 늘리는 행위를 &#8216;스팸 매크로 또는 어뷰징&#8217;으로 인식합니다. 소통을 유도하는 해시태그나 멘트를 단시간에 반복적으로 도배하면 AI가 즉각적으로 계정을 강제 비활성화 처리합니다.</p>

</div>
</div>
<div id="faq-question-1784298707314" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Q6. 우체국 내용증명은 영구정지 판정을 받은 직후에 보내야 하나요?</strong></h3>
<div class="rank-math-answer ">

<p><strong>A6.</strong> 그렇습니다. 재고 요청이 거부되어 영구정지가 확정되면 더 이상 시스템 내에서 손쓸 방법이 없습니다. 이때 가장 먼저 법적 효력을 가진 내용증명을 메타 측에 발송해야, 추후 기술 문제 신고나 블루뱃지 상담 시 케이스가 우선순위로 배정될 확률이 높아집니다.</p>

</div>
</div>
<div id="faq-question-1784298716087" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Q7. 블루뱃지 상담(메타 버리파이드)을 이용하려면 유료 결제를 해야 하나요?</strong></h3>
<div class="rank-math-answer ">

<p><strong>A7.</strong> 네, 메타 버리파이드는 월 구독형 유료 서비스입니다. 하지만 계정이 이미 정지된 상태라면 정지된 계정으로는 결제가 불가능하므로, 부계정을 만들어 블루뱃지를 구독한 뒤 상담원을 통해 본계정의 억울함을 대리 소명하는 방식을 사용해야 합니다.</p>

</div>
</div>
<div id="faq-question-1784298723398" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Q8. 기기를 흔들어 기술 문제 신고를 할 때 영어로 써야 하나요?</strong></h3>
<div class="rank-math-answer ">

<p><strong>A8.</strong> 메타의 핵심 기술 부서와 최종 권한을 가진 담당자들은 대부분 외국계 엔지니어입니다. 한국어로만 쓰면 번역 오류로 인해 기각될 확률이 높으므로, 파파고나 구글 번역기를 돌려 <strong>[한국어 내용]과 [영어 번역본]을 동시에 기재</strong>하여 전송하는 것을 강력히 추천합니다.</p>

</div>
</div>
<div id="faq-question-1784298730548" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Q9. 타인이 고의로 제 글을 대량 신고해서 정지당했을 수도 있나요?</strong></h3>
<div class="rank-math-answer ">

<p><strong>A9.</strong> 메타 AI는 누적 신고 횟수에도 민감하게 반응합니다. 아무리 무해한 글이라도 악의적인 허위·대량 신고가 단시간에 접수되면 AI가 선제적으로 계정을 정지시키는 과도기적 오류가 존재합니다. 이 경우 역시 기술 문제 신고를 통해 억울한 오판임을 적극적으로 어필해야 복구됩니다.</p>

</div>
</div>
</div>
</div>


<h2 class="wp-block-heading">마치며</h2>



<p class="wp-block-paragraph">현재 수 많은 인플루언서들이 메타의 강력한 정책변화로 인해 두려움에 떨고 있습니다.<br>때문에 빠른 SNS관련 소식을 체크하고 자신의 계정에 문제가 생길 수 있는 부분은 미리 체크하셔서 대비하시는게 가장 좋습니다.<br>SNSnote는 수년간 SNS를 운영하며 겪은 노하우와 실전 경험을 공유하고 있습니다.<br>북마크 하셔서 미리 SNS 소식을 전달받으시길 바랍니다.</p>
<div class="saboxplugin-wrap" itemtype="http://schema.org/Person" itemscope itemprop="author"><div class="saboxplugin-tab"><div class="saboxplugin-gravatar"><img loading="lazy" decoding="async" src="https://snsnote.com/wp-content/uploads/2026/06/5555.png" width="100"  height="100" alt="" itemprop="image"></div><div class="saboxplugin-authorname"><a href="https://snsnote.com/author/admin/" class="vcard author" rel="author"><span class="fn">JH</span></a></div><div class="saboxplugin-desc"><div itemprop="description"><p>SNSnote 편집 담당 JH입니다.2020년부터 SNS를 본격적으로 운영하기 시작해 현재 인스타그램, 유튜브, X를 합쳐 총 40만 팔로워를 보유하고 있습니다.영구정지 복구, 계정 성장, 수익화까지 직접 경험한 실패와 성공 사례를 바탕으로 실전에서 바로 활용할 수 있는 최신 정보를 전달하고 있습니다.최근에는 <strong>AI와 웹 기술을 활용한 브라우저 기반 도구를 직접 기획·개발하며</strong>, 사진·영상·문서·SNS 업무에 바로 사용할 수 있는 무료 온라인 도구도 함께 제공하고 있습니다.</p>
</div></div><div class="saboxplugin-web "><a href="https://snsnote.com" target="_self">snsnote.com</a></div><div class="clearfix"></div></div></div>]]></content:encoded>
					
					<wfw:commentRss>https://snsnote.com/threads-account-suspension-recovery/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		
	<media:content url="https://snsnote.com/wp-content/uploads/2026/07/threads-account-suspension-recovery-review.jpg" medium="image" />
<post-id xmlns="com-wordpress:feed-additions:1">853</post-id>	</item>
	</channel>
</rss>
