コード例 #1
0
ファイル: crysadm_helper.py プロジェクト: dahaichenfu/crysadm
def get_offline_user_data():
    config.crys_log('')
    #if DEBUG_MODE:
    #    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'get_offline_user_data')
    if r_session.exists('api_error_info'): return
    if datetime.now().minute < 50: return

    offline_users = []
    for b_user in r_session.mget(*['user:%s' % name.decode('utf-8') for name in r_session.sdiff('users', *r_session.smembers('global:online.users'))]):
        user_info = json.loads(b_user.decode('utf-8'))

        username = user_info.get('username')

        if not user_info.get('active'): continue

        every_hour_key = 'user:%s:cron_queued' % username
        if r_session.exists(every_hour_key): continue

        offline_users.append(username)

    pool = ThreadPool(processes=5)

    pool.map(get_data, offline_users)
    pool.close()
    pool.join()
コード例 #2
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def drawcash_crystal():
    config.crys_log( 'drawcash_crystal')
    time_now = datetime.now()
    if int(time_now.isoweekday()) != 2: return
    if int(time_now.hour) < 11 or int(time_now.hour) > 18: return

    cookies_auto(check_drawcash, 'global:auto.drawcash.cookies')
コード例 #3
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def drawcash_crystal():
    config.crys_log('drawcash_crystal')
    time_now = datetime.now()
    if int(time_now.isoweekday()) != 2: return
    if int(time_now.hour) < 11 or int(time_now.hour) > 18: return

    cookies_auto(check_drawcash, 'global:auto.drawcash.cookies')
コード例 #4
0
def get_offline_user_data():
    config.crys_log('')
    #if DEBUG_MODE:
    #    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'get_offline_user_data')
    if r_session.exists('api_error_info'): return
    if datetime.now().minute < 50: return

    offline_users = []
    for b_user in r_session.mget(*['user:%s' % name.decode('utf-8') for name in
                                   r_session.sdiff('users', *r_session.smembers('global:online.users'))]):
        user_info = json.loads(b_user.decode('utf-8'))

        username = user_info.get('username')

        if not user_info.get('active'): continue

        every_hour_key = 'user:%s:cron_queued' % username
        if r_session.exists(every_hour_key): continue

        offline_users.append(username)

    pool = ThreadPool(processes=5)

    pool.map(get_data, offline_users)
    pool.close()
    pool.join()
コード例 #5
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def check_drawcash(user, cookies, user_info):
    config.crys_log('check_drawcash')
    if 'draw_money_modify' in user_info.keys():
        limit = user_info.get('draw_money_modify')
    else:
        limit = 10.0
    r = exec_draw_cash(cookies=cookies, limits=limit)
    red_log(user, '自动执行', '提现', r.get('rd'))
    time.sleep(3)
コード例 #6
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def check_drawcash(user, cookies, user_info):
    config.crys_log( 'check_drawcash')
    if 'draw_money_modify' in user_info.keys():
        limit = user_info.get('draw_money_modify')
    else:
        limit = 10.0
    r = exec_draw_cash(cookies=cookies, limits=limit)
    red_log(user, '自动执行', '提现', r.get('rd'))
    time.sleep(3)
コード例 #7
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def get_online_user_data():

    config.crys_log( 'get_online_user_data')
    if r_session.exists('api_error_info'): return

    pool = ThreadPool(processes=1)

    pool.map(get_data, (u.decode('utf-8') for u in r_session.smembers('global:online.users')))
    pool.close()
    pool.join()
コード例 #8
0
def get_online_user_data():
    config.crys_log('')#
    #if DEBUG_MODE:
    #    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'get_online_user_data')
    if r_session.exists('api_error_info'): return

    pool = ThreadPool(processes=1)

    pool.map(get_data, (u.decode('utf-8') for u in r_session.smembers('global:online.users')))
    pool.close()
    pool.join()
コード例 #9
0
ファイル: crysadm_helper.py プロジェクト: dahaichenfu/crysadm
def get_online_user_data():
    config.crys_log('')#
    #if DEBUG_MODE:
    #    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'get_online_user_data')
    if r_session.exists('api_error_info'): return

    pool = ThreadPool(processes=1)

    pool.map(get_data, (u.decode('utf-8') for u in r_session.smembers('global:online.users')))
    pool.close()
    pool.join()
コード例 #10
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def select_auto_task_user():
    config.crys_log( 'select_auto_task_user')
    auto_collect_accounts = []
    auto_drawcash_accounts = []
    auto_giftbox_accounts = []
    auto_searcht_accounts = []
    auto_revenge_accounts = []
    auto_getaward_accounts = []
    auto_detect_accounts = []
    auto_report_accounts = []
    for b_user in r_session.mget(*['user:%s' % name.decode('utf-8') for name in r_session.smembers('users')]):
        user_info = json.loads(b_user.decode('utf-8'))
        if not user_info.get('active'): continue
        username = user_info.get('username')
        account_keys = ['account:%s:%s' % (username, user_id.decode('utf-8')) for user_id in r_session.smembers('accounts:%s' % username)]
        if len(account_keys) == 0: continue
        for b_account in r_session.mget(*account_keys):
            account_info = json.loads(b_account.decode('utf-8'))
            if not (account_info.get('active')): continue
            session_id = account_info.get('session_id')
            user_id = account_info.get('user_id')
            cookies = json.dumps(dict(sessionid=session_id, userid=user_id, user_info=user_info))
            if user_info.get('auto_collect'): auto_collect_accounts.append(cookies)
            if user_info.get('auto_drawcash'): auto_drawcash_accounts.append(cookies)
            if user_info.get('auto_giftbox'): auto_giftbox_accounts.append(cookies)
            if user_info.get('auto_searcht'): auto_searcht_accounts.append(cookies)
            if user_info.get('auto_revenge'): auto_revenge_accounts.append(cookies)
            if user_info.get('auto_getaward'): auto_getaward_accounts.append(cookies)
            if user_info.get('auto_detect'): auto_detect_accounts.append(cookies)
            if user_info.get('auto_report'): auto_report_accounts.append(cookies)
    r_session.delete('global:auto.collect.cookies')
    if len(auto_collect_accounts) != 0:
        r_session.sadd('global:auto.collect.cookies', *auto_collect_accounts)
    r_session.delete('global:auto.drawcash.cookies')
    if len(auto_drawcash_accounts) != 0:
        r_session.sadd('global:auto.drawcash.cookies', *auto_drawcash_accounts)
    r_session.delete('global:auto.giftbox.cookies')
    if len(auto_giftbox_accounts) != 0:
        r_session.sadd('global:auto.giftbox.cookies', *auto_giftbox_accounts)
    r_session.delete('global:auto.searcht.cookies')
    if len(auto_searcht_accounts) != 0:
        r_session.sadd('global:auto.searcht.cookies', *auto_searcht_accounts)
    r_session.delete('global:auto.revenge.cookies')
    if len(auto_revenge_accounts) != 0:
        r_session.sadd('global:auto.revenge.cookies', *auto_revenge_accounts)
    r_session.delete('global:auto.getaward.cookies')
    if len(auto_getaward_accounts) != 0:
        r_session.sadd('global:auto.getaward.cookies', *auto_getaward_accounts)
    r_session.delete('global:auto.detect.cookies')
    if len(auto_detect_accounts) != 0:
        r_session.sadd('global:auto.detect.cookies', *auto_detect_accounts)
    r_session.delete('global:auto.report.cookies')
    if len(auto_report_accounts) != 0:
        r_session.sadd('global:auto.report.cookies', *auto_report_accounts)
