|
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