Skip to content

Commit

Permalink
Best UX ever (beta)
Browse files Browse the repository at this point in the history
  • Loading branch information
Himura2la committed Sep 16, 2021
1 parent 7aae11a commit c1c86b2
Show file tree
Hide file tree
Showing 3 changed files with 133 additions and 46 deletions.
1 change: 1 addition & 0 deletions config.example.yml
Original file line number Diff line number Diff line change
Expand Up @@ -126,3 +126,4 @@ inviter_source_group: 'tulaanimefest'
inviter_target_group: 'yuki_no_odori_10'
inviter_add_friends: True
inviter_start_at: 0
inviter_captcha_scale_factor: 3
10 changes: 8 additions & 2 deletions vk-inviter/make.ps1
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
param (
[switch] $InstallRequirements,
[switch] $InstallPyInstaller,
[switch] $Clean,
[switch] $Compile
)
Set-Location $PSScriptRoot
Expand All @@ -18,9 +19,14 @@ if ($InstallPyInstaller) {
& py -m pip install --user --upgrade pyinstaller
$didSomething = $true
}
if ($Clean) {
Remove-Item -Recurse -Force ./dist
$didSomething = $true
}
if ($Compile) {
& py -m PyInstaller --onefile --specpath ./build ./vk_inviter.py
Remove-Item -Recurse ./build, ./__pycache__
& py -m PyInstaller --specpath ./build ./vk_inviter.py
Remove-Item -Recurse -Force ./build, ./__pycache__
'"%~dp0vk_inviter\vk_inviter.exe"' | Out-File "Приглашатор.bat" -Encoding Ascii
$didSomething = $true
}

Expand Down
168 changes: 124 additions & 44 deletions vk-inviter/vk_inviter.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ def collect_members(self, source_group, add_friends=True):
self.members_to_invite = []
if source_group:
self.members_to_invite += self.__massive_collect(self.VK.groups.getMembers,
v=self.vk_api_v,
group_id=source_group,
fields='id')
v=self.vk_api_v,
group_id=source_group,
fields='id')
if add_friends:
self.members_to_invite += self.__massive_collect(self.VK.friends.get,
v=self.vk_api_v,
fields='id')
v=self.vk_api_v,
fields='id')

self.members_to_invite = sorted(self.members_to_invite, key=lambda x: x['id'])
self.members_to_invite = {user_info['id']: user_info for user_info in self.members_to_invite}
Expand Down Expand Up @@ -127,42 +127,122 @@ def solve_captcha(self, img: Image):
def __submit_captcha(self, _):
self.captcha_submitted.set(True)



if __name__ == '__main__':
import os
from yaml import load, FullLoader

root_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
config = load(
open(os.path.join(root_dir, 'config.yml'), 'r', encoding='utf-8').read(),
Loader=FullLoader)
vk_token = config['vk_token']

captcha_scale_factor = 3
source_group = config['inviter_source_group']
target_group = config['inviter_target_group']
add_friends = config['inviter_add_friends']
start_at = config['inviter_start_at']

captchas_dir_name = 'vk_captchas'
if os.name == 'posix':
home_dir = os.path.expanduser('~')
home_dir_desc = f'в "{home_dir}"'
else:
home_dir = os.path.join(os.environ['USERPROFILE'], 'Desktop')
home_dir_desc = 'на рабочий стол'
captchas_dir = os.path.join(home_dir, captchas_dir_name)

captcha_size = (130*captcha_scale_factor, 50*captcha_scale_factor)
manual_solver = CaptchaManualSolver(tk.Tk(), captcha_size)
inviter = Inviter(vk_token, manual_solver.solve_captcha, captchas_dir)
inviter.collect_members(source_group, add_friends)
inviter.invite_all_members(target_group, start_at)

print('\nГотово! Мы сохранили все введённые Вами капчи ' +
f'{home_dir_desc} в папку "{captchas_dir_name}". ' +
'Если Вы хотите поспособствовать разработке автоматического ' +
'распознавателя капчи, заархивируйте эту папку и скиньте Химуре ' +
'(например, в телегу: https://t.me/Himura_Kazuto). ' +
'Если нет, то можно просто её удалить :(')
try:
if __name__ == '__main__':
import os
from sys import exit
from subprocess import call
from yaml import load, FullLoader

