diff --git a/README.md b/README.md index d530205..5df3fc1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # VK-Telegram Poster -**VK-Telegram Poster** – это инструмент автопостинга записей из сообществ ВКонтакте в каналы и группы Telegram с возможностью настройки пользовательского скрипта обработки постов. Поддерживается как [Callback API](https://dev.vk.com/ru/api/callback/getting-started), так и [Open API](https://dev.vk.com/ru/api/open-api/getting-started). +**VK-Telegram Poster** – это инструмент автопостинга записей из сообществ [ВКонтакте](https://vk.com/) в каналы и группы Telegram с возможностью настройки пользовательского скрипта обработки постов. Поддерживается как [Callback API](https://dev.vk.com/ru/api/callback/getting-started), так и [Open API](https://dev.vk.com/ru/api/open-api/getting-started). Для отправки сообщений используется буфер ожидания, что позволяет автопостеру корректно работать с включённым медленным режимом группы (чтобы игнорировать медленный режим или отправлять сообщения в канал, бот должен иметь права администратора). Также в скрипт внедрена возможность автоматического решения каптчи с использованием AI-сервисов. @@ -47,7 +47,7 @@ pip install vk_api pip install -r requirements.txt ``` 4. Создать в папке _Config_ файл конфигурации по предоставленному примеру (см. [здесь](#open-api)). -5. Настроить автопостер путём редактирования _Settings.json_. Указываемый аккаунт [ВКонтакте](https://vk.com/) должен иметь отключённую двухфакторную аутентификацию. +5. Настроить автопостер путём редактирования _Settings.json_. Указываемый аккаунт ВКонтакте должен иметь отключённую двухфакторную аутентификацию. Также настоятельно рекомендуется использовать постоянный токен доступа. 6. Для добавления пользовательского скрипта обработки постов можно внести изменения в файл _MessageEditor.py_. 7. Открыть директорию со скриптом в терминале. Можно использовать метод `cd` и прописать путь к папке, либо запустить терминал из проводника. Активировать автопостер командой `uvicorn vtp:App` (если используются оба типа API, тогда в качестве аргументов команде необходимо задать IP и порт по аналогии с [этим](#порядок-установки-и-использования--callback-api) руководством). 8. Для автоматического запуска службы рекомендуется провести инициализацию скрипта через [systemd](https://github.com/systemd/systemd) (пример [здесь](https://github.com/DUB1401/VK-Telegram-Poster/tree/main/systemd)) на Linux или путём добавления его в автозагрузку на Windows. @@ -55,20 +55,20 @@ pip install -r requirements.txt ## Версии поставляемых бинарных файлов | Файл | Версия | Источник | |---------|-------------------------------|--------------------------------------------------------------------| -| yt-dlp | _2023.07.06_ | [ссылка](https://github.com/yt-dlp/yt-dlp/releases/tag/2023.07.06) | +| yt-dlp | _2023.09.24_ | [ссылка](https://github.com/yt-dlp/yt-dlp/releases/tag/2023.07.06) | # Конфигурация источника Сервис предоставляет поддержку как [Callback API](https://dev.vk.com/ru/api/callback/getting-started), так и [Open API](https://dev.vk.com/ru/api/open-api/getting-started). Ниже приведено их сравнение. -| Признак | Callback API | Open API | +| Признак | Callback API | Open API | |-------------------|--------------------------------------------------------------------------|--------------------------------------------------------------------------------------------| -| Тип запросов | Запросы отправляет сервер [ВКонтакте](https://vk.com/) по заданному URL. | Скрипт сам отправляет запросы к серверам [ВКонтакте](https://vk.com/) и получает ответ. | +| Тип запросов | Запросы отправляет сервер ВКонтакте по заданному URL. | Скрипт сам отправляет запросы к серверам ВКонтакте и получает ответ. | | Требуемые права | Для верификации сервера требуются права администратора в сообществе. | Права администратора не требуются. | | Скорость отправки | Посты пересылаются практически моментально. | Посты запрашиваются с определённым интервалом, не менее 1 минуты. | -| Особенности | Часто требуется дополнительная настройка [nginx](https://nginx.org/). | Требуется аккаунт [ВКонтакте](https://vk.com/) с отключённой двухфакторной аутентификацией.| +| Особенности | Часто требуется дополнительная настройка [nginx](https://nginx.org/). | Требуется аккаунт ВКонтакте с отключённой двухфакторной аутентификацией. | > [!IMPORTANT] -> Для пересылки вложений типа _video_ необходимо, чтобы в сообществе [ВКонтакте](https://vk.com/) для раздела «Видео» было установленно значение _Открытые_ или _Ограниченные_. +> Для пересылки вложений типа _video_ необходимо, чтобы в сообществе ВКонтакте для раздела «Видео» было установленно значение _Открытые_ или _Ограниченные_. ## Callback API Для добавления новой конфигурации создайте копию файла _# Callback API Example.json_ и переименуйте её согласно источнику. Источник указывает конечную часть URI, использующегося для прослушивания Callback-запросов. @@ -83,7 +83,7 @@ ___ ```JSON "token": "" ``` -Сюда необходимо занести токен бота Telegram (можно получить у [BotFather](https://t.me/BotFather)). Можно использовать одни и те же токены для разных источников. +Сюда необходимо занести токен бота Telegram (можно получить у [BotFather](https://t.me/BotFather)). ___ ```JSON "target": "" @@ -105,7 +105,7 @@ ___ ```JSON "disable-web-page-preview": true ``` -Если включено, для ссылок из сообщений, в том числе форматированных, не будет отображаться предпросмотр. +Если включено, для ссылок, в том числе форматированных, не будет отображаться предпросмотр веб-содержимого под сообщениями. ___ ```JSON "blacklist": [] @@ -122,7 +122,7 @@ ___ В данной секции можно указать, какие типы вложений требуется пересылать в Telegram. ## Open API -Для добавления новой конфигурации создайте копию файла _# Open API Example.json_ и переименуйте её. Имя файла может быть любым, но рекомендуется использовать только латинские буквы. +Для добавления новой конфигурации создайте копию файла _# Open API Example.json_ и переименуйте её. Имя файла может быть любым, но рекомендуется использовать алиас сообщества ВКонтакте, указанный в адресной строке. ___ ```JSON "api": "Open" @@ -132,7 +132,7 @@ ___ ```JSON "token": "" ``` -Сюда необходимо занести токен бота Telegram (можно получить у [BotFather](https://t.me/BotFather)). Можно использовать одни и те же токены для разных источников. +Сюда необходимо занести токен бота Telegram (можно получить у [BotFather](https://t.me/BotFather)). ___ ```JSON "target": "" @@ -142,7 +142,7 @@ ___ ```JSON "wall-id": 0 ``` -Сюда необходимо занести ID сообщества [ВКонтакте](https://vk.com/). Быстро узнать его можно при помощи этого [сайта](https://regvk.com/id/). +Сюда необходимо занести ID сообщества ВКонтакте. Быстро узнать его можно при помощи [этого](https://regvk.com/id/) сайта. ___ ```JSON "clean-tags": true @@ -159,7 +159,7 @@ ___ ```JSON "disable-web-page-preview": true ``` -Если включено, для ссылок из сообщений, в том числе форматированных, не будет отображаться предпросмотр. +Если включено, для ссылок, в том числе форматированных, не будет отображаться предпросмотр веб-содержимого под сообщениями. ___ ```JSON "blacklist": [] @@ -199,11 +199,7 @@ ___ ```JSON "vk-access-token": "" ``` - -> [!NOTE] -> Данный способ является рекомендуемым для постоянного использования, однако при перезапуске автопостера может потребоваться обновление токена. - -Если [ВКонтакте](https://vk.com/) блокирует вашу авторизацию, а каптчу не удаётся решить при помощи AI, вы можете вручную получить постоянный токен доступа для вашего аккаунта и выполнять запросы с его использованием. Для этого необходимо выполнить нижеперечисленные шаги: +Если [ВКонтакте](https://vk.com/) блокирует вашу авторизацию, а каптчу не удаётся решить при помощи AI, вы можете вручную получить постоянный токен доступа для вашего аккаунта и проводить запросы с его использованием. Для этого необходимо выполнить нижеперечисленные шаги: 1. В любом браузере, поддерживающем расширения [Chromium](https://github.com/chromium/chromium), авторизуйтесь в [ВКонтакте](https://vk.com/). 2. Если вы планируете использовать автопостер на устройстве, IP которого отличается от вашего текущего (например, на собственном сервере), выполняйте шаги по порядку, иначе можете сразу переходить к пункту №8. @@ -216,22 +212,25 @@ http_access allow all 5. Перезапустите службу [Squid](https://github.com/squid-cache/squid). 6. Установите в ваш браузер [это](https://chromewebstore.google.com/detail/proxycontrol-%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80-%D0%B4%D0%BB%D1%8F/hjocpjdeacglfchomobaagbmipeggnjg) расширение и в его настройки занесите IP вашего сервера и стандартный прослушиваемый порт – **3128**. Включите расширение. 7. Откройте в браузере любой [сервис](https://whoer.net/ru), определяющий ваш IP, и убедитесь в том, что прокси работает. -8. Перейдите по [ссылке](https://oauth.vk.com/authorize?client_id=6121396&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=offline,wall&response_type=token&v=5.154), подтвердите предоставление прав и скопируйте токен из адресной строки браузера начиная от **token=** до **&expires_in**. +8. Перейдите по [ссылке](https://oauth.vk.com/authorize?client_id=6121396&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=offline,wall&response_type=token&v=5.154), подтвердите предоставление прав и скопируйте токен из адресной строки браузера начиная от **token=** до **&expires_in=0**. + +> [!WARNING] +> Помните, что токен выдаётся для одного IP адреса, при смене которого процедуру необходимо повторить. ___ ```JSON "openapi-period": 60 ``` -Задаёт интервал запросов для [Open API](https://dev.vk.com/ru/api/open-api/getting-started) в минутах. +Задаёт интервал запросов для Open API в минутах. Фактически, указывает, с какой частотой будет проверяться наличие новых постов в источниках. ___ ```JSON "confirmation-code": "" ``` -Указывает код подтверждения, необходимый для валидации прослушивающего сервера. +Указывает код подтверждения, необходимый для валидации прослушивающего сервера Callback API. ___ ```JSON "logging": true ``` -Если включено, скрипт будет вести логи инициализации и прослушивания запросов. +Если включено, скрипт будет вести логи инициализации и обработки новых постов. ___ ```JSON "debug": false diff --git a/Source/Open.py b/Source/Open.py index fbf2356..825abc0 100644 --- a/Source/Open.py +++ b/Source/Open.py @@ -83,7 +83,7 @@ def __GetUpdates(self, ConfigName: str) -> list[dict]: # Пока не будет найдено обновление. while IsUpdated == False: # Получение последних 20 постов. - Bufer = self.__GetPosts(Config["wall-id"], Offset = (20 * RequestIndex) + 1) + Bufer = self.__GetPosts(Config["wall-id"], Offset = 20 * RequestIndex) # Если ID последнего отправленного поста записан. if Config["last-post-id"] != None: @@ -332,6 +332,9 @@ def __init__(self, Settings: dict, ConfiguratorObject: Configurator, BotsManager # Немедленная проверка новых постов и активация таймера. self.CheckUpdates() + # Активация таймера. + self.__Repeater = Timer(float(self.__Settings["openapi-period"] * 60), self.CheckUpdates) + self.__Repeater.start() # Интервально проверяет обновления и добавляет сообщения в очередь отправки. def CheckUpdates(self): @@ -343,13 +346,19 @@ def CheckUpdates(self): NewPostsCount = 0 # Список постов. Posts = list() + # Список индексов мёртвых потоков. + DeadThreadsIndexes = list() # Проверка работы потоков. for Index in range(0, len(self.__PostsEditorsThreads)): - - # Если поток завершил работу, то удалить его из списка. + + # Если поток завершил работу, то записать его индекс. if self.__PostsEditorsThreads[Index].is_alive() == False: - self.__PostsEditorsThreads.pop(Index) + DeadThreadsIndexes.append(Index) + + # Удалить потоки по индексам начиная с конца. + for Index in reversed(DeadThreadsIndexes): + self.__PostsEditorsThreads.pop(Index) # Для каждой конфигурации. for Source in Configs: @@ -367,13 +376,9 @@ def CheckUpdates(self): # Запуск потока обработчика поста в список. self.__PostsEditorsThreads[-1].start() - - # Запись ID последнего отправленного поста в конфигурацию. - if len(Posts) > 0: - self.__WriteLastPostID(Source, Posts[-1]["id"]) + # Запись ID последнего отправленного поста в конфигурацию. + if len(Posts) > 0: + self.__WriteLastPostID(Source, Posts[-1]["id"]) # Запись в лог сообщения: количество обновлённых постов. - logging.info(f"[Open API] Updates checked. New posts count: {NewPostsCount}.") - # Активация таймера. - self.__Repiter = Timer(float(self.__Settings["openapi-period"] * 60), self.CheckUpdates) - self.__Repiter.start() \ No newline at end of file + logging.info(f"[Open API] Updates checked. New posts count: {NewPostsCount}.") \ No newline at end of file diff --git a/yt-dlp b/yt-dlp index 4d60a0a..2b7e826 100644 Binary files a/yt-dlp and b/yt-dlp differ