iMessage ๊ตฌ์กฐ
Macbook์ iphone iMessage๋ฅผ ๋๊ธฐํํ๋ฉด ~/Users/Name/Library/Messages ํด๋์ ์ ์ฅ๋๋ค. ์ ์ฅ๋ ํด๋๋ฅผ ๋ณด๋ฉด .db๋ก ๊ด๋ฆฌ๋๋ ๊ฒ์ ๋ณผ์์๋ค. sqlite๋ก ์ ์ฅ๋๋ฉฐ ๋ค์ํ ์ปฌ๋ผ๋ค์ด ์๋ค.
์ฃผ์ ํ ์ด๋ธ์ message๋ก text์ attributedBody์์ ๋ฉ์ธ์ง ๋ณธ๋ฌธ์ ์ฐพ์ ์ ์๋ค.
- **ROWID**: ๊ฐ ํ(row)์ ๊ณ ์ ์๋ณ์.
- **guid**: ๋ฉ์์ง์ ์ ์ญ ๊ณ ์ ์๋ณ์.
- **text**: ๋ฉ์์ง์ ๋ด์ฉ.
- **replace**: ๋์ฒด ํ
์คํธ.
- **service_center**: ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ ์๋น์ค ์ผํฐ.
- **handle_id**: ๋ฉ์์ง์ ์ก์ ์ ๋๋ ์์ ์์ ID.
- **subject**: ๋ฉ์์ง์ ์ฃผ์ .
- **country**: ๋ฉ์์ง๊ฐ ๋ฐ์ก๋ ๊ตญ๊ฐ.
- **attributedBody**: ์์ฑ์ด ๋ถ์ฌ๋ ๋ฉ์์ง ๋ณธ๋ฌธ.
- **version**: ๋ฉ์์ง์ ๋ฒ์ .
- **type**: ๋ฉ์์ง ์ ํ.
- **service**: ๋ฉ์์ง๊ฐ ์ ์ก๋ ์๋น์ค (iMessage, SMS ๋ฑ).
- **account**: ๋ฉ์์ง๋ฅผ ๋ณด๋ธ ๊ณ์ .
- **account_guid**: ๊ณ์ ์ ์ ์ญ ๊ณ ์ ์๋ณ์.
- **error**: ๋ฉ์์ง ์ ์ก ์ค๋ฅ ์ฌ๋ถ.
- **date**: ๋ฉ์์ง๊ฐ ์ ์ก๋ ๋ ์ง.
- **date_read**: ๋ฉ์์ง๊ฐ ์ฝํ ๋ ์ง.
- **date_delivered**: ๋ฉ์์ง๊ฐ ์ ๋ฌ๋ ๋ ์ง.
- **is_delivered**: ๋ฉ์์ง๊ฐ ์ ๋ฌ๋์๋์ง ์ฌ๋ถ.
- **is_finished**: ๋ฉ์์ง ์ ์ก์ด ์๋ฃ๋์๋์ง ์ฌ๋ถ.
- **is_emote**: ์ด๋ชจํฐ์ฝ ๋ฉ์์ง์ธ์ง ์ฌ๋ถ.
- **is_from_me**: ๋ฉ์์ง๊ฐ ๋์๊ฒ์ ๋ณด๋ธ ๊ฒ์ธ์ง ์ฌ๋ถ.
- **is_empty**: ๋ฉ์์ง ๋ด์ฉ์ด ๋น์ด ์๋์ง ์ฌ๋ถ.
- **is_delayed**: ๋ฉ์์ง๊ฐ ์ง์ฐ๋์๋์ง ์ฌ๋ถ.
- **is_auto_reply**: ์๋ ์๋ต ๋ฉ์์ง์ธ์ง ์ฌ๋ถ.
- **is_prepared**: ๋ฉ์์ง๊ฐ ์ค๋น๋์๋์ง ์ฌ๋ถ.
- **is_read**: ๋ฉ์์ง๊ฐ ์ฝํ๋์ง ์ฌ๋ถ.
- **is_system_message**: ์์คํ
๋ฉ์์ง์ธ์ง ์ฌ๋ถ.
- **is_sent**: ๋ฉ์์ง๊ฐ ๋ฐ์ก๋์๋์ง ์ฌ๋ถ.
- **has_dd_results**: ๋ฐ์ดํฐ ํ์ง ๊ฒฐ๊ณผ๊ฐ ์๋์ง ์ฌ๋ถ.
- **is_service_message**: ์๋น์ค ๋ฉ์์ง์ธ์ง ์ฌ๋ถ.
- **is_forward**: ๋ฉ์์ง๊ฐ ์ ๋ฌ๋์๋์ง ์ฌ๋ถ.
- **was_downgraded**: ๋ฉ์์ง๊ฐ ๋ค์ด๊ทธ๋ ์ด๋ ๋์๋์ง ์ฌ๋ถ.
- **is_archive**: ๋ฉ์์ง๊ฐ ์์นด์ด๋ธ๋์๋์ง ์ฌ๋ถ.
- **cache_has_attachments**: ๋ฉ์์ง์ ์ฒจ๋ถ ํ์ผ์ด ์๋์ง ์ฌ๋ถ.
- **cache_roomnames**: ์บ์๋ ๋ฐฉ ์ด๋ฆ.
- **was_data_detected**: ๋ฐ์ดํฐ๊ฐ ํ์ง๋์๋์ง ์ฌ๋ถ.
- **was_deduplicated**: ์ค๋ณต ์ ๊ฑฐ๋์๋์ง ์ฌ๋ถ.
- **is_audio_message**: ์ค๋์ค ๋ฉ์์ง์ธ์ง ์ฌ๋ถ.
- **is_played**: ๋ฉ์์ง๊ฐ ์ฌ์๋์๋์ง ์ฌ๋ถ.
- **date_played**: ๋ฉ์์ง๊ฐ ์ฌ์๋ ๋ ์ง.
- **item_type**: ํญ๋ชฉ ์ ํ.
- **other_handle**: ๋ค๋ฅธ ํธ๋ค.
- **group_title**: ๊ทธ๋ฃน ์ ๋ชฉ.
- **group_action_type**: ๊ทธ๋ฃน ์์
์ ํ.
- **share_status**: ๊ณต์ ์ํ.
- **share_direction**: ๊ณต์ ๋ฐฉํฅ.
- **is_expirable**: ๋ง๋ฃ๋๋์ง ์ฌ๋ถ.
- **expire_state**: ๋ง๋ฃ ์ํ.
- **message_action_type**: ๋ฉ์์ง ์์
์ ํ.
- **message_source**: ๋ฉ์์ง ์ถ์ฒ.
- **associated_message_guid**: ์ฐ๊ด๋ ๋ฉ์์ง์ ์ ์ญ ๊ณ ์ ์๋ณ์.
- **associated_message_type**: ์ฐ๊ด๋ ๋ฉ์์ง ์ ํ.
- **balloon_bundle_id**: ํ์ ๋ฒ๋ค ID.
- **payload_data**: ํ์ด๋ก๋ ๋ฐ์ดํฐ.
- **expressive_send_style_id**: ํํ์ ์ ์ก ์คํ์ผ ID.
- **associated_message_range_location**: ์ฐ๊ด๋ ๋ฉ์์ง ๋ฒ์ ์์น.
- **associated_message_range_length**: ์ฐ๊ด๋ ๋ฉ์์ง ๋ฒ์ ๊ธธ์ด.
- **time_expressive_send_played**: ํํ์ ์ ์ก ์ฌ์ ์๊ฐ.
- **message_summary_info**: ๋ฉ์์ง ์์ฝ ์ ๋ณด.
- **ck_sync_state**: ํด๋ผ์ฐ๋ ํคํธ ๋๊ธฐํ ์ํ.
- **ck_record_id**: ํด๋ผ์ฐ๋ ํคํธ ๋ ์ฝ๋ ID.
- **ck_record_change_tag**: ํด๋ผ์ฐ๋ ํคํธ ๋ ์ฝ๋ ๋ณ๊ฒฝ ํ๊ทธ.
- **destination_caller_id**: ๋์ ๋ฐ์ ์ ID.
- **is_corrupt**: ์์๋์๋์ง ์ฌ๋ถ.
- **reply_to_guid**: ํ์ ํ ๋ฉ์์ง์ ์ ์ญ ๊ณ ์ ์๋ณ์.
- **sort_id**: ์ ๋ ฌ ID.
- **is_spam**: ์คํธ ๋ฉ์์ง์ธ์ง ์ฌ๋ถ.
- **has_unseen_mention**: ๋ณด์ง ์์ ๋ฉ์
์ด ์๋์ง ์ฌ๋ถ.
- **thread_originator_guid**: ์ค๋ ๋ ์์์์ ์ ์ญ ๊ณ ์ ์๋ณ์.
- **thread_originator_part**: ์ค๋ ๋ ์์์์ ๋ถ๋ถ.
- **syndication_ranges**: ๋ฐฐํฌ ๋ฒ์.
- **synced_syndication_ranges**: ๋๊ธฐํ๋ ๋ฐฐํฌ ๋ฒ์.
- **was_delivered_quietly**: ์กฐ์ฉํ ์ ๋ฌ๋์๋์ง ์ฌ๋ถ.
- **did_notify_recipient**: ์์ ์๊ฐ ์๋ฆผ์ ๋ฐ์๋์ง ์ฌ๋ถ.
- **date_retracted**: ์ฒ ํ๋ ๋ ์ง.
- **date_edited**: ํธ์ง๋ ๋ ์ง.
- **was_detonated**: ํญํ๋์๋์ง ์ฌ๋ถ.
- **part_count**: ํํธ ์.
- **is_stewie**: ์คํ์ด ์ํ์ธ์ง ์ฌ๋ถ.
- **is_kt_verified**: KT ์ธ์ฆ ์ฌ๋ถ.
- **is_sos**: ๊ธด๊ธ ๋ฉ์์ง์ธ์ง ์ฌ๋ถ.
- **is_critical**: ์ค์ ๋ฉ์์ง์ธ์ง ์ฌ๋ถ.
- **bia_reference_id**: BIA ์ฐธ์กฐ ID.
- **fallback_hash**: ํด๋ฐฑ ํด์.
- **date_uct**: UCT ๋ ์ง.
Python์ผ๋ก ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
๋จผ์ ~/Users/Name/Library/Messages์ ์ ๊ทผํ๋ ค๋ฉด ์ ๊ทผ ๊ถํ์ด ํ์ํ๋ค. ๊ตฌ๋ํ๋ ค๋ python์ ์คํํ๊ฒฝ์ ๋ง์ถฐ
๊ฐ์ธ์ ๋ณด ๋ณดํธ ๋ฐ ๋ณด์ > ์ ์ฒด ๋์คํฌ ์ ๊ทผ ๊ถํ์์ ํฐ๋ฏธ๋๊ณผ Vscode๋ฅผ ํ์ฑํ ์์ผ์ค๋ค.
๋ค์์ผ๋ก python์์ sqlite๋ก Message db๋ฅผ ๋ถ๋ฌ์จ๋ค.
import sqlite3
import pandas as pd
path = "/Users/Name/Library/Messages/chat.db"
# substitute username with your username
conn = sqlite3.connect(path)
# connect to the database
cur = conn.cursor()
# get the names of the tables in the database
# get the 10 entries of the message table using pandas
messages = pd.read_sql_query("select * from message order by date desc limit 10", conn)
# messages['attributedBody']
# b'\x04\x0bstreamtyped\x81\xe8\x03\x84\x01@\x84
๋ถ๋ฌ์จ message๋ฅผ ๋ณด๋ฉด Web ๋ฐ์ ์ผ๋ก ์จ ๋ฌธ์๋ค ๋๋ถ๋ถ์ด encode ๋์ด ์์ด ํ์ธ์ด ์ด๋ ต๋ค. attributedBody๋ฅผ decode ํด์ ๋ฌธ์๋ฅผ ํ์ธํ๋ค.
def decode_message(row):
msg_text = row['text']
msg_attributed_body = row['attributedBody']
# Logic from https://github.com/my-other-github-account/imessage_tools
body=''
if msg_text:
body = msg_text
elif msg_attributed_body is None:
body = ''
else:
try:
msg_attributed_body = msg_attributed_body.decode('utf-8', errors='replace')
except AttributeError as err:
pass
if "NSNumber" in str(msg_attributed_body):
msg_attributed_body = str(msg_attributed_body).split("NSNumber")[0]
if "NSString" in msg_attributed_body:
msg_attributed_body = str(msg_attributed_body).split("NSString")[1]
if "NSDictionary" in msg_attributed_body:
msg_attributed_body = str(msg_attributed_body).split("NSDictionary")[0]
msg_attributed_body = msg_attributed_body[6:-12]
body = msg_attributed_body
return body
print(decode_message(messages.iloc[0]))
# [Web๋ฐ์ ]
# ๋ค์ด๋ฒ ํ๋์นด๋ ์น์ธ
# *
# 13,000์ ์ผ์๋ถ
# 06/15 13:49
# -----
# ๋์ 108,108,128,328,108,420์
Mac๊ณผ Iphone์ ๊ฐ์ด ์ฌ์ฉํ๋ ์ฌ๋์ ์ ๋ช์ค ์ฝ๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ LLM์ผ๋ก ์ฌ๋ฌ๊ฐ์ง๋ฅผ ํ ์ ์๋ค. ๋ค์ ํ๋ก์ ํธ๋ก ~
'๐ป Mac' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Mac ์คํ ์ค์ธ ํ๋ก์ธ์ค ํ์ธ ํ๊ธฐ (1 ~ 75) (0) | 2024.05.31 |
---|---|
Mac ๋ง์ฐ์ค ๋จ๋ฆผ ํ์ ๊ณ ์น๊ธฐ (0) | 2024.05.12 |
[ERR_NGROK_108] ngrok error (0) | 2024.01.13 |
[M1 mac] ngrok ์ค์น ์ค๋ฅ No such file or directory @ rb_file_s_rename - (0) | 2024.01.06 |
[Karabiner] Keyboard is ignored temporarily until key X is pressed #1848 (0) | 2023.10.08 |