reywechat 1.0.27__py3-none-any.whl → 1.0.29__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.
reywechat/__init__.py CHANGED
@@ -17,6 +17,7 @@ rall : All methods.
17
17
  rbase : Base methods.
18
18
  rclient : Client methods.
19
19
  rdb : WeChatDatabase methods.
20
+ rcache : Cache methods.
20
21
  rlog : Log methods.
21
22
  rreceive : Receive methods.
22
23
  rschedule : Schedule methods.
reywechat/rall.py CHANGED
@@ -10,6 +10,7 @@
10
10
 
11
11
 
12
12
  from .rbase import *
13
+ from .rcache import *
13
14
  from .rclient import *
14
15
  from .rdb import *
15
16
  from .rlog import *
reywechat/rcache.py ADDED
@@ -0,0 +1,47 @@
1
+ # !/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ @Time : 2025-08-13 22:58:31
6
+ @Author : Rey
7
+ @Contact : reyxbo@163.com
8
+ @Explain : Cache methods.
9
+ """
10
+
11
+
12
+ from reykit.ros import FileCache, join_path
13
+
14
+ from .rbase import BaseWeChat
15
+ from .rwechat import WeChat
16
+
17
+
18
+ __all__ = (
19
+ 'WeChatCache',
20
+ )
21
+
22
+
23
+ class WeChatCache(BaseWeChat, FileCache):
24
+ """
25
+ WeChat file cache type.
26
+ """
27
+
28
+
29
+ def __init__(
30
+ self,
31
+ wechat: WeChat
32
+ ) -> None:
33
+ """
34
+ Build instance attributes.
35
+
36
+ Parameters
37
+ ----------
38
+ wechat : `WeChatClient` instance.
39
+ """
40
+
41
+ # Set attribute.
42
+ self.wechat = wechat
43
+ path = join_path(self.wechat.project_dir, 'cache')
44
+ self.cache = FileCache(path)
45
+ self.folder = self.cache.folder
46
+ self.index = self.cache.index
47
+ self.store = self.cache.store
reywechat/rdb.py CHANGED
@@ -13,7 +13,7 @@ from typing import Any, Literal, overload
13
13
  from json import loads as json_loads
14
14
  from reydb.rdb import Database
15
15
  from reykit.rbase import throw
16
- from reykit.ros import Folder
16
+ from reykit.ros import File
17
17
  from reykit.rtime import to_time, time_to, sleep
18
18
  from reykit.rwrap import wrap_thread
19
19
 
@@ -58,8 +58,8 @@ class WeChatDatabase(BaseWeChat):
58
58
  case Database():
59
59
  self.rdatabase_wechat = self.rdatabase_file = rdatabase
60
60
  case dict():
61
- self.rdatabase_wechat = rdatabase.get('wechat')
62
- self.rdatabase_file = rdatabase.get('file')
61
+ self.rdatabase_wechat: Database = rdatabase.get('wechat')
62
+ self.rdatabase_file: Database = rdatabase.get('file')
63
63
  if (
64
64
  self.rdatabase_wechat
65
65
  or self.rdatabase_file
@@ -972,26 +972,18 @@ class WeChatDatabase(BaseWeChat):
972
972
  File save path and file name.
973
973
  """
974
974
 
975
- # Select.
975
+ # Information.
976
976
  file_info = self.rdatabase_file.file.query(file_id)
977
- file_name = file_info['name']
978
977
  file_md5 = file_info['md5']
978
+ file_name = file_info['name']
979
979
 
980
- # Check.
981
- rfolder = Folder(self.wechat.dir_cache)
982
- pattern = f'^{file_md5}$'
983
- cache_path = rfolder.search(pattern)
980
+ # Cache.
981
+ cache_path = self.wechat.cache.index(file_md5, file_name, True)
984
982
 
985
- # Download.
983
+ ## Download.
986
984
  if cache_path is None:
987
- cache_path = '%s/%s' % (
988
- self.wechat.dir_cache,
989
- file_md5
990
- )
991
- self.rdatabase_file.file.download(
992
- file_id,
993
- cache_path
994
- )
985
+ file_bytes = self.rdatabase_file.file.download(file_id)
986
+ cache_path = self.wechat.cache.store(file_bytes, file_name)
995
987
 
996
988
  return cache_path, file_name
997
989
 
@@ -1055,7 +1047,7 @@ class WeChatDatabase(BaseWeChat):
1055
1047
  send_type = WeChatSendEnum(type_)
