def send_post(self, destination): try: # Отправляем текст, нарезая при необходимости for text in cut_long_text(self.final_text): my_bot.send_message( destination, text, parse_mode="HTML", disable_web_page_preview=self.web_preview_url == '') # Отправляем отображаемые приложения к посту for url in self.gif_links: my_bot.send_document(destination, url) if len(self.image_links) > 0: my_bot.send_media_group( destination, [InputMediaPhoto(url) for url in self.image_links]) if len(self.video_links) > 0: my_bot.send_media_group( destination, [InputMediaVideo(url) for url in self.video_links]) for url in self.audio_links: my_bot.send_audio(destination, url) except apihelper.ApiException: action_log("VK Error: api exception")
def arxiv_search(query, message): try: arxiv_search_res = arxiv.query(search_query=query, max_results=3) query_answer = '' for paper in arxiv_search_res: end = '…' if len(paper['summary']) > 251 else '' a_name = paper['authors'][0] if len(paper['authors']) > 1: a_name += 'et al.' query_answer += \ '• {0}. <a href="{1}">{2}</a>. {3}{4}\n'.format( a_name, paper['arxiv_url'], escape(paper['title'].replace('\n', ' ')), escape(paper['summary'][0:250].replace('\n', ' ')), end) print(query_answer) user_action_log(message, "called arxiv search with query {}".format(query)) my_bot.reply_to(message, query_answer, parse_mode="HTML") except Exception as ex: exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] action_log("Unknown Exception:\n{}: {}\nat {} line {}\n" "Creating the alert file.".format(exc_type, ex, fname, exc_tb.tb_lineno))
def welcoming_task(message): chat_id = message.chat.id new_members_names = [] new_members_info = [] users = [] for member in message.new_chat_members: new_members_names.append(member.first_name) new_members_info.append(user_info(member)) if not member.is_bot: user = { 'user_id': member.id, 'chat_id': chat_id, 'first_name': member.first_name, 'last_name': member.last_name, 'is_member': True } users.append(user) if users: # Bot check with db.atomic(): User.insert_many(users).on_conflict_replace().execute() if str(message.chat.id) == config.mm_chat: welcoming_msg = "{}, {}!\nЕсли здесь впервые, то ознакомься с правилами — /rules, " \ "и представься, если несложно.".format(random.choice(config.welcome_list), ', '.join(new_members_names)) else: welcoming_msg = "{}, {}!\n".format(random.choice(config.welcome_list), ', '.join(new_members_names)) my_bot.reply_to(message, welcoming_msg) action_log("User(s) {} joined the chat.".format( ', '.join(new_members_info)))
def morning_msg(): text = '' # TODO: добавить генерацию разных вариантов приветствий text += 'Доброе утро, народ!' # TODO: Проверять на наличие картинки text += ' [😺](https://t.me/funkcat/{})'.format(random.randint(1, 826)) text += '\n' month_names = [u'января', u'февраля', u'марта', u'апреля', u'мая', u'июня', u'июля', u'августа', u'сентября', u'октября', u'ноября', u'декабря'] weekday_names = [u'понедельник', u'вторник', u'среда', u'четверг', u'пятница', u'суббота', u'воскресенье'] now = datetime.datetime.now(pytz.timezone('Europe/Moscow')) text += 'Сегодня *{} {}*, *{}*. Нас в чате *{}*!'.format(now.day, month_names[now.month - 1], weekday_names[now.weekday()], my_bot.get_chat_members_count(config.mm_chat)) text += '\n\n' text += '{}'.format(daily_weather()) text += '\n\n' text += 'Котик дня:' # Отправить и запинить сообщение без уведомления msg = my_bot.send_message(config.mm_chat, text, parse_mode="Markdown") my_bot.pin_chat_message(config.mm_chat, msg.message_id, disable_notification=True) action_log('Scheduled morning message sent: id = {}'.format(msg.message_id))
def welcoming_task(message): chat_id = message.chat.id new_members_names = [] new_members_info = [] users = [] for member in message.new_chat_members: new_members_names.append(member.first_name) new_members_info.append(user_info(member)) if not member.is_bot: user = { 'user_id' : member.id, 'chat_id' : chat_id, 'first_name': member.first_name, 'last_name' : member.last_name, 'is_member' : True } users.append(user) if users: # Bot check with db.atomic(): User.insert_many(users).on_conflict_replace().execute() if str(message.chat.id) == config.mm_chat: welcoming_msg = "{}, {}!\nЕсли здесь впервые, то ознакомься с правилами — /rules, " \ "и представься, если несложно.".format(random.choice(config.welcome_list), ', '.join(new_members_names)) else: welcoming_msg = "{}, {}!\n".format(random.choice(config.welcome_list), ', '.join(new_members_names)) my_bot.reply_to(message, welcoming_msg) action_log("User(s) {} joined the chat.".format(', '.join(new_members_info)))
def check_disa(message): if getattr(message, 'forward_from_chat') is not None: if message.forward_from_chat.id in config.stupid_channels: try: my_bot.delete_message(chat_id=message.chat.id, message_id=message.message_id) action_log("Successfully deleted a forward-post from this crap channel:\n{}".format( message.forward_from_chat.title)) except Exception: pass disa_commands.check_disa(message)
def welcoming_task(message): new_members_names = [] new_members_info = [] for member in message.new_chat_members: new_members_names.append(member.first_name) new_members_info.append(user_info(member)) welcoming_msg = "{}, {}!\nЕсли здесь впервые, то ознакомься с правилами — /rules, " \ "и представься, если несложно.".format(random.choice(config.welcome_list), ', '.join(new_members_names)) my_bot.reply_to(message, welcoming_msg) action_log("User(s) {} joined the chat.".format( ', '.join(new_members_info)))
def check_disa(message): if getattr(message, 'forward_from_chat') is not None: if message.forward_from_chat.id in config.stupid_channels: try: my_bot.delete_message(chat_id=message.chat.id, message_id=message.message_id) action_log( "Successfully deleted a forward-post from this crap channel:\n{}" .format(message.forward_from_chat.title)) except Exception: pass disa_commands.check_disa(message)
def vk_listener(): """ Проверяет наличие новых постов в паблике мехмата и отправляет их при наличии :return: None """ if tokens.vk == '': return try: vk_post = vk_find_last_post() if vk_post.not_posted(): action_log("We have new post in mechmath public") vk_post.prepare_post() if config.my_chatID != '': vk_post.send_post(config.my_chatID) if config.my_channel != '': vk_post.send_post(config.my_channel) vk_post.set_as_posted() time.sleep(5) except requests.ReadTimeout: action_log("Read Timeout in vkListener() function") except requests.ConnectionError: action_log("Connection Error in vkListener() function") except RuntimeError: action_log("Runtime Error in vkListener() function")
def repost_header(self): # TODO: попробовать обойтись без дополнительного вызова API (extended = 1) original_poster_id = int(self.post['copy_history'][-1]['owner_id']) web_preview = "<a href=\"{}\">📢</a>".format( self.web_preview_url) if self.web_preview_url != "" else "📢" # если значение ключа 'copy_owner_id' отрицательное, то репост из группы if original_poster_id < 0: response = requests.get('https://api.vk.com/method/groups.getById', params={ 'access_token': tokens.vk, 'group_ids': -original_poster_id, 'v': config.vk_ver }) try: op_name = response.json()['response'][0]['name'] op_screenname = response.json()['response'][0]['screen_name'] self.repost_header_fb = "Репост из группы {} (https://vk.com/{}):".format( op_name, op_screenname) return web_preview + " <a href=\"https://vk.com/wall{}_{}\">Репост</a> " \ "из группы <a href=\"https://vk.com/{}\">{}</a>:".format(self.owner_id, self.post['id'], op_screenname, op_name) except KeyError: action_log( 'We have an error in getting a VK post header with following message:\n{0}' .format(response.json()['error']['error_msg'])) return 'VK Error' # если значение ключа 'copy_owner_id' положительное, то репост пользователя else: response = requests.get('https://api.vk.com/method/users.get', params={ 'access_token': tokens.vk, 'user_id': original_poster_id, 'v': config.vk_ver }) op_name = "{0} {1}".format( response.json()['response'][0]['first_name'], response.json()['response'][0]['last_name'], ) op_screenname = response.json()['response'][0]['id'] self.repost_header_fb = "Репост пользователя {} (https://vk.com/id{}):".format( op_name, op_screenname) return web_preview + ( " <a href=\"https://vk.com/wall{}_{}\">Репост</a> " "пользователя <a href=\"https://vk.com/id{}\">{}</a>:").format( self.owner_id, self.post['id'], op_screenname, op_name)
def post_header(self): # TODO: попробовать обойтись без дополнительного вызова API (extended = 1) web_preview = "<a href=\"{}\">📋</a>".format(self.web_preview_url) if self.web_preview_url != "" else "📋" response = requests.get('https://api.vk.com/method/groups.getById', params={'access_token': tokens.vk, 'group_ids': -(int(self.owner_id)), 'v': config.vk_ver}) try: op_name = response.json()['response'][0]['name'] op_screenname = response.json()['response'][0]['screen_name'] return web_preview + (" <a href=\"https://vk.com/wall{}_{}\">Пост</a> в группе " "<a href=\"https://vk.com/{}\">{}</a>:").format(self.owner_id, self.post['id'], op_screenname, op_name) except KeyError: action_log('We have an error in getting a VK post header with following message:\n{0}'.format( response.json()['error']['error_msg'])) return 'VK Error'
def vk_listener(): """ Проверяет наличие новых постов в паблике мехмата и отправляет их при наличии :return: None """ if tokens.vk == '': return try: vk_post = vk_get_last_post(config.mm_vk_group) if vk_post == 1: return if vk_post.not_posted(): action_log("We have new post in mechmath public") vk_post.prepare_post() try: if config.mm_chat != '': vk_post.send_post(config.mm_chat) if config.mm_channel != '': vk_post.send_post(config.mm_channel) if tokens.fb != '' and config.mm_fb_album != '': try: vk_post.send_post_fb(tokens.fb, config.mm_fb_album) except facebook.GraphAPIError as ex: logging.exception(ex) scheduler.pause_job('vk_listener') my_bot.send_message(config.mm_chat_debug, 'Что-то не так с токеном у ФБ! Проверка новых постов приостановлена.\n' 'Фиксики приде, порядок наведе!') action_log('Error reposting a VK post to FB. Most likely there\'s invalid FB token.\n' 'Job "vk_listener" has been paused.') except Exception as ex: logging.exception(ex) my_bot.send_message(config.mm_chat_debug, "Последний пост вызвал ошибку при репостинге! @rm_bk, выезжай.") vk_post.set_as_posted() time.sleep(5) except requests.exceptions.ReadTimeout: action_log("Read Timeout in vkListener() function") except requests.exceptions.ConnectionError: action_log("Connection Error in vkListener() function") except RuntimeError: action_log("Runtime Error in vkListener() function")
def send_post(self, destination): try: # Отправляем текст, нарезая при необходимости for text in cut_long_text(self.final_text): my_bot.send_message(destination, text, parse_mode="HTML", disable_web_page_preview=self.web_preview_url == '') # Отправляем отображаемые приложения к посту for url in self.gif_links: my_bot.send_document(destination, url) if len(self.image_links) > 0: my_bot.send_media_group(destination, [InputMediaPhoto(url) for url in self.image_links]) if len(self.video_links) > 0: my_bot.send_media_group(destination, [InputMediaVideo(url) for url in self.video_links]) for url in self.audio_links: my_bot.send_audio(destination, url) except apihelper.ApiException: action_log("VK Error: api exception")
async def morning_msg(): text = '' # TODO: добавить генерацию разных вариантов приветствий text += 'Доброе утро, народ!' # TODO: Проверять на наличие картинки text += ' [😺](https://t.me/funkcat/{})'.format(random.randint(1, 826)) text += '\n' month_names = [ u'января', u'февраля', u'марта', u'апреля', u'мая', u'июня', u'июля', u'августа', u'сентября', u'октября', u'ноября', u'декабря' ] weekday_names = [ u'понедельник', u'вторник', u'среда', u'четверг', u'пятница', u'суббота', u'воскресенье' ] now = datetime.datetime.now(pytz.timezone('Europe/Moscow')) people_in_chat = await my_bot.get_chat_members_count(config.mm_chat) text += 'Сегодня *{} {}*, *{}*. Нас в чате *{}*!'.format( now.day, month_names[now.month - 1], weekday_names[now.weekday()], people_in_chat) text += '\n\n' text += '{}'.format(daily_weather()) text += '\n\n' text += 'Котик дня:' # Отправить и запинить сообщение без уведомления msg = await my_bot.send_message(config.mm_chat, text, parse_mode="Markdown") await my_bot.pin_chat_message(config.mm_chat, msg.message_id, disable_notification=True) action_log('Scheduled morning message sent: id = {}'.format( msg.message_id))
def disa_vk_report(disa_chromo, message): login, password = tokens.vk_disa_login, tokens.vk_disa_password vk_session = vk_api.VkApi(login, password) vk_session.auth() vk = vk_session.get_api() wall = vk.wall.get(owner_id=config.vk_disa_groupID, count=1) if time.localtime(wall['items'][0]['date'])[2] == time.localtime()[2]: disa_chromo_post = disa_chromo - 46 try: old_chromo = int(wall['items'][0]['text']) disa_chromo_post += old_chromo except Exception as ex: logging.error(ex) disa_chromo_post = disa_chromo vk.wall.edit(owner_id=config.vk_disa_groupID, post_id=wall['items'][0]['id'], message=str(disa_chromo_post)) else: disa_chromo_post = 46 + disa_chromo vk.wall.post(owner_id=config.vk_disa_groupID, message=str(disa_chromo_post)) if 1 < disa_chromo - 46 % 10 < 5: chromo_end = "ы" elif disa_chromo - 46 % 10 == 1: chromo_end = "а" else: chromo_end = "" my_bot.reply_to( message, "С последнего репорта набежало {0} хромосом{1}.\n" "Мы успешно зарегистрировали этот факт: " "https://vk.com/disa_count".format((disa_chromo - 46), chromo_end)) action_log("Disa summary printed") disa_chromo = 46 global_lock.acquire() with open(config.file_location_disa, 'w', encoding='utf-8') as file_disa_write: file_disa_write.write(str(disa_chromo)) global_lock.release() disa.disa_first = True
async def arxiv_random(message): user_action_log(message, "made arxiv random query") try: eastern = pytz.timezone('US/Eastern') eastern_time = datetime.datetime.now(eastern) # publications on 20:00 if eastern_time.hour < 20: eastern_time -= datetime.timedelta(days=1) # no publications on friday and saturday if eastern_time.weekday() == 5: eastern_time -= datetime.timedelta(days=2) elif eastern_time.weekday() == 4: eastern_time -= datetime.timedelta(days=1) last_published_date = eastern_time.strftime("%Y-%m-%d") response = requests.get('http://export.arxiv.org/oai2', params={'verb': 'ListIdentifiers', 'set': 'math', 'metadataPrefix': 'oai_dc', 'from': last_published_date}) action_log("Random arxiv paper since {}".format(last_published_date)) # если всё хорошо if response.status_code == 200: response_tree = ElementTree.fromstring(response.content) num_of_papers = len(response_tree[2]) paper_index = random.randint(0, num_of_papers) paper_arxiv_id = response_tree[2][paper_index][0].text.split(':')[-1] # hardcoded papep_obj = arxiv.query(id_list=[paper_arxiv_id])[0] paper_link = papep_obj['pdf_url'].replace('http://', 'https://') + '.pdf' paper_link_name = paper_link.split("/pdf/")[1] print(paper_link) print(paper_link_name) req_pdf_size = requests.head(paper_link) pdf_size = round(int(req_pdf_size.headers["Content-Length"]) / 1024 / 1024, 2) query_answer = '{}. <a href="{}">{}</a>. {}\n\n— <a href="{}">{}</a>, {} Мб\n'.format( papep_obj['author_detail']['name'], papep_obj['arxiv_url'], escape(papep_obj['title'].replace('\n', ' ')), escape(papep_obj['summary'].replace('\n', ' ')), paper_link, paper_link_name, pdf_size ) await message.reply(query_answer, parse_mode="HTML", disable_web_page_preview=False) user_action_log(message, "arxiv random query was successful: " "got paper {}".format(papep_obj['arxiv_url'])) # TODO(randl): doesn't send. Download and delete? # my_bot.send_document(message.chat.id, data=paper_link) elif response.status_code == 503: # слишком часто запрашиваем action_log("Too much queries. 10 minutes break should be enough") arxiv_checker.last_call = datetime.datetime.utcnow() - datetime.timedelta(seconds=610) else: # если всё плохо user_action_log(message, "arxiv random query failed: response {}".format(response.status_code)) except Exception as ex: exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] action_log("Unknown Exception: {}: {}\nat {} line {}".format(exc_type, ex, fname, exc_tb.tb_lineno))
def vk_get_last_post(vkgroup_id): try: # Берём первые два поста response = requests.get('https://api.vk.com/method/wall.get', params={'access_token': tokens.vk, 'owner_id': vkgroup_id, 'count': 2, 'offset': 0, 'v': config.vk_ver}) # print(response.json()) # Cоздаём json-объект для работы posts = response.json()['response']['items'] # Cверяем два верхних поста на предмет свежести, т.к. верхний может быть запинен post = posts[0] if posts[0]['date'] >= posts[1]['date'] else posts[1] return VkPost(post) except KeyError as ex: logging.exception(ex) if response.json()['error']['error_code'] == 5: scheduler.pause_job('vk_listener') my_bot.send_message(config.mm_chat_debug, 'Что-то не так с токеном у ВК! Проверка новых постов приостановлена.\n' 'Фиксики приде, порядок наведе!') action_log('KeyError exception in vk_listener. Most likely there\'s invalid token.\n' 'Job "vk_listener" has been paused.') return 1
def post_header(self): # TODO: попробовать обойтись без дополнительного вызова API (extended = 1) web_preview = "<a href=\"{}\">📋</a>".format( self.web_preview_url) if self.web_preview_url != "" else "📋" response = requests.get('https://api.vk.com/method/groups.getById', params={ 'access_token': tokens.vk, 'group_ids': -(int(self.owner_id)), 'v': config.vk_ver }) try: op_name = response.json()['response'][0]['name'] op_screenname = response.json()['response'][0]['screen_name'] return web_preview + ( " <a href=\"https://vk.com/wall{}_{}\">Пост</a> в группе " "<a href=\"https://vk.com/{}\">{}</a>:").format( self.owner_id, self.post['id'], op_screenname, op_name) except KeyError: action_log( 'We have an error in getting a VK post header with following message:\n{0}' .format(response.json()['error']['error_msg'])) return 'VK Error'
def disa_vk_report(disa_chromo, message): login, password = tokens.vk_disa_login, tokens.vk_disa_password vk_session = vk_api.VkApi( login, password, config_filename=config.file_location['vk_config']) vk_session.auth() vk = vk_session.get_api() wall = vk.wall.get(owner_id=config.disa_vk_group, count=1) if time.localtime(wall['items'][0]['date'])[2] == time.localtime()[2]: disa_chromo_post = disa_chromo - 46 try: old_chromo = int(wall['items'][0]['text']) disa_chromo_post += old_chromo except Exception as ex: logging.error(ex) disa_chromo_post = disa_chromo vk.wall.edit(owner_id=config.disa_vk_group, post_id=wall['items'][0]['id'], message=str(disa_chromo_post)) else: disa_chromo_post = 46 + disa_chromo vk.wall.post(owner_id=config.disa_vk_group, message=str(disa_chromo_post)) if 1 < disa_chromo - 46 % 10 < 5: chromo_end = "ы" elif disa_chromo - 46 % 10 == 1: chromo_end = "а" else: chromo_end = "" my_bot.reply_to( message, "С последнего репорта набежало {0} хромосом{1}.\n" "Мы успешно зарегистрировали этот факт: " "https://vk.com/disa_count".format((disa_chromo - 46), chromo_end)) action_log("Disa summary printed") value_to_file(config.file_location['chromo'], 46) disa.disa_first = True
def repost_header(self): # TODO: попробовать обойтись без дополнительного вызова API (extended = 1) original_poster_id = int(self.post['copy_history'][-1]['owner_id']) web_preview = "<a href=\"{}\">📢</a>".format(self.web_preview_url) if self.web_preview_url != "" else "📢" # если значение ключа 'copy_owner_id' отрицательное, то репост из группы if original_poster_id < 0: response = requests.get('https://api.vk.com/method/groups.getById', params={'access_token': tokens.vk, 'group_ids': -original_poster_id, 'v': config.vk_ver}) try: op_name = response.json()['response'][0]['name'] op_screenname = response.json()['response'][0]['screen_name'] self.repost_header_fb = "Репост из группы {} (https://vk.com/{}):".format(op_name, op_screenname) return web_preview + " <a href=\"https://vk.com/wall{}_{}\">Репост</a> " \ "из группы <a href=\"https://vk.com/{}\">{}</a>:".format(self.owner_id, self.post['id'], op_screenname, op_name) except KeyError: action_log('We have an error in getting a VK post header with following message:\n{0}'.format( response.json()['error']['error_msg'])) return 'VK Error' # если значение ключа 'copy_owner_id' положительное, то репост пользователя else: response = requests.get('https://api.vk.com/method/users.get', params={'access_token': tokens.vk, 'user_id': original_poster_id, 'v': config.vk_ver}) op_name = "{0} {1}".format(response.json()['response'][0]['first_name'], response.json()['response'][0]['last_name'], ) op_screenname = response.json()['response'][0]['id'] self.repost_header_fb = "Репост пользователя {} (https://vk.com/id{}):".format(op_name, op_screenname) return web_preview + (" <a href=\"https://vk.com/wall{}_{}\">Репост</a> " "пользователя <a href=\"https://vk.com/id{}\">{}</a>:").format(self.owner_id, self.post['id'], op_screenname, op_name)
def disa_vk_report(disa_chromo, message): login, password = tokens.vk_disa_login, tokens.vk_disa_password vk_session = vk_api.VkApi(login, password, config_filename=config.file_location['vk_config']) vk_session.auth() vk = vk_session.get_api() wall = vk.wall.get(owner_id=config.disa_vk_group, count=1) if time.localtime(wall['items'][0]['date'])[2] == time.localtime()[2]: disa_chromo_post = disa_chromo - 46 try: old_chromo = int(wall['items'][0]['text']) disa_chromo_post += old_chromo except Exception as ex: logging.error(ex) disa_chromo_post = disa_chromo vk.wall.edit(owner_id=config.disa_vk_group, post_id=wall['items'][0]['id'], message=str(disa_chromo_post)) else: disa_chromo_post = 46 + disa_chromo vk.wall.post(owner_id=config.disa_vk_group, message=str(disa_chromo_post)) if 1 < disa_chromo - 46 % 10 < 5: chromo_end = "ы" elif disa_chromo - 46 % 10 == 1: chromo_end = "а" else: chromo_end = "" my_bot.reply_to(message, "С последнего репорта набежало {0} хромосом{1}.\n" "Мы успешно зарегистрировали этот факт: " "https://vk.com/disa_count".format((disa_chromo - 46), chromo_end)) action_log("Disa summary printed") value_to_file(config.file_location['chromo'], 46) disa.disa_first = True
def arxiv_search(query, message): try: arxiv_search_res = arxiv.query(search_query=query, max_results=3) query_answer = '' for paper in arxiv_search_res: end = '…' if len(paper['summary']) > 251 else '' a_name = paper['authors'][0] if len(paper['authors'])>1: a_name += 'et al.' query_answer += \ '• {0}. <a href="{1}">{2}</a>. {3}{4}\n'.format( a_name, paper['arxiv_url'], escape(paper['title'].replace('\n', ' ')), escape(paper['summary'][0:250].replace('\n', ' ')), end) print(query_answer) user_action_log(message, "called arxiv search with query {}".format(query)) my_bot.reply_to(message, query_answer, parse_mode="HTML") except Exception as ex: exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] action_log("Unknown Exception:\n{}: {}\nat {} line {}\n" "Creating the alert file.".format(exc_type, ex, fname, exc_tb.tb_lineno))
def vk_listener(): """ Проверяет наличие новых постов в паблике мехмата и отправляет их при наличии :return: None """ if tokens.vk == '': return try: vk_post = vk_get_last_post(config.mm_vk_group) if vk_post.not_posted(): action_log("We have new post in mechmath public") vk_post.prepare_post() try: if config.mm_chat != '': vk_post.send_post(config.mm_chat) if config.mm_channel != '': vk_post.send_post(config.mm_channel) if tokens.fb != '' and config.mm_fb_album != '': vk_post.send_post_fb(tokens.fb, config.mm_fb_album) except Exception as ex: logging.exception(ex) my_bot.send_message( config.mm_chat_debug, "Последний пост вызвал ошибку при репостинге! @rm_bk, выезжай." ) vk_post.set_as_posted() time.sleep(5) except requests.exceptions.ReadTimeout: action_log("Read Timeout in vkListener() function") except requests.exceptions.ConnectionError: action_log("Connection Error in vkListener() function") except RuntimeError: action_log("Runtime Error in vkListener() function")
disa_commands.check_disa(message) # All messages handler def handle_messages(messages): dump_messages(messages) while __name__ == '__main__': try: if os.path.isfile(config.file_location['bot_killed']): os.remove(config.file_location['bot_killed']) if config.debug_mode: action_log("Running bot in Debug mode!") else: action_log("Running bot!") scheduler.add_job(vk_listener.vk_listener, 'interval', id='vk_listener', replace_existing=True, seconds=30) scheduler.add_job(morning_message.morning_msg, 'cron', id='morning_msg', replace_existing=True, hour=7, timezone=pytz.timezone('Europe/Moscow')) scheduler.add_job(morning_message.unpin_msg, 'cron', id='unpin_msg', replace_existing=True, hour=13, timezone=pytz.timezone('Europe/Moscow')) # Запуск Long Poll бота my_bot.set_update_listener(handle_messages) my_bot.polling(none_stop=True, interval=1, timeout=60) time.sleep(1)
choosen_answer = re.sub(r'(?i)\bя\b', 'ты', choosen_answer) else: choosen_answer = re.sub(r'(?i)\bi\b', 'you', choosen_answer) # more subs to come await message.reply(choosen_answer) @dp.message_handler(func=commands_handler(['/kek'])) @command_with_delay(delay=1) async def my_kek(message): await kek.my_kek(message) if __name__ == '__main__': if config.debug_mode: action_log("Running bot in Debug mode!") else: action_log("Running bot!") scheduler.add_job(morning_message.morning_msg, 'cron', id='morning_msg', replace_existing=True, hour=7, timezone=pytz.timezone('Europe/Moscow')) scheduler.add_job(morning_message.unpin_msg, 'cron', id='unpin_msg', replace_existing=True, hour=13,
disa_commands.check_disa(message) # All messages handler def handle_messages(messages): dump_messages(messages) while __name__ == '__main__': try: if os.path.isfile(config.file_location['bot_killed']): os.remove(config.file_location['bot_killed']) if config.debug_mode: action_log("Running bot in Debug mode!") else: action_log("Running bot!") scheduler.add_job(vk_listener.vk_listener, 'interval', id='vk_listener', replace_existing=True, seconds=30) scheduler.add_job(morning_message.morning_msg, 'cron', id='morning_msg', replace_existing=True, hour=7, timezone=pytz.timezone('Europe/Moscow'))
def my_wiki(message): """ Обрабатывает запрос и пересылает результат. Если запроса нет, выдаёт рандомный факт. :param message: :return: """ # обрабатываем всё, что пользователь ввёл после '/wiki ' if not len(message.text.split()) == 1: your_query = ' '.join(message.text.split()[1:]) user_action_log(message, "entered this query for /wiki:\n{0}".format(your_query)) try: # определяем язык запроса. Эвристика для английского и русского if all(ord(x) < 127 or not x.isalpha() for x in your_query): wikipedia.set_lang('en') # TODO: a bit dirty condition elif all(ord(x) < 127 or (ord('Ё') <= ord(x) <= ord('ё')) or not x.isalpha() for x in your_query): wikipedia.set_lang('ru') else: wikipedia.set_lang(detect(your_query)) wiki_response = wikipedia.summary(your_query, sentences=7) if '\n \n' in str(wiki_response): wiki_response = "{}...\n\n" \ "<i>В данной статье " \ "имеется математическая вёрстка. " \ "Ссылка на статью:</i>".format(str(wiki_response).split('\n \n', 1)[0]) # print(wiki_response) # извлекаем ссылку на саму статью wiki_url = parse.unquote(wikipedia.page(your_query).url) # извлекаем название статьи wiki_title = wikipedia.page(your_query).title my_bot.reply_to(message, "<b>{0}.</b>\n{1}\n\n{2}".format( wiki_title, wiki_response, wiki_url), parse_mode="HTML") user_action_log(message, "got Wikipedia article\n{0}".format(str(wiki_title))) # всё плохо, ничего не нашли except wikipedia.exceptions.PageError: my_bot.reply_to(message, "Запрос не найден.") user_action_log(message, "didn't received any data.") # нашли несколько статей, предлагаем пользователю список except wikipedia.exceptions.DisambiguationError as ex: wiki_options = ex.options my_bot.reply_to(message, "Пожалуйста, уточни запрос. " "Выбери, что из перечисленного имелось в виду, " "и вызови /wiki ещё раз.\n" + "\n".join(map(str, wiki_options))) print("There are multiple possible pages for that article.\n") # берём рандомную статью на рандомном языке (языки в config.py) else: wikipedia.set_lang(random.choice(['en', 'ru'])) wikp = wikipedia.random(pages=1) try: print("Trying to get Wikipedia article\n{0}".format(str(wikp))) wikpd = wikipedia.page(wikp) wiki_fact = wikipedia.summary(wikp, sentences=3) my_bot.reply_to(message, "<b>{0}.</b>\n{1}".format(wikpd.title, wiki_fact), parse_mode="HTML") user_action_log(message, "got Wikipedia article\n{0}".format(str(wikp))) except wikipedia.exceptions.DisambiguationError: wikp = wikipedia.random(pages=1) try: print("Trying to get Wikipedia article\n{0}".format(str(wikp))) wiki_var = wikipedia.search(wikp, results=1) print("There are multiple possible pages for that article.\n") # wikpd = wikipedia.page(str(wiki_var[0])) wiki_fact = wikipedia.summary(wiki_var, sentences=4) my_bot.reply_to(message, "<b>{0}.</b>\n{1}".format(wikp, wiki_fact), parse_mode="HTML") except wikipedia.exceptions.PageError: print("Page error for Wikipedia article\n{0}".format(str(wikp))) my_bot.reply_to(message, "<b>{0}.</b>".format("You're even unluckier"), parse_mode="HTML") except Exception as ex: exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] action_log("Unknown Exception in Wikipedia: {}: {}\nat {} line {}".format(exc_type, ex, fname, exc_tb.tb_lineno)) except wikipedia.exceptions.PageError: print("Page error for Wikipedia article\n{0}".format(str(wikp))) my_bot.reply_to(message, "<b>{0}.</b>".format("You're very unlucky bastard"), parse_mode="HTML") except Exception as ex: exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] action_log("Unknown Exception in Wikipedia: {}: {}\nat {} line {}".format(exc_type, ex, fname, exc_tb.tb_lineno))
def arxiv_random(message): user_action_log(message, "made arxiv random query") try: eastern = pytz.timezone('US/Eastern') eastern_time = datetime.datetime.now(eastern) # publications on 20:00 if eastern_time.hour < 20: eastern_time -= datetime.timedelta(days=1) # no publications on friday and saturday if eastern_time.weekday() == 5: eastern_time -= datetime.timedelta(days=2) elif eastern_time.weekday() == 4: eastern_time -= datetime.timedelta(days=1) last_published_date = eastern_time.strftime("%Y-%m-%d") response = requests.get('http://export.arxiv.org/oai2', params={'verb' : 'ListIdentifiers', 'set' : 'math', 'metadataPrefix': 'oai_dc', 'from' : last_published_date}) action_log("Random arxiv paper since {}".format(last_published_date)) # если всё хорошо if response.status_code == 200: response_tree = ElementTree.fromstring(response.content) num_of_papers = len(response_tree[2]) paper_index = random.randint(0, num_of_papers) paper_arxiv_id = response_tree[2][paper_index][0].text.split(':')[-1] # hardcoded papep_obj = arxiv.query(id_list=[paper_arxiv_id])[0] paper_link = papep_obj['pdf_url'].replace('http://', 'https://') + '.pdf' paper_link_name = paper_link.split("/pdf/")[1] print(paper_link) print(paper_link_name) req_pdf_size = requests.head(paper_link) pdf_size = round(int(req_pdf_size.headers["Content-Length"]) / 1024 / 1024, 2) a_name = papep_obj['authors'][0] if len(papep_obj['authors'])>1: a_name += 'et al.' query_answer = '{}. <a href="{}">{}</a>. {}\n\n— <a href="{}">{}</a>, {} Мб\n'.format( a_name, papep_obj['arxiv_url'], escape(papep_obj['title'].replace('\n', ' ')), escape(papep_obj['summary'].replace('\n', ' ')), paper_link, paper_link_name, pdf_size ) my_bot.reply_to(message, query_answer, parse_mode="HTML", disable_web_page_preview=False) user_action_log(message, "arxiv random query was successful: " "got paper {}".format(papep_obj['arxiv_url'])) # TODO(randl): doesn't send. Download and delete? # my_bot.send_document(message.chat.id, data=paper_link) elif response.status_code == 503: # слишком часто запрашиваем action_log("Too much queries. 10 minutes break should be enough") arxiv_checker.last_call = datetime.datetime.utcnow() - datetime.timedelta(seconds=610) else: # если всё плохо user_action_log(message, "arxiv random query failed: response {}".format(response.status_code)) except Exception as ex: exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] action_log("Unknown Exception: {}: {}\nat {} line {}".format(exc_type, ex, fname, exc_tb.tb_lineno))
def callback_chai(call): action_log(user_name(call.message.chat) + " called: " + call.data) current_controller.set_school_callback(call)