base_config = """
# Это настройки Приглашатора.
# Данный файл можно открывать и редактировать программой "Блокнот".
# Для начала, необходимо получить доступ к Вашей странице ВК.
# Пожалуйста, перейдите по ссылке и разрешите приложению доступ.
# https://oauth.vk.com/authorize?v=5.126&response_type=token&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=friends,groups&client_id=7728992
# Должна открыться белая страница с предупреждением.
# Скопируйте из адресной строки длинный набор букв и цифр между 'access_token=' и '&expires_in'.
# Вставьте его сюда между ковычками.
vk_token: ""
# Через 24 часа этот токен перестанет работать и придётся повторить процедуру.
# Никому его не показывайте: токен можно использовать вместо пароля от Вашей страницы ВК.
# Теперь, укажите из какой группы приглашать людей.
# Сейчас указана группа https://vk.com/tulaanimefest
# Замените слово tulaanimefest между ковычками на id своей группы.
inviter_source_group: "tulaanimefest"
# Далее, аналогичным образом, укажите куда приглашать людей.
# Помните, что массово приглашать можно только в мероприятие, организатором
# которого является указанная выше группа, а Вы должны быть админом этой группы.
inviter_target_group: "yuki_no_odori_10"
# Если Вы не хотите приглашать своих собственных друзей,
# замените True на False
inviter_add_friends: True
# Приглашатор умеет начинать рассылку приглашений с середины,
# так что поглядывайте на текущий номер. Если работа программы прервётся,
# Вы сможете указать его тут и продолжить рассылку.
inviter_start_at: 0
# В процессе рассылки, Вам придётся много вводить капчу. Капча очень маленькая
# и для удобства будет увеличиваться в указанно тут число раз.
inviter_captcha_scale_factor: 3
"""

def load_config():
config_name = 'config.yml'
config_encoding = 'utf-8'
script_dir = os.path.dirname(os.path.realpath(__file__))

config_path = os.path.join(os.path.dirname(script_dir), config_name)
if os.path.isfile(config_path):
config = load(open(config_path, 'r', encoding=config_encoding).read(), Loader=FullLoader)
config['__file_path'] = config_path
return config

with open(config_path, 'w', encoding=config_encoding) as f:
f.write(base_config)
config_path = os.path.realpath(config_path)
print('Добро пожаловать в Приглашатор! Мы не нашли файл с настройками и создали его ' +
f'вот здесь:\n\n{config_path}\n\nСейчас файл настроек должен был открыться ' +
'рядом в программе Блокнот.\n\nПожалуйста,\nотредактируйте файл настроек,\n' +
'сохраните его,\nзакройте блокнот (это окно закроется вместе с ним),\n' +
'и запустите Приглашатор ещё раз.')
call(['notepad', config_path])
exit(1)


config = load_config()
vk_token = config['vk_token']
source_group = config['inviter_source_group']
target_group = config['inviter_target_group']
add_friends = config['inviter_add_friends']
start_at = config['inviter_start_at']
captcha_scale_factor = config['inviter_captcha_scale_factor']

captchas_dir_name = 'vk_captchas'
if os.name == 'posix':
home_dir = os.path.expanduser('~')
home_dir_desc = f'в "{home_dir}"'
else:
home_dir = os.path.join(os.environ['USERPROFILE'], 'Desktop')
home_dir_desc = 'на рабочий стол'
captchas_dir = os.path.join(home_dir, captchas_dir_name)

captcha_size = (130*captcha_scale_factor, 50*captcha_scale_factor)
manual_solver = CaptchaManualSolver(tk.Tk(), captcha_size)
inviter = Inviter(vk_token, manual_solver.solve_captcha, captchas_dir)
try:
inviter.collect_members(source_group, add_friends)
except vk.exceptions.VkAPIError as e:
print('Похоже, что токен не работает... Вот, что про него говорит ВК:\n\n' +
f'{e.message} (ошибка {e.code})\n\n' +
'Пожалуйста,\nзамените vk_token в открытом файле настроек,\n' +
'сохраните его,\nзакройте блокнот (это окно закроется вместе с ним),\n' +
'и запустите Приглашатор ещё раз.')
call(['notepad', config['__file_path']])
exit(1)

inviter.invite_all_members(target_group, start_at)

print('\nГотово! Мы сохранили все введённые Вами капчи ' +
f'{home_dir_desc} в папку "{captchas_dir_name}".\n\n' +
'Если Вы хотите поспособствовать разработке автоматического ' +
'распознавателя капчи, заархивируйте эту папку и скиньте Химуре ' +
'(например, в телегу: https://t.me/Himura_Kazuto).\n' +
'Если нет, то можно просто её удалить :(')

except Exception as e:
import traceback
print("К сожалению, произошла неведомая фигня.\nВот немного технических деталей...\n" +
"пожалуйста, свяжитесь с Химурой (например, в телеге: https://t.me/Himura_Kazuto), " +
"и покажите ему это..\n")
traceback.print_exc()
input("\nПрограмма закроется, если нажать Enter. Больше она уже ничего не умеет...")

0 comments on commit c1c86b2

Please sign in to comment.