コード例 #11
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def get_online_user_data():

    config.crys_log('get_online_user_data')
    if r_session.exists('api_error_info'): return

    pool = ThreadPool(processes=1)

    pool.map(get_data, (u.decode('utf-8')
                        for u in r_session.smembers('global:online.users')))
    pool.close()
    pool.join()
コード例 #12
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def check_getaward(user, cookies, user_info):
    config.crys_log('check_getaward')
    r = api_getconfig(cookies)
    time.sleep(2)
    if r.get('rd') != 'ok': return
    if r.get('cost') == 5000:
        t = api_getaward(cookies)
        if t.get('rd') != 'ok':
            log = t.get('rd')
        else:
            log = '获得:%s' % regular_html(t.get('tip'))
        red_log(user, '自动执行', '转盘', log)

    time.sleep(3)
    return r
コード例 #13
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def check_getaward(user, cookies, user_info):
    config.crys_log( 'check_getaward')
    r = api_getconfig(cookies)
    time.sleep(2)
    if r.get('rd') != 'ok': return
    if r.get('cost') == 5000:
        t = api_getaward(cookies)
        if t.get('rd') != 'ok':
            log = t.get('rd')
        else:
            log = '获得:%s' % regular_html(t.get('tip'))
        red_log(user, '自动执行', '转盘', log)

    time.sleep(3)
    return r
コード例 #14
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def __relogin(username, password, account_info, account_key):

    config.crys_log( username.encode('utf-8'))

    login_result = login(username, password, conf.ENCRYPT_PWD_URL)

    if login_result.get('errorCode') != 0:
        account_info['status'] = login_result.get('errorDesc')
        account_info['active'] = False
        r_session.set(account_key, json.dumps(account_info))
        return False, account_info

    account_info['session_id'] = login_result.get('sessionID')
    account_info['status'] = 'OK'
    r_session.set(account_key, json.dumps(account_info))
    return True, account_info
コード例 #15
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def __relogin(username, password, account_info, account_key):

    config.crys_log(username.encode('utf-8'))

    login_result = login(username, password, conf.ENCRYPT_PWD_URL)

    if login_result.get('errorCode') != 0:
        account_info['status'] = login_result.get('errorDesc')
        account_info['active'] = False
        r_session.set(account_key, json.dumps(account_info))
        return False, account_info

    account_info['session_id'] = login_result.get('sessionID')
    account_info['status'] = 'OK'
    r_session.set(account_key, json.dumps(account_info))
    return True, account_info
コード例 #16
0
ファイル: crysadm_helper.py プロジェクト: dahaichenfu/crysadm
def __relogin(username, password, account_info, account_key):
    config.crys_log('')#
    #if DEBUG_MODE:
    #    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), username.encode('utf-8'), 'relogin')

    login_result = login(username, password, conf.ENCRYPT_PWD_URL)

    if login_result.get('errorCode') != 0:
        account_info['status'] = login_result.get('errorDesc')
        account_info['active'] = False
        r_session.set(account_key, json.dumps(account_info))
        return False, account_info

    account_info['session_id'] = login_result.get('sessionID')
    account_info['status'] = 'OK'
    r_session.set(account_key, json.dumps(account_info))
    return True, account_info
コード例 #17
0
def __relogin(username, password, account_info, account_key):
    config.crys_log('')#
    #if DEBUG_MODE:
    #    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), username.encode('utf-8'), 'relogin')

    login_result = login(username, password, conf.ENCRYPT_PWD_URL)

    if login_result.get('errorCode') != 0:
        account_info['status'] = login_result.get('errorDesc')
        account_info['active'] = False
        r_session.set(account_key, json.dumps(account_info))
        return False, account_info

    account_info['session_id'] = login_result.get('sessionID')
    account_info['status'] = 'OK'
    r_session.set(account_key, json.dumps(account_info))
    return True, account_info
コード例 #18
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def check_collect(user, cookies, user_info):
    config.crys_log( 'check_collect')
    mine_info = get_mine_info(cookies)
    time.sleep(2)
    if mine_info.get('r') != 0: return
    if 'collect_crystal_modify' in user_info.keys():
        limit = user_info.get('collect_crystal_modify')
    else:
        limit = 16000;

    if mine_info.get('td_not_in_a') > limit:
        r = collect(cookies)
        if r.get('rd') != 'ok':
            log = '%s' % r.get('rd')
        else:
            log = '收取:%s水晶.' % mine_info.get('td_not_in_a')
        red_log(user, '自动执行', '收取', log)
    time.sleep(3)
コード例 #19
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def check_collect(user, cookies, user_info):
    config.crys_log('check_collect')
    mine_info = get_mine_info(cookies)
    time.sleep(2)
    if mine_info.get('r') != 0: return
    if 'collect_crystal_modify' in user_info.keys():
        limit = user_info.get('collect_crystal_modify')
    else:
        limit = 16000

    if mine_info.get('td_not_in_a') > limit:
        r = collect(cookies)
        if r.get('rd') != 'ok':
            log = '%s' % r.get('rd')
        else:
            log = '收取:%s水晶.' % mine_info.get('td_not_in_a')
        red_log(user, '自动执行', '收取', log)
    time.sleep(3)
コード例 #20
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def save_income_history(username, pdc_detail):

    config.crys_log( username.encode('utf-8'))
    now = datetime.now()
    key = 'user_data:%s:%s' % (username, 'income.history')
    b_income_history = r_session.get(key)
    income_history = dict()

    if b_income_history is not None:
        income_history = json.loads(b_income_history.decode('utf-8'))

#    if now.minute < 50:
#        return

    if income_history.get(now.strftime('%Y-%m-%d')) is None:
        income_history[now.strftime('%Y-%m-%d')] = dict()

    income_history[now.strftime('%Y-%m-%d')][now.strftime('%H')] = pdc_detail

    r_session.setex(key, json.dumps(income_history), 3600 * 72)
コード例 #21
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def check_searcht(user, cookies, user_info):
    config.crys_log( 'check_searcht')
    r = api_sys_getEntry(cookies)
    time.sleep(2)
    if r.get('r') != 0: return
    if r.get('steal_free') > 0:
        steal_info = api_steal_search(cookies)
        if steal_info.get('r') != 0:
            log = regular_html(r.get('rd'))
        else:
            time.sleep(3)
            t = api_steal_collect(cookies=cookies, searcht_id=steal_info.get('sid'))
            if t.get('r') != 0:
                log = 'Forbidden'
            else:
                log = '获得:%s秘银.' % t.get('s')
                time.sleep(1)
                api_steal_summary(cookies=cookies, searcht_id=steal_info.get('sid'))
        red_log(user, '自动执行', '进攻', log)
    time.sleep(3)
コード例 #22
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def save_income_history(username, pdc_detail):

    config.crys_log(username.encode('utf-8'))
    now = datetime.now()
    key = 'user_data:%s:%s' % (username, 'income.history')
    b_income_history = r_session.get(key)
    income_history = dict()

    if b_income_history is not None:
        income_history = json.loads(b_income_history.decode('utf-8'))

#    if now.minute < 50:
#        return

    if income_history.get(now.strftime('%Y-%m-%d')) is None:
        income_history[now.strftime('%Y-%m-%d')] = dict()

    income_history[now.strftime('%Y-%m-%d')][now.strftime('%H')] = pdc_detail

    r_session.setex(key, json.dumps(income_history), 3600 * 72)
