@pruha19

Как написать бота для отслеживания постов в группе ВКонтакте на User Long Poll API?

Помогите, пожалуйста, написать бота для отслеживания появления постов в определённой группе. А дальше уже сам допишу, благодарю.
  • Вопрос задан
  • 390 просмотров
Пригласить эксперта
Ответы на вопрос 1
@SD4RK
Не знаю зачем здесь именно Long Poll.
import time
import sqlite3
import hashlib
import vk_api




class GroupAlerts:
    def __init__(self, token):
        self.__groups_list = []
        self.__vk = vk_api.VkApi(token=token)
        self.__connection = sqlite3.connect("GroupAlerts.db")
        self.__cursor = self.__connection.cursor()
        self.__cursor.execute("""CREATE TABLE IF NOT EXISTS group_info(group_id INTEGER NOT NULL,
                                                                       last_wall_id VARCHAR,
                                                                       last_check INTEGER);
                              """)
        self.__connection.commit()
    def add_new(self, *args):
        for group in args:
            group_screen_name = "public{}".format(group) if str(group).isdigit() else group
            group_resolved_name = self.__vk.method("utils.resolveScreenName", {"screen_name": group_screen_name})
            if group_resolved_name == []:
                print("{} - invalid group id!".format(group))
                continue
            self.__groups_list.append(group_resolved_name["object_id"])
            walls = self.__vk.method("wall.get", {"owner_id": -group_resolved_name["object_id"], "count": 1})
            if walls["items"] != []:
                last_wall = walls["items"][0]
                last_wall_id = "{}_{}".format(last_wall["owner_id"], last_wall["id"])
                self.__cursor.execute("INSERT INTO group_info VALUES(?, ?, ?)",
                                  (group_resolved_name["object_id"], last_wall_id, time.time()))
            self.__connection.commit()

    def check_wall(self):
        for group_id in self.__groups_list:
            last_db_wall = self.__cursor.execute("SELECT * FROM group_info WHERE group_id=?",
                                                      (group_id,)).fetchone()
            if last_db_wall != [] and time.time() - last_db_wall[2] > 5:
                walls = self.__vk.method("wall.get", {"owner_id": -group_id, "count": 1})
                if walls["items"] != []:
                    last_wall = walls["items"][0]
                    last_wall_id = "{}_{}".format(last_wall["owner_id"], last_wall["id"])
                    if last_db_wall[1] != last_wall_id and last_wall["id"] > int(last_db_wall[1].split("_")[1]):
                        self.__cursor.execute("UPDATE group_info SET last_wall_id=? WHERE group_id=?",
                                              (last_wall_id, group_id))

                        yield last_wall
                self.__cursor.execute("UPDATE group_info SET last_check=? WHERE group_id=?",
                                      (time.time(), group_id))
                self.__connection.commit()


if __name__ == '__main__':
    gAlerts = GroupAlerts('ТОКЕН')
    gAlerts.add_new("ГРУППА")
    while True:
        for new_wall in gAlerts.check_wall():
            pass
            # Обработка записи здесь

Наверняка можно сделать это гораздо легче, но я лёгких путей не ищу.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы