Skip to content

Feature Request: Support Naver OGQ Market as sticker source #49

@clack120

Description

@clack120

📌 Feature Request: Support Naver OGQ Market as sticker source

What:
Support importing stickers from https://ogqmarket.naver.com, a large Korean sticker marketplace with creator-made content.

Why:

  • OGQ Market hosts thousands of high-quality, creator-made sticker packs.
  • Korean Telegram users often want to reuse these but must manually convert them.
  • Adding automated support (like LINE/Kakao import) would be a big UX win.

How it could work:

  1. User provides OGQ sticker URL
  2. The bot scrapes:
    • Title from div.header div div.title p
    • Author from div.info div.nickname span
    • Images from img[alt="sticker-detail-image-prevew"] (...-prevew is not a typo)
  3. Downloads:
    • Uses ?type=ma480_480 variant (animated + alpha, largest)
    • Deduplicates by clean src
  4. Converts:
    • Animated: .webm (VP9 + alpha, ≤ 256KB)
    • Static: .webp
    • Files not starting with original_ (like djwhpr2j.png or qhqe6g5s.png): -> preview.png (should be scaled to 100x100)

FFmpeg example:

ffmpeg -i original_1.gif -an -to 3 \
-vf "scale='if(gt(iw,ih),512,-1)':'if(gt(ih,iw),512,-1)'" \
-c:v libvpx-vp9 -pix_fmt yuva420p -crf 28 -b:v 0 -fs 256k 1.webm

might not fit into 256k — raising CRF may needed.

I'm not sure about OCQMarket's backend, so there might be wrong or missing informations.

Python Downloader Example This is NOT okay. modification required.
import os, re, urllib.parse, requests
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor

url = "https://ogqmarket.naver.com/artworks/sticker/detail?artworkId=5ef373905a559"

headers = {"User-Agent":"Mozilla/5.0"}
html = requests.get(url, headers=headers).text
soup = BeautifulSoup(html, "html.parser")

def safe(s): return re.sub(r"[<>:\"/\\|?*\x00-\x1F]", "_", s)  # not sure would this ok
def sel(txt, fallback="unknown"):
  tag = soup.select_one(txt)
  return safe(tag.text.strip() if tag else fallback)

author = sel("div.info div.nickname span")
title = sel("div.header div div.title p")  # TODO: fallback = artwordId
save_dir = os.path.join("Downloads", author, title)
os.makedirs(save_dir, exist_ok=True)

seen, imgs = set(), []
for img in soup.find_all("img", alt="sticker-detail-image-prevew"):  # What if naver fix this typo?
  src = img.get("src")
  if src:
    src = src.split("?")[0]
    if src not in seen:
      seen.add(src)
      imgs.append(src)

def download(src):
  final = f"{src}?type=ma480_480"
  name = os.path.basename(urllib.parse.urlparse(src).path).replace("original_", "")  # this replacement might danger
  try:
    r = requests.get(final, headers=headers)
    r.raise_for_status()
    with open(os.path.join(save_dir, name), "wb") as f: f.write(r.content)
    print(f"✔ {name}")
  except Exception as e: print(f"✘ {name}:",e)

with ThreadPoolExecutor(max_workers=3) as ex:
  for i in imgs: ex.submit(download, i)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions