|
1 | 1 | import os, time, re, io
|
2 | 2 | import json
|
3 |
| -import mimetypes |
| 3 | +import mimetypes, hashlib |
4 | 4 | import traceback, logging
|
5 | 5 |
|
6 | 6 | import requests
|
@@ -235,39 +235,59 @@ def send_msg(self, msg='Test Message', toUserName=None):
|
235 | 235 | r = self.send_raw_msg(1, msg, toUserName)
|
236 | 236 | return r
|
237 | 237 |
|
238 |
| -def upload_file(self, fileDir, isPicture=False, isVideo=False): |
| 238 | +def upload_file(self, fileDir, isPicture=False, isVideo=False, |
| 239 | + toUserName='filehelper'): |
239 | 240 | logger.debug('Request to upload a %s: %s' % (
|
240 | 241 | 'picture' if isPicture else 'video' if isVideo else 'file', fileDir))
|
241 | 242 | if not utils.check_file(fileDir):
|
242 | 243 | return ReturnValue({'BaseResponse': {
|
243 | 244 | 'ErrMsg': 'No file found in specific dir',
|
244 | 245 | 'Ret': -1002, }})
|
245 |
| - url = self.loginInfo.get('fileUrl', self.loginInfo['url']) + \ |
| 246 | + fileSize = os.path.getsize(fileDir) |
| 247 | + fileSymbol = 'pic' if isPicture else 'video' if isVideo else'doc' |
| 248 | + with open(fileDir, 'rb') as f: fileMd5 = hashlib.md5(f.read()).hexdigest() |
| 249 | + file = open(fileDir, 'rb') |
| 250 | + chunks = int(fileSize / 524288) + 1 |
| 251 | + for chunk in range(chunks): |
| 252 | + r = upload_chunk_file(self, fileDir, fileSymbol, fileSize, |
| 253 | + fileMd5, file, toUserName, chunk, chunks) |
| 254 | + file.close() |
| 255 | + self.loginInfo['msgid'] += 1 |
| 256 | + return ReturnValue(rawResponse=r) |
| 257 | + |
| 258 | +def upload_chunk_file(core, fileDir, fileSymbol, fileSize, |
| 259 | + fileMd5, file, toUserName, chunk, chunks): |
| 260 | + url = core.loginInfo.get('fileUrl', core.loginInfo['url']) + \ |
246 | 261 | '/webwxuploadmedia?f=json'
|
247 | 262 | # save it on server
|
248 |
| - fileSize = str(os.path.getsize(fileDir)) |
249 |
| - cookiesList = {name:data for name,data in self.s.cookies.items()} |
| 263 | + cookiesList = {name:data for name,data in core.s.cookies.items()} |
250 | 264 | fileType = mimetypes.guess_type(fileDir)[0] or 'application/octet-stream'
|
251 | 265 | files = {
|
252 | 266 | 'id': (None, 'WU_FILE_0'),
|
253 | 267 | 'name': (None, os.path.basename(fileDir)),
|
254 | 268 | 'type': (None, fileType),
|
255 | 269 | 'lastModifiedDate': (None, time.strftime('%a %b %d %Y %H:%M:%S GMT+0800 (CST)')),
|
256 |
| - 'size': (None, fileSize), |
257 |
| - 'mediatype': (None, 'pic' if isPicture else 'video' if isVideo else'doc'), |
| 270 | + 'size': (None, str(fileSize)), |
| 271 | + 'mediatype': (None, fileSymbol), |
258 | 272 | 'uploadmediarequest': (None, json.dumps({
|
259 |
| - 'BaseRequest': self.loginInfo['BaseRequest'], |
260 |
| - 'ClientMediaId': int(time.time()), |
| 273 | + 'UploadType': (None, 2), |
| 274 | + 'BaseRequest': core.loginInfo['BaseRequest'], |
| 275 | + 'ClientMediaId': core.loginInfo['msgid'], |
261 | 276 | 'TotalLen': fileSize,
|
262 | 277 | 'StartPos': 0,
|
263 | 278 | 'DataLen': fileSize,
|
264 |
| - 'MediaType': 4, }, separators = (',', ':'))), |
| 279 | + 'MediaType': 4, |
| 280 | + 'FromUserName': core.storageClass.userName, |
| 281 | + 'ToUserName': toUserName, |
| 282 | + 'FileMd5': fileMd5, |
| 283 | + }, separators = (',', ':'))), |
265 | 284 | 'webwx_data_ticket': (None, cookiesList['webwx_data_ticket']),
|
266 |
| - 'pass_ticket': (None, 'undefined'), |
267 |
| - 'filename' : (os.path.basename(fileDir), open(fileDir, 'rb'), fileType), } |
| 285 | + 'pass_ticket': (None, core.loginInfo['pass_ticket']), |
| 286 | + 'filename' : (os.path.basename(fileDir), file.read(524288), fileType), } |
| 287 | + if chunks != 1: |
| 288 | + files['chunk'], files['chunks'] = (None, str(chunk)), (None, str(chunks)) |
268 | 289 | headers = { 'User-Agent' : config.USER_AGENT }
|
269 |
| - r = self.s.post(url, files=files, headers=headers) |
270 |
| - return ReturnValue(rawResponse=r) |
| 290 | + return core.s.post(url, files=files, headers=headers) |
271 | 291 |
|
272 | 292 | def send_file(self, fileDir, toUserName=None, mediaId=None):
|
273 | 293 | logger.debug('Request to send a file(mediaId: %s) to %s: %s' % (
|
|
0 commit comments