diff --git a/README.es-ES.md b/README.es-ES.md new file mode 100644 index 0000000..6a5b9e8 --- /dev/null +++ b/README.es-ES.md @@ -0,0 +1,381 @@ +WeChatToHTML +============ +Extrae información de `texto`, `imagen`, `audio` y `video` de la base de datos SQLite de WeChat +y la carpeta de contenido del usuario, generando **archivos HTML5 con estilo de la app WeChat**. + + +¿Por qué no hay código fuente aquí? +--------------------------------- +1. Dado que WeChat es un software comercial, aún no estoy seguro si habrá + algún **riesgo legal** si publico el código. + +2. La API no es lo suficientemente madura ni simple para el uso diario. + +Así que decidí eliminar todo el código fuente. Consideraré publicar el +código en el futuro. ^_^ + + +Demo +---- +#### Descripción general de mi implementación +![overview](./data/demo_imgs/overall.png) + +#### Algunos detalles +![img_and_gif](./data/demo_imgs/img_and_gif.png) + +- Puedes ver que los `mensajes de texto`, `emoji` e `imágenes` se muestran + normalmente. + +![audio](./data/demo_imgs/audio.png) + +- Los `audios` se pueden reproducir con el reproductor de audio HTML5 proporcionado por los navegadores + (Firefox, Chrome, etc.) +- El fondo de la `información de fecha` es una barra blanca. +- El texto de la `información de hora` usa un color gris claro. + +![inline_emoji](./data/demo_imgs/inline_emoji.png) + +- Los `emoji` se pueden mostrar **en línea con otro texto**. + +![enlarge](./data/demo_imgs/enlarge.png) + +- Si haces clic en un `mensaje de texto`, puedes ver la versión ampliada, + junto con la `información de fecha y hora`. +- Si haces clic en el `avatar` del usuario, puedes ver la versión ampliada del avatar. +- Si haces clic en una `imagen`, puedes ver la versión ampliada de la imagen. + Puedes **acercar** o **alejar** como desees. + + +Implementación +-------------- + +Primero, obtén el `archivo de base de datos SQLite` de WeChat y la `carpeta de contenido del usuario` del teléfono móvil. + +Para Android, puedes obtener tu `EnMicroMsg.db` desde esta ruta: + + /data/data/com.tencent.mm/MicroMsg/de42c....8ed(32 chars length)/ + +Este es un **archivo de base de datos SQLite cifrado**. Necesitas obtener el `IMEI` de tu teléfono móvil y tu `UIN` de WeChat (**contraseña=md5(IMEI+UIN)[:7]**). + +Luego, ejecuta: + + echo -n "$imei$uin" | md5sum | cut -c -7 + +Digamos que la contraseña de tu `EnMicroMsg.db` es abc1234. Ahora necesitas descifrar +tu archivo de base de datos. Puedes usar sqlcipher2 (no 3 ni versiones posteriores). + +Después de descifrarlo, ahora puedes acceder a tus mensajes de texto, lista de usuarios, información de fechas y horas, rutas de medios, ... desde el archivo de base de datos. Toda la información que necesitamos es conocida. + +Ahora puedes obtener tus archivos multimedia, archivos adjuntos y otros archivos en esta ruta: + + sdcard/Tencent/MicroMsg/de42c....8ed(32 chars length)/ + +Normalmente necesitaremos estas carpetas: `emoji`, `image`, `image2`, `video`, +`voice`... + +Luego podemos empezar a diseñar nuestra página web. + +Usar HTML5 es mucho más conveniente ya que +podemos reproducir algunos tipos de audio y video directamente en el navegador web. Dado que el formato de audio `.amr` en la carpeta `voice` no es compatible con la mayoría de los navegadores web, podemos +convertirlos al formato `.mp3` usando ffmpeg. Puedes hacer cosas similares para +otros tipos de medios. + + ffmpeg -i ./file.amr ./file.mp3 + +Necesitamos analizar el contenido del archivo de base de datos SQLite. + + msgId + msgSvrId + type + status + isSend + isShowTimer + createTime + talker + content + imgPath + reserved + lvbuffer + transContent + ... + +Ahora necesitamos concentrarnos en type. + + 1 Mensaje de texto normal + 3 Fotos + + # Cómo se organiza la carpeta de fotos: + if image_path.startswith("THUMBNAIL_DIRPATH"): + image_name = image_path.split('//')[1]\ + .replace('th_', '').strip() + image_path = os.path.join( + 'image2', + '%s/%s/%s' % (image_name[:2], + image_name[2:4], image_name)) + + ... + + 34 Audios (.amr) + 47 Emoji + 43 Imagen (jpg) + 62 Video (%H%M%S%d%m%Y******.mp4) + 1048625 imagen + +Caracteres emoji: + + u_keyword_list = [ + 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"菜刀", 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"NO", + u"OK", u"爱情", u"飞吻", u"跳跳", u"发抖", u"怄火", + u"转圈", u"磕头", u"回头", u"跳绳", u"投降", u"激动", + u"乱舞", u"献吻", u"左太极", u"右太极" + ] + + u_code_list = [ + u"/::)", u"/::~", u"/::B", u"/::|", u"/:8-)", u"/::<", u"/::$", + u"/::X", u"/::Z", u"/::'(", u"/::-|", u"/::@", u"/::P", u"/::D", + u"/::O", u"/::(", u"/::+", u"/:–b", u"/::Q", u"/::T", u"/:,@P", + u"/:,@-D", u"/::d", u"/:,@o", u"/::g", u"/:|-)", u"/::!", u"/::L", + u"/::>", u"/::,@", u"/:,@f", u"/::-S", u"/:?", u"/:,@x", u"/:,@@", + u"/::8", u"/:,@!", u"/:!!!", u"/:xx", u"/:bye", u"/:wipe", u"/:dig", + u"/:handclap", u"/:&-(", u"/:B-)", u"/:<@", u"/:@>", u"/::-O", + u"/:>-|", u"/:P-(", u"/::'|", u"/:X-)", u"/::*", u"/:@x", u"/:8*", + u"/:pd", u"/:", u"/:beer", u"/:basketb", u"/:oo", u"/:coffee", + u"/:eat", u"/:pig", u"/:rose", u"/:fade", u"/:showlove", u"/:heart", + u"/:break", u"/:cake", u"/:li", u"/:bome", u"/:kn", u"/:footb", + u"/:ladybug", u"/:shit", u"/:moon", u"/:sun", u"/:gift", u"/:hug", + u"/:strong", u"/:weak", u"/:share", u"/:v", u"/:@)", u"/:jj", + u"/:@@", u"/:bad", u"/:lvu", u"/:no", u"/:ok", u"/:love", u"/:", + u"/:jump", u"/:shake", u"/:", u"/:circle", u"/:kotow", u"/:turn", + u"/:skip", u"/:oY", u"/:#-0", u"/:hiphot", u"/:kiss", u"/:<&", + u"/:&>" + ] + +Archivos emoji (`data/emoji/{0-104}.png`) y código correspondiente, palabras clave: + + 0.png /::) 微笑 + 1.png /::~ 撇嘴 + 2.png /::B 色 + 3.png /::| 发呆 + 4.png /:8-) 得意 + 5.png /::< 流泪 + 6.png /::$ 害羞 + 7.png /::X 闭嘴 + 8.png /::Z 睡 + 9.png /::'( 大哭 + 10.png /::-| 尴尬 + 11.png /::@ 发怒 + 12.png /::P 调皮 + 13.png /::D 呲牙 + 14.png /::O 惊讶 + 15.png /::( 难过 + 16.png /::+ 酷 + 17.png /:–b 冷汗 + 18.png /::Q 抓狂 + 19.png /::T 吐 + 20.png /:,@P 偷笑 + 21.png /:,@-D 愉快 + 22.png /::d 白眼 + 23.png /:,@o 傲慢 + 24.png /::g 饥饿 + 25.png /:|-) 困 + 26.png /::! 惊恐 + 27.png /::L 流汗 + 28.png /::> 憨笑 + 29.png /::,@ 悠闲 + 30.png /:,@f 奋斗 + 31.png /::-S 咒骂 + 32.png /:? 疑问 + 33.png /:,@x 嘘 + 34.png /:,@@ 晕 + 35.png /::8 疯了 + 36.png /:,@! 哀 + 37.png /:!!! 骷髅 + 38.png /:xx 敲打 + 39.png /:bye 再见 + 40.png /:wipe 擦汗 + 41.png /:dig 抠鼻 + 42.png /:handclap 鼓掌 + 43.png /:&-( 糗大了 + 44.png /:B-) 坏笔 + 45.png /:<@ 左哼哼 + 46.png /:@> 右哼哼 + 47.png /::-O 哈欠 + 48.png /:>-| 鄙视 + 49.png /:P-( 委屈 + 50.png /::'| 快哭了 + 51.png /:X-) 阴险 + 52.png /::* 亲亲 + 53.png /:@x 吓 + 54.png /:8* 可怜 + 55.png /:pd 菜刀 + 56.png /: 西瓜 + 57.png /:beer 啤酒 + 58.png /:basketb 篮球 + 59.png /:oo 乒乓 + 60.png /:coffee 咖啡 + 61.png /:eat 饭 + 62.png /:pig 猪头 + 63.png /:rose 玫瑰 + 64.png /:fade 凋谢 + 65.png /:showlove 嘴唇 + 66.png /:heart 爱心 + 67.png /:break 心碎 + 68.png /:cake 蛋糕 + 69.png /:li 闪电 + 70.png /:bome 炸弹 + 71.png /:kn 刀 + 72.png /:footb 足球 + 73.png /:ladybug 瓢虫 + 74.png /:shit 便便 + 75.png /:moon 月亮 + 76.png /:sun 太阳 + 77.png /:gift 礼物 + 78.png /:hug 拥抱 + 79.png /:strong 强 + 80.png /:weak 弱 + 81.png /:share 握手 + 82.png /:v 胜利 + 83.png /:@) 抱拳 + 84.png /:jj 勾引 + 85.png /:@@ 拳头 + 86.png /:bad 差劲 + 87.png /:lvu 爱你 + 88.png /:no NO + 89.png /:ok OK + 90.png /:love 爱情 + 91.png /: 飞吻 + 92.png /:jump 跳跳 + 93.png /:shake 发抖 + 94.png /: 怄火 + 95.png /:circle 转圈 + 96.png /:kotow 磕头 + 97.png /:turn 回头 + 98.png /:skip 跳绳 + 99.png /:oY 投降 + 100.png /:#-0 激动 + 101.png /:hiphot 乱舞 + 102.png /:kiss 献吻 + 103.png /:<& 左太极 + 104.png /:&> 右太极 + +Archivos emoji (`data/emoji/{0-104}.png`) y emojis: + +- 0.png ![1.png](data/emoji/0.png) +- 1.png ![1.png](data/emoji/1.png) +- 2.png ![2.png](data/emoji/2.png) +- 3.png ![3.png](data/emoji/3.png) +- 4.png ![4.png](data/emoji/4.png) +- 5.png ![5.png](data/emoji/5.png) +- 6.png ![6.png](data/emoji/6.png) +- 7.png ![7.png](data/emoji/7.png) +- 8.png ![8.png](data/emoji/8.png) +- 9.png ![9.png](data/emoji/9.png) +- 10.png ![10.png](data/emoji/10.png) +- 11.png ![11.png](data/emoji/11.png) +- 12.png ![12.png](data/emoji/12.png) +- 13.png ![13.png](data/emoji/13.png) +- 14.png ![14.png](data/emoji/14.png) +- 15.png ![15.png](data/emoji/15.png) +- 16.png ![16.png](data/emoji/16.png) +- 17.png ![17.png](data/emoji/17.png) +- 18.png ![18.png](data/emoji/18.png) +- 19.png ![19.png](data/emoji/19.png) +- 20.png ![20.png](data/emoji/20.png) +- 21.png ![21.png](data/emoji/21.png) +- 22.png ![22.png](data/emoji/22.png) +- 23.png ![23.png](data/emoji/23.png) +- 24.png ![24.png](data/emoji/24.png) +- 25.png ![25.png](data/emoji/25.png) +- 26.png ![26.png](data/emoji/26.png) +- 27.png ![27.png](data/emoji/27.png) +- 28.png ![28.png](data/emoji/28.png) +- 29.png ![29.png](data/emoji/29.png) +- 30.png ![30.png](data/emoji/30.png) +- 31.png ![31.png](data/emoji/31.png) +- 32.png ![32.png](data/emoji/32.png) +- 33.png ![33.png](data/emoji/33.png) +- 34.png ![34.png](data/emoji/34.png) +- 35.png ![35.png](data/emoji/35.png) +- 36.png ![36.png](data/emoji/36.png) +- 37.png ![37.png](data/emoji/37.png) +- 38.png ![38.png](data/emoji/38.png) +- 39.png ![39.png](data/emoji/39.png) +- 40.png ![40.png](data/emoji/40.png) +- 41.png ![41.png](data/emoji/41.png) +- 42.png ![42.png](data/emoji/42.png) +- 43.png ![43.png](data/emoji/43.png) +- 44.png ![44.png](data/emoji/44.png) +- 45.png ![45.png](data/emoji/45.png) +- 46.png ![46.png](data/emoji/46.png) +- 47.png ![47.png](data/emoji/47.png) +- 48.png ![48.png](data/emoji/48.png) +- 49.png ![49.png](data/emoji/49.png) +- 50.png ![50.png](data/emoji/50.png) +- 51.png ![51.png](data/emoji/51.png) +- 52.png ![52.png](data/emoji/52.png) +- 53.png ![53.png](data/emoji/53.png) +- 54.png ![54.png](data/emoji/54.png) +- 55.png ![55.png](data/emoji/55.png) +- 56.png ![56.png](data/emoji/56.png) +- 57.png ![57.png](data/emoji/57.png) +- 58.png ![58.png](data/emoji/58.png) +- 59.png ![59.png](data/emoji/59.png) +- 60.png ![60.png](data/emoji/60.png) +- 61.png ![61.png](data/emoji/61.png) +- 62.png ![62.png](data/emoji/62.png) +- 63.png ![63.png](data/emoji/63.png) +- 64.png ![64.png](data/emoji/64.png) +- 65.png ![65.png](data/emoji/65.png) +- 66.png ![66.png](data/emoji/66.png) +- 67.png ![67.png](data/emoji/67.png) +- 68.png ![68.png](data/emoji/68.png) +- 69.png ![69.png](data/emoji/69.png) +- 70.png ![70.png](data/emoji/70.png) +- 71.png ![71.png](data/emoji/71.png) +- 72.png ![72.png](data/emoji/72.png) +- 73.png ![73.png](data/emoji/73.png) +- 74.png ![74.png](data/emoji/74.png) +- 75.png ![75.png](data/emoji/75.png) +- 76.png ![76.png](data/emoji/76.png) +- 77.png ![77.png](data/emoji/77.png) +- 78.png ![78.png](data/emoji/78.png) +- 79.png ![79.png](data/emoji/79.png) +- 80.png ![80.png](data/emoji/80.png) +- 81.png ![81.png](data/emoji/81.png) +- 82.png ![82.png](data/emoji/82.png) +- 83.png ![83.png](data/emoji/83.png) +- 84.png ![84.png](data/emoji/84.png) +- 85.png ![85.png](data/emoji/85.png) +- 86.png ![86.png](data/emoji/86.png) +- 87.png ![87.png](data/emoji/87.png) +- 88.png ![88.png](data/emoji/88.png) +- 89.png ![89.png](data/emoji/89.png) +- 90.png ![90.png](data/emoji/90.png) +- 91.png ![91.png](data/emoji/91.png) +- 92.png ![92.png](data/emoji/92.png) +- 93.png ![93.png](data/emoji/93.png) +- 94.png ![94.png](data/emoji/94.png) +- 95.png ![95.png](data/emoji/95.png) +- 96.png ![96.png](data/emoji/96.png) +- 97.png ![97.png](data/emoji/97.png) +- 98.png ![98.png](data/emoji/98.png) +- 99.png ![99.png](data/emoji/99.png) +- 100.png ![100.png](data/emoji/100.png) +- 101.png ![101.png](data/emoji/101.png) +- 102.png ![102.png](data/emoji/102.png) +- 103.png ![103.png](data/emoji/103.png) +- 104.png ![104.png](data/emoji/104.png)