コード例 #23
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def check_giftbox(user, cookies, user_info):
    config.crys_log( 'check_giftbox')
    box_info = api_giftbox(cookies)
    time.sleep(2)
    if box_info.get('r') != 0: return
    for box in box_info.get('ci'):
        if box.get('cnum') == 0:
            r_info = api_openStone(cookies=cookies, giftbox_id=box.get('id'), direction='3')
            if r_info.get('r') != 0:
                log = r_info.get('rd')
            else:
                r = r_info.get('get')
                log = '开启:获得:%s水晶.' % r.get('num')
        else:
            r_info = api_giveUpGift(cookies=cookies, giftbox_id=box.get('id'))
            if r_info.get('r') != 0:
                log = r_info.get('rd')
            else:
                log = '丢弃:收费:%s水晶.' % box.get('cnum')
        red_log(user, '自动执行', '宝箱', log)
    time.sleep(3)
コード例 #24
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def check_revenge(user, cookies, user_info):
    config.crys_log( 'check_revenge')
    r = api_steal_stolenSilverHistory(cookies)
    time.sleep(2)
    if r.get('r') != 0: return
    for q in r.get('list'):
        if q.get('st') == 0:
            steal_info = api_steal_search(cookies, q.get('sid'))
            if steal_info.get('r') != 0:
                log = regular_html(r.get('rd'))
            else:
                time.sleep(3)
                t = api_steal_collect(cookies=cookies, searcht_id=steal_info.get('sid'))
                if t.get('r') != 0:
                    log = 'Forbidden'
                else:
                    log = '获得:%s秘银.' % t.get('s')
                    time.sleep(1)
                    api_steal_summary(cookies=cookies, searcht_id=steal_info.get('sid'))
            red_log(user, '自动执行', '复仇', log)
    time.sleep(3)
コード例 #25
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def check_searcht(user, cookies, user_info):
    config.crys_log('check_searcht')
    r = api_sys_getEntry(cookies)
    time.sleep(2)
    if r.get('r') != 0: return
    if r.get('steal_free') > 0:
        steal_info = api_steal_search(cookies)
        if steal_info.get('r') != 0:
            log = regular_html(r.get('rd'))
        else:
            time.sleep(3)
            t = api_steal_collect(cookies=cookies,
                                  searcht_id=steal_info.get('sid'))
            if t.get('r') != 0:
                log = 'Forbidden'
            else:
                log = '获得:%s秘银.' % t.get('s')
                time.sleep(1)
                api_steal_summary(cookies=cookies,
                                  searcht_id=steal_info.get('sid'))
        red_log(user, '自动执行', '进攻', log)
    time.sleep(3)
コード例 #26
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def check_giftbox(user, cookies, user_info):
    config.crys_log('check_giftbox')
    box_info = api_giftbox(cookies)
    time.sleep(2)
    if box_info.get('r') != 0: return
    for box in box_info.get('ci'):
        if box.get('cnum') == 0:
            r_info = api_openStone(cookies=cookies,
                                   giftbox_id=box.get('id'),
                                   direction='3')
            if r_info.get('r') != 0:
                log = r_info.get('rd')
            else:
                r = r_info.get('get')
                log = '开启:获得:%s水晶.' % r.get('num')
        else:
            r_info = api_giveUpGift(cookies=cookies, giftbox_id=box.get('id'))
            if r_info.get('r') != 0:
                log = r_info.get('rd')
            else:
                log = '丢弃:收费:%s水晶.' % box.get('cnum')
        red_log(user, '自动执行', '宝箱', log)
    time.sleep(3)
コード例 #27
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def check_revenge(user, cookies, user_info):
    config.crys_log('check_revenge')
    r = api_steal_stolenSilverHistory(cookies)
    time.sleep(2)
    if r.get('r') != 0: return
    for q in r.get('list'):
        if q.get('st') == 0:
            steal_info = api_steal_search(cookies, q.get('sid'))
            if steal_info.get('r') != 0:
                log = regular_html(r.get('rd'))
            else:
                time.sleep(3)
                t = api_steal_collect(cookies=cookies,
                                      searcht_id=steal_info.get('sid'))
                if t.get('r') != 0:
                    log = 'Forbidden'
                else:
                    log = '获得:%s秘银.' % t.get('s')
                    time.sleep(1)
                    api_steal_summary(cookies=cookies,
                                      searcht_id=steal_info.get('sid'))
            red_log(user, '自动执行', '复仇', log)
    time.sleep(3)
コード例 #28
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def getaward_crystal():
    config.crys_log('getaward_crystal')

    cookies_auto(check_getaward, 'global:auto.getaward.cookies')
コード例 #29
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def auto_detect():
    config.crys_log('auto_detect')

    cookies_auto(detect_exception, 'global:auto.detect.cookies')
コード例 #30
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def check_report(user, cookies, user_info):
    from mailsand import send_email
    from mailsand import validateEmail
    config.crys_log('check_report')
    extra_info_key = 'extra_info:%s' % (user_info.get('username'))
    b_extra_info = r_session.get(extra_info_key)
    if b_extra_info is None:
        extra_info = {}
    else:
        extra_info = json.loads(b_extra_info.decode('utf-8'))
    if 'last_adjust_date' not in extra_info.keys() or datetime.strptime(
            extra_info['last_adjust_date'],
            '%Y-%m-%d %H:%M:%S').day != datetime.now().day:
        return
    if 'last_report_date' not in extra_info.keys():
        extra_info['last_report_date'] = '1997-1-1 1:1:1'
    if datetime.strptime(extra_info['last_report_date'],
                         '%Y-%m-%d %H:%M:%S').day == datetime.now().day:
        return
    config.crys_log('check_report')
    str_yesterday = (datetime.now() + timedelta(days=-1)).strftime('%Y-%m-%d')
    yesterday_key = 'user_data:%s:%s' % (user_info.get('username'),
                                         str_yesterday)
    b_yesterday_data = r_session.get(yesterday_key)
    if b_yesterday_data is None: return
    yesterday_data = json.loads(b_yesterday_data.decode('utf-8'))
    if 'produce_stat' in yesterday_data.keys():
        if validateEmail(user_info['email']) != 1: return
        mail = dict()
        mail['to'] = user_info['email']
        mail['subject'] = '云监工-收益报告'
        mail['text'] = """
<DIV style="BACKGROUND-COLOR: #e6eae9">
    <TABLE style="WIDTH: 100%; COLOR: #4f6b72; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px" cellSpacing=0 summary="The technical specifications of the Apple PowerMac G5 series">
        <CAPTION style="WIDTH: 700px; PADDING-BOTTOM: 5px; TEXT-ALIGN: center; PADDING-TOP: 0px; FONT: italic 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 0px; PADDING-RIGHT: 0px">
            收益报告
        </CAPTION>
        <TBODY>
            <TR>
                <TH style="BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=col>
                    矿主ID
                </TH>
                <TH style="BORDER-TOP: #c1dad7 1px solid; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #cae8ea; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px" scope=col>
                    平均速度(KB/S)
                </TH>
                <TH style="BORDER-TOP: #c1dad7 1px solid; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #cae8ea; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px" scope=col>
                    今日收益(¥)
                </TH>
            </TR>
    """
        td_speed = {}
        td_produce = {}
        s_sum = 0
        p_sum = 0
        for stat in yesterday_data['speed_stat']:
            s = 0
            for i in range(0, 24):
                s += stat['dev_speed'][i]
            td_speed[stat['mid']] = s / 24 / 8
            s_sum += td_speed[stat['mid']]
        for j, stat in enumerate(yesterday_data['produce_stat']):
            s = 0
            for i in range(1, 25):
                s += stat['hourly_list'][i]
            td_produce[stat['mid']] = s / 10000
            p_sum += td_produce[stat['mid']]
            if j % 2 == 0:
                mail['text'] = mail['text'] + """
            <TR>
                <TH style="BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #fff; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 10px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; BORDER-LEFT: #c1dad7 1px solid; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=row>
                    """ + ('%d' % (stat['mid'])) + """
                </TH>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #fff; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.1f' % (td_speed[stat['mid']])) + """
                </TD>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #fff; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.2f' % (td_produce[stat['mid']])) + """
                </TD>
            </TR>
    """
            else:
                mail['text'] = mail['text'] + """
                <TH style="BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #f5fafa; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #797268; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 10px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; BORDER-LEFT: #c1dad7 1px solid; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=row>
                    """ + ('%d' % (stat['mid'])) + """
                </TH>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #f5fafa; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #797268; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.1f' % (td_speed[stat['mid']])) + """
                </TD>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #f5fafa; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #797268; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.2f' % (td_produce[stat['mid']])) + """
                </TD>
            </TR>
    """
        mail['text'] = mail['text'] + """
            <TR>
                <TH style="BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=col>
                    总计
                </TH>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.1f' % (s_sum)) + """
                </TD>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.2f' % (p_sum)) + """
                </TD>
            </TR>
        </TBODY>
        <TFOOT style="FONT-SIZE: 11px; BACKGROUND: none transparent scroll repeat 0% 0%">
            <TR>
                <TD colSpan=4 align=right>
                """ + datetime.now().strftime('%Y-%m-%d %H:%M:%S') + """
                </TD>
            </TR>
        </TFOOT>
    </TABLE>
