def sheldon_job(): global sheldon_old_episode resp = requests.get('https://91mjw.com/video/2248.htm') element = etree.HTML(resp.text) episodes = element.xpath('//*[@id="video_list_li"]/div/a') last_episode = episodes[-1].xpath('text()')[0] if not sheldon_old_episode: # 初始化 sheldon_old_episode = last_episode if sheldon_old_episode != last_episode: sheldon_old_episode = last_episode # 有新的一集更新了,获取新的一集视频链接 video_id = episodes[-1].xpath('@id')[0] video_link = 'https://91mjw.com/vplay/{}.html'.format(video_id) logger.info('更新了: {}'.format(video_link)) # 推送给所有用户 ids = models.get_all_user_id() print(ids) for user_id in ids: bot.sendMessage(chat_id=user_id, text=video_link) else: logger.info('未更新')
def on_messaged_arrived(msg): content_type, chat_type, chat_id = telepot.glance(msg) logger.debug(content_type, chat_type, chat_id) if content_type == 'text': bot.sendMessage(chat_id, msg['text']) if content_type == 'photo': pprint(msg["photo"]) file_id = msg["photo"][-1]["file_id"] file = bot.download_file(file_id, "downloads/" + file_id)
def respond(): # retrieve the message in JSON and then transform it to Telegram object update = telegram.Update.de_json(request.get_json(force=True), bot) chat_id = update.message.chat.id msg_id = update.message.message_id # Telegram understands UTF-8, so encode text for unicode compatibility text = update.message.text.encode('utf-8').decode() print("got text message :", text) response = get_response(text) bot.sendMessage(chat_id=chat_id, text=response, reply_to_message_id=msg_id) return 'ok'
def index_post(): update = telegram.Update.de_json(request.get_json(force=True), bot) if update.message: msg = update.message try: handle_msg(msg) models.add_new_user(msg) except Exception as e: logging.exception(e) bot.sendMessage(chat_id=msg.chat.id, text='未知错误') elif update.callback_query: try: handle_callback_query(update.callback_query) except Exception as e: logging.exception(e) chat_id = update.callback_query.message.chat.id bot.sendMessage(chat_id=chat_id, text='未知错误') return 'ok'
def keyboard_send(admin_cid): button3 = telegram.KeyboardButton(text='/показать_друга') button2 = telegram.KeyboardButton(text='/показать_взыскателей') button1 = telegram.KeyboardButton(text='/help') button8 = telegram.KeyboardButton(text='/удалить_всех') button4 = telegram.KeyboardButton(text='/статистика') button6 = telegram.KeyboardButton(text='/обновить_друга') button7 = telegram.KeyboardButton(text='/добавить_взыскателя') button5 = telegram.KeyboardButton(text='/удалить_взыскателя') button9 = telegram.KeyboardButton(text='/отправить_всем') mes = telegram.ReplyKeyboardMarkup(keyboard=[[button1], [button9 ], [button2], [button3], [button4], [button5], [button6], [button7], [button8]], resize_keyboard=True, one_time_keyboard=True) bot.sendMessage(chat_id=admin_cid, text='Выберете команду:', reply_markup=mes) return 'ok'
def exec(self, val, admin_cid): if self.state == 0: if val[0] == '/': text = val[1:] self.command = text.split()[0] if self.command in [ 'показать_друга', 'показать_взыскателей', 'help', 'удалить_всех', 'статистика' ]: make_cmd(cmd=self.command) keyboard_send(admin_cid) else: self.state = 1 if (self.command == 'обновить_друга') and (Friend.query.first()): bot.sendMessage( chat_id=admin_cid, text= 'Напоминаю, что старый юзернейм друга перезапишется новым. Введите, пожалуйста, новый юзернейм пользователя.' ) elif self.command == 'отправить_всем': bot.sendMessage( chat_id=admin_cid, text='Введите сообщение для взыскателей.') else: bot.sendMessage(chat_id=admin_cid, text='Введите юзернейм пользователя.') else: self.state = 0 make_cmd(cmd=self.command, name=val) keyboard_send(admin_cid)
def general_send(message, *args, need_save=False, **kwargs): if message.text: bot_message = bot.sendMessage( chat_id=kwargs.get('chat_id'), reply_to_message_id=kwargs.get('reply_to_message_id'), text=message.text.encode('utf-8').decode()) if need_save: save_link(message, bot_message) elif message.video: bot_message = bot.sendVideo( chat_id=kwargs.get('chat_id'), reply_to_message_id=kwargs.get('reply_to_message_id'), video=message.video.file_id, caption=message.caption) if need_save: save_link(message, bot_message) elif message.voice: bot_message = bot.sendVoice( chat_id=kwargs.get('chat_id'), reply_to_message_id=kwargs.get('reply_to_message_id'), voice=message.voice.file_id, caption=message.caption) if need_save: save_link(message, bot_message) elif message.animation: bot_message = bot.sendAnimation( chat_id=kwargs.get('chat_id'), reply_to_message_id=kwargs.get('reply_to_message_id'), animation=message.animation.file_id, caption=message.caption) if need_save: save_link(message, bot_message) elif message.document: bot_message = bot.sendDocument( chat_id=kwargs.get('chat_id'), reply_to_message_id=kwargs.get('reply_to_message_id'), document=message.document.file_id, caption=message.caption) if need_save: save_link(message, bot_message) elif message.photo: bot_message = bot.sendPhoto( chat_id=kwargs.get('chat_id'), reply_to_message_id=kwargs.get('reply_to_message_id'), photo=message.photo[-1].file_id, caption=message.caption) if need_save: save_link(message, bot_message)
def respond(update): # update = telegram.Update.de_json(request.get_json(force=True), bot) app.logger.debug(f'update_id: {update.update_id}') info = bot.get_webhook_info() app.logger.debug(f'pending_update_count: {info.pending_update_count}') message = update.message app.logger.info( f'''from: {message.from_user.username}, message: {message.text}, mgi: {message.media_group_id}''' ) # админская часть try: if (str(message.from_user.username).lower() == str(app.config['ADMIN']).lower()) and\ (message.text) and\ ((message.text.encode('utf-8').decode()[0] == '/') or\ admin_exec.state == 1): text = message.text.encode('utf-8').decode()[1:] cmd = text.split()[0] if cmd == 'start': a = Admin.query.first() if a: Admin.query.delete() db.session.commit() a = Admin(name=str(app.config['ADMIN']).lower(), chat_id=message.chat.id) db.session.add(a) db.session.commit() bot.sendMessage( chat_id=message.chat.id, text='''Используй /help для описания возможных команд.''') keyboard_send(message.chat.id) # bot.sendMessage(chat_id=message.chat.id, text='Start!') return 'ok' # if len(text.split()) == 2: # name = text.split()[1] # else: # name = None # make_cmd(cmd=cmd, name=name) admin_exec.exec( message.text.encode('utf-8').decode(), message.chat.id) return 'ok' # elif (message.from_user.username == app.config['ADMIN']): # return 'ok' except Exception as e: app.logger.error(f'Error: {e}') return 'ok' # вытаскиваем имена взыскателей claimants_raw = Claimant.query.all() claimants = [str(x.name).lower() for x in claimants_raw] # вытаскивем имя друга friend = Friend.query.first() if not friend: return 'ok' try: # выясняем кому сообщение if str(message.from_user.username).lower() in claimants: to_user = str(friend.name).lower() from_claimant = True else: link = Link.query.filter_by(current_message_id=message. reply_to_message.message_id).first() to_user = str(link.claimant).lower() from_claimant = False # если друг решил отправить сообщение в никуда except Exception as e: friend = Friend.query.first() if friend and (str(message.from_user.username).lower() == str( friend.name).lower()) and (friend.chat_id): bot.sendMessage( chat_id=message.chat.id, text= 'Сообщение не доставлено. Нужно выбрать входящее сообщение, на которое отвечаете. Только так ответ будет доставлен нужному адресату.' ) app.logger.warning(f'to-whom error: {e}') to_user = None from_claimant = False # вытаскиваем file_id если есть if message.photo: file_id = [message.photo[-1].file_id] elif message.document: file_id = [message.document.file_id] elif message.voice: file_id = [message.voice.file_id] elif message.video: file_id = [message.video.file_id] elif message.animation: file_id = [message.animation.file_id] else: file_id = [] # пытаемся выдрать текст если это обычный текст if message.text: t_b = message.text.encode('utf-8').decode() # если не получилось то берем caption elif message.caption: t_b = message.caption else: t_b = None # сохранение в БД # если не медиагруппа или первое сообщение из медиагруппы if (not message.media_group_id) or\ (message.media_group_id and (not Message.query.filter_by( media_group_id=message.media_group_id).first())): # сохраняем сообщение в БД m = Message(tlg_chat_id=message.chat.id, tlg_msg_id=message.message_id, text=t_b, media_group_id=message.media_group_id, from_user=str(message.from_user.username).lower(), to_user=str(to_user).lower(), file_ids=file_id, from_claimant=from_claimant) db.session.add(m) db.session.commit() # if message.media_group_id: # return 'ok' try: # если не первое сообщение из медиагруппы if message.media_group_id: old_message = Message.query.filter_by( media_group_id=message.media_group_id).first() if old_message: app.logger.debug( f'old_message.file_ids: {old_message.file_ids}') old_files = old_message.file_ids if message.photo: old_files.append(message.photo[-1].file_id) elif message.video: old_files.append(message.photo[-1].file_id) old_message.file_ids = old_files db.session.commit() # # если последнее сообщение # if bot.get_webhook_info().pending_update_count == 1: # if to_user == friend.name: # chat_id = friend.chat_id # else: # chat_id = Link.query.filter_by( # claimant=to_user).first().from_chat_id # media = [] # for i, file in enumerate(old_message.file_ids): # print(f'file: {file}') # if i != 0: # media.append(telegram.InputMediaPhoto(media=file)) # else: # media.append(telegram.InputMediaPhoto( # media=file, caption=old_message.text)) # bot.sendMediaGroup(chat_id=chat_id, media=media) except Exception as e: app.logger.error(f'Error: {e}') return 'ok' # если сообщение от друга и с пересылкой if (str(message.from_user.username).lower() == str(friend.name).lower()) and\ (message.reply_to_message is not None): cl_chat_id_raw = Link.query\ .filter_by(current_message_id=message.reply_to_message.message_id)\ .first() if cl_chat_id_raw: # and not message.media_group_id: # пытаемся отправить, если не получается # то ответное сообщение удалено try: general_send( message, chat_id=cl_chat_id_raw.from_chat_id, reply_to_message_id=cl_chat_id_raw.source_message_id) except Exception as e: app.logger.warning(f'Reply message is deleted! {e}') general_send(message, chat_id=cl_chat_id_raw.from_chat_id) else: a = Admin.query.first() admin_cid = a.chat_id bot.sendMessage(chat_id=admin_cid, text='error...') # если сообщение от друга без пересылки и не сохранен айдишник чата elif (str(message.from_user.username).lower() == str( friend.name).lower()) and (not friend.chat_id): friend.chat_id = message.chat.id db.session.commit() bot.sendMessage(chat_id=message.chat.id, text='Все готово!') # если сообщение от взыскателя elif (str(message.from_user.username).lower() in claimants): # and\ # (not message.media_group_id): general_send(message, need_save=True, chat_id=friend.chat_id) else: app.logger.warning(f'Warning: another case!') app.logger.debug(f'message.message_id: {message.message_id}') return 'ok'
def make_cmd(cmd=None, name=None): a = Admin.query.first() admin_cid = a.chat_id app.logger.info(f'Command: {cmd}') need_update = False if (cmd == 'обновить_друга') and name: app.logger.info(f'Adding friend...') f = Friend.query.first() if f: Friend.query.delete() db.session.commit() r = Friend(name=str(name).lower()) db.session.add(r) need_update = True elif (cmd == 'добавить_взыскателя') and name: app.logger.info(f'Adding claimant...') r = Claimant(name=str(name).lower()) db.session.add(r) need_update = True # elif cmd == 'add_several_claimants': # print('adding several claimants') # claims = # r = Claimant(name=name) # db.session.add(r) # need_update = True elif (cmd == 'отправить_всем') and name: cs_raw = Claimant.query.all() cs = [x.name for x in cs_raw] links_raw = Link.query.distinct(Link.from_chat_id) chats = [x.from_chat_id for x in links_raw if x.claimant in cs] for clai in chats: bot.sendMessage(chat_id=clai, text=name) time.sleep(1) bot.sendMessage(chat_id=admin_cid, text='Сообщение отправлено всем взыскателям.') elif cmd == 'показать_друга': friend = Friend.query.first() if friend: text = friend.name else: text = 'No friend' bot.sendMessage(chat_id=admin_cid, text=text) elif cmd == 'показать_взыскателей': cs_raw = Claimant.query.all() cs = [x.name for x in cs_raw] if cs: bot.sendMessage(chat_id=admin_cid, text=(', '.join(cs))) else: bot.sendMessage(chat_id=admin_cid, text='No claimants') elif cmd == 'help': bot.sendMessage(chat_id=admin_cid, text='''Для настройки бота надо: Перед запуском приложения в файле config.py указать username админа бота, в формате без "@", либо же указать в переменной окружения 'ADMIN', пример "test_user0" Админ должен найти бота "ClaimantBot" и написать ему "/start", дождаться ответа бота со справкой. Админ с помощью команд "/обновить_друга" и "/добавить_взыскателя" может обновлять username друга и добавлять username взыскателей соответственно, например: нажать кнопку "/обновить_друга", дожидаемся ответа бота, отправляем username друга "test_user1"; нажать кнопку "/добавить_взыскателя", дожидаемся ответа бота, отправляем username взыскателя "test_user2". После добавления друга командой "/обновить_друга" друг должен найти бота и отправить ему любое сообщение, бот ответит "Все готово!" После добавления взыскателей они должны найти бота, отправить ему сообщение, эти сообщения попадают к другу, друг может отвечать на них с помощью стандартного функционала телеграма "ответить". Для админа также существуют команды: /показать_друга - показывает username друга /показать_взыскателей - показывает username всех взыскателей /удалить_всех - удаляет username и друга, и всех взыскателей /удалить_взыскателя - удаляет username взыскателя, используется: нажатие кнопки команды, дожидаемся ответа бота, отправляем username взыскателя /статистика - показывает статистику использования бота''') elif cmd == 'test_cmd': return 'all is good' elif cmd == 'удалить_всех': app.logger.info(f'Deleting all...') Friend.query.delete() Claimant.query.delete() need_update = True elif (cmd == 'удалить_взыскателя') and name: app.logger.info(f'Deleting claimant...') app.logger.info(f'{name}') # b = Claimant.query.filter_by(name=str(name).lower()).first() # if b: # app.logger.info(f'{b.name}') # b.delete() # db.session.commit() Claimant.query.filter_by(name=str(name).lower()).delete() need_update = True elif cmd == 'статистика': b = datetime.now() count_today = Message.query.filter( Message.timestamp >= datetime(b.year, b.month, b.day)) count_daily = Message.query.filter( Message.timestamp >= (b - timedelta(days=1))) claimant_today = count_today.filter( Message.from_claimant == True).count() claimant_daily = count_daily.filter( Message.from_claimant == True).count() count_today = count_today.count() count_daily = count_daily.count() last_7day = Message.query.filter( Message.timestamp >= (datetime(b.year, b.month, b.day)) - timedelta(days=7)) claimant_last_7day = last_7day.filter( Message.from_claimant == True).count() last_30day = Message.query.filter( Message.timestamp >= (datetime(b.year, b.month, b.day)) - timedelta(days=30)) claimant_last_30day = last_30day.filter( Message.from_claimant == True).count() last_7day = last_7day.count() last_30day = last_30day.count() count_all = Message.query claimant_count_all = count_all.filter( Message.from_claimant == True).count() count_all = count_all.count() resp = f'''Сообщений за этот день: {count_today} Сообщений за последние сутки: {count_daily} Сообщений за этот день от взыскателей: {claimant_today} Сообщений за последние сутки от взыскателей: {claimant_daily} Сообщений за неделю: {last_7day} Сообщений за месяц: {last_30day} Сообщений за неделю от взыскателей: {claimant_last_7day} Сообщений за месяц от взыскателей: {claimant_last_30day} Всего сообщений: {count_all} Всего сообщений от взыскателей: {claimant_count_all}\n''' claimants = Claimant.query.all() claimants = [str(cl.name).lower() for cl in claimants] for cl in claimants: base_query = Message.query.filter(Message.from_user == cl) resp += f' {cl}: {base_query.filter(Message.timestamp >= datetime(b.year, b.month, b.day)).count()} за день, \ {base_query.filter(Message.timestamp >= (b - timedelta(days=1))).count()} за сутки, \ {base_query.filter(Message.timestamp >= (datetime(b.year, b.month, b.day)) - timedelta(days=7)).count()} за неделю, \ {base_query.count()} сообщений всего.\n' bot.sendMessage(chat_id=admin_cid, text=resp) else: bot.sendMessage(chat_id=admin_cid, text='Что-то не так...') if need_update: db.session.commit() bot.sendMessage(chat_id=admin_cid, text='Сделано!') app.logger.info(f'Successful db commit!')