1056
1048
  parameter: dict = json_loads(parameter)
1057
1049
 
1058
- ## Save file.
1050
+ ## File.
1059
1051
  if file_id is not None:
1060
1052
  file_path, file_name = self.__download_file(file_id)
1061
1053
  parameter['file_path'] = file_path
@@ -1242,9 +1234,14 @@ class WeChatDatabase(BaseWeChat):
1242
1234
  if 'file_name' in params:
1243
1235
  file_name: str = params.pop('file_name')
1244
1236
  else:
1245
- file_name = None
1237
+ file = File(file_path)
1238
+ file_name = file.name_suffix
1239
+
1240
+ ## Cache.
1241
+ cache_path = self.wechat.cache.store(file_path, file_name)
1242
+
1246
1243
  file_id = self.rdatabase_file.file.upload(
1247
- file_path,
1244
+ cache_path,
1248
1245
  file_name,
1249
1246
  'WeChat'
1250
1247
  )
reywechat/rlog.py CHANGED
@@ -9,8 +9,8 @@
9
9
  """
10
10
 
11
11
 
12
- from os.path import join as os_join
13
12
  from reykit.rlog import Log
13
+ from reykit.ros import Folder, join_path
14
14
 
15
15
  from .rbase import BaseWeChat
16
16
  from .rreceive import WeChatMessage
@@ -44,6 +44,9 @@ class WeChatLog(BaseWeChat):
44
44
  # Set attribute.
45
45
  self.wechat = wechat
46
46
 
47
+ # Make directory.
48
+ self.folder = self.__make_dir()
49
+
47
50
  # Logger.
48
51
  self.rrlog = Log('WeChat')
49
52
  self.rrlog_print = Log('WeChat.WeChatPrint')
@@ -53,6 +56,29 @@ class WeChatLog(BaseWeChat):
53
56
  self.__add_handler()
54
57
 
55
58
 
59
+ def __make_dir(self) -> Folder:
60
+ """
61
+ Make directory 'project_dir/log'.
62
+
63
+ Parameters
64
+ ----------
65
+ project_dir: Project directory.
66
+
67
+ Returns
68
+ -------
69
+ Folder instance.
70
+ """
71
+
72
+ # Set parameter.
73
+ dir_path = join_path(self.wechat.project_dir, 'log')
74
+
75
+ # Make.
76
+ folder = Folder(dir_path)
77
+ folder.make()
78
+
79
+ return folder
80
+
81
+
56
82
  def __add_handler(self) -> None:
57
83
  """
58
84
  Add log handler.
@@ -74,7 +100,7 @@ class WeChatLog(BaseWeChat):
74
100
  self.rrlog_print.add_print(format_=format_)
75
101
 
76
102
  ## Add handler file.
