sticker-convert 2.13.3.0__py3-none-any.whl → 2.14.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
sticker_convert/cli.py CHANGED
@@ -15,8 +15,9 @@ from sticker_convert.definitions import CONFIG_DIR, DEFAULT_DIR
15
15
  from sticker_convert.job import Job
16
16
  from sticker_convert.job_option import CompOption, CredOption, InputOption, OutputOption
17
17
  from sticker_convert.utils.auth.get_discord_auth import GetDiscordAuth
18
- from sticker_convert.utils.auth.get_kakao_auth import GetKakaoAuth
19
- from sticker_convert.utils.auth.get_kakao_desktop_auth import GetKakaoDesktopAuth
18
+ from sticker_convert.utils.auth.get_kakao_auth_android_login import GetKakaoAuthAndroidLogin
19
+ from sticker_convert.utils.auth.get_kakao_auth_desktop_login import GetKakaoAuthDesktopLogin
20
+ from sticker_convert.utils.auth.get_kakao_auth_desktop_memdump import GetKakaoAuthDesktopMemdump
20
21
  from sticker_convert.utils.auth.get_line_auth import GetLineAuth
21
22
  from sticker_convert.utils.auth.get_signal_auth import GetSignalAuth
22
23
  from sticker_convert.utils.auth.get_viber_auth import GetViberAuth
@@ -176,8 +177,9 @@ class CLI:
176
177
  flags_cred_bool = (
177
178
  "signal_get_auth",
178
179
  "telethon_setup",
179
- "kakao_get_auth",
180
- "kakao_get_auth_desktop",
180
+ "kakao_get_auth_desktop_memdump",
181
+ "kakao_get_auth_desktop_login",
182
+ "kakao_get_auth_android_login",
181
183
  "line_get_auth",
182
184
  "discord_get_auth",
183
185
  "save_cred",
@@ -511,28 +513,42 @@ class CLI:
511
513
  else creds.get("discord", {}).get("token"),
512
514
  )
513
515
 
