Исправлены все основные проблемы: - Исправлена логика фильтрации сообщений по топикам в Telegram - Исправлен бесконечный цикл в VK клиенте get_wall_posts() - Добавлена асинхронная поддержка для VK в главном файле - Дедупликация работает корректно для всех платформ - Добавлена полная документация в CLAUDE.md и README.md 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
144 lines
4.4 KiB
Python
Executable File
144 lines
4.4 KiB
Python
Executable File
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())
|