</DIV>
    """
        if send_email(mail, config_info) == True:
            extra_info['last_report_date'] = datetime.now().strftime(
                '%Y-%m-%d %H:%M:%S')
        r_session.set(extra_info_key, json.dumps(extra_info))
コード例 #31
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def auto_report():
    config.crys_log('auto_report')
    cookies_auto(check_report, 'global:auto.report.cookies')
コード例 #32
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def collect_crystal():
    config.crys_log( 'collect_crystal')

    cookies_auto(check_collect, 'global:auto.collect.cookies')
コード例 #33
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def giftbox_crystal():
    config.crys_log( 'giftbox_crystal')

    cookies_auto(check_giftbox, 'global:auto.giftbox.cookies')
コード例 #34
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def searcht_crystal():
    config.crys_log('searcht_crystal')
    cookies_auto(check_searcht, 'global:auto.searcht.cookies')
コード例 #35
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def clear_offline_user():
    config.crys_log( 'clear_offline_user')
    for b_username in r_session.smembers('global:online.users'):
        username = b_username.decode('utf-8')
        if not r_session.exists('user:%s:is_online' % username):
            r_session.srem('global:online.users', username)
コード例 #36
0
def get_data(username):
    config.crys_log('get %s data' % username)

    start_time = datetime.now()
    try:
        for user_id in r_session.smembers('accounts:%s' % username):
            time.sleep(3)
            account_key = 'account:%s:%s' % (username, user_id.decode('utf-8'))
            account_info = json.loads(r_session.get(account_key).decode('utf-8'))

            # clean the log everyday
            record_key = '%s:%s' % ('record', username)
            if start_time.hour == 23 and start_time.minute >= 55:
                record_info = dict(diary=[])
                r_session.set(record_key, json.dumps(record_info))

            if not account_info.get('active'):
                continue

            config.crys_log('start get data with user id %s ' % user_id)

            session_id = account_info.get('session_id')
            user_id = account_info.get('user_id')
            cookies = dict(sessionid=session_id, userid=str(user_id))

            mine_info = get_mine_info(cookies)
            if is_api_error(mine_info):
                config.crys_log('get data %s error#' % user_id)
                #if DEBUG_MODE:
                #    print('get_data:', user_id, mine_info, 'error')
                return

            if mine_info.get('r') != 0:

                success, account_info = __relogin(account_info.get('account_name'), account_info.get('password'),
                                                  account_info, account_key)
                if not success:
                    config.crys_log('%s re-login failed' % user_id)
                    print('get_data:', user_id, 'relogin failed')
                    continue
                session_id = account_info.get('session_id')
                user_id = account_info.get('user_id')
                cookies = dict(sessionid=session_id, userid=str(user_id))
                mine_info = get_mine_info(cookies)

            if mine_info.get('r') != 0:
                config.crys_log('get mime info %s error#' % user_id)
                #print('get_data:', user_id, mine_info, 'error')
                continue

            device_info = ubus_cd(session_id, user_id, 'get_devices', ["server", "get_devices", {}])
            red_zqb = device_info['result'][1]

            account_data_key = account_key + ':data'
            exist_account_data = r_session.get(account_data_key)
            if exist_account_data is None:
                account_data = dict()
                account_data['privilege'] = get_privilege(cookies)
            else:
                account_data = json.loads(exist_account_data.decode('utf-8'))

            if account_data.get('updated_time') is not None:
                last_updated_time = datetime.strptime(account_data.get('updated_time'), '%Y-%m-%d %H:%M:%S')
                if last_updated_time.hour != datetime.now().hour:
                    account_data['zqb_speed_stat'] = get_speed_stat(cookies)
            else:
                account_data['zqb_speed_stat'] = get_speed_stat(cookies)

            account_data['updated_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            account_data['mine_info'] = mine_info
            account_data['device_info'] = red_zqb.get('devices')
            account_data['income'] = get_income_info(cookies)
            account_data['produce_info'] = get_produce_stat(cookies)

            if is_api_error(account_data.get('income')):
                config.crys_log('get income %s error#' % user_id)
                #print('get_data:', user_id, 'income', 'error')
                return

            r_session.set(account_data_key, json.dumps(account_data))
            if not r_session.exists('can_drawcash'):
                r = get_can_drawcash(cookies=cookies)
                if r.get('r') == 0:
                    r_session.setex('can_drawcash', r.get('is_tm'), 60)

        if start_time.day == datetime.now().day:
            save_history(username)

        r_session.setex('user:%s:cron_queued' % username, '1', 60)
        if DEBUG_MODE:
            config.crys_log('get data user %s successed#' % username)
            #print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), username.encode('utf-8'), 'successed')
    except Exception as ex:
        config.crys_log('get data user %s failed##' % username)
        print(username.encode('utf-8'), 'failed', datetime.now().strftime('%Y-%m-%d %H:%M:%S'), ex)
コード例 #37
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def revenge_crystal():
    config.crys_log( 'revenge_crystal')

    cookies_auto(check_revenge, 'global:auto.revenge.cookies')
コード例 #38
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def get_data(username):
    config.crys_log('get %s data' % username)

    start_time = datetime.now()
    try:
        for user_id in r_session.smembers('accounts:%s' % username):
            time.sleep(3)
            account_key = 'account:%s:%s' % (username, user_id.decode('utf-8'))
            account_info = json.loads(r_session.get(account_key).decode('utf-8'))

            if not account_info.get('active'):
                continue

            config.crys_log('start get data with user id %s ' % user_id)

            session_id = account_info.get('session_id')
            user_id = account_info.get('user_id')
            cookies = dict(sessionid=session_id, userid=str(user_id))

            mine_info = get_mine_info(cookies)
            if is_api_error(mine_info):
                config.crys_log('get data %s error#' % user_id)
                return

            if mine_info.get('r') != 0:

                success, account_info = __relogin(account_info.get('account_name'), account_info.get('password'),
                                                  account_info, account_key)
                if not success:
                    config.crys_log('%s re-login failed' % user_id)
                    print('get_data:', user_id, 'relogin failed')
                    continue
                session_id = account_info.get('session_id')
                user_id = account_info.get('user_id')
                cookies = dict(sessionid=session_id, userid=str(user_id))
                mine_info = get_mine_info(cookies)

            if mine_info.get('r') != 0:
                config.crys_log('get mime info %s error#' % user_id)
                continue

            device_info = ubus_cd(session_id, user_id, 'get_devices', ["server", "get_devices", {}])
            red_zqb = device_info['result'][1]

            account_data_key = account_key + ':data'
            exist_account_data = r_session.get(account_data_key)
            if exist_account_data is None:
                account_data = dict()
                account_data['privilege'] = get_privilege(cookies)
            else:
                account_data = json.loads(exist_account_data.decode('utf-8'))

            balance_log = get_balance_log(cookies)
            if balance_log.get('r') == 0 and 'ioi' in balance_log.keys():
                account_data['ioi'] = balance_log['ioi']
                
            if account_data.get('updated_time') is not None:
                last_updated_time = datetime.strptime(account_data.get('updated_time'), '%Y-%m-%d %H:%M:%S')
                if last_updated_time.hour != datetime.now().hour:
                    account_data['zqb_speed_stat'] = get_speed_stat(cookies)
            else:
                account_data['zqb_speed_stat'] = get_speed_stat(cookies)

            account_data['updated_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            account_data['mine_info'] = mine_info
            account_data['device_info'] = red_zqb.get('devices')
            account_data['income'] = get_balance_info(cookies)
            
            account_data['produce_info'] = get_produce_stat(cookies)

            if is_api_error(account_data.get('income')):
                config.crys_log('get income %s error#' % user_id)
                return

            r_session.set(account_data_key, json.dumps(account_data))
            if not r_session.exists('can_drawcash'):
                r = get_can_drawcash(cookies=cookies)
                if r.get('r') == 0:
                    r_session.setex('can_drawcash', r.get('is_tm'), 60)

        if start_time.day == datetime.now().day:
            save_history(username)

        r_session.setex('user:%s:cron_queued' % username, '1', 60)
        config.crys_log('get data user %s successed#' % username)
    except Exception as ex:
        config.crys_log('get data user %s failed##' % username)
        print(username.encode('utf-8'), 'failed', datetime.now().strftime('%Y-%m-%d %H:%M:%S'), ex)
コード例 #39
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def save_history(username):

    config.crys_log( 'save_history')
    str_today = datetime.now().strftime('%Y-%m-%d')
    key = 'user_data:%s:%s' % (username, str_today)
    b_today_data = r_session.get(key)
    today_data = dict()

    if b_today_data is not None:
        today_data = json.loads(b_today_data.decode('utf-8'))

    today_data['updated_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    today_data['pdc'] = 0
    today_data['last_speed'] = 0
    today_data['deploy_speed'] = 0
    today_data['balance'] = 0
    today_data['income'] = 0
    today_data['speed_stat'] = list()
    today_data['pdc_detail'] = []
    today_data['giftbox_pdc'] = 0
    today_data['produce_stat'] = []
    today_data['award_income'] = 0

    for user_id in r_session.smembers('accounts:%s' % username):
        # 获取账号所有数据
        account_data_key = 'account:%s:%s:data' % (username, user_id.decode('utf-8'))
        b_data = r_session.get(account_data_key)
        if b_data is None:
            continue
        data = json.loads(b_data.decode('utf-8'))

        if datetime.strptime(data.get('updated_time'), '%Y-%m-%d %H:%M:%S').day != datetime.now().day:
            continue
        today_data.get('speed_stat').append(dict(mid=data.get('privilege').get('mid'),
                                                 dev_speed=data.get('zqb_speed_stat') if data.get(
                                                     'zqb_speed_stat') is not None else [0] * 24))
        this_pdc = data.get('mine_info').get('dev_m').get('pdc')

        today_data['pdc'] += this_pdc
        today_data.get('pdc_detail').append(dict(mid=data.get('privilege').get('mid'), pdc=this_pdc))
        today_data['balance'] += data.get('income').get('r_can_use')
        today_data['income'] += data.get('income').get('r_h_a')
        today_data.get('produce_stat').append(dict(mid=data.get('privilege').get('mid'), hourly_list=data.get('produce_info').get('hourly_list')))
        if 'ioi' in data.keys():
            for ioi in data['ioi']:
                if 'cn' in ioi.keys() and 'ct' in ioi.keys() and time.localtime(ioi['ct']).tm_mday == datetime.now().day:
                    if ioi['cn'].find('宝箱') != -1 or ioi['cn'].find('转盘') != -1:
                        today_data['award_income'] += ioi['c']
        for device in data.get('device_info'):
            today_data['last_speed'] += int(int(device.get('dcdn_upload_speed')) / 1024)
            today_data['deploy_speed'] += int(device.get('dcdn_download_speed') / 1024)
    today_data['pdc'] += today_data['award_income'] 
    r_session.setex(key, json.dumps(today_data), 3600 * 24 * 35)

    extra_info_key='extra_info:%s' % (username)
    b_extra_info=r_session.get(extra_info_key)
    if b_extra_info is None:
        extra_info={}
    else:
        extra_info=json.loads(b_extra_info.decode('utf-8'))
    if 'last_adjust_date' not in extra_info.keys():
        extra_info['last_adjust_date'] = '1997-1-1 1:1:1'
    if datetime.now().hour<20 and datetime.strptime(extra_info['last_adjust_date'],'%Y-%m-%d %H:%M:%S').day != datetime.now().day:
        str_yesterday = (datetime.now() + timedelta(days=-1)).strftime('%Y-%m-%d')
        yesterday_key = 'user_data:%s:%s' % (username, str_yesterday)
        b_yesterday_data = r_session.get(yesterday_key)
        if b_yesterday_data is None: return
        yesterday_data = json.loads(b_yesterday_data.decode('utf-8'))
        if 'produce_stat' in yesterday_data.keys():
            td_produce={}
            for td_stat in today_data['produce_stat']:
                td_produce[td_stat['mid']]=td_stat['hourly_list']
            detail_adjust_dict={}
            for stat in yesterday_data['produce_stat']:
                if stat['mid'] in td_produce.keys():
                    last_hour_pdc=td_produce[stat['mid']][23-datetime.strptime(today_data['updated_time'],'%Y-%m-%d %H:%M:%S').hour]
                    detail_adjust_dict[stat['mid']] = last_hour_pdc - stat['hourly_list'][24]
                    stat['hourly_list'][24] = last_hour_pdc
            for pdc_info in yesterday_data.get('pdc_detail'):
                if pdc_info.get('mid') is not None and pdc_info.get('pdc') is not None:
                    pdc_info['pdc'] += detail_adjust_dict[pdc_info.get('mid')]
        r_session.setex(yesterday_key, json.dumps(yesterday_data), 3600 * 24 * 34)
        extra_info['last_adjust_date']=datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        r_session.set(extra_info_key,json.dumps(extra_info))
    save_income_history(username, today_data.get('pdc_detail'))
コード例 #40
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def collect_crystal():
    config.crys_log('collect_crystal')

    cookies_auto(check_collect, 'global:auto.collect.cookies')
コード例 #41
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def revenge_crystal():
    config.crys_log('revenge_crystal')

    cookies_auto(check_revenge, 'global:auto.revenge.cookies')
コード例 #42
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def detect_exception(user, cookies, user_info):
    from mailsand import send_email
    from mailsand import validateEmail
    config.crys_log('detect_exception')
    config_key = '%s:%s' % ('user', 'system')
    config_info = json.loads(r_session.get(config_key).decode('utf-8'))
    account_data_key = 'account:%s:%s:data' % (user_info.get('username'),
                                               user.get('userid'))
    exist_account_data = r_session.get(account_data_key)
    if exist_account_data is None: return
    account_data = json.loads(exist_account_data.decode('utf-8'))

    extra_info_key = 'extra_info:%s' % (user_info.get('username'))
    b_extra_info = r_session.get(extra_info_key)
    if b_extra_info is None:
        extra_info = {}
    else:
        extra_info = json.loads(b_extra_info.decode('utf-8'))
    if 'detect_info' not in extra_info.keys():
        detect_info = {}
    else:
        detect_info = extra_info['detect_info']
    if not 'device_info' in account_data.keys(): return
    status_cn = {'offline': '离线', 'online': '在线', 'exception': '异常'}
    warn_list = []
    for dev in account_data['device_info']:
        if 'status_list' not in detect_info.keys():
            detect_info['status_list'] = {}
        if dev['device_name'] not in detect_info['status_list'].keys():
            detect_info['status_list'][dev['device_name']] = dev['status']
        elif dev['status'] != detect_info['status_list'][dev['device_name']]:
            red_log(
                user, '矿机状态', '状态', '%s:%s -> %s' %
                (dev['device_name'],
                 status_cn[detect_info['status_list'][dev['device_name']]],
                 status_cn[dev['status']]))
            detect_info['status_list'][dev['device_name']] = dev['status']
            if 'exception_occured' not in detect_info.keys():
                detect_info['exception_occured'] = True
        if dev['status'] != 'online':
            warn_list.append(dev)
        if 'dcdn_clients' in dev.keys():
            for i, client in enumerate(dev['dcdn_clients']):
                space_last_key = 'space_%s:%s:%s' % (i, user.get('userid'),
                                                     dev['device_name'])
                if space_last_key in detect_info.keys():
                    last_space = detect_info[space_last_key]
                    if last_space - 100 * 1024 * 1024 > int(
                            client['space_used']):
                        red_log(
                            user, '缓存变动', '状态', '%s:删除了%.2fGB缓存,当前%.2fGB' %
                            (dev['device_name'],
                             float(last_space) / 1024 / 1024 / 1024 -
                             float(client['space_used']) / 1024 / 1024 / 1024,
                             float(client['space_used']) / 1024 / 1024 / 1024))
                        detect_info[space_last_key] = int(client['space_used'])
                    elif last_space < int(client['space_used']):
                        detect_info[space_last_key] = int(client['space_used'])
                else:
                    detect_info[space_last_key] = int(client['space_used'])
    if len(warn_list) != 0:
        if 'updated_time' in detect_info.keys(
        ) and account_data['updated_time'] != detect_info['updated_time']:
            if 'exception_occured' in detect_info.keys(
            ) and detect_info['exception_occured'] == True:
                if 'last_warn' not in detect_info.keys() or (datetime.now(
                ) - datetime.strptime(detect_info['last_warn'],
                                      '%Y-%m-%d %H:%M:%S')).seconds > 60 * 60:
                    if validateEmail(user_info['email']) == 1:
                        mail = dict()
                        mail['to'] = user_info['email']
                        mail['subject'] = '云监工-矿机异常'
                        mail['text'] = ''
                        for dev in warn_list:
                            mail['text'] = mail['text'].join([
                                '您的矿机:', dev['device_name'], '<br />状态:',
                                status_cn[dev['status']], '<br />时间:',
                                datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
                                '<br />==================<br />'
                            ])
                        if send_email(mail, config_info) == True:
                            detect_info['last_warn'] = datetime.now().strftime(
                                '%Y-%m-%d %H:%M:%S')
                            detect_info['exception_occured'] = False
    else:
        detect_info.pop('exception_occured', '^.^')

    detect_info['updated_time'] = account_data['updated_time']
    extra_info['detect_info'] = detect_info
    r_session.set(extra_info_key, json.dumps(extra_info))
コード例 #43
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def select_auto_task_user():
    config.crys_log('select_auto_task_user')
    auto_collect_accounts = []
    auto_drawcash_accounts = []
    auto_giftbox_accounts = []
    auto_searcht_accounts = []
    auto_revenge_accounts = []
    auto_getaward_accounts = []
    auto_detect_accounts = []
    auto_report_accounts = []
    for b_user in r_session.mget(*[
            'user:%s' % name.decode('utf-8')
            for name in r_session.smembers('users')
    ]):
        user_info = json.loads(b_user.decode('utf-8'))
        if not user_info.get('active'): continue
        username = user_info.get('username')
        account_keys = [
            'account:%s:%s' % (username, user_id.decode('utf-8'))
            for user_id in r_session.smembers('accounts:%s' % username)
        ]
        if len(account_keys) == 0: continue
        for b_account in r_session.mget(*account_keys):
            account_info = json.loads(b_account.decode('utf-8'))
            if not (account_info.get('active')): continue
            session_id = account_info.get('session_id')
            user_id = account_info.get('user_id')
            cookies = json.dumps(
                dict(sessionid=session_id, userid=user_id,
                     user_info=user_info))
            if user_info.get('auto_collect'):
                auto_collect_accounts.append(cookies)
            if user_info.get('auto_drawcash'):
                auto_drawcash_accounts.append(cookies)
            if user_info.get('auto_giftbox'):
                auto_giftbox_accounts.append(cookies)
            if user_info.get('auto_searcht'):
                auto_searcht_accounts.append(cookies)
            if user_info.get('auto_revenge'):
                auto_revenge_accounts.append(cookies)
            if user_info.get('auto_getaward'):
                auto_getaward_accounts.append(cookies)
            if user_info.get('auto_detect'):
                auto_detect_accounts.append(cookies)
            if user_info.get('auto_report'):
                auto_report_accounts.append(cookies)
    r_session.delete('global:auto.collect.cookies')
    if len(auto_collect_accounts) != 0:
        r_session.sadd('global:auto.collect.cookies', *auto_collect_accounts)
    r_session.delete('global:auto.drawcash.cookies')
    if len(auto_drawcash_accounts) != 0:
        r_session.sadd('global:auto.drawcash.cookies', *auto_drawcash_accounts)
    r_session.delete('global:auto.giftbox.cookies')
    if len(auto_giftbox_accounts) != 0:
        r_session.sadd('global:auto.giftbox.cookies', *auto_giftbox_accounts)
    r_session.delete('global:auto.searcht.cookies')
    if len(auto_searcht_accounts) != 0:
        r_session.sadd('global:auto.searcht.cookies', *auto_searcht_accounts)
    r_session.delete('global:auto.revenge.cookies')
    if len(auto_revenge_accounts) != 0:
        r_session.sadd('global:auto.revenge.cookies', *auto_revenge_accounts)
    r_session.delete('global:auto.getaward.cookies')
    if len(auto_getaward_accounts) != 0:
        r_session.sadd('global:auto.getaward.cookies', *auto_getaward_accounts)
    r_session.delete('global:auto.detect.cookies')
    if len(auto_detect_accounts) != 0:
        r_session.sadd('global:auto.detect.cookies', *auto_detect_accounts)
    r_session.delete('global:auto.report.cookies')
    if len(auto_report_accounts) != 0:
        r_session.sadd('global:auto.report.cookies', *auto_report_accounts)
コード例 #44
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def check_report(user, cookies, user_info):
    from mailsand import send_email
    from mailsand import validateEmail
    config.crys_log( 'check_report')
    extra_info_key='extra_info:%s' % (user_info.get('username'))
    b_extra_info=r_session.get(extra_info_key)
    if b_extra_info is None:
        extra_info={}
    else:
        extra_info=json.loads(b_extra_info.decode('utf-8'))
    if 'last_adjust_date' not in extra_info.keys() or datetime.strptime(extra_info['last_adjust_date'],'%Y-%m-%d %H:%M:%S').day != datetime.now().day:
        return
    if 'last_report_date' not in extra_info.keys():
        extra_info['last_report_date'] = '1997-1-1 1:1:1'
    if datetime.strptime(extra_info['last_report_date'],'%Y-%m-%d %H:%M:%S').day == datetime.now().day: return
    config.crys_log( 'check_report')
    str_yesterday = (datetime.now() + timedelta(days=-1)).strftime('%Y-%m-%d')
    yesterday_key = 'user_data:%s:%s' % (user_info.get('username'), str_yesterday)
    b_yesterday_data = r_session.get(yesterday_key)
    if b_yesterday_data is None: return
    yesterday_data = json.loads(b_yesterday_data.decode('utf-8'))
    if 'produce_stat' in yesterday_data.keys():
        if validateEmail(user_info['email']) != 1: return
        mail = dict()
        mail['to'] = user_info['email']
        mail['subject'] = '云监工-收益报告'
        mail['text'] = """