77
- file_path = os_join(self.wechat.dir_log, 'WeChat')
103
+ file_path = self.folder + 'wechat'
78
104
  self.rrlog_file.add_file(
79
105
  file_path,
80
106
  time='m',
reywechat/rreceive.py CHANGED
@@ -12,15 +12,14 @@
12
12
  from __future__ import annotations
13
13
  from typing import Any, TypedDict, Literal, overload
14
14
  from collections.abc import Callable
15
- from os.path import join as os_join
16
15
  from queue import Queue
17
16
  from json import loads as json_loads
18
17
  from bs4 import BeautifulSoup as BSBeautifulSoup
19
18
  from bs4.element import Tag as BSTag
20
- from reykit.rbase import throw, catch_exc
19
+ from reykit.rbase import throw
21
20
  from reykit.rimage import decode_qrcode
22
21
  from reykit.rnet import listen_socket
23
- from reykit.ros import File, Folder, os_exists
22
+ from reykit.ros import File, os_exists
24
23
  from reykit.rre import search, findall
25
24
  from reykit.rtask import ThreadPool
26
25
  from reykit.rtime import sleep, wait
@@ -417,6 +416,8 @@ class WeChatMessage(BaseWeChat):
417
416
  pattern = r'@\w+\u2005'
418
417
  self._at_names = findall(pattern, text)
419
418
 
419
+ return self._at_names
420
+
420
421
 
421
422
  @property
422
423
  def is_at(self) -> bool:
@@ -1116,68 +1117,47 @@ class WechatReceiver(BaseWeChat):
1116
1117
  """
1117
1118
 
1118
1119
  # Download.
1119
- folder = Folder(self.wechat.dir_cache)
1120
- generate_path = None
1121
1120
  match message.type:
1122
1121
 
1123
1122
  ## Image.
1124
1123
  case 3:
1125
- ### Get attribute.
1126
- file_name = f'{message.id}.jpg'
1127
- pattern = r'length="(\d+)".*?md5="([\da-f]{32})"'
1128
- result: tuple[str, str] = search(pattern, message.data)
1129
- file_size, file_md5 = result
1130
- file_size = int(file_size)
1131
-
1132
- ### Exist.
1133
- pattern = f'^{file_md5}$'
1134
- cache_path = folder.search(pattern)
1135
-
1136
- ### Generate.
1124
+ pattern = r' md5="([\da-f]{32})"'
1125
+ file_md5: str = search(pattern, message.data)
1126
+ file_name = f'{file_md5}.jpg'
1127
+ cache_path = self.wechat.cache.index(file_md5, file_name, copy=True)
1128
+
1129
+ ### Download.
1137
1130
  if cache_path is None:
1138
1131
  self.wechat.client.download_file(message.id)
1139
- generate_path = '%swxhelper/image/%s.dat' % (
1132
+ download_path = '%swxhelper/image/%s.dat' % (
1140
1133
  self.wechat.client.login_info['account_data_path'],
1141
1134
  message.id
1142
1135
  )
1143
1136
 
1144
1137
  ## Voice.
1145
1138
  case 34:
1139
+ file_name = None
1140
+ file_name_suffix = 'amr'
1141
+ cache_path = None
1146
1142
 
1147
- ### Get attribute.
1148
- file_name = f'{message.id}.amr'
1149
- pattern = r'length="(\d+)"'
1150
- file_size = int(search(pattern, message.data))
1151
- file_md5 = None
1152
-
1153
- ### Generate.
1143
+ ### Download.
1154
1144
  self.wechat.client.download_voice(
1155
1145
  message.id,
1156
- self.wechat.dir_cache
1157
- )
1158
- generate_path = '%s/%s.amr' % (
1159
- self.wechat.dir_cache,
1160
- message.id
1146
+ self.wechat.cache.folder.path
1161
1147
  )
1148
+ download_path = self.wechat.cache.folder + f'{message.id}.amr'
1162
1149
 
1163
1150
  ## Video.
1164
1151
  case 43:
1152
+ pattern = r' md5="([\da-f]{32})"'
1153
+ file_md5: str = search(pattern, message.data)
1154
+ file_name = f'{file_md5}.mp4'
1155
+ cache_path = self.wechat.cache.index(file_md5, file_name, copy=True)
1165
1156
 
1166
- ### Get attribute.
1167
- file_name = f'{message.id}.mp4'
1168
- pattern = r'length="(\d+)"'
1169
- file_size = int(search(pattern, message.data))
1170
- pattern = r'md5="([\da-f]{32})"'
1171
- file_md5 = search(pattern, message.data)
1172
-
1173
- ### Exist.
1174
- pattern = f'^{file_md5}$'
1175
- cache_path = folder.search(pattern)
1176
-
1177
- ### Generate.
1157
+ ### Download.
1178
1158
  if cache_path is None:
1179
1159
  self.wechat.client.download_file(message.id)
1180
- generate_path = '%swxhelper/video/%s.mp4' % (
1160
+ download_path = '%swxhelper/video/%s.mp4' % (
1181
1161
  self.wechat.client.login_info['account_data_path'],
1182
1162
  message.id
1183
1163
  )
@@ -1187,26 +1167,21 @@ class WechatReceiver(BaseWeChat):
1187
1167
 
1188
1168
  ### Check.
1189
1169
  pattern = r'^.+? : \[文件\](.+)$'
1190
- file_name = search(pattern, message.display)
1191
- if file_name is None:
1192
- return
1193
- if '<type>6</type>' not in message.data:
1170
+ file_name: str | None = search(pattern, message.display)
1171
+ if (
1172
+ file_name is None
1173
+ or '<type>6</type>' not in message.data
1174
+ ):
1194
1175
  return
1195
1176
 
1196
- ### Get attribute.
1197
- pattern = r'<totallen>(\d+)</totallen>'
1198
- file_size = int(search(pattern, message.data))
1199
1177
  pattern = r'<md5>([\da-f]{32})</md5>'
1200
- file_md5 = search(pattern, message.data)
1201
-
1202
- ### Exist.
1203
- pattern = f'^{file_md5}$'
1204
- cache_path = folder.search(pattern)
1178
+ file_md5: str = search(pattern, message.data)
1179
+ cache_path = self.wechat.cache.index(file_md5, file_name, copy=True)
1205
1180
 
1206
- ### Generate.
1181
+ ### Download.
1207
1182
  if cache_path is None:
1208
1183
  self.wechat.client.download_file(message.id)
1209
- generate_path = '%swxhelper/file/%s_%s' % (
1184
+ download_path = '%swxhelper/file/%s_%s' % (
1210
1185
  self.wechat.client.login_info['account_data_path'],
1211
1186
  message.id,
1212
1187
  file_name
@@ -1216,35 +1191,32 @@ class WechatReceiver(BaseWeChat):
1216
1191
  case _:
1217
1192
  return
1218
1193
 
1219
- if generate_path is not None:
1194
+ if cache_path is None:
1220
1195
 
1221
1196
  ## Wait.
1222
1197
  wait(
1223
1198
  os_exists,
1224
- generate_path,
1199
+ download_path,
1225
1200
  _interval = 0.05,
1226
1201
  _timeout=3600
1227
1202
  )
1228
1203
  sleep(0.2)
1229
1204
 
1230
- ## Move.
1231
- rfile = File(generate_path)
1232
- if file_md5 is None:
1233
- file_md5 = rfile.md5
1234
- pattern = f'^{file_md5}$'
1235
- cache_path = folder.search(pattern)
1236
- if cache_path is None:
1237
- cache_path = os_join(self.wechat.dir_cache, file_md5)
1238
- rfile.move(cache_path)
1205
+ ## Cache.
1206
+ download_file = File(download_path)
1207
+ if file_name is None:
1208
+ file_name = f'{download_file.md5}.{file_name_suffix}'
1209
+ cache_path = self.wechat.cache.store(download_path, file_name, delete=True)
1239
1210
 
1240
1211
  # Set parameter.
1241
- file: MessageParameterFile = {
1212
+ cache_file = File(cache_path)
1213
+ message_file: MessageParameterFile = {
1242
1214
  'path': cache_path,
1243
- 'name': file_name,
1244
- 'md5': file_md5,
1245
- 'size': file_size
1215
+ 'name': cache_file.name_suffix,
1216
+ 'md5': cache_file.md5,
1217
+ 'size': cache_file.size
1246
1218
  }
1247
- message.file = file
1219
+ message.file = message_file
1248
1220
 
1249
1221
 
1250
1222
  def start(self) -> None:
reywechat/rsend.py CHANGED
@@ -17,7 +17,6 @@ from functools import wraps as functools_wraps
17
17
  from queue import Queue
18
18
  from re import escape as re_escape
19
19
  from reykit.rbase import throw, catch_exc
20
- from reykit.ros import File
21
20
  from reykit.rre import sub
22
21
  from reykit.rtime import sleep
23
22
  from reykit.rwrap import wrap_thread, wrap_exc
@@ -286,15 +285,6 @@ class WeChatSender(BaseWeChat):
286
285
  sendparam : `WeChatSendParameter` instance.
287
286
  """
288
287
 
289
- # File rename to new.
290
- if (
291
- (file_path := sendparam.params.get('file_path')) is not None
292
- and (file_name := sendparam.params.get('file_name')) is not None
293
- ):
294
- file = File(file_path)
295
- file_old_name = file.name
296
- file_path_rename = file.rename(file_name)
297
-
298
288
  # Send.
299
289
  match sendparam.send_type:
300
290
 
@@ -317,21 +307,21 @@ class WeChatSender(BaseWeChat):
317
307
  case WeChatSendEnum.SEND_FILE:
318
308
  self.wechat.client.send_file(
319
309
  sendparam.receive_id,
320
- file_path_rename
310
+ sendparam.params['file_path']
321
311
  )
322
312
 
323
313
  ## Image.
324
314
  case WeChatSendEnum.SEND_IMAGE:
325
315
  self.wechat.client.send_image(
326
316
  sendparam.receive_id,
327
- file_path_rename
317
+ sendparam.params['file_path']
328
318
  )
329
319
 
330
320
  ## Emotion.
331
321
  case WeChatSendEnum.SEND_EMOTION:
332
322
  self.wechat.client.send_emotion(
333
323
  sendparam.receive_id,
334
- file_path_rename
324
+ sendparam.params['file_path']
335
325
  )
336
326
 
337
327
  ## Pat.
@@ -364,15 +354,6 @@ class WeChatSender(BaseWeChat):
364
354
  case send_type:
365
355
  throw(ValueError, send_type)
366
356
 
367
- # File rename to old.
368
- if (
369
- file_path is not None
370
- and file_name is not None
371
- ):
372
- sleep(1)
373
- file = File(file_path_rename)
374
- file.rename(file_old_name)
375
-
376
357
 
377
358
  def add_handler(
378
359
  self,
reywechat/rwechat.py CHANGED
@@ -11,10 +11,8 @@
11
11
 
12
12
  from typing import Literal
13
13
  from os import getcwd as os_getcwd
14
- from os.path import join as os_join
15
14
  from reydb.rdb import Database
16
15
  from reykit.rbase import block
17
- from reykit.ros import make_dir as reykit_make_dir
18
16
 
19
17
  from .rbase import BaseWeChat
20
18
 
@@ -63,6 +61,7 @@ class WeChat(BaseWeChat):
63
61
  """
64
62
 
65
63
  # Import.
64
+ from .rcache import WeChatCache
66
65
  from .rclient import WeChatClient
67
66
  from .rdb import WeChatDatabase
68
67
  from .rlog import WeChatLog
@@ -70,14 +69,12 @@ class WeChat(BaseWeChat):
70
69
  from .rschedule import WeChatSchedule
71
70
  from .rsend import WeChatSender
72
71
 
73
- # Make directory.
74
- project_dir = project_dir or os_getcwd()
75
- self.dir_cache, self.dir_log = self.__make_subdir(project_dir)
76
-
77
72
  # Set attribute.
73
+ self.project_dir = project_dir or os_getcwd()
78
74
 
79
75
  ## Instance.
80
76
  self.client = WeChatClient(self)
77
+ self.cache = WeChatCache(self)
81
78
  self.log = WeChatLog(self)
82
79
  self.receiver = WechatReceiver(self, max_receiver)
83
80
  self.trigger = self.receiver.trigger
@@ -109,7 +106,7 @@ class WeChat(BaseWeChat):
109
106
  self.wrap_try_send = self.sender.wrap_try_send
110
107
 
111
108
  ## Database.
112
- self.send = self.database.send
109
+ self.send = self.sender.send = self.database.send
113
110
 
114
111
  ## Schedule.
115
112
  self.schedule_add_task = self.schedule.add_task
@@ -117,39 +114,6 @@ class WeChat(BaseWeChat):
117
114
  self.schedule_resume = self.schedule.resume
118
115
 
119
116
 
120
- def __make_subdir(
121
- self,
122
- project_dir: str
123
- ) -> tuple[str, str]:
124
- """
125
- Make project subdirectory, 'project_dir/cache' and 'project_dir/cache'.
126
-
127
- Parameters
128
- ----------
129
- project_dir: Project directory.
130
-
131
- Returns
132
- -------
133
- Subdirectorys path.
134
- """
135
-
136
- # Set parameter.
137
- dir_names = (
138
- 'cache',
139
- 'log'
140
- )
141
- dir_dict = {
142
- dir_name: os_join(project_dir, dir_name)
143
- for dir_name in dir_names
144
- }
145
-
146
- # Create.
147
- paths = dir_dict.values()
148
- reykit_make_dir(*paths)
149
-
150
- return dir_dict['cache'], dir_dict['log']
151
-
152
-
153
117
  def start(self) -> None:
154
118
  """
155
119
  Start all methods.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reywechat
3
- Version: 1.0.27
3
+ Version: 1.0.29
4
4
  Summary: WeChat method set.
5
5
  Project-URL: homepage, https://github.com/reyxbo/reywechat/
6
6
  Author-email: Rey <reyxbo@163.com>
@@ -0,0 +1,17 @@
1
+ reywechat/__init__.py,sha256=BL4PUpTguszJ612qsZf4-sOXxRIsiYRQ_m__FGMd1RQ,513
2
+ reywechat/rall.py,sha256=zEW-mLL2uP8aT2_foCMFGmMi_3RCrGl8qutnSVkmY1E,397
3
+ reywechat/rbase.py,sha256=0NunIUIXra2ML2N6odwMk5oENTE0r6VSBHWXUvgI-lc,1124
4
+ reywechat/rcache.py,sha256=Hh_HE-t_KUMlrz4gEFPh1AjmhnrSgH520IFJPumWb7A,908
5
+ reywechat/rclient.py,sha256=gtTYaoqhgh9kRFslETKjBJiAAdzJfeOxIJbdCkGAFhM,22577
6
+ reywechat/rdb.py,sha256=Gcj3d-uIospaacjHY8B4HHdru5OwiS9PO6cceAWvXqY,40333
7
+ reywechat/rlog.py,sha256=d3S0eHMUZ92OLE7fjP3zzikIYANtnbAxhnE_DIV_1OY,5251
8
+ reywechat/rreceive.py,sha256=5emlgnIChYL60yx6PoQc1h5aGHFXNuFJ71a585gamEg,31550
9
+ reywechat/rschedule.py,sha256=fn11rH0HqxbnJYxARCBBiSdzBpYfQFhcjNmkvihVMTc,1854
10
+ reywechat/rsend.py,sha256=s2sR6l74reDShBAu_MwpavVunz0g42pIga0zX4ElIuI,13717
11
+ reywechat/rtrigger.py,sha256=GHfkhNrS8rV4uXWC3N54UTjak7nKGfqJWX6pe57Hsgg,4953
12
+ reywechat/rwechat.py,sha256=K9fwje_Sos3Pvke8tFexDNZsRD7FsLtH3Jktg9xREpk,4788
13
+ reywechat/data/client_api.dll,sha256=H9uj-x9Ztg0jFZK0yY6NsnyH5_119dQRFfoVVMidxRs,592384
14
+ reywechat-1.0.29.dist-info/METADATA,sha256=GQNNn2iqWueYDLoZuKQGnmmQqMgEJlBPAtqQeFY3U3s,1551
15
+ reywechat-1.0.29.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
16
+ reywechat-1.0.29.dist-info/licenses/LICENSE,sha256=UYLPqp7BvPiH8yEZduJqmmyEl6hlM3lKrFIefiD4rvk,1059
17
+ reywechat-1.0.29.dist-info/RECORD,,
@@ -1,16 +0,0 @@
1
- reywechat/__init__.py,sha256=CBcaezJsuYnBzunuzRoRwz-q_HDQq7XsGKtNxCWAQoY,488
2
- reywechat/rall.py,sha256=KAHdmzvrmDel_ttvZKR0tkfg21Amm3sKMvGJDkNA14U,374
3
- reywechat/rbase.py,sha256=0NunIUIXra2ML2N6odwMk5oENTE0r6VSBHWXUvgI-lc,1124
4
- reywechat/rclient.py,sha256=gtTYaoqhgh9kRFslETKjBJiAAdzJfeOxIJbdCkGAFhM,22577
5
- reywechat/rdb.py,sha256=JBrJw-Xev9BNogOg2G31-da80y7edpSjtAzFHZkDs3g,40313
6
- reywechat/rlog.py,sha256=rIl3fy1SFuAAiUnxVnOFJv-gK51AunDljJgsFUx6I50,4745
7
- reywechat/rreceive.py,sha256=pgo--mHTSpCtb_ScIreoiiWAtIVsqe2Tut88W7MrBc8,32403
8
- reywechat/rschedule.py,sha256=fn11rH0HqxbnJYxARCBBiSdzBpYfQFhcjNmkvihVMTc,1854
9
- reywechat/rsend.py,sha256=q1stNggg40WPqI5h8_coAXsbFRM6M6dxsDxq2-L3CJs,14286
10
- reywechat/rtrigger.py,sha256=GHfkhNrS8rV4uXWC3N54UTjak7nKGfqJWX6pe57Hsgg,4953
11
- reywechat/rwechat.py,sha256=Niu2TTyElpzXtb6fn-xzwa1QjkwrvLwFyP3U-2ALrl4,5595
12
- reywechat/data/client_api.dll,sha256=H9uj-x9Ztg0jFZK0yY6NsnyH5_119dQRFfoVVMidxRs,592384
13
- reywechat-1.0.27.dist-info/METADATA,sha256=Y9h0Dr56SY6w5krZ163ufW6FdT3-kgdUkOD5jw6O7JM,1551
14
- reywechat-1.0.27.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
15
- reywechat-1.0.27.dist-info/licenses/LICENSE,sha256=UYLPqp7BvPiH8yEZduJqmmyEl6hlM3lKrFIefiD4rvk,1059
16
- reywechat-1.0.27.dist-info/RECORD,,