Skip to content

Instantly share code, notes, and snippets.

@kyujin-cho
Created December 16, 2017 18:34
Show Gist options
  • Select an option

  • Save kyujin-cho/f361f94dd5654c23187bc4306673fc5a to your computer and use it in GitHub Desktop.

Select an option

Save kyujin-cho/f361f94dd5654c23187bc4306673fc5a to your computer and use it in GitHub Desktop.
import requests
import urllib.request
import re
import json
import os.path
import PIL.Image
import zipfile
import io
import sys
import glob
import base64
def xor(a, b):
return bytearray([x^y for x, y in zip(a, b)])
key = base64.b64decode('you-find-out-yourself')
def download_kakao(sids, resize=False):
for sid in sids:
os.mkdir(sid) if not os.path.isdir(sid) else False
tid = re.findall(r'[0-9]+', re.findall(r'https:\/\/item\.kakaocdn\.net\/dw\/[0-9]+\.share\.png', requests.get('https://e.kakao.com/t/' + sid).text)[0])[0]
zipfile.ZipFile(io.BytesIO(urllib.request.urlopen('https://item.kakaocdn.net/dw/{}.file_pack.zip'.format(tid)).read()), 'r').extractall(sid + '/')
if os.listdir(sid)[0].split('.')[-1] == 'webp':
for image in os.listdir(sid):
f = open(sid + '/' + image, 'rb')
decrypted, plain = xor(f.read(128), key), f.read()
open(sid + '/' + image, 'wb').write(decrypted + plain)
else:
[i[1].save(sid + '/' + i[0]) for i in [(image, PIL.Image.open(sid + '/' + image).resize((512, 512))) for image in os.listdir(sid)]] if resize else None
# ex1
# print(download_kakao(['blu-yello-daily-life', 'blu-yello-daily-life-2'], resize=True))
# ex2
# print(download_kakao(['extremely-frends', 'korean-ver-extremely-rabbit-2', 'extremely-rabbit', 'korean-ver-extremely-cat-winter-ver', 'korean-ver-extremely-rabbit-valentine-ver', 'extremely-cat2', 'korean-ver-extremely-dog-dialect-special-gyeongsang-chungcheong-ver', 'extremely-bear', 'korean-ver-extremely-chibi-rabbit', 'korean-ver-extremely-chibi-rabbit-chibi-bear', 'korean-ver-extremely-rabbit-2']))
@kyujin-cho

Copy link
Copy Markdown
Author

설명:
카카오톡의 움직이는 이모티콘의 경우 WebP 파일로 이루어져 있으며,
일반 이모티콘 과는 다르게 이 파일은 앞의 128바이트가 특정 방식으로 암호화되어 있습니다.
이를 해제하기 위해서는 128바이트짜리 키를 구해서 앞의 128바이트와 XOR 연산을 해야 합니다.
키는 디버거 붙이면 나오니까 알아서 찾으세요.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment