In [ ]:
import json
import sys
import time
from sys import platform

from login import s, _print

dic = {}


file_index = 0



def upload_media(fpath, is_img=False):
    global file_index
    if not os.path.exists(fpath):
        _print('File not exists')
        return None
    url_1 = 'https://file.wx2.qq.com/cgi-bin/mmwebwx-bin/webwxuploadmedia?f=json'
    url_2 = 'https://file2.wx2.qq.com/cgi-bin/mmwebwx-bin/webwxuploadmedia?f=json'
    flen = str(os.path.getsize(fpath))
    ftype = mimetypes.guess_type(fpath)[0] or 'application/octet-stream'
    files = {
        'id': (None, 'WU_FILE_%s' % str(file_index)),
        'name': (None, os.path.basename(fpath)),
        'type': (None, ftype),
        'lastModifiedDate': (None, time.strftime('%m/%d/%Y, %H:%M:%S GMT+0800 (CST)')),
        'size': (None, flen),
        'mediatype': (None, 'pic' if is_img else 'doc'),
        'uploadmediarequest': (None, json.dumps({
            'BaseRequest': dic['BaseRequest'],
            'ClientMediaId': int(time.time()),
            'TotalLen': flen,
            'StartPos': 0,
            'DataLen': flen,
            'MediaType': 4,
        })),
        'webwx_data_ticket': (None, s.cookies['webwx_data_ticket']),
        'pass_ticket': (None, dic['pass_ticket']),
        'filename': (os.path.basename(fpath), open(fpath, 'rb'),ftype.split('/')[1]),
    }
    file_index += 1
    try:
        r = s.post(url_1, files=files)
        if json.loads(r.text)['BaseResponse']['Ret'] != 0:
            # 当file返回值不为0时则为上传失败,尝试第二服务器上传
            r = s.post(url_2, files=files)
            if json.loads(r.text)['BaseResponse']['Ret'] != 0:
                _print('Upload media failure.')
                return None
            mid = json.loads(r.text)['MediaId']
            return mid
        except Exception,e:
            return None

def send_img(fpath, friend):
        mid = upload_media(fpath, is_img=True)
        if mid is None:
            return False
        url = dic['base_uri'] + '/webwxsendmsgimg?fun=async&f=json'
        data = {
                'BaseRequest': self.base_request,
                'Msg': {
                    'Type': 3,
                    'MediaId': mid,
                    'FromUserName': dic['My']['UserName'],
                    'ToUserName': friend["UserName"].encode('unicode_escape'),
                    'LocalID': str(time.time() * 1e7),
                    'ClientMsgId': str(time.time() * 1e7), }, }
        if fpath[-4:] == '.gif':
            url = dic['base_uri'] + '/webwxsendemoticon?fun=sys'
            data['Msg']['Type'] = 47
            data['Msg']['EmojiFlag'] = 2
        try:
            r = s.post(url, data=json.dumps(data))
            res = json.loads(r.text)
            if res['BaseResponse']['Ret'] == 0:
                return True
            else:
                return False
        except Exception,e:
            return False
        

def init():
    global dic
    try:
        with open("./logininfo.log", 'r') as f:
            _print('login info time:\t' +
                   f.readline()[:-1])
            dic = f.readline()
            dic = eval(dic)
    except:
        if 'linux' in platform:
            path = '/home/stevi/all2wechat/logininfo.log'
        else:
            path = 'E:/Github/all2wechat/logininfo.log'
        with open(path, 'r') as f:
            _print('login info time:\t' +
                   f.readline()[:-1])
            dic = f.readline()
            dic = eval(dic)

def webwxgetcontact():
    global dic
    try:
        with open("./contactlist.log", 'r') as f:
            ContactList = f.readline()
            ContactList = eval(ContactList)
            dic['ContactList'] = ContactList
    except:
        pass
        #todo
        if 'linux' in platform:
            path = '/home/stevi/all2wechat/logininfo.log'
        else:
            path = 'E:/Github/all2wechat/logininfo.log'
        with open(path, 'r') as f:
            _print('loading login data from '+path)
            _print('login info time:\t' +
                   f.readline()[:-1])
            dic = f.readline()
            dic = eval(dic)
#    _print('Getting contactlist')
#    url = dic['base_uri'] + "/webwxgetcontact?r=" + str(int(
#        time.time()))
#    r = s.post(url, json={})
#    content = r.text.encode('unicode_escape').decode('string_escape')
#    ContactList = json.loads(content)['MemberList']
#    dic['ContactList'] = ContactList
#    with open('contactlist.log', 'w') as f:
#        f.write(str(ContactList))
#    _print('Contactlist get')

    

def main():
    global dic
    init()
    webwxgetcontact()
    name = sys.argv[1].decode('utf8')
    for f in dic['ContactList']:
        if f['RemarkName'] == name or f['NickName'] == name:
            send_img('./image/ScreenClip.png', f)
#             webwxsendmsg(f, sys.argv[2])
            print('Send')
            break



def webwxsendmsg(friend, content):
    clientMsgId = str(int(time.time()))
    url = dic['base_uri'] + \
        "/webwxsendmsg?lang=zh_CN&pass_ticket=" + dic['pass_ticket']
    Msg = {
        'Type': '1',
        'Content': content,
        'ClientMsgId': clientMsgId.encode('unicode_escape'),
        'FromUserName': dic['My']['UserName'].encode('unicode_escape'),
        'ToUserName': friend["UserName"].encode('unicode_escape'),
        'LocalID': clientMsgId.encode('unicode_escape')
    }
    payload = {'BaseRequest': dic['BaseRequest'], 'Msg': Msg}
    headers = {'ContentType': 'application/json; charset=UTF-8'}

    data = json.dumps(payload, ensure_ascii=False)

    r = s.post(url, data=data, headers=headers)

    resp = json.loads(r.text)
    if 'BaseResponse' in resp:
        if 'Ret' in resp['BaseResponse']:
            return True
    return False


if __name__ == '__main__':
    main()