diff --git a/.gitignore b/.gitignore index a6ba59d..69083d4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,5 @@ .fleet __pycache__ -keys*.py -vkdel.py -tgdel.py *.session -*del-tests.py -.idea \ No newline at end of file +.idea +.gigaide \ No newline at end of file diff --git a/del-tests.py b/del-tests.py new file mode 100644 index 0000000..8f76172 --- /dev/null +++ b/del-tests.py @@ -0,0 +1,143 @@ +import discord +import asyncio +import requests +import logging +import time + +from telethon import TelegramClient, events +from discord.ext.commands import Bot + +import keys # Файл, где хранятся ваши ключи доступа + +url_vk_get = "https://api.vk.com/method/wall.get" +url_vk_delete = "https://api.vk.com/method/wall.delete" + +# Укажите ваши токены и ID каналов +TELEGRAM_API_ID = keys.api_id_tg +TELEGRAM_API_HASH = keys.api_hash_tg +DISCORD_TOKEN = keys.discord_token +TELEGRAM_CHAT_ID = keys.channel_username_tg +DISCORD_CHANNEL_ID = keys.dicord_channel # Укажите ID вашего канала + +# Создание экземпляра клиента Telethon +telegram_client = TelegramClient('session_name', TELEGRAM_API_ID, TELEGRAM_API_HASH) + + +# Удаление сообщений из Telegram +async def delete_all_telegram_messages(client, chat_id): + async for message in client.iter_messages(chat_id): + try: + await client.delete_messages(chat_id, message.id) + time.sleep(1.0) + print(f"Удалено сообщение {message.id}") + except Exception as e: + print(f"Не удалось удалить сообщение {message.id}: {e}") + + +# Удаление сообщений из Discord +class MyClient(discord.Client): + async def on_ready(self): + print(f'Вошли как {self.user}') + channel = self.get_channel(DISCORD_CHANNEL_ID) + if channel is not None: + await self.delete_all_messages(channel) + + async def delete_all_messages(self, channel): + try: + async for message in channel.history(limit=100): # Установите лимит + try: + await message.delete() + print(f'Удалено сообщение {message.id}') + except Exception as e: + print(f"Не удалось удалить сообщение {message.id}: {e}") + except Exception as e: + print(f"Не удалось получить историю сообщений: {e}") + await self.close() + + +intents = discord.Intents.default() +intents.message_content = True +discord_client = MyClient(intents=intents) + + +# Основная функция +async def main(): + await telegram_client.start() + print("Telegram клиент запущен") + await delete_all_telegram_messages(telegram_client, TELEGRAM_CHAT_ID) + await telegram_client.disconnect() + + +params_get = { + 'access_token': keys.user_token_vk, + 'v': '5.199', # Версия API + 'owner_id': str(keys.own_id), + 'count': 100, + 'offset': 0 +} + + +def get_all_posts(): + all_posts = [] + while True: + response = requests.get(url_vk_get, params=params_get) + data = response.json() + print(data) + if 'error' in data: + logging.error(f"Ошибка {data['error']['error_code']}: {data['error']['error_msg']}") + break + + items = data.get('response', {}).get('items', []) + if not items: + break + + all_posts.extend(items) + if len(items) < 100: + break + + params_get['offset'] += 100 + + return all_posts + + +params_delete = { + 'access_token': keys.user_token_vk, + 'v': '5.199' # Версия API +} + + +def delete_post(post_id): + params_delete.update({ + 'owner_id': str(keys.own_id), + 'post_id': post_id + }) + response = requests.post(url_vk_delete, params=params_delete) + data = response.json() + if 'error' in data: + logging.error(f"Ошибка {data['error']['error_code']}: {data['error']['error_msg']}") + return False + return True + + +def delete_all_posts(): + print("Удаление ВК постов запущено") + all_posts = get_all_posts() + print(all_posts) + if not all_posts: + logging.info("Нет постов для удаления") + return + + for post in all_posts: + + post_id = post['id'] + if delete_post(post_id): + logging.info(f"Пост {post_id} успешно удален") + else: + logging.error(f"Не удалось удалить пост {post_id}") + time.sleep(1.0) # Пауза между запросами, чтобы избежать превышения лимитов API + + +if __name__ == "__main__": + delete_all_posts() + discord_client.run(DISCORD_TOKEN) + asyncio.run(main()) diff --git a/news-bot.py b/news-bot.py index 55fe81d..5e89a89 100755 --- a/news-bot.py +++ b/news-bot.py @@ -41,7 +41,7 @@ params_get = { } logger = logging.getLogger() -logger.setLevel(logging.INFO) +logger.setLevel(logging.DEBUG) handler = colorlog.StreamHandler() handler.setFormatter(colorlog.ColoredFormatter( @@ -489,43 +489,46 @@ def get_vk_topics(): def check_vk_posts(): vk_posts = get_vk_topics() if not vk_posts: - logging.warning(f"Постов на стене нет{vk_posts}") - - list_titles_and_ids = news() - list_titles_and_ids = [pair for pair in list_titles_and_ids if pair[0] >= keys.start_topic_id] - if list_titles_and_ids: - list_for_public = [] - for topic_id, topic_title in list_titles_and_ids: - # Сравнение заголовков с текстами постов - if not any(topic_title in vk_posts for vk_posts in vk_posts): - list_for_public.append((topic_id, topic_title)) - - if not list_for_public: - logging.warning(f"Новостей для публикации в ВК нет") - else: - # Отфильтровываем посты ниже определенного ID статьи - for topic_id, topic_title in reversed(list_for_public): - logging.info(f"Новости для публикации в ВК: {list_for_public}") - text_data = news_content(topic_id) - if text_data: - content = f"{topic_title}\t\n" + text_data + "\n" - content = remove_markdown_links(content) - - content = re.sub(r'https://linux-gaming.ru/uploads/default/original/1X/5cfa59077a5275971401fab0114e56f3ffdd0ec4.png', '\n', content, flags=re.DOTALL) - links = extract_links(content) - if "Кумулятивное обновление скриптов" in topic_title: - # Пример добавления изображения с постом - vk_post(url_vk_post, content, "photo-99238527_457244491") - else: - if links: - vk_post(url_vk_post, content, links) - else: - vk_post(url_vk_post, content) - else: - logging.warning(f"Не удалось получить текст новости {topic_id}") - time.sleep(1.0) + logging.warning(f"Постов на стене нет {vk_posts}") else: - logging.warning(f"Новостей для публикации в ВК нет") + list_titles_and_ids = news() + list_titles_and_ids = [pair for pair in list_titles_and_ids if pair[0] >= keys.start_topic_id] + + if list_titles_and_ids: + list_for_public = [] + # Отфильтровываем посты ниже определенного ID статьи + for topic_id, topic_title in list_titles_and_ids: + # Сравнение заголовков с текстами постов + if not any(topic_title in vk_posts for vk_posts in vk_posts): + list_for_public.append((topic_id, topic_title)) + + if not list_for_public: + logging.warning(f"Новостей для публикации в ВК нет") + else: + # Отфильтровываем посты ниже определенного ID статьи + for topic_id, topic_title in reversed(list_for_public): + logging.info(f"Новости для публикации в ВК: {list_for_public}") + text_data = news_content(topic_id) + if text_data: + content = f"{topic_title}\t\n" + text_data + "\n" + content = remove_markdown_links(content) + + content = re.sub(r'https://linux-gaming.ru/uploads/default/original/1X/5cfa59077a5275971401fab0114e56f3ffdd0ec4.png', '\n', content, flags=re.DOTALL) + links = extract_links(content) + + if "Кумулятивное обновление скриптов" in topic_title: + # Пример добавления изображения с постом + vk_post(url_vk_post, content, "photo-99238527_457244491") + else: + if links: + vk_post(url_vk_post, content, links) + else: + vk_post(url_vk_post, content) + else: + logging.warning(f"Не удалось получить текст новости {topic_id}") + time.sleep(1.0) + else: + logging.warning(f"Новостей для публикации в ВК нет") def tg_post(post_text, client_tg): @@ -574,12 +577,11 @@ async def check_tg_news(): except FloodWaitError as e: logging.warning(f"Flood wait error: нужно подождать {e.seconds} секунд.") await asyncio.sleep(e.seconds) # Ждем - time.sleep(1.0)# указанное время перед повторной попыткой + time.sleep(1.0) # указанное время перед повторной попыткой def run_job(): - loop = asyncio.get_event_loop() - loop.run_until_complete(job()) + asyncio.run(job()) if __name__ == '__main__': @@ -587,9 +589,9 @@ if __name__ == '__main__': run_job() # Планируем выполнение задачи каждые N минут - schedule.every(30).minutes.do(run_job) + schedule.every(30).minutes.do(check_vk_posts).do(run_job) logger.info("Запуск планировщика задач") while True: schedule.run_pending() - time.sleep(1) + time.sleep(5)