Исправление цикла для ВК и небольшие правки

This commit is contained in:
2024-11-10 21:27:50 +03:00
parent 9483aad1fa
commit 188acdd812
3 changed files with 189 additions and 47 deletions

5
.gitignore vendored
View File

@@ -1,8 +1,5 @@
.fleet .fleet
__pycache__ __pycache__
keys*.py
vkdel.py
tgdel.py
*.session *.session
*del-tests.py
.idea .idea
.gigaide

143
del-tests.py Normal file
View File

@@ -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())

View File

@@ -41,7 +41,7 @@ params_get = {
} }
logger = logging.getLogger() logger = logging.getLogger()
logger.setLevel(logging.INFO) logger.setLevel(logging.DEBUG)
handler = colorlog.StreamHandler() handler = colorlog.StreamHandler()
handler.setFormatter(colorlog.ColoredFormatter( handler.setFormatter(colorlog.ColoredFormatter(
@@ -489,43 +489,46 @@ def get_vk_topics():
def check_vk_posts(): def check_vk_posts():
vk_posts = get_vk_topics() vk_posts = get_vk_topics()
if not vk_posts: if not vk_posts:
logging.warning(f"Постов на стене нет{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)
else: 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): def tg_post(post_text, client_tg):
@@ -574,12 +577,11 @@ async def check_tg_news():
except FloodWaitError as e: except FloodWaitError as e:
logging.warning(f"Flood wait error: нужно подождать {e.seconds} секунд.") logging.warning(f"Flood wait error: нужно подождать {e.seconds} секунд.")
await asyncio.sleep(e.seconds) # Ждем await asyncio.sleep(e.seconds) # Ждем
time.sleep(1.0)# указанное время перед повторной попыткой time.sleep(1.0) # указанное время перед повторной попыткой
def run_job(): def run_job():
loop = asyncio.get_event_loop() asyncio.run(job())
loop.run_until_complete(job())
if __name__ == '__main__': if __name__ == '__main__':
@@ -587,9 +589,9 @@ if __name__ == '__main__':
run_job() run_job()
# Планируем выполнение задачи каждые N минут # Планируем выполнение задачи каждые N минут
schedule.every(30).minutes.do(run_job) schedule.every(30).minutes.do(check_vk_posts).do(run_job)
logger.info("Запуск планировщика задач") logger.info("Запуск планировщика задач")
while True: while True:
schedule.run_pending() schedule.run_pending()
time.sleep(1) time.sleep(5)