514
- if args.kakao_get_auth:
515
- get_kakao_auth = GetKakaoAuth(
516
+ if args.kakao_get_auth_android_login:
517
+ get_kakao_auth_android_login = GetKakaoAuthAndroidLogin(
516
518
  opt_cred=opt_cred,
517
519
  cb_msg=self.cb.msg,
518
520
  cb_msg_block=self.cb.msg_block,
519
521
  cb_ask_str=self.cb.ask_str,
520
522
  )
521
- auth_token = get_kakao_auth.get_cred()
523
+ auth_token = get_kakao_auth_android_login.get_cred()
522
524
 
523
525
  if auth_token:
524
526
  opt_cred.kakao_auth_token = auth_token
525
527
 
526
528
  self.cb.msg(f"Got auth_token successfully: {auth_token}")
527
529
 
528
- if args.kakao_get_auth_desktop:
529
- get_kakao_desktop_auth = GetKakaoDesktopAuth(
530
+ if args.kakao_get_auth_desktop_memdump:
531
+ get_kakao_auth_desktop_memdump = GetKakaoAuthDesktopMemdump(
530
532
  cb_ask_str=self.cb.ask_str,
531
533
  )
532
534
  kakao_bin_path = None
533
535
  if args.kakao_bin_path:
534
536
  kakao_bin_path = args.kakao_bin_path
535
- auth_token, msg = get_kakao_desktop_auth.get_cred(kakao_bin_path)
537
+ auth_token, msg = get_kakao_auth_desktop_memdump.get_cred(kakao_bin_path)
538
+
539
+ if auth_token:
540
+ opt_cred.kakao_auth_token = auth_token
541
+
542
+ self.cb.msg(msg)
543
+
544
+ if args.kakao_get_auth_desktop_login:
545
+ get_kakao_auth_desktop_login = GetKakaoAuthDesktopLogin(
546
+ opt_cred=opt_cred,
547
+ cb_msg=self.cb.msg,
548
+ cb_msg_block=self.cb.msg_block,
549
+ cb_ask_str=self.cb.ask_str,
550
+ )
551
+ auth_token, msg = get_kakao_auth_desktop_login.get_cred()
536
552
 
537
553
  if auth_token:
538
554
  opt_cred.kakao_auth_token = auth_token
@@ -111,10 +111,10 @@ def yuva_to_rgba(frame: "VideoFrame") -> "np.ndarray[Any, Any]":
111
111
  u = u.repeat(2, axis=0).repeat(2, axis=1)
112
112
  v = v.repeat(2, axis=0).repeat(2, axis=1)
113
113
 
114
- y = y.reshape((y.shape[0], y.shape[1], 1))
115
- u = u.reshape((u.shape[0], u.shape[1], 1))
116
- v = v.reshape((v.shape[0], v.shape[1], 1))
117
- a = a.reshape((a.shape[0], a.shape[1], 1))
114
+ y = y.reshape((y.shape[0], y.shape[1], 1)) # type: ignore
115
+ u = u.reshape((u.shape[0], u.shape[1], 1)) # type: ignore
116
+ v = v.reshape((v.shape[0], v.shape[1], 1)) # type: ignore
117
+ a = a.reshape((a.shape[0], a.shape[1], 1)) # type: ignore
118
118
 
119
119
  yuv_array = np.concatenate((y, u, v), axis=2)
120
120
 
sticker_convert/gui.py CHANGED
@@ -163,6 +163,7 @@ class GUI(Window):
163
163
  self.kakao_password_var = StringVar(self)
164
164
  self.kakao_country_code_var = StringVar(self)
165
165
  self.kakao_phone_number_var = StringVar(self)
166
+ self.kakao_device_uuid_var = StringVar(self)
166
167
  self.kakao_bin_path_var = StringVar(self)
167
168
  self.line_cookies_var = StringVar(self)
168
169
  self.viber_auth_var = StringVar(self)
@@ -427,6 +428,9 @@ class GUI(Window):
427
428
  self.kakao_phone_number_var.set(
428
429
  self.creds.get("kakao", {}).get("phone_number", "")
429
430
  )
431
+ self.kakao_device_uuid_var.set(
432
+ self.creds.get("kakao", {}).get("device_uuid", "")
433
+ )
430
434
  self.line_cookies_var.set(self.creds.get("line", {}).get("cookies", ""))
431
435
  self.viber_auth_var.set(self.creds.get("viber", {}).get("auth", ""))
432
436
  self.discord_token_var.set(self.creds.get("discord", {}).get("token", ""))
@@ -599,6 +603,7 @@ class GUI(Window):
599
603
  kakao_password=self.kakao_password_var.get(),
600
604
  kakao_country_code=self.kakao_country_code_var.get(),
601
605
  kakao_phone_number=self.kakao_phone_number_var.get(),
606
+ kakao_device_uuid=self.kakao_device_uuid_var.get(),
602
607
  line_cookies=self.line_cookies_var.get(),
603
608
  viber_auth=self.viber_auth_var.get(),
604
609
  discord_token=self.discord_token_var.get(),
@@ -9,8 +9,9 @@ from ttkbootstrap import Button, Entry, Frame, Label, LabelFrame # type: ignore
9
9
  from sticker_convert.gui_components.frames.right_clicker import RightClicker
10
10
  from sticker_convert.gui_components.gui_utils import GUIUtils
11
11
  from sticker_convert.gui_components.windows.base_window import BaseWindow
12
- from sticker_convert.utils.auth.get_kakao_auth import GetKakaoAuth
13
- from sticker_convert.utils.auth.get_kakao_desktop_auth import GetKakaoDesktopAuth
12
+ from sticker_convert.utils.auth.get_kakao_auth_android_login import GetKakaoAuthAndroidLogin
13
+ from sticker_convert.utils.auth.get_kakao_auth_desktop_login import GetKakaoAuthDesktopLogin
14
+ from sticker_convert.utils.auth.get_kakao_auth_desktop_memdump import GetKakaoAuthDesktopMemdump
14
15
 
15
16
 
16
17
  class KakaoGetAuthWindow(BaseWindow):
@@ -22,72 +23,76 @@ class KakaoGetAuthWindow(BaseWindow):
22
23
  self.cb_msg_block_kakao = partial(self.gui.cb_msg_block, parent=self)
23
24
  self.cb_ask_str_kakao = partial(self.gui.cb_ask_str, parent=self)
24
25
 
25
- self.frame_from_desktop = LabelFrame(
26
- self.scrollable_frame, text="Method 1: From KakaoTalk Desktop"
26
+ self.frame_desktop_memdump = LabelFrame(
27
+ self.scrollable_frame, text="Method 1: KakaoTalk Desktop memdump"
27
28
  )
28
- self.frame_simulate_login = LabelFrame(
29
- self.scrollable_frame, text="Method 2: Simulate login"
29
+ self.frame_desktop_login = LabelFrame(
30
+ self.scrollable_frame, text="Method 2: Simulate Desktop login"
31
+ )
32
+ self.frame_android_login = LabelFrame(
33
+ self.scrollable_frame, text="Method 3: Simulate Android login"
30
34
  )
31
35
  self.frame_login_btn = Frame(self.scrollable_frame)
32
36
 
33
- self.frame_from_desktop.grid(column=0, row=0, sticky="news", padx=3, pady=3)
34
- self.frame_simulate_login.grid(column=0, row=1, sticky="news", padx=3, pady=3)
37
+ self.frame_desktop_memdump.grid(column=0, row=0, sticky="news", padx=3, pady=3)
38
+ self.frame_desktop_login.grid(column=0, row=1, sticky="news", padx=3, pady=3)
39
+ self.frame_android_login.grid(column=0, row=2, sticky="news", padx=3, pady=3)
35
40
 
36
41
  # Method 1 frame
37
42
  self.explanation1_1_lbl = Label(
38
- self.frame_from_desktop,
43
+ self.frame_desktop_memdump,
39
44
  text="This will get Kakao auth_token from Kakao Desktop",
40
45
  justify="left",
41
46
  anchor="w",
42
47
  )
43
48
  self.explanation1_2_lbl = Label(
44
- self.frame_from_desktop,
49
+ self.frame_desktop_memdump,
45
50
  text="Download Kakao Desktop, login and press 'Get auth_token'",
46
51
  justify="left",
47
52
  anchor="w",
48
53
  )
49
54
  self.explanation1_3_lbl = Label(
50
- self.frame_from_desktop,
55
+ self.frame_desktop_memdump,
51
56
  text="This can take about a minute.",
52
57
  justify="left",
53
58
  anchor="w",
54
59
  )
55
60
  if platform.system() != "Darwin":
56
61
  self.explanation1_4_lbl = Label(
57
- self.frame_from_desktop,
62
+ self.frame_desktop_memdump,
58
63
  text="Note: This will download ProcDump and read memory of KakaoTalk Desktop",
59
64
  justify="left",
60
65
  anchor="w",
61
66
  )
62
67
  else:
63
68
  self.explanation1_4_lbl = Label(
64
- self.frame_from_desktop,
69
+ self.frame_desktop_memdump,
65
70
  text="Note: This will read memory of KakaoTalk Desktop",
66
71
  justify="left",
67
72
  anchor="w",
68
73
  )
69
74
  self.kakao_bin_path_lbl = Label(
70
- self.frame_from_desktop,
75
+ self.frame_desktop_memdump,
71
76
  text="Kakao app path (Optional):",
72
77
  justify="left",
73
78
  anchor="w",
74
79
  )
75
80
  self.kakao_bin_path_entry = Entry(
76
- self.frame_from_desktop,
81
+ self.frame_desktop_memdump,
77
82
  textvariable=self.gui.kakao_bin_path_var,
78
83
  width=30,
79
84
  )
80
85
  self.launch_desktop_btn = Button(
81
- self.frame_from_desktop,
86
+ self.frame_desktop_memdump,
82
87
  text="Launch Desktop app",
83
88
  command=self.cb_launch_desktop,
84
89
  width=24,
85
90
  bootstyle="secondary", # type: ignore
86
91
  )
87
92
  self.get_auth_desktop_btn = Button(
88
- self.frame_from_desktop,
93
+ self.frame_desktop_memdump,
89
94
  text="Get auth_token",
90
- command=self.cb_from_desktop,
95
+ command=self.cb_get_auth_desktop_memdump,
91
96
  width=24,
92
97
  )
93
98
 
@@ -110,26 +115,143 @@ class KakaoGetAuthWindow(BaseWindow):
110
115
 
111
116
  # Method 2 frame
112
117
  self.explanation2_1_lbl = Label(
113
- self.frame_simulate_login,
114
- text="This will simulate login to Android Kakao app",
118
+ self.frame_desktop_login,
119
+ text="This will simulate login to Desktop Kakao app",
115
120
  justify="left",
116
121
  anchor="w",
117
122
  )
118
123
  self.explanation2_2_lbl = Label(
119
- self.frame_simulate_login,
120
- text="You will send / receive verification code via SMS",
124
+ self.frame_desktop_login,
125
+ text="You may receive verification code from Kakao app on phone",
121
126
  justify="left",
122
127
  anchor="w",
123
128
  )
124
129
  self.explanation2_3_lbl = Label(
125
- self.frame_simulate_login,
130
+ self.frame_desktop_login,
131
+ text="It is not necessary to download Desktop Kakao app",
132
+ justify="left",
133
+ anchor="w",
134
+ )
135
+
136
+ self.kakao_username_help_btn2 = Button(
137
+ self.frame_desktop_login,
138
+ text="?",
139
+ width=1,
140
+ command=lambda: self.cb_msg_block_kakao(
141
+ self.gui.help["cred"]["kakao_username"]
142
+ ),
143
+ bootstyle="secondary", # type: ignore
144
+ )
145
+ self.kakao_username_lbl2 = Label(
146
+ self.frame_desktop_login,
147
+ text="Username",
148
+ width=18,
149
+ justify="left",
150
+ anchor="w",
151
+ )
152
+ self.kakao_username_entry2 = Entry(
153
+ self.frame_desktop_login,
154
+ textvariable=self.gui.kakao_username_var,
155
+ width=30,
156
+ )
157
+ self.kakao_username_entry2.bind("<Button-3><ButtonRelease-3>", RightClicker)
158
+
159
+ self.kakao_password_help_btn2 = Button(
160
+ self.frame_desktop_login,
161
+ text="?",
162
+ width=1,
163
+ command=lambda: self.cb_msg_block_kakao(
164
+ self.gui.help["cred"]["kakao_password"]
165
+ ),
166
+ bootstyle="secondary", # type: ignore
167
+ )
168
+ self.kakao_password_lbl2 = Label(
169
+ self.frame_desktop_login, text="Password", justify="left", anchor="w"
170
+ )
171
+ self.kakao_password_entry2 = Entry(
172
+ self.frame_desktop_login,
173
+ textvariable=self.gui.kakao_password_var,
174
+ width=30,
175
+ )
176
+ self.kakao_password_entry2.bind("<Button-3><ButtonRelease-3>", RightClicker)
177
+
178
+ self.kakao_device_uuid_help_btn = Button(
179
+ self.frame_desktop_login,
180
+ text="?",
181
+ width=1,
182
+ command=lambda: self.cb_msg_block_kakao(
183
+ self.gui.help["cred"]["kakao_device_uuid"]
184
+ ),
185
+ bootstyle="secondary", # type: ignore
186
+ )
187
+ self.kakao_device_uuid_lbl = Label(
188
+ self.frame_desktop_login,
189
+ text="Device UUID (Optional)",
190
+ justify="left",
191
+ anchor="w",
192
+ )
193
+ self.kakao_device_uuid_entry = Entry(
194
+ self.frame_desktop_login,
195
+ textvariable=self.gui.kakao_device_uuid_var,
196
+ width=30,
197
+ )
198
+ self.kakao_device_uuid_entry.bind("<Button-3><ButtonRelease-3>", RightClicker)
199
+
200
+ self.login_btn2 = Button(
201
+ self.frame_desktop_login,
202
+ text="Login and get auth_token",
203
+ command=self.cb_get_auth_desktop_login,
204
+ width=24,
205
+ )
206
+
207
+ self.explanation2_1_lbl.grid(
208
+ column=0, row=0, columnspan=3, sticky="w", padx=3, pady=3
209
+ )
210
+ self.explanation2_2_lbl.grid(
211
+ column=0, row=1, columnspan=3, sticky="w", padx=3, pady=3
212
+ )
213
+ self.explanation2_3_lbl.grid(
214
+ column=0, row=2, columnspan=3, sticky="w", padx=3, pady=3
215
+ )
216
+
217
+ self.kakao_username_help_btn2.grid(column=0, row=3, sticky="w", padx=3, pady=3)
218
+ self.kakao_username_lbl2.grid(column=1, row=3, sticky="w", padx=3, pady=3)
219
+ self.kakao_username_entry2.grid(column=2, row=3, sticky="w", padx=3, pady=3)
220
+
221
+ self.kakao_password_help_btn2.grid(column=0, row=4, sticky="w", padx=3, pady=3)
222
+ self.kakao_password_lbl2.grid(column=1, row=4, sticky="w", padx=3, pady=3)
223
+ self.kakao_password_entry2.grid(column=2, row=4, sticky="w", padx=3, pady=3)
224
+
225
+ self.kakao_device_uuid_help_btn.grid(
226
+ column=0, row=5, sticky="w", padx=3, pady=3
227
+ )
228
+ self.kakao_device_uuid_lbl.grid(column=1, row=5, sticky="w", padx=3, pady=3)
229
+ self.kakao_device_uuid_entry.grid(column=2, row=5, sticky="w", padx=3, pady=3)
230
+
231
+ self.login_btn2.grid(column=0, row=6, columnspan=3, padx=3, pady=3)
232
+
233
+ # Method 3 frame
234
+ self.explanation3_1_lbl = Label(
235
+ self.frame_android_login,
236
+ text="This will simulate login to Android Kakao app",
237
+ justify="left",
238
+ anchor="w",
239
+ )
240
+ self.explanation3_2_lbl = Label(
241
+ self.frame_android_login,
242
+ text="You will send / receive verification code via SMS",
243
+ justify="left",
244
+ anchor="w",
245
+ )
246
+ self.explanation3_3_lbl = Label(
247
+ self.frame_android_login,
126
248
  text="You will be logged out of existing device",
127
249
  justify="left",
128
250
  anchor="w",
129
251
  )
130
252
 
131
- self.kakao_username_help_btn = Button(
132
- self.frame_simulate_login,
253
+ self.kakao_username_help_btn3 = Button(
254
+ self.frame_android_login,
133
255
  text="?",
134
256
  width=1,
135
257
  command=lambda: self.cb_msg_block_kakao(
@@ -137,22 +259,22 @@ class KakaoGetAuthWindow(BaseWindow):
137
259
  ),
138
260
  bootstyle="secondary", # type: ignore
139
261
  )
140
- self.kakao_username_lbl = Label(
141
- self.frame_simulate_login,
262
+ self.kakao_username_lbl3 = Label(
263
+ self.frame_android_login,
142
264
  text="Username",
143
265
  width=18,
144
266
  justify="left",
145
267
  anchor="w",
146
268
  )
147
- self.kakao_username_entry = Entry(
148
- self.frame_simulate_login,
269
+ self.kakao_username_entry3 = Entry(
270
+ self.frame_android_login,
149
271
  textvariable=self.gui.kakao_username_var,
150
272
  width=30,
151
273
  )
152
- self.kakao_username_entry.bind("<Button-3><ButtonRelease-3>", RightClicker)
274
+ self.kakao_username_entry3.bind("<Button-3><ButtonRelease-3>", RightClicker)
153
275
 
154
- self.kakao_password_help_btn = Button(
155
- self.frame_simulate_login,
276
+ self.kakao_password_help_btn3 = Button(
277
+ self.frame_android_login,
156
278
  text="?",
157
279
  width=1,
158
280
  command=lambda: self.cb_msg_block_kakao(
@@ -160,18 +282,18 @@ class KakaoGetAuthWindow(BaseWindow):
160
282
  ),
161
283
  bootstyle="secondary", # type: ignore
162
284
  )
163
- self.kakao_password_lbl = Label(
164
- self.frame_simulate_login, text="Password", justify="left", anchor="w"
285
+ self.kakao_password_lbl3 = Label(
286
+ self.frame_android_login, text="Password", justify="left", anchor="w"
165
287
  )
166
- self.kakao_password_entry = Entry(
167
- self.frame_simulate_login,
288
+ self.kakao_password_entry3 = Entry(
289
+ self.frame_android_login,
168
290
  textvariable=self.gui.kakao_password_var,
169
291
  width=30,
170
292
  )
171
- self.kakao_password_entry.bind("<Button-3><ButtonRelease-3>", RightClicker)
293
+ self.kakao_password_entry3.bind("<Button-3><ButtonRelease-3>", RightClicker)
172
294
 
173
295
  self.kakao_country_code_help_btn = Button(
174
- self.frame_simulate_login,
296
+ self.frame_android_login,
175
297
  text="?",
176
298
  width=1,
177
299
  command=lambda: self.cb_msg_block_kakao(
@@ -180,17 +302,17 @@ class KakaoGetAuthWindow(BaseWindow):
180
302
  bootstyle="secondary", # type: ignore
181
303
  )
182
304
  self.kakao_country_code_lbl = Label(
183
- self.frame_simulate_login, text="Country code", justify="left", anchor="w"
305
+ self.frame_android_login, text="Country code", justify="left", anchor="w"
184
306
  )
185
307
  self.kakao_country_code_entry = Entry(
186
- self.frame_simulate_login,
308
+ self.frame_android_login,
187
309
  textvariable=self.gui.kakao_country_code_var,
188
310
  width=30,
189
311
  )
190
312
  self.kakao_country_code_entry.bind("<Button-3><ButtonRelease-3>", RightClicker)
191
313
 
192
314
  self.kakao_phone_number_help_btn = Button(
193
- self.frame_simulate_login,
315
+ self.frame_android_login,
194
316
  text="?",
195
317
  width=1,
196
318
  command=lambda: self.cb_msg_block_kakao(
@@ -199,39 +321,39 @@ class KakaoGetAuthWindow(BaseWindow):
199
321
  bootstyle="secondary", # type: ignore
200
322
  )
201
323
  self.kakao_phone_number_lbl = Label(
202
- self.frame_simulate_login, text="Phone number", justify="left", anchor="w"
324
+ self.frame_android_login, text="Phone number", justify="left", anchor="w"
203
325
  )
204
326
  self.kakao_phone_number_entry = Entry(
205
- self.frame_simulate_login,
327
+ self.frame_android_login,
206
328
  textvariable=self.gui.kakao_phone_number_var,
207
329
  width=30,
208
330
  )
209
331
  self.kakao_phone_number_entry.bind("<Button-3><ButtonRelease-3>", RightClicker)
210
332
 
211
- self.login_btn = Button(
212
- self.frame_simulate_login,
333
+ self.login_btn3 = Button(
334
+ self.frame_android_login,
213
335
  text="Login and get auth_token",
214
- command=self.cb_simulate_login,
336
+ command=self.cb_get_auth_android_login,
215
337
  width=24,
216
338
  )
217
339
 
218
- self.explanation2_1_lbl.grid(
340
+ self.explanation3_1_lbl.grid(
219
341
  column=0, row=0, columnspan=3, sticky="w", padx=3, pady=3
220
342
  )
221
- self.explanation2_2_lbl.grid(
343
+ self.explanation3_2_lbl.grid(
222
344
  column=0, row=1, columnspan=3, sticky="w", padx=3, pady=3
223
345
  )
224
- self.explanation2_3_lbl.grid(
346
+ self.explanation3_3_lbl.grid(
225
347
  column=0, row=2, columnspan=3, sticky="w", padx=3, pady=3
226
348
  )
227
349
 
228
- self.kakao_username_help_btn.grid(column=0, row=3, sticky="w", padx=3, pady=3)
229
- self.kakao_username_lbl.grid(column=1, row=3, sticky="w", padx=3, pady=3)
230
- self.kakao_username_entry.grid(column=2, row=3, sticky="w", padx=3, pady=3)
350
+ self.kakao_username_help_btn3.grid(column=0, row=3, sticky="w", padx=3, pady=3)
351
+ self.kakao_username_lbl3.grid(column=1, row=3, sticky="w", padx=3, pady=3)
352
+ self.kakao_username_entry3.grid(column=2, row=3, sticky="w", padx=3, pady=3)
231
353
 
232
- self.kakao_password_help_btn.grid(column=0, row=4, sticky="w", padx=3, pady=3)
233
- self.kakao_password_lbl.grid(column=1, row=4, sticky="w", padx=3, pady=3)
234
- self.kakao_password_entry.grid(column=2, row=4, sticky="w", padx=3, pady=3)
354
+ self.kakao_password_help_btn3.grid(column=0, row=4, sticky="w", padx=3, pady=3)
355
+ self.kakao_password_lbl3.grid(column=1, row=4, sticky="w", padx=3, pady=3)
356
+ self.kakao_password_entry3.grid(column=2, row=4, sticky="w", padx=3, pady=3)
235
357
 
236
358
  self.kakao_country_code_help_btn.grid(
237
359
  column=0, row=5, sticky="w", padx=3, pady=3
@@ -244,16 +366,41 @@ class KakaoGetAuthWindow(BaseWindow):
244
366
  )
245
367
  self.kakao_phone_number_lbl.grid(column=1, row=6, sticky="w", padx=3, pady=3)
246
368
  self.kakao_phone_number_entry.grid(column=2, row=6, sticky="w", padx=3, pady=3)
247
- self.login_btn.grid(column=0, row=7, columnspan=3, padx=3, pady=3)
369
+ self.login_btn3.grid(column=0, row=7, columnspan=3, padx=3, pady=3)
248
370
 
249
371
  GUIUtils.finalize_window(self)
250
372
 
251
- def cb_simulate_login(self) -> None:
252
- Thread(target=self.cb_simulate_login_thread, daemon=True).start()
373
+ def cb_get_auth_android_login(self) -> None:
374
+ Thread(target=self.cb_get_auth_android_login_thread, daemon=True).start()
375
+
376
+ def cb_get_auth_desktop_login_thread(self, *_: Any) -> None:
377
+ self.gui.save_creds()
378
+ m = GetKakaoAuthDesktopLogin(
379
+ opt_cred=self.gui.get_opt_cred(),
380
+ cb_msg=self.gui.cb_msg,
381
+ cb_msg_block=self.cb_msg_block_kakao,
382
+ cb_ask_str=self.cb_ask_str_kakao,
383
+ )
384
+
385
+ auth_token, msg = m.get_cred()
386
+
387
+ if auth_token:
388
+ if not self.gui.creds.get("kakao"):
389
+ self.gui.creds["kakao"] = {}
390
+ self.gui.creds["kakao"]["auth_token"] = auth_token
391
+ self.gui.kakao_auth_token_var.set(auth_token)
392
+
393
+ self.gui.save_creds()
394
+ self.gui.highlight_fields()
395
+
396
+ self.cb_msg_block_kakao(msg)
397
+
398
+ def cb_get_auth_desktop_login(self) -> None:
399
+ Thread(target=self.cb_get_auth_desktop_login_thread, daemon=True).start()
253
400
 
254
- def cb_simulate_login_thread(self, *_: Any) -> None:
401
+ def cb_get_auth_android_login_thread(self, *_: Any) -> None:
255
402
  self.gui.save_creds()
256
- m = GetKakaoAuth(
403
+ m = GetKakaoAuthAndroidLogin(
257
404
  opt_cred=self.gui.get_opt_cred(),
258
405
  cb_msg=self.gui.cb_msg,
259
406
  cb_msg_block=self.cb_msg_block_kakao,
@@ -275,7 +422,7 @@ class KakaoGetAuthWindow(BaseWindow):
275
422
  self.cb_msg_block_kakao("Failed to get auth_token")
276
423
 
277
424
  def cb_launch_desktop(self) -> None:
278
- m = GetKakaoDesktopAuth(
425
+ m = GetKakaoAuthDesktopMemdump(
279
426
  cb_ask_str=self.cb_ask_str_kakao,
280
427
  )
281
428
  if self.gui.kakao_bin_path_var.get() != "":
@@ -290,14 +437,14 @@ class KakaoGetAuthWindow(BaseWindow):
290
437
  "Error: Cannot launch Kakao Desktop. Is it installed?"
291
438
  )
292
439
 
293
- def cb_from_desktop(self) -> None:
294
- Thread(target=self.cb_from_desktop_thread, daemon=True).start()
440
+ def cb_get_auth_desktop_memdump(self) -> None:
441
+ Thread(target=self.cb_get_auth_desktop_memdump_thread, daemon=True).start()
295
442
 
296
- def cb_from_desktop_thread(self, *_: Any) -> None:
443
+ def cb_get_auth_desktop_memdump_thread(self, *_: Any) -> None:
297
444
  self.gui.save_creds()
298
445
  self.gui.cb_msg("Getting auth_token, this may take a minute...")
299
446
  self.gui.cb_bar("indeterminate")
300
- m = GetKakaoDesktopAuth(
447
+ m = GetKakaoAuthDesktopMemdump(
301
448
  cb_ask_str=self.cb_ask_str_kakao,
302
449
  )
303
450
 
@@ -223,6 +223,7 @@ class CredOption(BaseOption):
223
223
  kakao_auth_token: str = ""
224
224
  kakao_username: str = ""
225
225
  kakao_password: str = ""
226
+ kakao_device_uuid: str = ""
226
227
  kakao_country_code: str = ""
227
228
  kakao_phone_number: str = ""
228
229
  line_cookies: str = ""
@@ -66,13 +66,15 @@
66
66
  "telegram_userid": "Set Telegram user_id (From real account, not bot account). Required for uploading Telegram stickers.",
67
67
  "telethon_setup": "Setup Telethon",
68
68
  "kakao_auth_token": "Set Kakao auth_token. Required for downloading animated stickers from https://e.kakao.com/t/xxxxx",
69
- "kakao_get_auth": "Generate Kakao auth_token by simulating login. Kakao username, password, country code and phone number are also required.",
70
- "kakao_get_auth_desktop": "Get Kakao auth_token from Kakao Desktop application.",
69
+ "kakao_get_auth_android_login": "Get Kakao auth_token by simulating login from Android. Kakao username, password, country code and phone number required.",
70
+ "kakao_get_auth_desktop_memdump": "Get Kakao auth_token from installed Kakao Desktop application with memdump.",
71
+ "kakao_get_auth_desktop_login": "Get Kakao auth_token by simulating login from Desktop application. Kakao username and password required.",
71
72
  "kakao_bin_path": "Set Kakao Desktop application path for launching and getting auth_token.\nUseful for portable installation.",
72
- "kakao_username": "Set Kakao username, which is email or phone number used for signing up Kakao account\nExample: +447700900142\nRequired for generating Kakao auth_token.",
73
- "kakao_password": "Set Kakao password (Password of Kakao account).\nRequired for generating Kakao auth_token.",
74
- "kakao_country_code": "Set Kakao country code of phone.\nExample: 82 (For korea), 44 (For UK), 1 (For USA).\nRequired for generating Kakao auth_token.",
75
- "kakao_phone_number": "Set Kakao phone number (Phone number associated with your Kakao account)\nDo NOT enter country code\nExample: 7700900142\nUsed for send / receive verification code via SMS.\nRequired for generating Kakao auth_token.",
73
+ "kakao_username": "Set Kakao username, which is email or phone number used for signing up Kakao account\nExample: +447700900142\nRequired for getting Kakao auth_token by simulating android/desktop login.",
74
+ "kakao_password": "Set Kakao password (Password of Kakao account).\nRequired for getting Kakao auth_token by simulating android/desktop login.",
75
+ "kakao_country_code": "Set Kakao country code of phone.\nExample: 82 (For korea), 44 (For UK), 1 (For USA).\nRequired for getting Kakao auth_token by simulating android login.",
76
+ "kakao_phone_number": "Set Kakao phone number (Phone number associated with your Kakao account)\nDo NOT enter country code\nExample: 7700900142\nUsed for send / receive verification code via SMS.\nRequired for getting Kakao auth_token by simulating android login.",
77
+ "kakao_device_uuid": "Set Kakao device uuid for desktop login. Defaults to real device uuid.\nOptional for getting Kakao auth_token by simulating desktop login",
76
78
  "line_get_auth": "Get Line cookies from browser, which is required to create custom message stickers.",
77
79
  "line_cookies": "Set Line cookies, which is required to create custom message stickers.",
78
80
  "viber_auth": "Set Viber authentication data.\nRequired for uploading Viber stickers.",
@@ -11,7 +11,7 @@ from bs4 import BeautifulSoup
11
11
  from sticker_convert.job_option import CredOption
12
12
 
13
13
 
14
- class GetKakaoAuth:
14
+ class GetKakaoAuthAndroidLogin:
15
15
  def __init__(
16
16
  self,
17
17
  opt_cred: CredOption,
@@ -0,0 +1,282 @@
1
+ #!/usr/bin/env python3
2
+ import base64
3
+ import hashlib
4
+ import json
5
+ import os
6
+ import platform
7
+ import shutil
8
+ import socket
9
+ import subprocess
10
+ import time
11
+ import uuid
12
+ from typing import Any, Callable, Optional, Tuple
13
+
14
+ import requests
15
+ from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
16
+
17
+ from sticker_convert.job_option import CredOption
18
+
19
+
20
+ class GetKakaoAuthDesktopLogin:
21
+ def __init__(
22
+ self,
23
+ opt_cred: CredOption,
24
+ cb_msg: Callable[..., None] = print,
25
+ cb_msg_block: Callable[..., Any] = input,
26
+ cb_ask_str: Callable[..., str] = input,
27
+ ) -> None:
28
+ self.opt_cred = opt_cred
29
+ self.username = opt_cred.kakao_username
30
+ self.password = opt_cred.kakao_password
31
+
32
+ self.cb_msg = cb_msg
33
+ self.cb_msg_block = cb_msg_block
34
+ self.cb_ask_str = cb_ask_str
35
+
36
+ if platform.system() == "Darwin":
37
+ self.plat = "mac"
38
+ user_agent_os = "Mc"
39
+ self.os_version = platform.mac_ver()[0]
40
+ version = "25.2.0"
41
+ else:
42
+ self.plat = "win32"
43
+ user_agent_os = "Wd"
44
+ if platform.system() == "Windows":
45
+ self.os_version = platform.uname().version
46
+ else:
47
+ self.os_version = "10.0"
48
+ version = "25.7.7"
49
+
50
+ user_agent = f"KT/{version} {user_agent_os}/{self.os_version} en"
51
+ self.headers = {
52
+ "user-agent": user_agent,
53
+ "a": f"{self.plat}/{version}/en",
54
+ "accept": "*/*",
55
+ "accept-encoding": "gzip, deflate, br",
56
+ "accept-language": "en",
57
+ "host": "katalk.kakao.com",
58
+ "Connection": "close",
59
+ }
60
+
61
+ self.device_name = socket.gethostname()
62
+ self.device_uuid = self.get_device_uuid()
63
+
64
+ hash = hashlib.sha512(
65
+ f"KLEAL|{self.username}|{self.device_uuid}|LCNUE|{user_agent}".encode(
66
+ "utf-8"
67
+ )
68
+ ).hexdigest()
69
+ xvc = hash[:16]
70
+
71
+ self.headers_login = self.headers.copy()
72
+ self.headers_login["x-vc"] = xvc
73
+
74
+ def pkcs7_pad(self, m: str) -> str:
75
+ return m + chr(16 - len(m) % 16) * (16 - len(m) % 16)
76
+
77
+ def windows_get_pragma(self, use_wine: bool = False) -> Optional[str]:
78
+ sys_uuid = None
79
+ hdd_model = None
80
+ hdd_serial = None
81
+
82
+ if use_wine and shutil.which("wine") is None:
83
+ return None
84
+
85
+ regkey = "HKEY_CURRENT_USER\\Software\\Kakao\\KakaoTalk\\DeviceInfo"
86
+ wine = "wine " if use_wine else ""
87
+ cmd = f"{wine}reg query '{regkey}' /v Last"
88
+ last_device_info = subprocess.run(
89
+ cmd, stdout=subprocess.PIPE, shell=True
90
+ ).stdout.decode()
91
+ if "REG_SZ" not in last_device_info:
92
+ return None
93
+ last_device_info = last_device_info.split("\n")[2].split()[2]
94
+
95
+ if self.opt_cred.kakao_device_uuid:
96
+ sys_uuid = self.opt_cred.kakao_device_uuid
97
+ else:
98
+ cmd = f"{wine}reg query '{regkey}\\{last_device_info}' /v sys_uuid"
99
+ sys_uuid = subprocess.run(
100
+ cmd, stdout=subprocess.PIPE, shell=True
101
+ ).stdout.decode()
102
+ if "REG_SZ" in sys_uuid:
103
+ sys_uuid = sys_uuid.split("\n")[2].split()[2]
104
+
105
+ cmd = f"{wine}reg query '{regkey}\\{last_device_info}' /v hdd_model"
106
+ hdd_model = subprocess.run(
107
+ cmd, stdout=subprocess.PIPE, shell=True
108
+ ).stdout.decode()
109
+ if "REG_SZ" in hdd_model:
110
+ hdd_model = hdd_model.split("\n")[2].split()[2]
111
+
112
+ cmd = f"{wine}reg query '{regkey}\\{last_device_info}' /v hdd_serial"
113
+ hdd_serial = subprocess.run(
114
+ cmd, stdout=subprocess.PIPE, shell=True
115
+ ).stdout.decode()
116
+ if "REG_SZ" in hdd_serial:
117
+ hdd_serial = hdd_serial.split("\n")[2].split()[2]
118
+
119
+ if sys_uuid and hdd_model and hdd_serial:
120
+ return f"{sys_uuid}|{hdd_model}|{hdd_serial}"
121
+ else:
122
+ return None
123
+
124
+ def get_device_uuid(self) -> str:
125
+ if platform.system() == "Darwin":
126
+ cmd = "ioreg -rd1 -c IOPlatformExpertDevice | grep IOPlatformUUID | awk '{print $3}'"
127
+ result = subprocess.run(cmd, stdout=subprocess.PIPE, shell=True, check=True)
128
+ hwid = result.stdout.decode().strip().replace('"', "")
129
+
130
+ hwid_sha1 = bytes.fromhex(hashlib.sha1(hwid.encode()).hexdigest())
131
+ hwid_sha256 = bytes.fromhex(hashlib.sha256(hwid.encode()).hexdigest())
132
+
133
+ return base64.b64encode(hwid_sha1 + hwid_sha256).decode()
134
+ else:
135
+ use_wine = True if platform.system != "Windows" else False
136
+ pragma = self.windows_get_pragma(use_wine=use_wine)
137
+ if pragma is None:
138
+ if platform.system == "Windows":
139
+ if self.opt_cred.kakao_device_uuid:
140
+ sys_uuid = self.opt_cred.kakao_device_uuid
141
+ else:
142
+ cmd = "wmic csproduct get uuid"
143
+ result = subprocess.run(cmd, stdout=subprocess.PIPE, shell=True)
144
+ sys_uuid = result.stdout.decode().split("\n")[1].strip()
145
+ cmd = "wmic diskdrive get Model"
146
+ result = subprocess.run(cmd, stdout=subprocess.PIPE, shell=True)
147
+ hdd_model = result.stdout.decode().split("\n")[1].strip()
148
+ cmd = "wmic diskdrive get SerialNumber"
149
+ result = subprocess.run(cmd, stdout=subprocess.PIPE, shell=True)
150
+ hdd_serial = result.stdout.decode().split("\n")[1].strip()
151
+ else:
152
+ if self.opt_cred.kakao_device_uuid:
153
+ sys_uuid = self.opt_cred.kakao_device_uuid
154
+ else:
155
+ product_uuid_path = "/sys/devices/virtual/dmi/id/product_uuid"
156
+ sys_uuid = None
157
+ if os.access(product_uuid_path, os.R_OK):
158
+ cmd = f"cat {product_uuid_path}"
159
+ result = subprocess.run(
160
+ cmd, stdout=subprocess.PIPE, shell=True
161
+ )
162
+ if result.returncode == 0:
163
+ sys_uuid = result.stdout.decode().strip()
164
+ if sys_uuid is None:
165
+ sys_uuid = str(uuid.uuid4()).upper()
166
+ self.opt_cred.kakao_device_uuid = sys_uuid
167
+ hdd_model = "Wine Disk Drive"
168
+ hdd_serial = ""
169
+ pragma = f"{sys_uuid}|{hdd_model}|{hdd_serial}"
170
+
171
+ aes_key = bytes.fromhex("9FBAE3118FDE5DEAEB8279D08F1D4C79")
172
+ aes_iv = bytes.fromhex("00000000000000000000000000000000")
173
+
174
+ cipher = Cipher(algorithms.AES(aes_key), modes.CBC(aes_iv))
175
+ encryptor = cipher.encryptor()
176
+ padded = self.pkcs7_pad(pragma).encode()
177
+ encrypted_pragma = encryptor.update(padded) + encryptor.finalize()
178
+ pragma_hash = hashlib.sha512(encrypted_pragma).digest()
179
+
180
+ return base64.b64encode(pragma_hash).decode()
181
+
182
+ def login(self, forced: bool = False):
183
+ data = {
184
+ "device_name": self.device_name,
185
+ "device_uuid": self.device_uuid,
186
+ "email": self.username,
187
+ "os_version": self.os_version,
188
+ "password": self.password,
189
+ "permanent": "1",
190
+ }
191
+
192
+ if forced:
193
+ data["forced"] = "1"
194
+
195
+ headers = self.headers_login.copy()
196
+ headers["content-type"] = "application/x-www-form-urlencoded"
197
+ response = requests.post(
198
+ f"https://katalk.kakao.com/{self.plat}/account/login.json",
199
+ headers=headers,
200
+ data=data,
201
+ )
202
+
203
+ return json.loads(response.text)
204
+
205
+ def generate_passcode(self):
206
+ data = {
207
+ "password": self.password,
208
+ "permanent": True,
209
+ "device": {
210
+ "name": self.device_name,
211
+ "osVersion": self.os_version,
212
+ "uuid": self.device_uuid,
213
+ },
214
+ "email": self.username,
215
+ }
216
+
217
+ if platform.system() == "Darwin":
218
+ cmd = "sysctl -n hw.model"
219
+ result = subprocess.run(cmd, stdout=subprocess.PIPE, shell=True, check=True)
220
+ data["device"]["model"] = result.stdout.decode().strip() # type: ignore
221
+
222
+ headers = self.headers_login.copy()
223
+ headers["content-type"] = "application/json"
224
+ response = requests.post(
225
+ f"https://katalk.kakao.com/{self.plat}/account/passcodeLogin/generate",
226
+ headers=headers,
227
+ json=data,
228
+ )
229
+
230
+ return json.loads(response.text)
231
+
232
+ def register_device(self):
233
+ data = {
234
+ "device": {"uuid": self.device_uuid},
235
+ "email": self.username,
236
+ "password": self.password,
237
+ }
238
+
239
+ headers = self.headers_login.copy()
240
+ headers["content-type"] = "application/json"
241
+ response = None
242
+
243
+ response = requests.post(
244
+ f"https://katalk.kakao.com/{self.plat}/account/passcodeLogin/registerDevice",
245
+ headers=headers,
246
+ json=data,
247
+ )
248
+ return json.loads(response.text)
249
+
250
+ def get_cred(self) -> Tuple[Optional[str], str]:
251
+ self.cb_msg("Get authorization token")
252
+ rjson = self.login()
253
+ access_token = rjson.get("access_token")
254
+ if access_token is not None:
255
+ auth_token = access_token + "-" + self.device_uuid
256
+ return auth_token, f"Login successful, auth_token: {auth_token}"
257
+
258
+ rjson = self.generate_passcode()
259
+ if rjson.get("status") != 0:
260
+ return None, f"Failed to generate passcode: {rjson}"
261
+ passcode = rjson["passcode"]
262
+
263
+ start_time = time.time()
264
+ register_success = False
265
+ while time.time() - start_time < 60:
266
+ self.cb_ask_str(f"Please enter passcode within 1 minute: {passcode}")
267
+ rjson = self.register_device()
268
+ if rjson["status"] == 0:
269
+ register_success = True
270
+ break
271
+ if register_success is False:
272
+ return None, f"Failed to register device: {rjson}"
273
+
274
+ rjson = self.login()
275
+ if rjson.get("status") == -101:
276
+ rjson = self.login(forced=True)
277
+ access_token = rjson.get("access_token")
278
+ if access_token is None:
279
+ return None, f"Failed to login after registering device: {rjson}"
280
+
281
+ auth_token = access_token + "-" + self.device_uuid
282
+ return auth_token, f"Login successful, auth_token: {auth_token}"
@@ -26,9 +26,13 @@ MSG_LAUNCH_FAIL = "Failed to launch Kakao"
26
26
  MSG_PERMISSION_ERROR = "Failed to read Kakao process memory"
27
27
 
28
28
 
29
- class GetKakaoDesktopAuth:
29
+ class GetKakaoAuthDesktopMemdump:
30
30
  def __init__(self, cb_ask_str: Callable[..., str] = input) -> None:
31
31
  self.cb_ask_str = cb_ask_str
32
+ if platform.system() == "Windows":
33
+ self.auth_token_length = 64
34
+ else:
35
+ self.auth_token_length = 52
32
36
 
33
37
  def launch_kakao(self, kakao_bin_path: str) -> None:
34
38
  if platform.system() == "Windows":
@@ -69,12 +73,11 @@ class GetKakaoDesktopAuth:
69
73
  ):
70
74
  auth_token_addr = cast(int, address) + 15
71
75
  auth_token_bytes = process.read_process_memory(
72
- auth_token_addr, bytes, 200
76
+ auth_token_addr, bytes, self.auth_token_length + 1
73
77
  )
74
- auth_token_term = auth_token_bytes.find(b"\x00")
75
- if auth_token_term == -1:
78
+ if auth_token_bytes[-1:] != b"\x00":
76
79
  continue
77
- auth_token_candidate = auth_token_bytes[:auth_token_term].decode(
80
+ auth_token_candidate = auth_token_bytes[:-1].decode(
78
81
  encoding="ascii"
79
82
  )
80
83
  if len(auth_token_candidate) > 150:
@@ -126,13 +129,12 @@ class GetKakaoDesktopAuth:
126
129
  for i in re.finditer(b"authorization: ", s):
127
130
  auth_token_addr = i.start() + 15
128
131
 
129
- auth_token_bytes = s[auth_token_addr : auth_token_addr + 200]
130
- auth_token_term = auth_token_bytes.find(b"\x00")
131
- if auth_token_term == -1:
132
+ auth_token_bytes = s[
133
+ auth_token_addr : auth_token_addr + self.auth_token_length + 1
134
+ ]
135
+ if auth_token_bytes[-1:] != b"\x00":
132
136
  return None, MSG_NO_AUTH
133
- auth_token_candidate = auth_token_bytes[:auth_token_term].decode(
134
- encoding="ascii"
135
- )
137
+ auth_token_candidate = auth_token_bytes[:-1].decode(encoding="ascii")
136
138
  if len(auth_token_candidate) > 150:
137
139
  auth_token = auth_token_candidate
138
140
  break
@@ -67,11 +67,12 @@ class BotAPI(TelegramAPI):
67
67
  self.cb.put("Token required for downloading from telegram")
68
68
  return False
69
69
 
70
- if opt_cred.telegram_userid.isnumeric():
71
- self.telegram_userid = int(opt_cred.telegram_userid)
72
- else:
73
- self.cb.put("Invalid userid, should contain numbers only")
74
- return False
70
+ if opt_cred.telegram_userid:
71
+ if opt_cred.telegram_userid.isnumeric():
72
+ self.telegram_userid = int(opt_cred.telegram_userid)
73
+ else:
74
+ self.cb.put("Invalid userid, should contain numbers only")
75
+ return False
75
76
 
76
77
  self.application = ( # type: ignore
77
78
  ApplicationBuilder()
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env python3
2
2
 
3
- __version__ = "2.13.3.0"
3
+ __version__ = "2.14.0.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sticker-convert
3
- Version: 2.13.3.0
3
+ Version: 2.14.0.0
4
4
  Summary: Convert (animated) stickers to/from WhatsApp, Telegram, Signal, Line, Kakao, Viber, Discord, iMessage. Written in Python.
5
5
  Author-email: laggykiller <chaudominic2@gmail.com>
6
6
  Maintainer-email: laggykiller <chaudominic2@gmail.com>
@@ -366,9 +366,10 @@ License-File: LICENSE
366
366
  Requires-Dist: aiolimiter~=1.2.1
367
367
  Requires-Dist: anyio~=4.10.0
368
368
  Requires-Dist: apngasm_python~=1.3.2
369
- Requires-Dist: av>=13.1.0
370
- Requires-Dist: beautifulsoup4~=4.13.4
369
+ Requires-Dist: av<15,>=13.1.0
370
+ Requires-Dist: beautifulsoup4~=4.13.5
371
371
  Requires-Dist: cryptg~=0.5.1
372
+ Requires-Dist: cryptography~=46.0.1
372
373
  Requires-Dist: rookiepy~=0.5.6
373
374
  Requires-Dist: httpx~=0.28.1
374
375
  Requires-Dist: imagequant~=1.1.4
@@ -376,15 +377,15 @@ Requires-Dist: memory-tempfile~=2.2.3
376
377
  Requires-Dist: mergedeep~=1.3.4
377
378
  Requires-Dist: numpy>=1.22.4
378
379
  Requires-Dist: Pillow~=11.3.0
379
- Requires-Dist: pyoxipng~=9.1.0
380
- Requires-Dist: python-telegram-bot~=22.3
380
+ Requires-Dist: pyoxipng~=9.1.1
381
+ Requires-Dist: python-telegram-bot~=22.4
381
382
  Requires-Dist: psutil~=7.0.0
382
383
  Requires-Dist: PyMemoryEditor~=1.5.24
383
384
  Requires-Dist: requests~=2.32.4
384
- Requires-Dist: rlottie_python~=1.3.7
385
+ Requires-Dist: rlottie_python~=1.3.8
385
386
  Requires-Dist: signalstickers-client-fork-laggykiller~=3.3.0.post2
386
387
  Requires-Dist: socksio~=1.0.0
387
- Requires-Dist: telethon~=1.40.0
388
+ Requires-Dist: telethon~=1.41.2
388
389
  Requires-Dist: tqdm~=4.67.1
389
390
  Requires-Dist: ttkbootstrap-fork-laggykiller~=1.5.1
390
391
  Requires-Dist: websocket_client~=1.8.0
@@ -497,37 +498,29 @@ Dynamic: license-file
497
498
  To run in CLI mode, pass on any arguments
498
499
 
499
500
  ```
500
- usage: sticker-convert.py [-h] [--version] [--no-confirm] [--no-progress]
501
- [--custom-presets CUSTOM_PRESETS] [--input-dir INPUT_DIR]
501
+ usage: sticker-convert.py [-h] [--version] [--no-confirm] [--no-progress] [--custom-presets CUSTOM_PRESETS] [--input-dir INPUT_DIR]
502
502
  [--download-auto DOWNLOAD_AUTO | --download-signal DOWNLOAD_SIGNAL | --download-telegram DOWNLOAD_TELEGRAM | --download-telegram-telethon DOWNLOAD_TELEGRAM_TELETHON | --download-line DOWNLOAD_LINE | --download-kakao DOWNLOAD_KAKAO | --download-band DOWNLOAD_BAND | --download-ogq DOWNLOAD_OGQ | --download-viber DOWNLOAD_VIBER | --download-discord DOWNLOAD_DISCORD | --download-discord-emoji DOWNLOAD_DISCORD_EMOJI]
503
503
  [--output-dir OUTPUT_DIR] [--author AUTHOR] [--title TITLE]
504
504
  [--export-signal | --export-telegram | --export-telegram-emoji | --export-telegram-telethon | --export-telegram-emoji-telethon | --export-viber | --export-whatsapp | --export-imessage]
505
505
  [--no-compress]
506
506
  [--preset {auto,signal,telegram,telegram_emoji,whatsapp,line,kakao,band,ogq,viber,discord,discord_emoji,imessage_small,imessage_medium,imessage_large,custom}]
507
- [--steps STEPS] [--processes PROCESSES] [--fps-min FPS_MIN] [--fps-max FPS_MAX]
508
- [--fps-power FPS_POWER] [--res-min RES_MIN] [--res-max RES_MAX]
509
- [--res-w-min RES_W_MIN] [--res-w-max RES_W_MAX] [--res-h-min RES_H_MIN]
510
- [--res-h-max RES_H_MAX] [--res-power RES_POWER] [--res-snap-pow2]
511
- [--no-res-snap-pow2] [--quality-min QUALITY_MIN] [--quality-max QUALITY_MAX]
512
- [--quality-power QUALITY_POWER] [--color-min COLOR_MIN] [--color-max COLOR_MAX]
513
- [--color-power COLOR_POWER] [--duration-min DURATION_MIN]
514
- [--duration-max DURATION_MAX] [--padding-percent PADDING_PERCENT]
515
- [--bg-color BG_COLOR] [--vid-size-max VID_SIZE_MAX]
516
- [--img-size-max IMG_SIZE_MAX] [--vid-format VID_FORMAT]
517
- [--img-format IMG_FORMAT] [--fake-vid] [--no-fake-vid]
518
- [--scale-filter SCALE_FILTER] [--quantize-method QUANTIZE_METHOD]
519
- [--cache-dir CACHE_DIR] [--chromium-path CHROMIUM_PATH]
520
- [--default-emoji DEFAULT_EMOJI] [--signal-uuid SIGNAL_UUID]
521
- [--signal-password SIGNAL_PASSWORD] [--signal-get-auth]
522
- [--telegram-token TELEGRAM_TOKEN] [--telegram-userid TELEGRAM_USERID]
523
- [--telethon-setup] [--kakao-auth-token KAKAO_AUTH_TOKEN] [--kakao-get-auth]
524
- [--kakao-get-auth-desktop] [--kakao-bin-path KAKAO_BIN_PATH]
525
- [--kakao-username KAKAO_USERNAME] [--kakao-password KAKAO_PASSWORD]
526
- [--kakao-country-code KAKAO_COUNTRY_CODE]
527
- [--kakao-phone-number KAKAO_PHONE_NUMBER] [--line-get-auth]
528
- [--line-cookies LINE_COOKIES] [--viber-auth VIBER_AUTH]
529
- [--viber-get-auth VIBER_GET_AUTH] [--viber-bin-path VIBER_BIN_PATH]
530
- [--discord-get-auth] [--discord-token DISCORD_TOKEN] [--save-cred]
507
+ [--steps STEPS] [--processes PROCESSES] [--fps-min FPS_MIN] [--fps-max FPS_MAX] [--fps-power FPS_POWER]
508
+ [--res-min RES_MIN] [--res-max RES_MAX] [--res-w-min RES_W_MIN] [--res-w-max RES_W_MAX]
509
+ [--res-h-min RES_H_MIN] [--res-h-max RES_H_MAX] [--res-power RES_POWER] [--res-snap-pow2]
510
+ [--no-res-snap-pow2] [--quality-min QUALITY_MIN] [--quality-max QUALITY_MAX] [--quality-power QUALITY_POWER]
511
+ [--color-min COLOR_MIN] [--color-max COLOR_MAX] [--color-power COLOR_POWER] [--duration-min DURATION_MIN]
512
+ [--duration-max DURATION_MAX] [--padding-percent PADDING_PERCENT] [--bg-color BG_COLOR]
513
+ [--vid-size-max VID_SIZE_MAX] [--img-size-max IMG_SIZE_MAX] [--vid-format VID_FORMAT]
514
+ [--img-format IMG_FORMAT] [--fake-vid] [--no-fake-vid] [--scale-filter SCALE_FILTER]
515
+ [--quantize-method QUANTIZE_METHOD] [--cache-dir CACHE_DIR] [--chromium-path CHROMIUM_PATH]
516
+ [--default-emoji DEFAULT_EMOJI] [--signal-uuid SIGNAL_UUID] [--signal-password SIGNAL_PASSWORD]
517
+ [--signal-get-auth] [--telegram-token TELEGRAM_TOKEN] [--telegram-userid TELEGRAM_USERID] [--telethon-setup]
518
+ [--kakao-auth-token KAKAO_AUTH_TOKEN] [--kakao-get-auth-android-login] [--kakao-get-auth-desktop-memdump]
519
+ [--kakao-get-auth-desktop-login] [--kakao-bin-path KAKAO_BIN_PATH] [--kakao-username KAKAO_USERNAME]
520
+ [--kakao-password KAKAO_PASSWORD] [--kakao-country-code KAKAO_COUNTRY_CODE]
521
+ [--kakao-phone-number KAKAO_PHONE_NUMBER] [--kakao-device-uuid KAKAO_DEVICE_UUID] [--line-get-auth]
522
+ [--line-cookies LINE_COOKIES] [--viber-auth VIBER_AUTH] [--viber-get-auth VIBER_GET_AUTH]
523
+ [--viber-bin-path VIBER_BIN_PATH] [--discord-get-auth] [--discord-token DISCORD_TOKEN] [--save-cred]
531
524
 
532
525
  CLI for stickers-convert
533
526
 
@@ -706,29 +699,35 @@ Credentials options:
706
699
  --telethon-setup Setup Telethon
707
700
  --kakao-auth-token KAKAO_AUTH_TOKEN
708
701
  Set Kakao auth_token. Required for downloading animated stickers from https://e.kakao.com/t/xxxxx
709
- --kakao-get-auth Generate Kakao auth_token by simulating login. Kakao username, password, country code and phone number are also required.
710
- --kakao-get-auth-desktop
711
- Get Kakao auth_token from Kakao Desktop application.
702
+ --kakao-get-auth-android-login
703
+ Get Kakao auth_token by simulating login from Android. Kakao username, password, country code and phone number required.
704
+ --kakao-get-auth-desktop-memdump
705
+ Get Kakao auth_token from installed Kakao Desktop application with memdump.
706
+ --kakao-get-auth-desktop-login
707
+ Get Kakao auth_token by simulating login from Desktop application. Kakao username and password required.
712
708
  --kakao-bin-path KAKAO_BIN_PATH
713
709
  Set Kakao Desktop application path for launching and getting auth_token.
714
710
  Useful for portable installation.
715
711
  --kakao-username KAKAO_USERNAME
716
712
  Set Kakao username, which is email or phone number used for signing up Kakao account
717
713
  Example: +447700900142
718
- Required for generating Kakao auth_token.
714
+ Required for getting Kakao auth_token by simulating android/desktop login.
719
715
  --kakao-password KAKAO_PASSWORD
720
716
  Set Kakao password (Password of Kakao account).
721
- Required for generating Kakao auth_token.
717
+ Required for getting Kakao auth_token by simulating android/desktop login.
722
718
  --kakao-country-code KAKAO_COUNTRY_CODE
723
719
  Set Kakao country code of phone.
724
720
  Example: 82 (For korea), 44 (For UK), 1 (For USA).
725
- Required for generating Kakao auth_token.
721
+ Required for getting Kakao auth_token by simulating android login.
726
722
  --kakao-phone-number KAKAO_PHONE_NUMBER
727
723
  Set Kakao phone number (Phone number associated with your Kakao account)
728
724
  Do NOT enter country code
729
725
  Example: 7700900142
730
726
  Used for send / receive verification code via SMS.
731
- Required for generating Kakao auth_token.
727
+ Required for getting Kakao auth_token by simulating android login.
728
+ --kakao-device-uuid KAKAO_DEVICE_UUID
729
+ Set Kakao device uuid for desktop login. Defaults to real device uuid.
730
+ Optional for getting Kakao auth_token by simulating desktop login
732
731
  --line-get-auth Get Line cookies from browser, which is required to create custom message stickers.
733
732
  --line-cookies LINE_COOKIES
734
733
  Set Line cookies, which is required to create custom message stickers.
@@ -1,12 +1,12 @@
1
1
  sticker_convert/__init__.py,sha256=iQnv6UOOA69c3soAn7ZOnAIubTIQSUxtq1Uhh8xRWvU,102
2
2
  sticker_convert/__main__.py,sha256=elDCMvU27letiYs8jPUpxaCq5puURnvcDuqGsAAb6_w,592
3
- sticker_convert/cli.py,sha256=XsP-GE2XxOeseryXukIMR9MVdPOd7nhjO3Bp37WDxBM,22913
4
- sticker_convert/converter.py,sha256=6Yqq7nt0mYxoiuyF7nhDxuhvrAOOU8qCsiREWE1qf9M,41077
3
+ sticker_convert/cli.py,sha256=AWdcGeMJudYb39Pxi28svPQrNs6pPpa-d-RhQN-Ryz8,23674
4
+ sticker_convert/converter.py,sha256=7-XQbBUAqfc9mLuLTIkjjMeO-UTInldeRD32suFgNJo,41141
5
5
  sticker_convert/definitions.py,sha256=BqROmOvqIqw8ANaqZXIxJAXGD0HgjAvCfFouQ4SaWHc,2254
6
- sticker_convert/gui.py,sha256=4Yz9F57MhPgzODFYikT73aMBevcnEB4dwKvUsJnSJwY,34341
6
+ sticker_convert/gui.py,sha256=kUEIfd7fYtvlGwc29VQV1dpQLn07Gv2WEeXuJDuAlsE,34571
7
7
  sticker_convert/job.py,sha256=AJoxWg61ZxQRHzKyGIrQaaCGs-S6NDO6lvWjddYemH8,28543
8
- sticker_convert/job_option.py,sha256=gWE7oV1azPcMeri-BrKbqMjpL0hbHE8yRPtOosRG580,8190
9
- sticker_convert/version.py,sha256=zkaUkSx4GNtFkhpch_kcfHX4GwPuBtPB9jxk7EqNaDw,49
8
+ sticker_convert/job_option.py,sha256=unG8kt2cCK-Rmg45xkhD4JFt5ubx6P6JEvLvDeOeX_I,8222
9
+ sticker_convert/version.py,sha256=u8HiSgljvPyJwWtEWrwe5go7kX6hzYxjhPg2UDJ2ssg,49
10
10
  sticker_convert/downloaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  sticker_convert/downloaders/download_band.py,sha256=JPjwwdxbMXPBM9TXF76wT9mtoDCLssYnrm1iS2C6uVM,3629
12
12
  sticker_convert/downloaders/download_base.py,sha256=MI5pCT_tkfoaFlrD1oNynDj1Rv1CK0APuNVElTEAEis,5110
@@ -32,7 +32,7 @@ sticker_convert/gui_components/windows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JC
32
32
  sticker_convert/gui_components/windows/advanced_compression_window.py,sha256=mIkapYo93Kw7oa10in1yH-DwR3hX0D2JYJ7cTAs48bk,33748
33
33
  sticker_convert/gui_components/windows/base_window.py,sha256=xBE1peGMPvWsdrFej0CJUVhmQ57GJGvz-cX03nIIhkE,1108
34
34
  sticker_convert/gui_components/windows/discord_get_auth_window.py,sha256=a9ptBqtpZslQJ87-ZPotcT6gigouIHWAFijfkWv2rZQ,2786
35
- sticker_convert/gui_components/windows/kakao_get_auth_window.py,sha256=9YfzuKQE6bjfqFxkpCa4XxMnw2T1UPPI_A6Z8E75J_M,11953
35
+ sticker_convert/gui_components/windows/kakao_get_auth_window.py,sha256=TH4yLi4YmydukTm4K99DficaxBne0tAAvbDzU3EYR0A,17624
36
36
  sticker_convert/gui_components/windows/line_get_auth_window.py,sha256=S4ES_lk2-GDvPokZtYALnUc5zW1VbS4WulNqO9K1aSs,3375
37
37
  sticker_convert/gui_components/windows/signal_get_auth_window.py,sha256=d9vWMfrD0s-qI-TmB0796LRvDW64Jh2wmA1mZcRubUw,3126
38
38
  sticker_convert/gui_components/windows/viber_get_auth_window.py,sha256=DI-RayYAfk6ig7NlGy97ulYgZZs77S8CEDIUJdtGDwI,5787
@@ -68,13 +68,13 @@ sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworks
68
68
  sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist,sha256=36D5u4W5XMupxoEa2t-MtAf7XVIIjonbg-vDCOxEhUI,238
69
69
  sticker_convert/ios-message-stickers-template/stickers.xcodeproj/project.xcworkspace/xcuserdata/niklaspeterson.xcuserdatad/UserInterfaceState.xcuserstate,sha256=GB0zcEgI5Ot4Djb1WUSpYFyBomrwM3I-9zlQ0tdonWQ,21835
70
70
  sticker_convert/ios-message-stickers-template/stickers.xcodeproj/xcuserdata/niklaspeterson.xcuserdatad/xcschemes/xcschememanagement.plist,sha256=uHJbEexYAQ1YSuNrCh2mYY_h67_OoJGLGlP0Fuo7lls,364
71
- sticker_convert/resources/NotoColorEmoji.ttf,sha256=Ptd4EMID4aZ3NdwZ05XzLCPy18DDaWaQ9PeOFeV6uBY,10195752
71
+ sticker_convert/resources/NotoColorEmoji.ttf,sha256=cqY1yz0vNSTFFiDN3kBrIXIE6KagbGoJb_jtS1_W4ns,10673480
72
72
  sticker_convert/resources/appicon.icns,sha256=FB2DVTOQcFfQNZ9RcyG3z9c9k7eOiI1qw0IJhXMRFg4,5404
73
73
  sticker_convert/resources/appicon.ico,sha256=-ldugcl2Yq2pBRTktnhGKWInpKyWzRjCiPvMr3XPTlc,38078
74
74
  sticker_convert/resources/appicon.png,sha256=6XBEQz7PnerqS43aRkwpWolFG4WvKMuQ-st1ly-_JPg,5265
75
75
  sticker_convert/resources/compression.json,sha256=X3b3KCpf9KdHWjmV9KzXFf8KQYq7MSFk9O8WmzahVZg,16695
76
76
  sticker_convert/resources/emoji.json,sha256=q9DRFdVJfm7feZW7ZM6Xa5P1QsMvrn0PbBVU9jKcJKI,422720
77
- sticker_convert/resources/help.json,sha256=oDg0JghzaNrsVCzQ0BB_XKW3flsWfeQXrUd9WA34IDw,7811
77
+ sticker_convert/resources/help.json,sha256=LpqTOvORlY2pqVjpN1RCRn2PuOzkxuRMCNw2UwEgCOM,8289
78
78
  sticker_convert/resources/input.json,sha256=cpLQQ-jwXSHQUd8faLn-e-mAEvJViKs_d7UuqIvF7ZQ,4575
79
79
  sticker_convert/resources/memdump_linux.sh,sha256=SFKXiE0ztZyGvpFYPOrdQ0wmY3ndgJuqfiofC7BQon0,625
80
80
  sticker_convert/resources/memdump_windows.ps1,sha256=CfyNSSEW3HJOkTu-mKrP3qh5aprN-1VCBfj-R1fELA0,302
@@ -93,12 +93,13 @@ sticker_convert/utils/process.py,sha256=y_W-D9zkxAEfPvYJZTKxNtNHxmuK0NldpDXu-OdG
93
93
  sticker_convert/utils/singletons.py,sha256=SiV374FxU68DpysGoj_ytU1ErINkeOBbP4s9QTcexeY,357
94
94
  sticker_convert/utils/url_detect.py,sha256=_wmI28hUyngq8TVz1bw7YM90qPLd3bIynawVlbr_lcI,939
95
95
  sticker_convert/utils/auth/get_discord_auth.py,sha256=8H9Z0c7pl6JjzkP8lo0-lCFnBAT5Eql-LYc6M92FY_k,4283
96
- sticker_convert/utils/auth/get_kakao_auth.py,sha256=Wok5sp0GGBgTwwlfYB7lVq82ndBAOGTcqsWEaWAXFNE,10760
97
- sticker_convert/utils/auth/get_kakao_desktop_auth.py,sha256=GNT-Y0lZwqRHuXfItmxRFC7kH81DuPRMDSfrbS-YSrw,8855
96
+ sticker_convert/utils/auth/get_kakao_auth_android_login.py,sha256=YOyzNvPBUseoZBD8o3IoJsDA207G_sJGfZU3x1aUwTA,10772
97
+ sticker_convert/utils/auth/get_kakao_auth_desktop_login.py,sha256=Lf_AzTzRW-NwYrayL7hwXIfQUYZxc03cnFB8WcyBwuE,10680
98
+ sticker_convert/utils/auth/get_kakao_auth_desktop_memdump.py,sha256=GE4rjVx32zHmQbX8tuO8V_ZhBCcXv-sHdeqHEG5H6HI,8911
98
99
  sticker_convert/utils/auth/get_line_auth.py,sha256=8l8ha2vQmk3rHGvDE7PkcxQXbH3oe62LKbI3qVUtvqc,2196
99
100
  sticker_convert/utils/auth/get_signal_auth.py,sha256=I6od2aj8yl1eLV8S2TtNQEPM77DC7FpkRKex0pXY2II,4580
100
101
  sticker_convert/utils/auth/get_viber_auth.py,sha256=aQiv1JI2RKiPVoo_JjbjcWwsUr2OK2FXMsFLPb3TtGU,8123
101
- sticker_convert/utils/auth/telegram_api.py,sha256=MAWNFA6Ttn-aO1g_waeIZkc4AMUH_Atds2x8-jhhQIU,24311
102
+ sticker_convert/utils/auth/telegram_api.py,sha256=_DAtxE1vP5eChKyQ53WIdDzojH6YY4hza_LJPF5NZZQ,24368
102
103
  sticker_convert/utils/auth/telethon_setup.py,sha256=7VtsSM3n8qrN_VXV8hBaNSmApxgIPCa84Z08fRr43eQ,3309
103
104
  sticker_convert/utils/chromiums/linux.py,sha256=voWOxQVNy2icGDQfnZEa-2Nwrv-Qmuvt0v1L65hKnY8,1719
104
105
  sticker_convert/utils/chromiums/osx.py,sha256=ET6_uWZDbPCIN-GihMmjNcva0-WAyn0fA2-SzNn5wcU,3255
@@ -113,9 +114,9 @@ sticker_convert/utils/media/apple_png_normalize.py,sha256=LbrQhc7LlYX4I9ek4XJsZE
113
114
  sticker_convert/utils/media/codec_info.py,sha256=HwA6eVh7cLhOlUoR_K9d_wyBRJ_ocGtB3GAyne_iZAU,16483
114
115
  sticker_convert/utils/media/decrypt_kakao.py,sha256=4wq9ZDRnFkx1WmFZnyEogBofiLGsWQM_X69HlA36578,1947
115
116
  sticker_convert/utils/media/format_verify.py,sha256=oM32P186tWe9YxvBQRPr8D3FEmBN3b2rEe_2S_MwxyQ,6236
116
- sticker_convert-2.13.3.0.dist-info/licenses/LICENSE,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
117
- sticker_convert-2.13.3.0.dist-info/METADATA,sha256=StsXvUrWQSbRtZnrr57V-gKsVo2xB-fIionKSa3g-q4,56034
118
- sticker_convert-2.13.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
119
- sticker_convert-2.13.3.0.dist-info/entry_points.txt,sha256=MNJ7XyC--ugxi5jS1nzjDLGnxCyLuaGdsVLnJhDHCqs,66
120
- sticker_convert-2.13.3.0.dist-info/top_level.txt,sha256=r9vfnB0l1ZnH5pTH5RvkobnK3Ow9m0RsncaOMAtiAtk,16
121
- sticker_convert-2.13.3.0.dist-info/RECORD,,
117
+ sticker_convert-2.14.0.0.dist-info/licenses/LICENSE,sha256=gXf5dRMhNSbfLPYYTY_5hsZ1r7UU1OaKQEAQUhuIBkM,18092
118
+ sticker_convert-2.14.0.0.dist-info/METADATA,sha256=lef3juGzbeG_KZ71ntLIhD68ztCclv1_WlsYC5ZHmbU,56527
119
+ sticker_convert-2.14.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
120
+ sticker_convert-2.14.0.0.dist-info/entry_points.txt,sha256=MNJ7XyC--ugxi5jS1nzjDLGnxCyLuaGdsVLnJhDHCqs,66
121
+ sticker_convert-2.14.0.0.dist-info/top_level.txt,sha256=r9vfnB0l1ZnH5pTH5RvkobnK3Ow9m0RsncaOMAtiAtk,16
122
+ sticker_convert-2.14.0.0.dist-info/RECORD,,