Исправление цикла для ВК и небольшие правки
This commit is contained in:
5
.gitignore
vendored
5
.gitignore
vendored
@@ -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
143
del-tests.py
Normal 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())
|
86
news-bot.py
86
news-bot.py
@@ -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)
|
||||||
|
Reference in New Issue
Block a user