From fe5e52c74089f8275a1e037f8b4a8ee571100cbe Mon Sep 17 00:00:00 2001 From: lpetrov02 <71082527+lpetrov02@users.noreply.github.com> Date: Sat, 28 Nov 2020 19:14:58 +0300 Subject: [PATCH 1/3] Add files via upload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Написал бота. Понимает некоторые штуки, но суть такова: получает формат: "group_id: .....; period: .....", пробелы важны. Возвращает процент онлайн - разово. Вырубается по команде stop --- messages_test.py | 227 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 messages_test.py diff --git a/messages_test.py b/messages_test.py new file mode 100644 index 0000000..8debb51 --- /dev/null +++ b/messages_test.py @@ -0,0 +1,227 @@ +import vk +import datetime +import requests +import time +import random +import math + + +class Group: + """ + we don't really need this now but i suppose it would be useful in the nearest future + """ + + def __init__(self, group_id, freq): + self.group_id = group_id + self.begin = datetime.datetime.now() + self.frequency = freq + + def count_online_proportion(self): + """ + gets the number of members online, ant the total number of members, not counting those, + whose info is not is not available + :param self: the object of the class Group. We need the group id + :return: two integers - the number of members with available online-information and the number of members online + """ + amount = 0 + online = 0 + your_group_info = vk_api.groups.getById(group_id=self.group_id, fields='members_count') + number_of_members = your_group_info[0]['members_count'] + one_more_number_of_members = number_of_members + already_count = 0 + while already_count < number_of_members: + group_members_ids = vk_api.groups.getMembers(group_id=self.group_id, offset=already_count, fields='online') + for x in group_members_ids['items']: + if 'online' in x: + online += x['online'] + else: + one_more_number_of_members -= 1 + already_count += 1000 + if one_more_number_of_members == 0: + return -1, -1 + else: + return one_more_number_of_members, online + + def group_analyse(self): + t0 = time.time() + current_time = datetime.datetime.now() + + all_members, online_members = self.count_online_proportion() + percent = online_members / all_members * 100 + percent = math.ceil(percent) + + t0 = time.time() - t0 + return t0, percent + + def group_analyse1(self): + t0 = time.time() + all_members, online_members = self.count_online_proportion() + percent = online_members / all_members * 100 + percent = math.ceil(percent) + + t0 = time.time() - t0 + if t0 >= self.frequency * 60: + print("Sorry, I can't work so fast, so I will count statistics as fast as i can") + while True: + # message, user_id = get_message(my_number_group_id) + current_time = datetime.datetime.now() + + all_members, online_members = self.count_online_proportion() + percent = online_members / all_members * 100 + percent = math.ceil(percent) + + print("Time: " + str(current_time) + ". Online percent in " + self.group_id + " is " + str( + percent) + "%") + print( + "_____________________________________________________________________________________________") + else: + while True: + current_time = datetime.datetime.now() + t0 = time.time() + + all_members, online_members = self.count_online_proportion() + percent = online_members / all_members * 100 + percent = math.ceil(percent) + + print("Time: " + str(current_time) + ". Online percent in " + self.group_id + " is " + str( + percent) + "%") + print( + "_____________________________________________________________________________________________") + t0 = time.time() - t0 + time.sleep(self.frequency * 60 - t0) + + +token = "65e6efa565e6efa565e6efa54f6593fb1f665e665e6efa53a5c6937a4636b3416a8bd92" +group_token = "17e681fbe171945431a04f1abc752d41ff888698288abf74124de4e782c67f36e76484601991870f56b7a" +analyse_group_id = 'memkn' +my_group_id = 'memkn_funclub' +my_number_group_id = 200698416 + +session1 = vk.AuthSession(access_token=token) +session2 = vk.AuthSession(access_token=group_token) +vk_api = vk.API(session1, v=5.92) +vk_api2 = vk.API(session2, v=5.92) + +month_length = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] + + +def get_user_last_seen(profile_id): + """ + shows when user was online + :param profile_id: + :return time: + """ + value = vk_api.users.get(user_ids=profile_id, fields='last_seen') + if 'last_seen' not in value[0]: + return None + online_time = datetime.datetime.fromtimestamp(value[0]['last_seen']['time']) + return online_time + + +def get_group_followers(group_page_id, done): + """ + gets the list of the group members, not more than 1000 + :param group_page_id: + :param done: shows the indent + :return list of members' ids: + """ + value = vk_api.groups.getMembers(group_id=group_page_id, offset=done) + followers_id = [] + for user in value['items']: + followers_id.append(user) + return followers_id + + +def approximate_time(real_time): + """ + gets time user was last seen and adds two minutes + :param real_time: time user was last seen online + :return: real_time plus 2 min + """ + + hours = real_time.hour + days = real_time.day + months = real_time.month + years = real_time.year + # обработка редких случаев + if years % 4 == 0 and years % 100 != 0 or years % 400 == 0: + month_length[1] += 1 + if real_time.minute >= 58: + hours = real_time.hour + 1 + if hours == 24: + hours = 0 + days += 1 + if days > month_length[months - 1]: + days = 1 + months += 1 + if months > 12: + months = 1 + years += 1 + + approximate_online_time = real_time.replace(minute=(real_time.minute + 2) % 60, + hour=hours, day=days, month=months, year=years) + return approximate_online_time + + +def is_online(online_time): + # just checks if the user is online or not, returns 0 or 1 + + now_time = datetime.datetime.now() + now_time = now_time.replace(microsecond=0) + if online_time >= now_time: + return 1 + else: + return 0 + + +def get_message(group_id, server_, ts_, key_): + # some = vk_api2.groups.getLongPollServer(group_id=group_id) + response = requests.get('{server}?act=a_check&key={key}&ts={ts}&wait=25'.format + (server=server_, key=key_, ts=ts_)).json() + # print(response) + if len(response['updates']) > 0: + return response['updates'][0]['object']['body'], response['updates'][0]['object']['user_id'], response['ts'] + return "", -1, response['ts'] + + +some = vk_api2.groups.getLongPollServer(group_id=my_number_group_id) +current_ts = some['ts'] +server = some['server'] +key = some['key'] +message = "" +run = 1 +count = 0 +while run: + message, current_user_id, current_ts = get_message(my_number_group_id, server, current_ts, key) + + # print(message) + if message.count(';') > 0: + index = message.find(";") + if message[0: 10] == "group_id: " and message[index + 2: index + 10] == "period: ": + analyse_group_id = message[10: index] + frequency = message[index + 10:] + if frequency == "frequently": + frequency_number = 0 + elif frequency.isdigit(): + frequency_number = int(frequency) + else: + print("Error") + exit() + + group = Group(analyse_group_id, frequency_number) + start_time, percent = group.group_analyse() + string = "Online percent in " + group.group_id + " is " + str(percent) + "%" + vk_api2.messages.send(user_id=current_user_id, message=string, random_id=count) + count += 1 + # value = vk_api2.messages.getLongPollHistory(ts=current_ts, group_id=my_number_group_id) + elif message == "stop": + run = 0 + elif message == "hello" or message == "привет" or message == "Hello" or message == "Привет": + string = "Ну привет, " + value = vk_api2.users.get(user_ids=current_user_id, fields='first_name') + string += value[0]['first_name'] + vk_api2.messages.send(user_id=current_user_id, message=string, random_id=count) + else: + string = "I understand just such a format: 'group_id: *id*; period: * period time *'. Please, write correctly))" + vk_api2.messages.send(user_id=current_user_id, message=string, random_id=count) + count += 1 From b35e5369c743917091389208c0005c9d67b9c6d5 Mon Sep 17 00:00:00 2001 From: lpetrov02 <71082527+lpetrov02@users.noreply.github.com> Date: Sun, 29 Nov 2020 00:17:36 +0300 Subject: [PATCH 2/3] Add files via upload super bot --- messages_test.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/messages_test.py b/messages_test.py index 8debb51..6e565d1 100644 --- a/messages_test.py +++ b/messages_test.py @@ -216,12 +216,16 @@ def get_message(group_id, server_, ts_, key_): # value = vk_api2.messages.getLongPollHistory(ts=current_ts, group_id=my_number_group_id) elif message == "stop": run = 0 + vk_api2.messages.send(user_id=current_user_id, message="Goodbye!", random_id=count) + count += 1 elif message == "hello" or message == "привет" or message == "Hello" or message == "Привет": string = "Ну привет, " value = vk_api2.users.get(user_ids=current_user_id, fields='first_name') string += value[0]['first_name'] vk_api2.messages.send(user_id=current_user_id, message=string, random_id=count) - else: + count += 1 + elif message != "": string = "I understand just such a format: 'group_id: *id*; period: * period time *'. Please, write correctly))" vk_api2.messages.send(user_id=current_user_id, message=string, random_id=count) count += 1 + From e6cb757b5a1d091e779a18a235213dab4fd8cca7 Mon Sep 17 00:00:00 2001 From: lpetrov02 <71082527+lpetrov02@users.noreply.github.com> Date: Mon, 30 Nov 2020 15:24:46 +0300 Subject: [PATCH 3/3] Add files via upload upgraded bot --- messages_test.py | 96 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 77 insertions(+), 19 deletions(-) diff --git a/messages_test.py b/messages_test.py index 6e565d1..c7e173f 100644 --- a/messages_test.py +++ b/messages_test.py @@ -53,6 +53,12 @@ def group_analyse(self): t0 = time.time() - t0 return t0, percent + def work_and_print(self, count, current_user_id): + start_time, percent = self.group_analyse() + string = "Online percent in " + self.group_id + " is " + str(percent) + "%" + vk_api2.messages.send(user_id=current_user_id, message=string, random_id=count) + return count + 1 + def group_analyse1(self): t0 = time.time() all_members, online_members = self.count_online_proportion() @@ -136,7 +142,7 @@ def approximate_time(real_time): """ gets time user was last seen and adds two minutes :param real_time: time user was last seen online - :return: real_time plus 2 min + :return: real_time plus delta min """ hours = real_time.hour @@ -184,6 +190,39 @@ def get_message(group_id, server_, ts_, key_): return "", -1, response['ts'] +def count_new_time(time_now, period): + d_minutes = period + d_hours = 0 + if period > 59: + d_minutes = period % 60 + d_hours = period // 60 + minutes = time_now.minute + hours = time_now.hour + days = time_now.day + months = time_now.month + years = time_now.year + if years % 4 == 0 and years % 100 != 0 or years % 400 == 0: + month_length[1] += 1 + + minutes = (minutes + d_minutes) % 60 + if minutes < time_now.minute: + hours += 1 + hours += d_hours + if hours > 23: + hours %= 24 + days += 1 + if days > month_length[time_now.month]: + days = 1 + months += 1 + if months > 12: + months = 1 + years += 1 + month_length[1] -= 1 + + new_time = time_now.replace(minute=minutes, hour=hours, day=days, month=months, year=years) + return new_time + + some = vk_api2.groups.getLongPollServer(group_id=my_number_group_id) current_ts = some['ts'] server = some['server'] @@ -191,30 +230,49 @@ def get_message(group_id, server_, ts_, key_): message = "" run = 1 count = 0 +have_a_task = 0 +group = Group(-1, -1) while run: message, current_user_id, current_ts = get_message(my_number_group_id, server, current_ts, key) + if have_a_task and datetime.datetime.now() >= next_time: + current_minutes = time_start.minute + next_time = count_new_time(next_time, group.frequency) + count = group.work_and_print(count, master_id) # print(message) if message.count(';') > 0: index = message.find(";") - if message[0: 10] == "group_id: " and message[index + 2: index + 10] == "period: ": - analyse_group_id = message[10: index] - frequency = message[index + 10:] - if frequency == "frequently": - frequency_number = 0 - elif frequency.isdigit(): - frequency_number = int(frequency) - else: - print("Error") - exit() - - group = Group(analyse_group_id, frequency_number) - start_time, percent = group.group_analyse() - string = "Online percent in " + group.group_id + " is " + str(percent) + "%" - vk_api2.messages.send(user_id=current_user_id, message=string, random_id=count) - count += 1 - # value = vk_api2.messages.getLongPollHistory(ts=current_ts, group_id=my_number_group_id) - elif message == "stop": + if index > 10 and len(message) - index - 10 > 0: + if message[0: 10] == "group_id: " and message[index + 2: index + 10] == "period: ": + analyse_group_id = message[10: index].strip() + frequency = message[index + 10:].strip() + if frequency == "frequently" or frequency.isdigit(): + if frequency == "frequently": + frequency_number = 0 + else: + frequency_number = int(frequency) + have_a_task = 1 + master_id = current_user_id + # time when we start - in seconds and in a special type + t_start = time.time() + time_start = datetime.datetime.now() + current_minutes = time_start.minute + next_time = count_new_time(time_start, frequency_number) + # next_minutes - when to count again + group.group_id = analyse_group_id + group.frequency = frequency_number + count = group.work_and_print(count, current_user_id) + t_finish = time.time() - t_start + # if analysing took more time than the period: + if t_finish > frequency_number * 60: + vk_api2.messages.send(user_id=current_user_id, message="Can't work so fast((", random_id=count) + count += 1 + next_time = datetime.datetime.now() + frequency_number = 0 + group.frequency = 0 + else: + print("Error") + elif message == "stop" or message == "Stop": run = 0 vk_api2.messages.send(user_id=current_user_id, message="Goodbye!", random_id=count) count += 1