Комментарии 3
Да кто такой этот ваш VK API. Хотя иногда действительно в нём столько приколов, что кажется проще другими путями. Но почему именно такой формат?
Не проще было бы сделать табличку в sqlite с парой столбцов и просто проверять каждую минуту должно быть отправлено сообщение или нет? Токен с доступом к отправке сообщении можно получить через https://vkhost.github.io (для умников, токен получается локально и никуда не уходит). Кода меньше, работает надежнее, ресурсов жрёт меньше. В пару строк добавляется возможность отправки сообщении в чаты. Не нужно запускать несколько экземпляров на каждый чат для разных сообщении. GPT написал полностью рабочий код после простейшего промта
import vk_api
import sqlite3
import datetime
import time
import random
def get_pending_messages():
"""Получает сообщения, готовые к отправке."""
conn = sqlite3.connect('messages.db')
cursor = conn.cursor()
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
cursor.execute("SELECT rowid, user_id, message FROM message WHERE send_time <= ?", (now,))
rows = cursor.fetchall()
conn.close()
return rows
def delete_message(rowid):
"""Удаляет отправленное сообщение из базы."""
conn = sqlite3.connect('messages.db')
cursor = conn.cursor()
cursor.execute("DELETE FROM message WHERE rowid = ?", (rowid,))
conn.commit()
conn.close()
def send_message(vk, user_id, text):
"""Отправляет сообщение через VK API."""
try:
vk.messages.send(
user_id=user_id,
message=text,
random_id=random.randint(0, 2**32)
)
return True
except Exception as e:
print(f"Ошибка отправки: {e}")
return False
def check_and_send_messages(vk):
"""Проверяет и отправляет сообщения из базы."""
messages = get_pending_messages()
for row in messages:
rowid, user_id, message = row
if send_message(vk, user_id, message):
delete_message(rowid)
print(f"Отправлено пользователю {user_id}")
else:
print(f"Ошибка отправки пользователю {user_id}")
def main():
vk_session = vk_api.VkApi(token='YOUR_VK_TOKEN') # Замените на ваш токен
vk = vk_session.get_api()
print("Сервис отправки запущен...")
while True:
check_and_send_messages(vk)
time.sleep(60)
if __name__ == "__main__":
main()
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Пишем отложенные сообщения для ВК на питоне