Skip to content

Commit

Permalink
Fix: repeater death & bad offset calculation
Browse files Browse the repository at this point in the history
  • Loading branch information
DUB1401 committed Sep 29, 2023
1 parent 1083e0f commit b36f04a
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 34 deletions.
43 changes: 21 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
@@ -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-сервисов.

Expand Down Expand Up @@ -47,28 +47,28 @@ 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.

## Версии поставляемых бинарных файлов
| Файл | Версия | Источник |
|---------|-------------------------------|--------------------------------------------------------------------|
| 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-запросов.
Expand All @@ -83,7 +83,7 @@ ___
```JSON
"token": ""
```
Сюда необходимо занести токен бота Telegram (можно получить у [BotFather](https://t.me/BotFather)). Можно использовать одни и те же токены для разных источников.
Сюда необходимо занести токен бота Telegram (можно получить у [BotFather](https://t.me/BotFather)).
___
```JSON
"target": ""
Expand All @@ -105,7 +105,7 @@ ___
```JSON
"disable-web-page-preview": true
```
Если включено, для ссылок из сообщений, в том числе форматированных, не будет отображаться предпросмотр.
Если включено, для ссылок, в том числе форматированных, не будет отображаться предпросмотр веб-содержимого под сообщениями.
___
```JSON
"blacklist": []
Expand All @@ -122,7 +122,7 @@ ___
В данной секции можно указать, какие типы вложений требуется пересылать в Telegram.

## Open API
Для добавления новой конфигурации создайте копию файла _# Open API Example.json_ и переименуйте её. Имя файла может быть любым, но рекомендуется использовать только латинские буквы.
Для добавления новой конфигурации создайте копию файла _# Open API Example.json_ и переименуйте её. Имя файла может быть любым, но рекомендуется использовать алиас сообщества ВКонтакте, указанный в адресной строке.
___
```JSON
"api": "Open"
Expand All @@ -132,7 +132,7 @@ ___
```JSON
"token": ""
```
Сюда необходимо занести токен бота Telegram (можно получить у [BotFather](https://t.me/BotFather)). Можно использовать одни и те же токены для разных источников.
Сюда необходимо занести токен бота Telegram (можно получить у [BotFather](https://t.me/BotFather)).
___
```JSON
"target": ""
Expand All @@ -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
Expand All @@ -159,7 +159,7 @@ ___
```JSON
"disable-web-page-preview": true
```
Если включено, для ссылок из сообщений, в том числе форматированных, не будет отображаться предпросмотр.
Если включено, для ссылок, в том числе форматированных, не будет отображаться предпросмотр веб-содержимого под сообщениями.
___
```JSON
"blacklist": []
Expand Down Expand Up @@ -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.
Expand All @@ -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
Expand Down
29 changes: 17 additions & 12 deletions Source/Open.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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):
Expand All @@ -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:
Expand All @@ -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()
logging.info(f"[Open API] Updates checked. New posts count: {NewPostsCount}.")
Binary file modified yt-dlp
Binary file not shown.

0 comments on commit b36f04a

Please sign in to comment.