<DIV style="BACKGROUND-COLOR: #e6eae9">
    <TABLE style="WIDTH: 100%; COLOR: #4f6b72; PADDING-BOTTOM: 0px; PADDING-TOP: 0px; PADDING-LEFT: 0px; MARGIN: 0px; PADDING-RIGHT: 0px" cellSpacing=0 summary="The technical specifications of the Apple PowerMac G5 series">
        <CAPTION style="WIDTH: 700px; PADDING-BOTTOM: 5px; TEXT-ALIGN: center; PADDING-TOP: 0px; FONT: italic 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 0px; PADDING-RIGHT: 0px">
            收益报告
        </CAPTION>
        <TBODY>
            <TR>
                <TH style="BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=col>
                    矿主ID
                </TH>
                <TH style="BORDER-TOP: #c1dad7 1px solid; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #cae8ea; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px" scope=col>
                    平均速度(KB/S)
                </TH>
                <TH style="BORDER-TOP: #c1dad7 1px solid; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #cae8ea; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px" scope=col>
                    今日收益(¥)
                </TH>
            </TR>
    """
        td_speed={}
        td_produce={}
        s_sum=0
        p_sum=0
        for stat in yesterday_data['speed_stat']:
            s=0
            for i in range(0,24):
               s+=stat['dev_speed'][i]
            td_speed[stat['mid']]=s/24/8
            s_sum+=td_speed[stat['mid']]
        for j,stat in enumerate(yesterday_data['produce_stat']):
            s=0
            for i in range(1,25):
               s+=stat['hourly_list'][i]
            td_produce[stat['mid']]=s/10000
            p_sum+=td_produce[stat['mid']]
            if j % 2 == 0:
                mail['text']=mail['text'] + """
            <TR>
                <TH style="BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #fff; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 10px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; BORDER-LEFT: #c1dad7 1px solid; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=row>
                    """ + ('%d' % (stat['mid'])) + """
                </TH>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #fff; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.1f' % (td_speed[stat['mid']])) + """
                </TD>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #fff; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.2f' % (td_produce[stat['mid']])) + """
                </TD>
            </TR>
    """
            else:
                mail['text']=mail['text'] + """
                <TH style="BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #f5fafa; BORDER-BOTTOM: #c1dad7 1px solid; TEXT-TRANSFORM: uppercase; COLOR: #797268; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 10px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; BORDER-LEFT: #c1dad7 1px solid; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=row>
                    """ + ('%d' % (stat['mid'])) + """
                </TH>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #f5fafa; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #797268; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.1f' % (td_speed[stat['mid']])) + """
                </TD>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: #f5fafa; BORDER-BOTTOM: #c1dad7 1px solid; COLOR: #797268; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.2f' % (td_produce[stat['mid']])) + """
                </TD>
            </TR>
    """
        mail['text']=mail['text'] + """
            <TR>
                <TH style="BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; TEXT-TRANSFORM: uppercase; COLOR: #4f6b72; PADDING-BOTTOM: 6px; TEXT-ALIGN: left; PADDING-TOP: 6px; FONT: bold 11px 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; PADDING-LEFT: 12px; LETTER-SPACING: 2px; PADDING-RIGHT: 6px; BORDER-TOP-WIDTH: 0px" scope=col>
                    总计
                </TH>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.1f' % (s_sum)) + """
                </TD>
                <TD style="FONT-SIZE: 11px; BORDER-RIGHT: #c1dad7 1px solid; BACKGROUND: none transparent scroll repeat 0% 0%; COLOR: #4f6b72; PADDING-BOTTOM: 6px; PADDING-TOP: 6px; PADDING-LEFT: 12px; PADDING-RIGHT: 6px">
                    """ + ('%.2f' % (p_sum)) + """
                </TD>
            </TR>
        </TBODY>
        <TFOOT style="FONT-SIZE: 11px; BACKGROUND: none transparent scroll repeat 0% 0%">
            <TR>
                <TD colSpan=4 align=right>
                """ + datetime.now().strftime('%Y-%m-%d %H:%M:%S') + """
                </TD>
            </TR>
        </TFOOT>
    </TABLE>
</DIV>
    """
        if send_email(mail,config_info) == True:
            extra_info['last_report_date']=datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        r_session.set(extra_info_key,json.dumps(extra_info))
コード例 #45
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def clear_offline_user():
    config.crys_log('clear_offline_user')
    for b_username in r_session.smembers('global:online.users'):
        username = b_username.decode('utf-8')
        if not r_session.exists('user:%s:is_online' % username):
            r_session.srem('global:online.users', username)
コード例 #46
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def detect_exception(user, cookies, user_info):
    from mailsand import send_email
    from mailsand import validateEmail
    config.crys_log( 'detect_exception')
    config_key = '%s:%s' % ('user', 'system')
    config_info = json.loads(r_session.get(config_key).decode('utf-8'))
    account_data_key = 'account:%s:%s:data' % (user_info.get('username'), user.get('userid'))        
    exist_account_data = r_session.get(account_data_key)
    if exist_account_data is None: return
    account_data = json.loads(exist_account_data.decode('utf-8'))

    extra_info_key='extra_info:%s' % (user_info.get('username'))
    b_extra_info=r_session.get(extra_info_key)
    if b_extra_info is None:
        extra_info={}
    else:
        extra_info=json.loads(b_extra_info.decode('utf-8'))
    if 'detect_info' not in extra_info.keys():
        detect_info={}
    else:
        detect_info=extra_info['detect_info']
    if not 'device_info' in account_data.keys(): return
    status_cn={'offline':'离线','online':'在线','exception':'异常'}
    warn_list=[]
    for dev in account_data['device_info']:
        if 'status_list' not in detect_info.keys():
            detect_info['status_list']={}
        if dev['device_name'] not in detect_info['status_list'].keys():
            detect_info['status_list'][dev['device_name']]=dev['status']
        elif dev['status'] != detect_info['status_list'][dev['device_name']]:
            red_log(user, '矿机状态', '状态', '%s:%s -> %s' % (dev['device_name'],status_cn[detect_info['status_list'][dev['device_name']]],status_cn[dev['status']]))
            detect_info['status_list'][dev['device_name']]=dev['status']
            if 'exception_occured' not in detect_info.keys():
                detect_info['exception_occured'] = True
        if dev['status'] != 'online':
            warn_list.append(dev);
        if 'dcdn_clients' in dev.keys():
            for i,client in enumerate(dev['dcdn_clients']):
                space_last_key='space_%s:%s:%s' % (i,user.get('userid'),dev['device_name'])
                if space_last_key in detect_info.keys():
                    last_space=detect_info[space_last_key]
                    if last_space - 100*1024*1024 > int(client['space_used']):
                        red_log(user, '缓存变动', '状态', '%s:删除了%.2fGB缓存,当前%.2fGB' % (dev['device_name'],float(last_space)/1024/1024/1024-float(client['space_used'])/1024/1024/1024,float(client['space_used'])/1024/1024/1024))
                        detect_info[space_last_key] = int(client['space_used'])
                    elif last_space < int(client['space_used']):
                        detect_info[space_last_key] = int(client['space_used'])
                else:
                   detect_info[space_last_key] = int(client['space_used'])
    if len(warn_list) != 0:
        if 'updated_time' in detect_info.keys() and account_data['updated_time'] != detect_info['updated_time']:
            if 'exception_occured' in detect_info.keys() and detect_info['exception_occured'] == True:
                if 'last_warn' not in detect_info.keys() or (datetime.now() - datetime.strptime(detect_info['last_warn'],'%Y-%m-%d %H:%M:%S')).seconds > 60*60:
                    if validateEmail(user_info['email']) == 1:
                        mail = dict()
                        mail['to'] = user_info['email']
                        mail['subject'] = '云监工-矿机异常'
                        mail['text'] = ''
                        for dev in warn_list:
                            mail['text'] = mail['text'].join(['您的矿机:',dev['device_name'],'<br />状态:',status_cn[dev['status']] ,'<br />时间:',datetime.now().strftime('%Y-%m-%d %H:%M:%S'),'<br />==================<br />'])
                        if send_email(mail,config_info) == True:
                            detect_info['last_warn']=datetime.now().strftime('%Y-%m-%d %H:%M:%S')
                            detect_info['exception_occured'] = False
    else:
        detect_info.pop('exception_occured','^.^')

    detect_info['updated_time'] = account_data['updated_time']
    extra_info['detect_info']=detect_info
    r_session.set(extra_info_key, json.dumps(extra_info))
コード例 #47
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def searcht_crystal():
    config.crys_log( 'searcht_crystal')
    cookies_auto(check_searcht, 'global:auto.searcht.cookies')
コード例 #48
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def auto_detect():
    config.crys_log( 'auto_detect')

    cookies_auto(detect_exception, 'global:auto.detect.cookies')
コード例 #49
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def getaward_crystal():
    config.crys_log( 'getaward_crystal')

    cookies_auto(check_getaward, 'global:auto.getaward.cookies')
コード例 #50
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def giftbox_crystal():
    config.crys_log('giftbox_crystal')

    cookies_auto(check_giftbox, 'global:auto.giftbox.cookies')
コード例 #51
0
ファイル: crysadm_helper.py プロジェクト: qtjay/crysadm-1
def auto_report():
    config.crys_log( 'auto_report')
    cookies_auto(check_report, 'global:auto.report.cookies')
コード例 #52
0
ファイル: crysadm_helper.py プロジェクト: withisola/crysadm-1
def save_history(username):

    config.crys_log('save_history')
    str_today = datetime.now().strftime('%Y-%m-%d')
    key = 'user_data:%s:%s' % (username, str_today)
    b_today_data = r_session.get(key)
    today_data = dict()

    if b_today_data is not None:
        today_data = json.loads(b_today_data.decode('utf-8'))

    today_data['updated_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    today_data['pdc'] = 0
    today_data['last_speed'] = 0
    today_data['deploy_speed'] = 0
    today_data['balance'] = 0
    today_data['income'] = 0
    today_data['speed_stat'] = list()
    today_data['pdc_detail'] = []
    today_data['giftbox_pdc'] = 0
    today_data['produce_stat'] = []
    today_data['award_income'] = 0

    for user_id in r_session.smembers('accounts:%s' % username):
        # 获取账号所有数据
        account_data_key = 'account:%s:%s:data' % (username,
                                                   user_id.decode('utf-8'))
        b_data = r_session.get(account_data_key)
        if b_data is None:
            continue
        data = json.loads(b_data.decode('utf-8'))

        if datetime.strptime(data.get('updated_time'),
                             '%Y-%m-%d %H:%M:%S').day != datetime.now().day:
            continue
        today_data.get('speed_stat').append(
            dict(mid=data.get('privilege').get('mid'),
                 dev_speed=data.get('zqb_speed_stat')
                 if data.get('zqb_speed_stat') is not None else [0] * 24))
        this_pdc = data.get('mine_info').get('dev_m').get('pdc')

        today_data['pdc'] += this_pdc
        today_data.get('pdc_detail').append(
            dict(mid=data.get('privilege').get('mid'), pdc=this_pdc))
        today_data['balance'] += data.get('income').get('r_can_use')
        today_data['income'] += data.get('income').get('r_h_a')
        today_data.get('produce_stat').append(
            dict(mid=data.get('privilege').get('mid'),
                 hourly_list=data.get('produce_info').get('hourly_list')))
        if 'ioi' in data.keys():
            for ioi in data['ioi']:
                if 'cn' in ioi.keys() and 'ct' in ioi.keys(
                ) and time.localtime(ioi['ct']).tm_mday == datetime.now().day:
                    if ioi['cn'].find('宝箱') != -1 or ioi['cn'].find(
                            '转盘') != -1:
                        today_data['award_income'] += ioi['c']
        for device in data.get('device_info'):
            today_data['last_speed'] += int(
                int(device.get('dcdn_upload_speed')) / 1024)
            today_data['deploy_speed'] += int(
                device.get('dcdn_download_speed') / 1024)
    today_data['pdc'] += today_data['award_income']
    r_session.setex(key, json.dumps(today_data), 3600 * 24 * 35)

    extra_info_key = 'extra_info:%s' % (username)
    b_extra_info = r_session.get(extra_info_key)
    if b_extra_info is None:
        extra_info = {}
    else:
        extra_info = json.loads(b_extra_info.decode('utf-8'))
    if 'last_adjust_date' not in extra_info.keys():
        extra_info['last_adjust_date'] = '1997-1-1 1:1:1'
    if datetime.now().hour < 20 and datetime.strptime(
            extra_info['last_adjust_date'],
            '%Y-%m-%d %H:%M:%S').day != datetime.now().day:
        str_yesterday = (datetime.now() +
                         timedelta(days=-1)).strftime('%Y-%m-%d')
        yesterday_key = 'user_data:%s:%s' % (username, str_yesterday)
        b_yesterday_data = r_session.get(yesterday_key)
        if b_yesterday_data is None: return
        yesterday_data = json.loads(b_yesterday_data.decode('utf-8'))
        if 'produce_stat' in yesterday_data.keys():
            td_produce = {}
            for td_stat in today_data['produce_stat']:
                td_produce[td_stat['mid']] = td_stat['hourly_list']
            detail_adjust_dict = {}
            for stat in yesterday_data['produce_stat']:
                if stat['mid'] in td_produce.keys():
                    last_hour_pdc = td_produce[stat['mid']][
                        23 - datetime.strptime(today_data['updated_time'],
                                               '%Y-%m-%d %H:%M:%S').hour]
                    detail_adjust_dict[
                        stat['mid']] = last_hour_pdc - stat['hourly_list'][24]
                    stat['hourly_list'][24] = last_hour_pdc
            for pdc_info in yesterday_data.get('pdc_detail'):
                if pdc_info.get('mid') is not None and pdc_info.get(
                        'pdc') is not None:
                    pdc_info['pdc'] += detail_adjust_dict[pdc_info.get('mid')]
        r_session.setex(yesterday_key, json.dumps(yesterday_data),
                        3600 * 24 * 34)
        extra_info['last_adjust_date'] = datetime.now().strftime(
            '%Y-%m-%d %H:%M:%S')
        r_session.set(extra_info_key, json.dumps(extra_info))
    save_income_history(username, today_data.get('pdc_detail'))