def get_super_tag_size(self, member_name): """ 获取超话人数 :param member_name: :return: """ cursor = self.conn.cursor() try: # 获取超话链接 c = cursor.execute( """ select super_tag from member WHERE member_name=? """, (member_name, )) super_tag = c.fetchone()[0] r = self.session.get(super_tag).json() if r['ok'] == 1: desc_more = r['data']['pageInfo']['desc_more'][0] desc_arr = desc_more.strip().split('\u3000') fans_number = int(desc_arr[2][2:]) cur_date = util.convert_timestamp_to_timestr(time.time() * 1000) my_logger.debug('统计:成员: %s, 超话: %s, 人数: %d, 时间: %s', member_name, super_tag, fans_number, cur_date) cursor.execute( """ INSERT INTO `super_tag` (`member_name`, `link`, `size`, `date`) VALUES (?, ?, ?, ?) """, (member_name, super_tag, fans_number, cur_date)) self.conn.commit() except Exception as e: my_logger.error(e) finally: cursor.close()
def get_member_all_posts(member_id, next_id="0"): """ 获取成员全部动态 :param member_id: :param next_id: :return: """ url = 'https://pocketapi.48.cn/posts/api/v1/posts/timeline/home/new' print('next_id: {}'.format(next_id)) params = {"nextId": next_id, "userId": member_id} r = requests.post(url, data=json.dumps(params), headers=get_header(), verify=False).json() if r['status'] == 200: next_id = r['content']['nextId'] post_list = r['content']['postsInfo'] for post in post_list: post = post['data']['postsInfo'] print(util.convert_timestamp_to_timestr(int(post['createAt']))) print(handle_weibo_text(post['postContent'].rstrip('\n'))) if 'previewImg' in post and post['previewImg']: print("图片:") for img in post['previewImg']: print('https://source.48.cn/{}'.format(img['imgUrl'])) get_member_all_posts(member_id, next_id)
def draw_missed_card(context, modian_id, backer_money): """ 补抽卡 :param context: :param modian_id: :param backer_money: :return: """ from utils import util from modian.modian_card_draw import CardDrawHandler import time card_draw_handler = CardDrawHandler() card_draw_handler.read_config() money_is_digit = util.is_digit(backer_money) modian_id_is_digit = util.is_positive_integer(modian_id) # if not modian_id_is_digit: # bot.send(context, '输入的摩点ID不符合规范,请重试~') # return if not money_is_digit: bot.send(context, '输入的金额不符合规范,请重试~') try: report = card_draw_handler.draw( modian_id, '补抽用户', float(backer_money), util.convert_timestamp_to_timestr(int(time.time() * 1000))) bot.send(context, report) except: logger.error('补抽卡出现错误!')
def draw_missed_cards(self, modian_id, score=10): """ 补抽卡 :param modian_id: :param score: 抽卡消耗的积分数量 :return: """ logger.info('积分抽卡,modian_id:{}, score:{}'.format(modian_id, score)) import time if score < 15: return '消耗的积分必须要大于等于15!' if score % 15 != 0: return '消耗的积分必须是15的倍数!' current_score = int(self.get_current_score(modian_id)) if current_score < score: return '桃叭ID:{}的当前积分: {},少于需要消耗的积分: {},不能补抽!'.format(modian_id, current_score, score) else: result = '桃叭ID:{},积分抽卡,当前积分-{}\n'.format(modian_id, score) mysql_util.query(""" INSERT INTO `t_card_score` (`modian_id`, `score`) VALUES (%s, %s) """, (modian_id, -1 * score)) money = int(score // 10) * 10.17 result += self.draw(modian_id, '补抽用户', money, util.convert_timestamp_to_timestr(int(time.time() * 1000))) return result
def parse_member_live(self, response, member_id): """ 对直播列表进行处理,找到正在直播的指定成员 :param member_id: :param response: :return: """ rsp_json = json.loads(response) # DEBUG('keys of parse member live: %s', rsp_json['content'].keys()) # 当前没有人在直播 if 'liveList' not in rsp_json['content'].keys(): # print 'no live' DEBUG('当前没有人在直播') return live_list = rsp_json['content']["liveList"] DEBUG('当前正在直播的人数: %d', len(live_list)) # print '当前正在直播的人数: %d' % len(live_list) msg = '' # DEBUG('直播ID列表: %s', ','.join(self.member_live_ids)) for live in live_list: live_id = live['liveId'] # DEBUG(live.keys()) # print '直播人: %s' % live['memberId'] # DEBUG('直播人(response): %s, 类型: %s', live['memberId'], type(live['memberId'])) # DEBUG('member_id(参数): %s, 类型: %s', member_id, type(member_id)) DEBUG('memberId %s is in live: %s, live_id: %s', live['memberId'], live['title'], live_id) DEBUG('stream path: %s', live['streamPath']) # DEBUG('member_live_ids list: %s', ','.join(self.member_live_ids)) # DEBUG('live_id is in member_live_ids: %s', str(live_id in self.member_live_ids)) if live['memberId'] == int( member_id) and live_id not in self.member_live_ids: DEBUG('[被监控成员正在直播]member_id: %s, live_id: %', member_id, live_id) start_time = util.convert_timestamp_to_timestr( live['startTime']) stream_path = live['streamPath'] # 流地址 sub_title = live['subTitle'] # 直播名称 live_type = live['liveType'] url = 'https://h5.48.cn/2017appshare/memberLiveShare/index.html?id=%s' % live_id if live_type == 1: # 露脸直播 msg += '你的小宝贝儿开露脸直播了: %s\n直播链接: %s\n开始时间: %s' % ( sub_title, url, start_time) elif live_type == 2: # 电台直播 msg += '你的小宝贝儿开电台直播了: %s\n直播链接: %s\n开始时间: %s' % ( sub_title, url, start_time) self.member_live_ids.append(live_id) # 录制直播 # name = '%s_%s' % (member_id, live['startTime']) # # self.download.setName(name) # self.live_urls.put(name) # self.live_urls.put(stream_path) DEBUG(msg) if msg and len(self.member_live_groups) > 0: QQHandler.send_to_groups(self.member_live_groups, msg)
def parse_room_comment(self, response, task): """ 对房间评论进行处理 :param response: :param task: :return: """ rsp_json = json.loads(response) msgs = rsp_json['content']['message'] logger.debug('parse room comment reponse: %s', response) message = '' for msg in msgs: extInfo = json.loads(msg['extInfo']) msg_id = msg['msgidClient'] total_msg_type = msg['msgType'] msg_type = extInfo['messageType'] msg_time = util.convert_timestamp_to_timestr(msg['msgTime']) if msg_id in task.member_room_comment_ids: continue logger.debug('该评论{}不在队列中,需要打印'.format(msg_id)) task.member_room_comment_ids.append(msg_id) user_id = extInfo['user']['nickName'] if total_msg_type == 'TEXT': if msg_type == 'TEXT': logger.debug('房间评论') logger.debug('【房间评论】[%s]-%s: %s\n' % (msg_time, user_id, extInfo['text'])) elif msg_type == 'PRESENT_TEXT': gift_num = extInfo['giftInfo']['giftNum'] gift_name = extInfo['giftInfo']['giftName'] if extInfo['giftInfo']['isVote']: logger.debug('投票') message = '感谢{}送出的{}票,爱你呦~\n【{}】'.format( user_id, gift_num, msg_time) logger.debug(message) if message and len(task.member_room_msg_groups) > 0: pass # QQHandler.send_to_groups(task.member_room_msg_groups, message) else: logger.debug('礼物') logger.debug('感谢{}送出的{}个{},爱你呦~'.format( user_id, gift_num, gift_name)) else: logger.debug('其他类型评论') # logger.info('message: %s', message) # logger.debug('length of comment groups: %d', len(task.member_room_comment_msg_groups)) logger.debug('房间评论队列: %s', len(task.member_room_comment_ids))
def parse_room_comments(msgs, end_time): try: for msg in msgs: extInfo = json.loads(msg['extInfo']) msg_id = msg['msgidClient'] # 消息id msg_time_0 = msg["msgTime"] if msg_time_0 < end_time: return if 'roleId' in extInfo['user'].keys(): if extInfo['user']['roleId'] != 1: continue msg_time = util.convert_timestamp_to_timestr(msg["msgTime"]) if 'userId' in extInfo['user'].keys(): user_id = int(extInfo['user']['userId']) else: user_id = 0 if 'gender' in extInfo['user'].keys(): gender = int(extInfo['user']['gender']) else: gender = 0 user_name = extInfo['user']['nickName'] if 'level' in extInfo['user'].keys(): level = int(extInfo['user']['level']) else: level = 1 if 'vip' in extInfo['user'].keys(): is_vip = extInfo['user']['vip'] else: is_vip = False if 'Verification' in extInfo['user'].keys(): verification = extInfo['user']['Verification'] else: verification = False room_id = int(extInfo['sourceId']) fan = Fan(user_id, user_name, level, gender, is_vip, verification) comment_rst[room_id].add(fan) if fan not in fan_rst.keys(): fan_rst[fan] = set() fan_rst[fan].add(room_id) except Exception as e: print(e)
def update_group_size(self, member_name): """ 获取群人数 :param member_name: :return: """ cursor = self.conn.cursor() DEBUG('更新群信息') QQHandler.update() try: # 获取群号 DEBUG('获取成员群号') c = cursor.execute( """ select group_number from member WHERE member_name=? """, (member_name, )) group_number = c.fetchone()[0] DEBUG('群号: %s', group_number) number = QQHandler.get_group_number(str(group_number)) DEBUG('群%s人数: %s', group_number, number) # number = 800 cur_date = util.convert_timestamp_to_timestr(time.time() * 1000) DEBUG('记录时间: %s', cur_date) DEBUG('统计:成员: %s, 群号: %s, 人数: %s, 时间: %s', member_name, group_number, number, cur_date) cursor.execute( """ INSERT INTO `group` (`member_name`, `group_number`, `group_size`, `date`) VALUES (?, ?, ?, ?) """, (member_name, group_number, number, cur_date)) self.conn.commit() except Exception as e: ERROR(e) finally: cursor.close()
def get_super_tag_size(self, member_name): """ 获取超话人数 :param member_name: :return: """ cursor = self.conn.cursor() try: # 获取超话链接 c = cursor.execute( """ select super_tag from member WHERE member_name=? """, (member_name, )) super_tag = c.fetchone()[0] r = self.session.get(super_tag) soup = BeautifulSoup(r.content, 'lxml') tb_counter = soup.find_all(class_='tb_counter')[0] fans_number = tb_counter.find_all( class_='S_line1')[2].find_all('strong').contents[0] cur_date = util.convert_timestamp_to_timestr(time.time() * 1000) DEBUG('统计:成员: %s, 超话: %s, 人数: %d, 时间: %s', member_name, super_tag, fans_number, cur_date) cursor.execute( """ INSERT INTO `super_tag` (`member_name`, `link`, `size`, `date`) VALUES (?, ?, ?, ?) """, (member_name, super_tag, fans_number, cur_date)) self.conn.commit() except Exception as e: ERROR(e) finally: cursor.close()
def parse_room_msg(msgs, end_time): try: for msg in msgs: extInfo = json.loads(msg['extInfo']) msg_id = msg['msgidClient'] # 消息id # rst = cursor.execute(""" # SELECT * FROM 'room_message' WHERE message_id=? # """, msg_id) msg_time_0 = msg["msgTime"] if msg_time_0 < end_time: return msg_time = util.convert_timestamp_to_timestr(msg["msgTime"]) user_id = extInfo['user']['userId'] user_name = extInfo['user']['nickName'] room_id = int(extInfo['roomId']) # if int(user_id) != member_messages['id']: # continue message_rst[room_id] += 1 # print('extInfo.keys():' + ','.join(extInfo.keys())) except Exception as e: print(e)
def parse_order_details(self, orders, modian_entity): if len(self.order_queues[modian_entity.pro_id]) == 0 and len( orders) == 0: my_logger.debug('订单队列为空') return jiebang_activities = global_config.MODIAN_JIEBANG_ACTIVITIES[ modian_entity.pro_id] flag_activities = global_config.MODIAN_FLAG_ACTIVITIES[ modian_entity.pro_id] count_flag_activities = global_config.MODIAN_COUNT_FLAG_ACTIVITIES[ modian_entity.pro_id] # 查询集资情况 target, current, pro_name, backer_count = self.get_current_and_target( modian_entity) project_info = '当前进度: %s元, 目标金额: %s元' % (current, target) modian_entity.current = current modian_entity.title = pro_name modian_entity.target = target modian_entity.support_num = backer_count my_logger.debug('size of order %s queue: %s', modian_entity.pro_id, len(self.order_queues[modian_entity.pro_id])) for order in orders: user_id = order['user_id'] nickname = order['nickname'] pay_time = order['pay_time'] backer_money = order['backer_money'] oid = uuid.uuid3(uuid.NAMESPACE_OID, str(user_id) + pay_time) my_logger.debug('oid: %s', oid) if oid in self.order_queues[modian_entity.pro_id]: continue my_logger.debug('项目%s队列长度: %s', modian_entity.pro_id, len(self.order_queues[modian_entity.pro_id])) # 每次需要更新一下昵称 try: # supporter = Supporter(id=user_id, name=nickname) # self.alchemy_session.merge(supporter) mysql_util.query( """ INSERT INTO `supporter` (`id`, `name`) VALUES (%s, %s) ON DUPLICATE KEY UPDATE `name`=%s """, (user_id, nickname, nickname)) except Exception as e: my_logger.exception(e) try: # 创建对象 # modian_order = ModianOrder(id=str(oid), supporter_id=user_id, backer_money=backer_money, pay_time=pay_time, # pro_id=modian_entity.pro_id) # self.alchemy_session.merge(modian_order) mysql_util.query( """ INSERT INTO `order` (`id`,`supporter_id`,`backer_money`,`pay_time`, `pro_id`) VALUES (%s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE `id`=%s """, (str(oid), user_id, backer_money, pay_time, modian_entity.pro_id, str(oid))) except Exception as e: my_logger.exception(e) msg = '感谢 %s(%s) 支持了%s元, %s\n' % ( nickname, user_id, backer_money, util.random_str(global_config.MODIAN_POSTSCRIPTS)) daka_rank, support_days = self.find_user_daka_rank( user_id, modian_entity.pro_id) if daka_rank != -1 and support_days: msg += '当前项目已打卡%s天\n' % support_days if modian_entity.need_display_rank is True: jizi_rank, backer_money = self.find_user_jizi_rank( user_id, modian_entity.pro_id) if jizi_rank != -1: msg += '当前项目已集资%s元, 排名: %s' % (backer_money, jizi_rank) else: pass # 统计当前人数 msg += '当前集资人数: %s\n' % backer_count # 抽卡播报 card_report = '' if global_config.MODIAN_CARD_DRAW: card_report = self.card_draw_handler.draw( user_id, nickname, backer_money, pay_time) '''接棒相关''' my_logger.debug('接棒情况更新') for jiebang in jiebang_activities: # if jiebang.start_time > time.time(): # continue my_logger.debug('接棒活动详情: 【%s】', jiebang.name) my_logger.debug('集资金额: %s, 接棒最小金额: %s', backer_money, jiebang.min_stick_amount) if backer_money >= jiebang.min_stick_amount: stick_num = util.compute_stick_num( jiebang.min_stick_amount, backer_money) jiebang.current_stick_num += stick_num jiebang.last_record_time = util.convert_timestamp_to_timestr( int(time.time() * 1000)) # 数据库也要更新 try: mysql_util.query( """ UPDATE jiebang SET `current_stick_num`=%s, `last_record_time`=%s WHERE `name`=%s """, (jiebang.current_stick_num, jiebang.last_record_time, jiebang.name)) except Exception as e: my_logger.error('更新接棒数据失败') my_logger.exception(e) my_logger.debug('数据库接棒数据更新完成') test_msg = '' if jiebang.need_detail == 1: test_msg = '【%s】, 当前第%s棒, 目标%s棒\n' \ % (jiebang.name, jiebang.current_stick_num, jiebang.target_stick_num) elif jiebang.need_detail == 0: test_msg = '【%s】\n' % jiebang.name elif jiebang.need_detail == 2: test_msg = '【%s】, 当前第%s棒\n' \ % (jiebang.name, jiebang.current_stick_num) elif jiebang.need_detail == 3: if stick_num > 1: test_msg = '抽奖号: {}~{}\n'.format( jiebang.current_stick_num - stick_num + 1, jiebang.current_stick_num) else: test_msg = '抽奖号: {}\n'.format( jiebang.current_stick_num) my_logger.debug(test_msg) if len(test_msg) > 0: msg += test_msg QQHandler.send_to_groups(['483548995'], test_msg) '''金额类flag相关''' my_logger.debug('flag情况更新') flag_test_msgs = '' for flag in flag_activities: my_logger.debug('Flag活动详情: %s', flag.name) my_logger.debug('Flag金额: %s, 结束时间: %s', flag.target_flag_amount, flag.end_time) diff = flag.target_flag_amount - current test_msgs = '【%s】, 目标金额: %s元, ' % (flag.name, flag.target_flag_amount) if diff > 0: test_msgs += '距离目标还差%s元\n' % round(diff, 2) flag_test_msgs += test_msgs else: test_msgs += '已经达成目标\n' my_logger.debug(flag_test_msgs) if len(flag_test_msgs) > 0: QQHandler.send_to_groups(['483548995'], flag_test_msgs) # msg += flag_test_msgs '''人头类flag相关''' my_logger.debug('人头flag情况更新') count_flag_test_msgs = '' for flag in count_flag_activities: my_logger.debug('人头Flag活动详情: %s', flag.name) my_logger.debug('人头Flag目标: %s, 开始时间: %s, 结束时间: %s', flag.target_flag_amount, flag.start_time, flag.end_time) target = flag.target_flag_amount # 统计当前人数 rst = mysql_util.select_one( """ select count(distinct(`supporter_id`)) from `order` where `pro_id` = %s and `pay_time` <= %s and `pay_time` >= %s """, (modian_entity.pro_id, flag.end_time, flag.start_time)) # 目标人数为0,代表特殊类flag,只报人数 if target == 0: count_flag_test_msgs += '【%s】, 当前人数: %s ' % (flag.name, rst[0]) else: count_flag_test_msgs += '【%s】, 当前人数: %s, 目标人数: %s ' % ( flag.name, rst[0], flag.target_flag_amount) my_logger.debug(count_flag_test_msgs) if len(count_flag_test_msgs) > 0: QQHandler.send_to_groups(['483548995'], count_flag_test_msgs) # msg += flag_test_msgs msg += '%s\n集资项目: %s\n链接: %s\n' % (project_info, pro_name, modian_entity.link) # msg += jizi_pk_report my_logger.info(msg) if global_config.USING_COOLQ_PRO is True: my_logger.debug('使用酷Q PRO发送图片') msg += '\n[CQ:image,file=http://wx1.sinaimg.cn/large/439a9f3fgy1fpllweknr6j201i01g0lz.jpg]\n' # if global_config.MODIAN_NEED_DISPLAY_PK: # msg += self.pk_modian_activity() QQHandler.send_to_groups(modian_entity.broadcast_groups, msg) if card_report: QQHandler.send_to_groups(modian_entity.broadcast_groups, card_report) # QQHandler.send_to_groups(['483548995'], card_report) self.order_queues[modian_entity.pro_id].add(oid) # 更新接棒的数据库 try: my_logger.debug('更新接棒活动信息:') for jiebang in jiebang_activities: my_logger.debug( 'current_stick_num: %s, last_record_time: %s, name: %s', jiebang.current_stick_num, jiebang.last_record_time, jiebang.name) mysql_util.query( """ UPDATE jiebang SET current_stick_num=%s WHERE name=%s """, (jiebang.current_stick_num, jiebang.name)) except Exception as e: my_logger.exception(e)
def _get_room_msg(member_id, room_id, last_time, limit): time.sleep(10) url = 'https://pocketapi.48.cn/im/api/v1/chatroom/msg/list/homeowner' params = { "ownerId": member_id, "roomId": room_id, "nextTime": last_time } try: r = requests.post(url, data=json.dumps(params), headers=get_header(), verify=False).text except Exception as e: print(e) rsp_json = json.loads(r) msgs = rsp_json['content']['message'] if len(msgs) == 0: return -1 cursor = conn.cursor() msg_time = last_time try: for msg in msgs: extInfo = json.loads(msg['extInfo']) msg_id = msg['msgidClient'] # 消息id # rst = cursor.execute(""" # SELECT * FROM 'room_message' WHERE message_id=? # """, msg_id) msg_time = util.convert_timestamp_to_timestr(msg["msgTime"]) user_id = extInfo['user']['userId'] user_name = extInfo['user']['nickName'] # print('extInfo.keys():' + ','.join(extInfo.keys())) if msg['msgType'] == MessageType.TEXT: # 文字消息 text_message_type = extInfo['messageType'].strip() if text_message_type == MessageType.TEXT: # 普通消息 print('普通消息: %s' % extInfo['text']) save_msg_to_db(cursor, 100, msg_id, user_id, user_name, msg_time, extInfo['text']) elif text_message_type == TextMessageType.REPLY: # 翻牌消息 print('翻牌') member_msg = extInfo['text'] fanpai_msg = extInfo['replyText'] fanpai_id = extInfo['replyName'] if fanpai_id: message = ('【翻牌】[%s]-%s: %s\n【被翻牌】%s: %s\n' % ( msg_time, user_name, member_msg, fanpai_id, fanpai_msg)) save_msg_to_db(cursor, 101, msg_id, user_id, user_name, msg_time, member_msg, fanpai_msg, fanpai_id) else: message = ('【翻牌】[%s]-%s: %s\n【被翻牌】%s\n' % ( msg_time, user_name, member_msg, fanpai_msg)) save_msg_to_db(cursor, 101, msg_id, user_id, user_name, msg_time, member_msg, fanpai_msg) print(message) elif text_message_type == TextMessageType.LIVEPUSH: # 露脸直播 print('露脸直播') live_title = extInfo['liveTitle'] live_id = extInfo['liveId'] print(live_title + ' ' + live_id) save_msg_to_db(cursor, 102, msg_id, user_id, user_name, msg_time, live_title) elif text_message_type == TextMessageType.VOTE: # 投票 logger.debug('投票消息') vote_content = extInfo['text'] message = '【发起投票】{}: {}\n'.format(user_name, vote_content) print(message) save_msg_to_db(cursor, 104, msg_id, user_id, user_name, msg_time, vote_content) elif text_message_type == TextMessageType.FLIPCARD: print('付费翻牌功能') content = extInfo['question'] question_id = extInfo['questionId'] answer_id = extInfo['answerId'] source = extInfo['sourceId'] answer = extInfo['answer'] fan_name = get_idol_flip_name(answer_id, question_id) if fan_name: print('付费翻牌id: {}'.format(fan_name)) flip_message = ('【问】%s: %s\n【答】%s: %s\n翻牌时间: %s\n' % ( fan_name, content, user_name, answer, msg_time)) save_msg_to_db(cursor, 105, msg_id, user_id, user_name, msg_time, answer, content, fan_name) else: flip_message = ('【问】%s\n【答】%s: %s\n翻牌时间: %s\n' % ( content, user_name, answer, msg_time)) save_msg_to_db(cursor, 105, msg_id, user_id, user_name, msg_time, answer, content) message = flip_message print(message) elif text_message_type == TextMessageType.PASSWORD_REDPACKAGE: print('红包消息') content = '【红包】{}'.format(extInfo['redPackageTitle']) print(content) save_msg_to_db(cursor, 106, msg_id, user_id, user_name, msg_time, content) elif msg['msgType'] == MessageType.IMAGE: # 图片消息 print('图片') bodys = json.loads(msg['bodys']) if 'url' in bodys.keys(): url = bodys['url'] message = ('【图片】[%s]-%s: %s\n' % (msg_time, user_name, url)) print(message) save_msg_to_db(cursor, 200, msg_id, user_id, user_name, msg_time, url) elif msg['msgType'] == MessageType.AUDIO: # 语音消息 print('语音消息') bodys = json.loads(msg['bodys']) if 'url' in bodys.keys(): url = bodys['url'] message = ('【语音】[%s]-%s: %s\n' % (msg_time, user_name, url)) print(message) save_msg_to_db(cursor, 201, msg_id, user_id, user_name, msg_time, url) elif msg['msgType'] == MessageType.VIDEO: # 小视频 print('房间小视频') bodys = json.loads(msg['bodys']) if 'url' in bodys.keys(): url = bodys['url'] message = ('【小视频】[%s]-%s: %s\n' % (msg_time, user_name, url)) print(message) save_msg_to_db(cursor, 202, msg_id, user_id, user_name, msg_time, url) elif msg['msgType'] == MessageType.EXPRESS: # 大表情 logger.debug('大表情') emotion_name = extInfo['emotionName'] print(emotion_name) save_msg_to_db(cursor, 203, msg_id, user_id, user_name, msg_time, emotion_name) msg_time = msg['msgTime'] except Exception as e: print(e) finally: conn.commit() cursor.close() return msg_time
def parse_room_msg(msgs, end_time): try: for msg in msgs: extInfo = json.loads(msg['extInfo']) msg_id = msg['msgidClient'] # 消息id # rst = cursor.execute(""" # SELECT * FROM 'room_message' WHERE message_id=? # """, msg_id) msg_time_0 = msg["msgTime"] if msg_time_0 < end_time: return msg_time = util.convert_timestamp_to_timestr(msg["msgTime"]) user_id = extInfo['user']['userId'] user_name = extInfo['user']['nickName'] # if int(user_id) != member_messages['id']: # continue # print('extInfo.keys():' + ','.join(extInfo.keys())) if msg['msgType'] == MessageType.TEXT: # 文字消息 text_message_type = extInfo['messageType'].strip() if text_message_type == MessageType.TEXT: # 普通消息 print('普通消息: %s' % extInfo['text']) member_messages['100'] += 1 elif text_message_type == TextMessageType.REPLY: # 翻牌消息 print('翻牌') member_msg = extInfo['text'] fanpai_msg = extInfo['replyText'] fanpai_id = extInfo['replyName'] if fanpai_id: message = ('【翻牌】[%s]-%s: %s\n【被翻牌】%s: %s\n' % (msg_time, user_name, member_msg, fanpai_id, fanpai_msg)) else: message = ( '【翻牌】[%s]-%s: %s\n【被翻牌】%s\n' % (msg_time, user_name, member_msg, fanpai_msg)) print(message) member_messages['101'] += 1 elif text_message_type == TextMessageType.LIVEPUSH: # 露脸直播 print('露脸直播') live_title = extInfo['liveTitle'] live_id = extInfo['liveId'] print(live_title + ' ' + live_id) member_messages['102'] += 1 elif text_message_type == TextMessageType.VOTE: # 投票 print('投票消息') vote_content = extInfo['text'] message = '【发起投票】{}: {}\n'.format(user_name, vote_content) print(message) member_messages['104'] += 1 elif text_message_type == TextMessageType.FLIPCARD: print('付费翻牌功能') content = extInfo['question'] question_id = extInfo['questionId'] answer_id = extInfo['answerId'] source = extInfo['sourceId'] answer = extInfo['answer'] message = '【问】{}\n【答】{}'.format(content, answer) print(message) member_messages['105'] += 1 elif text_message_type == TextMessageType.PASSWORD_REDPACKAGE: print('红包消息') content = '【红包】{}'.format(extInfo['redPackageTitle']) print(content) member_messages['106'] += 1 elif msg['msgType'] == MessageType.IMAGE: # 图片消息 print('图片') bodys = json.loads(msg['bodys']) if 'url' in bodys.keys(): url = bodys['url'] message = ('【图片】[%s]-%s: %s\n' % (msg_time, user_name, url)) print(message) member_messages['200'] += 1 img_name = './口袋图/{}.png'.format(msg_time) html = requests.get(url, verify=False) with open(img_name, 'wb') as f: f.write(html.content) f.close() elif msg['msgType'] == MessageType.AUDIO: # 语音消息 print('语音消息') bodys = json.loads(msg['bodys']) if 'url' in bodys.keys(): url = bodys['url'] message = ('【语音】[%s]-%s: %s\n' % (msg_time, user_name, url)) print(message) member_messages['201'] += 1 elif msg['msgType'] == MessageType.VIDEO: # 小视频 print('房间小视频') bodys = json.loads(msg['bodys']) if 'url' in bodys.keys(): url = bodys['url'] message = ('【小视频】[%s]-%s: %s\n' % (msg_time, user_name, url)) print(message) member_messages['202'] += 1 elif msg['msgType'] == MessageType.EXPRESS: # 大表情 print('大表情') emotion_name = extInfo['emotionName'] print(emotion_name) member_messages['203'] += 1 except Exception as e: print(e)
def pocket_msgs(self): from pocket48 import others cursor = self.conn.cursor() today = datetime.date.today().strftime('%Y-%m-%d %H:%M:%S') today_timestamp = int(util.convert_timestr_to_timestamp(today)) * 1000 yesterday_timestamp = today_timestamp - 60 * 24 * 60 * 1000 room_list = others.get_room_list() try: for room in room_list: others.member_messages = { 'id': room['id'], 'name': room['name'], 'room_id': room['room_id'], '100': 0, '101': 0, '102': 0, '103': 0, '104': 0, '105': 0, '106': 0, '200': 0, '201': 0, '202': 0, '203': 0 } my_logger.debug(room['name']) if room['id'] in [63, 327683, 327682, 5973]: continue others.get_room_history_msg(room['id'], room['room_id'], today_timestamp - 1, yesterday_timestamp) my_logger.debug(others.member_messages) cur_date = util.convert_timestamp_to_timestr(time.time() * 1000) sum = others.member_messages['100'] + others.member_messages[ '101'] + others.member_messages[ '102'] + others.member_messages[ '103'] + others.member_messages[ '104'] + others.member_messages[ '105'] + others.member_messages[ '106'] + others.member_messages[ '201'] + others.member_messages[ '202'] + others.member_messages[ '203'] cursor.execute( """ INSERT INTO `pocket_message` (`member_id`, `room_id`, `member_name`, `text`, `reply`, `live`, `vote`, `idol_flip`, `red_packet`, `pic`, `voice`, `video`, `total_num`, `update_time`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) """, (others.member_messages['id'], others.member_messages['room_id'], others.member_messages['name'], others.member_messages['100'], others.member_messages['101'], others.member_messages['102'], others.member_messages['104'], others.member_messages['105'], others.member_messages['106'], others.member_messages['200'], others.member_messages['201'], others.member_messages['202'], sum, cur_date)) self.conn.commit() except Exception as e: my_logger.exception(e) finally: cursor.close()
def get_bilibili_stat(self): """ 获取b站数据 :return: """ cursor = self.conn.cursor() try: bilibili_path = os.path.join(os.path.dirname(BASE_DIR), 'data', 'bilibili.json') member_json = json.load(open(bilibili_path, encoding='utf8'))['stats'] for member in member_json: bilibili_id = member['bid'] member_name = member['name'] my_logger.info(member_name) url1 = 'https://api.bilibili.com/x/relation/stat?vmid={}&jsonp=jsonp'.format( bilibili_id) header = { 'Referer': 'https://space.bilibili.com/{}'.format(bilibili_id), 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36' } rsp = self.session.get(url1, headers=header).json() fan_number = rsp['data']['follower'] try: url2 = 'https://api.bilibili.com/x/space/upstat?mid={}&jsonp=jsonp'.format( bilibili_id) rsp_json = self.session.get( url2, headers=header, cookies={ 'SESSDATA': 'db49e46a%2C1614611003%2C81dfe*91' }).json() view = rsp_json['data']['archive']['view'] print(rsp_json) except Exception as e: my_logger.exception(e) view = 0 url3 = 'https://api.bilibili.com/x/space/acc/info?mid={}&jsonp=jsonp'.format( bilibili_id) rsp = self.session.get(url3, headers=header).json() bilibili_name = rsp['data']['name'] cur_date = util.convert_timestamp_to_timestr(time.time() * 1000) cursor.execute( """ INSERT INTO `bilibili` (`member_name`, `bilibili_id`, `bilibili_name`, `fans_num`, `video_view`, `update_time`) VALUES (?, ?, ?, ?, ?, ?) """, (member_name, bilibili_id, bilibili_name, fan_number, view, cur_date)) self.conn.commit() time.sleep(2) except Exception as e: my_logger.exception(e) finally: cursor.close()
def parse_room_msg(self, response, task): """ 对成员消息进行处理 :param response: :param task: :return: """ logger.debug('parse room msg response: %s', response) rsp_json = json.loads(response) msgs = rsp_json['content']['message'] cursor = self.conn.cursor() message = '' try: for msg in msgs: extInfo = json.loads(msg['extInfo']) msg_id = msg['msgidClient'] # 消息id if msg_id in task.member_room_msg_ids: continue logger.debug('session role: {}'.format(extInfo['sessionRole'])) if int(extInfo['sessionRole']) != 2: # 其他成员的消息 task.unread_other_member_msg_amount += 1 member_name = extInfo['user']['nickName'] if member_name == '19岁了还是小可爱': member_name = 'YBY' if member_name not in task.other_members_names: task.other_members_names.append(member_name) else: task.unread_msg_amount += 1 logger.debug('成员消息') task.member_room_msg_ids.append(msg_id) msg_time = util.convert_timestamp_to_timestr(msg["msgTime"]) user_id = extInfo['user']['userId'] user_name = extInfo['user']['nickName'] logger.debug('extInfo.keys():' + ','.join(extInfo.keys())) if msg['msgType'] == MessageType.TEXT: # 文字消息 text_message_type = extInfo['messageType'].strip() if text_message_type == TextMessageType.TEXT: # 普通消息 logger.debug('普通消息') message = ( '【成员消息】[%s]-%s: %s\n' % (msg_time, user_name, extInfo['text'])) + message self.save_msg_to_db(100, msg_id, user_id, user_name, msg_time, extInfo['text']) elif text_message_type == TextMessageType.REPLY: # 翻牌消息 logger.debug('翻牌') member_msg = extInfo['text'] fanpai_msg = extInfo['replyText'] fanpai_id = extInfo['replyName'] if fanpai_id: message = ('【翻牌】[%s]-%s: %s\n【被翻牌】%s: %s\n' % (msg_time, user_name, member_msg, fanpai_id, fanpai_msg)) + message self.save_msg_to_db(101, msg_id, user_id, user_name, msg_time, member_msg, fanpai_msg, fanpai_id) else: message = ('【翻牌】[%s]-%s: %s\n【被翻牌】%s\n' % (msg_time, user_name, member_msg, fanpai_msg)) + message self.save_msg_to_db(101, msg_id, user_id, user_name, msg_time, member_msg, fanpai_msg) elif text_message_type == TextMessageType.LIVEPUSH: # 直播 logger.debug('直播') live_title = extInfo['liveTitle'] live_id = extInfo['liveId'] playStreamPath, playDetail = self.get_live_detail( live_id) self.save_msg_to_db(102, msg_id, user_id, user_name, msg_time, live_title) live_message = '你们的崽崽开直播了\n直播标题: {}\n开始时间: {}'.format( live_title, msg_time) # QQHandler.send_to_groups(task.member_room_msg_groups, live_message) elif text_message_type == TextMessageType.VOTE: # 投票 logger.debug('投票消息') vote_content = extInfo['text'] message = '【发起投票】{}: {}\n'.format( user_name, vote_content) + message self.save_msg_to_db(104, msg_id, user_id, user_name, msg_time, vote_content) elif text_message_type == TextMessageType.FLIPCARD: logger.debug('付费翻牌功能') content = extInfo['question'] question_id = extInfo['questionId'] answer_id = extInfo['answerId'] source = extInfo['sourceId'] answer = extInfo['answer'] fan_name = self.get_idol_flip_name( answer_id, question_id) if fan_name: flip_message = ( '【问】%s: %s\n【答】%s: %s\n翻牌时间: %s\n' % (fan_name, content, user_name, answer, msg_time)) self.save_msg_to_db(105, msg_id, user_id, user_name, msg_time, answer, content, fan_name) else: flip_message = ( '【问】%s\n【答】%s: %s\n翻牌时间: %s\n' % (content, user_name, answer, msg_time)) self.save_msg_to_db(105, msg_id, user_id, user_name, msg_time, answer, content) message = flip_message + message elif text_message_type == TextMessageType.PASSWORD_REDPACKAGE: print('红包消息') content = '【红包】{}'.format(extInfo['redPackageTitle']) self.save_msg_to_db(106, msg_id, user_id, user_name, msg_time, content) elif msg['msgType'] == MessageType.IMAGE: # 图片消息 logger.debug('图片') bodys = json.loads(msg['bodys']) if 'url' in bodys.keys(): url = bodys['url'] if global_config.USING_COOLQ_PRO is True: message = ('【图片】[%s]-%s: [CQ:image,file=%s]\n' % (msg_time, user_name, url)) + message else: message = ('【图片】[%s]-%s: %s\n' % (msg_time, user_name, url)) + message self.save_msg_to_db(200, msg_id, user_id, user_name, msg_time, url) elif msg['msgType'] == MessageType.AUDIO: # 语音消息 logger.debug('语音消息') bodys = json.loads(msg['bodys']) if 'url' in bodys.keys(): url = bodys['url'] if global_config.USING_COOLQ_PRO is True: message3 = ('【语音】[%s]-%s: %s\n' % (msg_time, user_name, url)) logger.info(message3) # 语音消息直接单条发送 message2 = '[CQ:record,file={}]\n'.format(url) # QQHandler.send_to_groups(task.member_room_msg_groups, message2) else: message = ('【语音】[%s]-%s: %s\n' % (msg_time, user_name, url)) + message self.save_msg_to_db(201, msg_id, user_id, user_name, msg_time, url) elif msg['msgType'] == MessageType.VIDEO: # 小视频 logger.debug('房间小视频') bodys = json.loads(msg['bodys']) if 'url' in bodys.keys(): url = bodys['url'] message = ('【小视频】[%s]-%s: %s\n' % (msg_time, user_name, url)) + message self.save_msg_to_db(202, msg_id, user_id, user_name, msg_time, url) elif msg['msgType'] == MessageType.EXPRESS: # 大表情 logger.debug('大表情') emotion_name = extInfo['emotionName'] if global_config.USING_COOLQ_PRO is True: if 'tsj' in emotion_name: express_message = '[%s]-%s: [CQ:image,file=%s]' % ( msg_time, user_name, '{}.gif'.format(emotion_name)) else: express_message = '[%s]-%s: [CQ:image,file=%s]' % ( msg_time, user_name, '{}.png'.format(emotion_name)) message = express_message + message self.save_msg_to_db(203, msg_id, user_id, user_name, msg_time, emotion_name) if message and len(task.member_room_msg_groups) > 0: # express_message = '[CQ:image,file=%s]' % ( # 'express\\tsj000.gif') # express_message2 = '[CQ:image,file=%s]' % ( # 'express\\lt001.png') # QQHandler.send_to_groups(task.member_room_msg_groups, message) self.get_member_room_msg_lite(task) logger.info('message: %s', message) # QQHandler.send_to_groups(task.member_room_msg_groups, express_message) # QQHandler.send_to_groups(task.member_room_msg_groups, express_message2) logger.debug('成员{}消息队列: {}'.format(task.member.name, len(task.member_room_msg_ids))) except Exception as e: logger.exception(e) finally: self.conn.commit() cursor.close()
def parse_order_details(self, orders, taoba_entity): my_logger.debug('taoba_entity: {}'.format(taoba_entity.taoba_id)) my_logger.debug('keys: {}'.format(self.order_queues.keys())) if len(self.order_queues[taoba_entity.taoba_id]) == 0 and len( orders) == 0: my_logger.debug('订单队列为空') return jiebang_activities = global_config.MODIAN_JIEBANG_ACTIVITIES[ taoba_entity.taoba_id] flag_activities = global_config.MODIAN_FLAG_ACTIVITIES[ taoba_entity.taoba_id] count_flag_activities = global_config.MODIAN_COUNT_FLAG_ACTIVITIES[ taoba_entity.taoba_id] # 查询集资情况 pro_name, current, backer_count = self.get_current_and_target( taoba_entity) project_info = '当前进度: %s元' % current taoba_entity.current = current taoba_entity.title = pro_name # group_account_entity.target = target taoba_entity.support_num = backer_count my_logger.debug('size of order %s queue: %s', taoba_entity.taoba_id, len(self.order_queues[taoba_entity.taoba_id])) for order in orders: user_id = order['userid'] nickname = order['nickname'] pay_time = util.convert_timestamp_to_timestr(order['addtime'] * 1000) single_price = order['amount'] pay_amount = order['nums'] backer_money = single_price listid = int(order['id']) my_logger.debug('oid: %s', listid) if listid in self.order_queues[taoba_entity.taoba_id]: continue my_logger.debug('项目%s队列长度: %s', taoba_entity.taoba_id, len(self.order_queues[taoba_entity.taoba_id])) # 每次需要更新一下昵称 try: mysql_util.query( """ INSERT INTO `supporter` (`id`, `name`) VALUES (%s, %s) ON DUPLICATE KEY UPDATE `id`=%s """, (user_id, nickname, user_id)) except Exception as e: my_logger.exception(e) try: # 创建对象 mysql_util.query( """ INSERT INTO `order` (`id`,`supporter_id`,`backer_money`,`pay_time`, `pro_id`) VALUES (%s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE `id`=%s """, (str(listid), user_id, backer_money, pay_time, taoba_entity.taoba_id, str(listid))) except Exception as e: my_logger.exception(e) msg = '感谢 %s(%s) 支持了%s元, %s\n' % ( nickname, user_id, backer_money, util.random_str(global_config.MODIAN_POSTSCRIPTS)) # daka_rank, support_days = self.find_user_daka_rank(user_id, group_account_entity.pro_id) # if daka_rank != -1 and support_days: # msg += '当前项目已打卡%s天\n' % support_days # if group_account_entity.need_display_rank is True: # jizi_rank, backer_money = self.find_user_jizi_rank(user_id, group_account_entity.pro_id) # if jizi_rank != -1: # msg += '当前项目已集资%s元, 排名: %s' % (backer_money, jizi_rank) # else: # pass # 统计当前人数 count = mysql_util.select_one( """ SELECT COUNT(distinct(`supporter_id`)) FROM `order` WHERE `pro_id`=%s """, (taoba_entity.taoba_id, )) backer_count = count[0] msg += '当前集资人数: %s\n' % backer_count # 抽卡播报 card_report = '' if global_config.MODIAN_CARD_DRAW: card_report = self.card_draw_handler.draw( user_id, nickname, backer_money, pay_time) '''接棒相关''' my_logger.debug('接棒情况更新') for jiebang in jiebang_activities: # if jiebang.start_time > time.time(): # continue my_logger.debug('接棒活动详情: 【%s】', jiebang.name) my_logger.debug('集资金额: %s, 接棒最小金额: %s', backer_money, jiebang.min_stick_amount) if backer_money >= jiebang.min_stick_amount: stick_num = util.compute_stick_num( jiebang.min_stick_amount, backer_money) jiebang.current_stick_num += stick_num jiebang.last_record_time = util.convert_timestamp_to_timestr( int(time.time() * 1000)) # 数据库也要更新 try: mysql_util.query( """ UPDATE jiebang SET `current_stick_num`=%s, `last_record_time`=%s WHERE `name`=%s """, (jiebang.current_stick_num, jiebang.last_record_time, jiebang.name)) except Exception as e: my_logger.error('更新接棒数据失败') my_logger.exception(e) my_logger.debug('数据库接棒数据更新完成') test_msg = '' if jiebang.need_detail == 1: test_msg = '【%s】, 当前第%s棒, 目标%s棒\n' \ % (jiebang.name, jiebang.current_stick_num, jiebang.target_stick_num) elif jiebang.need_detail == 0: test_msg = '【%s】\n' % jiebang.name elif jiebang.need_detail == 2: test_msg = '【%s】, 当前第%s棒\n' \ % (jiebang.name, jiebang.current_stick_num) elif jiebang.need_detail == 3: if stick_num > 1: test_msg = '抽奖号: {}~{}\n'.format( jiebang.current_stick_num - stick_num + 1, jiebang.current_stick_num) else: test_msg = '抽奖号: {}\n'.format( jiebang.current_stick_num) my_logger.debug(test_msg) if len(test_msg) > 0: msg += test_msg # QQHandler.send_to_groups(['483548995'], test_msg) '''金额类flag相关''' my_logger.debug('flag情况更新') flag_test_msgs = '' for flag in flag_activities: my_logger.debug('Flag活动详情: %s', flag.name) my_logger.debug('Flag金额: %s, 结束时间: %s', flag.target_flag_amount, flag.end_time) diff = flag.target_flag_amount - current test_msgs = '【%s】, 目标金额: %s元, ' % (flag.name, flag.target_flag_amount) if diff > 0: test_msgs += '距离目标还差%s元\n' % round(diff, 2) flag_test_msgs += test_msgs else: test_msgs += '已经达成目标\n' my_logger.debug(flag_test_msgs) if len(flag_test_msgs) > 0: pass # QQHandler.send_to_groups(['483548995'], flag_test_msgs) # msg += flag_test_msgs '''人头类flag相关''' my_logger.debug('人头flag情况更新') count_flag_test_msgs = '' for flag in count_flag_activities: my_logger.debug('人头Flag活动详情: %s', flag.name) my_logger.debug('人头Flag目标: %s, 开始时间: %s, 结束时间: %s', flag.target_flag_amount, flag.start_time, flag.end_time) target = flag.target_flag_amount # 统计当前人数 rst = mysql_util.select_one( """ select count(distinct(`supporter_id`)) from `order` where `pro_id` = %s and `pay_time` <= %s and `pay_time` >= %s """, (taoba_entity.taoba_id, flag.end_time, flag.start_time)) # 目标人数为0,代表特殊类flag,只报人数 if target == 0: count_flag_test_msgs += '【%s】, 当前人数: %s ' % (flag.name, rst[0]) else: count_flag_test_msgs += '【%s】, 当前人数: %s, 目标人数: %s ' % ( flag.name, rst[0], flag.target_flag_amount) my_logger.debug(count_flag_test_msgs) if len(count_flag_test_msgs) > 0: # QQHandler.send_to_groups(['483548995'], count_flag_test_msgs) pass # msg += flag_test_msgs msg += '%s\n集资项目: %s\n集资方式: %s\n' % (project_info, pro_name, taoba_entity.link) # msg += jizi_pk_report # if global_config.MODIAN_NEED_DISPLAY_PK: # msg += self.pk_modian_activity() if global_config.USING_COOLQ_PRO is True: my_logger.debug('使用酷Q PRO发送图片') msg += '\n[CQ:image,file={}]\n'.format(taoba_entity.qrcode) # QQHandler.send_to_groups(taoba_entity.broadcast_groups, msg) if card_report: pass # QQHandler.send_to_groups(taoba_entity.broadcast_groups, card_report) # QQHandler.send_to_groups(['483548995'], card_report) # 集五福 # wufu_report = modian_wufu_handler.draw(user_id, nickname, backer_money, pay_time) # if wufu_report: # QQHandler.send_to_groups(group_account_entity.broadcast_groups, wufu_report) self.order_queues[taoba_entity.taoba_id].add(listid) # 更新接棒的数据库 try: my_logger.debug('更新接棒活动信息:') for jiebang in jiebang_activities: my_logger.debug( 'current_stick_num: %s, last_record_time: %s, name: %s', jiebang.current_stick_num, jiebang.last_record_time, jiebang.name) mysql_util.query( """ UPDATE jiebang SET current_stick_num=%s WHERE name=%s """, (jiebang.current_stick_num, jiebang.name)) except Exception as e: my_logger.exception(e)