Files
GoogleFormsFiller/__init__.py

410 lines
16 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!venv/bin/python3
from selenium import webdriver
import time
import requests
import random
import re
import progressbar
from os import path
from bs4 import BeautifulSoup
from datetime import datetime
logPath = './respondents.log'
banList = []
if path.exists('./ban_list.txt'):
print(datetime.now().strftime('[%X] ') + 'Обнаружен бан-лист')
f = open('./ban_list.txt')
for line in f.readlines():
banList.append(line.rstrip('\r\n').lower())
f.close()
professionsList = []
if path.exists('./professions_list.txt'):
print(datetime.now().strftime('[%X] ') + 'Обнаружен список профессий')
f = open('./professions_list.txt')
for line in f.readlines():
banList.append(line.lower())
f.close()
weightsList = {}
if path.exists('./weights_list.txt'):
print(datetime.now().strftime('[%X] ') + 'Обнаружены веса')
f = open('./weights_list.txt')
for line in f.readlines():
question = line.split(':')[0]
if question[-1:] == ' ':
question = question[:-1]
weights = line.split(':')[1].split()
weights = [float(num) for num in weights]
weightsList[question] = weights
f.close()
def log(header, data=None):
with open(logPath, 'a') as f:
f.write(datetime.now().strftime('[%X] ') + header + '\n')
if data:
for key, value in data.items():
f.write(f' {key}: {value}\n')
f.write('\n')
def button_by_text(text): # получение кнопки по тексту на ней
try:
button = driver.find_element_by_xpath(
f'//*[contains(text(), "{text}")]')
button.click()
return True
except Exception:
return False
def get_profession(): # получение случайной профессии в РФ, где 1 и 2 диапазон - профессии рабочих, 2 и 3 - должности служащих
global banList
coin = (1, 2, 3, 4)
coin = random.choices(coin, [0.1, 0.1, 0.4, 0.4], k=1)[0]
while True:
if coin == 1:
code = random.randint(10003, 19975)
elif coin == 2:
code = random.randint(30018, 33270)
elif coin == 3:
code = random.randint(20001, 27933)
else:
code = random.randint(40064, 47110)
page = requests.get(f'http://okpdtr.ru/?s={code}').text
soup = BeautifulSoup(page, features='html.parser')
try:
profession = soup.findAll("div", {"class": "my_col2"})[1]
profession = re.sub(r'\([^()]*\)', '', profession.get_text())
if not banList:
return profession
if not_in_ban_list(profession):
return profession
except:
pass
def not_in_ban_list(word):
global banList
wordLowReg = word.lower() # проверка на наличие слов из бан-листа
for badWord in banList:
if badWord in wordLowReg:
return False
return True
def profile_maker():
global driver
profile = {}
forms_list = driver.find_elements_by_class_name(
'freebirdFormviewerViewItemsItemItem') # получение форм со страницы
for form in forms_list:
header = form.find_element_by_class_name(
'freebirdFormviewerViewItemsItemItemHeader').text # получение заголовка формы
if header[-1:] == '*':
header = header[:-2]
if header == 'Укажите Ваш пол':
buttons_list = form.find_elements_by_class_name(
'docssharedWizToggleLabeledContainer') # получение кнопок-радио с формы
button = random.choices(buttons_list, [0.7, 0.3], k=1)[0]
button.click()
profile['Пол'] = button.text
elif header == 'Укажите Ваш возраст (полных лет)':
age = random.randint(18, 56)
field = form.find_elements_by_class_name('quantumWizTextinputPaperinputInput')[
0] # получение полей для ввода с формы
field.click()
field.send_keys(age)
profile['Возраст'] = age
elif header == 'Укажите Ваше образование (возможно несколько вариантов)':
buttons_list = form.find_elements_by_class_name(
'docssharedWizToggleLabeledContainer') # получение чекбоксов с формы
coin = random.randint(0, 4)
buttons_list[coin].click()
profile['Образование'] = buttons_list[coin].text
elif header == 'Выберите из списка основную сферу деятельности организации, в которой Вы сейчас работаете':
form.find_elements_by_class_name(
'quantumWizMenuPaperselectOption')[0].click()
coin = random.randint(3, 24)
time.sleep(1)
variant = form.find_element_by_xpath(
f'/html/body/div/div[2]/form/div/div/div[2]/div[5]/div/div[2]/div[2]/div[{coin}]') # перебор элементов выпадающего списка
profile['Сфера'] = variant.text
variant.click()
time.sleep(1.5)
elif header == 'Укажите Ваш стаж работы (полных лет) в указанной организации':
buttons_list = form.find_elements_by_class_name(
'docssharedWizToggleLabeledContainer') # получение кнопок-радио с формы
coin = random.randint(0, len(buttons_list) - 1)
buttons_list[coin].click()
profile['Стаж работы'] = buttons_list[coin].text
elif header == 'Укажите тип Вашей должности':
buttons_list = form.find_elements_by_class_name(
'docssharedWizToggleLabeledContainer') # получение кнопок-радио с формы
coin = random.randint(0, len(buttons_list) - 1)
buttons_list[coin].click()
profile['Тип должности'] = buttons_list[coin].text
elif header == 'Укажите название Вашей должности':
field = form.find_elements_by_class_name('quantumWizTextinputPapertextareaInput')[
0] # получение полей для ввода с формы
field.click()
profession = get_profession()
field.send_keys(profession)
profile['Должность'] = profession
elif header == 'Укажите Ваш стаж работы в текущей должности (полных лет)':
buttons_list = form.find_elements_by_class_name(
'docssharedWizToggleLabeledContainer') # получение кнопок-радио с формы
if profile['Стаж работы'] == 'Меньше 1 года':
max_variant = 0
elif profile['Стаж работы'] == 'От 1 года до 3 лет':
max_variant = 1
elif profile['Стаж работы'] == 'от 3 до 5 лет':
max_variant = 2
else:
max_variant = 3
coin = random.randint(0, max_variant)
buttons_list[coin].click()
profile['Стаж в текущей должности'] = buttons_list[coin].text
log('Новорожденный', profile)
def another_profile_maker():
global driver
forms_list = driver.find_elements_by_class_name(
'freebirdFormviewerViewItemsItemItem') # получение форм со страницы
for form in forms_list:
header = form.find_element_by_class_name(
'freebirdFormviewerViewItemsItemItemHeader').text # получение заголовка формы
if header[-1:] == '*':
header = header[:-2]
if header == 'Оцените свою удовлетворенность работой в команде группы разработчиков':
buttons_list = form.find_elements_by_class_name(
'appsMaterialWizToggleRadiogroupRadioButtonContainer') # получение кнопок-радио с формы
button = random.choices(
buttons_list, [0, 0, 0.05, 0.07, 0.88], k=1)[0]
button.click()
elif header == 'Оцените свою готовность продолжать работу в своей команде':
buttons_list = form.find_elements_by_class_name(
'appsMaterialWizToggleRadiogroupRadioButtonContainer') # получение кнопок-радио с формы
button = random.choices(
buttons_list, [0, 0, 0.01, 0.15, 0.84], k=1)[0]
button.click()
elif header == 'Укажите ваш стаж работы в IT-сфере':
buttons_list = form.find_elements_by_class_name(
'docssharedWizToggleLabeledLabelWrapper') # получение кнопок-радио с формы
button = random.choices(
buttons_list, [0.1, 0.49, 0.36, 0.05], k=1)[0]
button.click()
seniority = button.text
elif header == 'Укажите занимаемую должность':
buttons_list = form.find_elements_by_class_name(
'appsMaterialWizToggleRadiogroupRadioButtonContainer') # получение кнопок-радио с формы
button = random.choices(buttons_list, [0.72, 0.28], k=1)[0]
button.click()
elif header == 'В каком формате вы обычно работаете?':
buttons_list = form.find_elements_by_class_name(
'appsMaterialWizToggleRadiogroupRadioButtonContainer') # получение кнопок-радио с формы
button = random.choices(buttons_list, [0.67, 0.31, 0.02], k=1)[0]
button.click()
elif header == 'Какой практикой (фреймворком) вы пользуетесь. Укажите 1-2 варианта':
buttons_list = form.find_elements_by_class_name(
'docssharedWizToggleLabeledContainer') # получение чекбоксов с формы
coin = random.randint(1, 2)
button = random.choices(
buttons_list, [0.4, 0.3, 0.1, 0.1, 0.1], k=coin)[0]
button.click()
elif header == 'Укажите ваш возраст':
ageRange_1 = (19, 24)
ageRange_2 = (25, 28)
ageRange_3 = (29, 44)
if seniority == 'меньше 1 года':
age = random.randint(ageRange_1[0], ageRange_1[1])
elif seniority == 'от 1 года до 5 лет':
pool = random.choices(
[ageRange_2, ageRange_3], [0.9, 0.1], k=1)[0]
age = random.randint(pool[0], pool[1])
elif seniority == 'от 5 лет до 10 лет':
pool = random.choices(
[ageRange_2, ageRange_3], [0.7, 0.3], k=1)[0]
age = random.randint(pool[0], pool[1])
else:
age = random.randint(ageRange_3[0], ageRange_3[1])
field = form.find_elements_by_class_name('quantumWizTextinputPaperinputInput')[
0] # получение полей для ввода с формы
field.click()
field.send_keys(age)
elif header == 'Укажите ваш пол':
buttons_list = form.find_elements_by_class_name(
'docssharedWizToggleLabeledContainer') # получение кнопок-радио с формы
button = random.choices(buttons_list, [0.63, 0.37], k=1)[0]
button.click()
elif header == 'Укажите регион, в котором проживаете на данный момент':
buttons_list = form.find_elements_by_class_name(
'appsMaterialWizToggleRadiogroupRadioButtonContainer') # получение кнопок-радио с формы
button = random.choices(buttons_list, [0.4, 0.3, 0.2, 0.1], k=1)[0]
button.click()
def buildozer():
global driver, weightsList
forms_list = driver.find_elements_by_class_name(
'freebirdFormviewerViewItemsItemItem') # получение форм со страницы
for form in forms_list:
header = form.find_element_by_class_name(
'freebirdFormviewerViewItemsItemItemHeader').text # получение заголовка формы
if header[-1:] == '*':
header = header[:-2]
buttons_list = form.find_elements_by_class_name(
'appsMaterialWizToggleRadiogroupRadioButtonContainer') # получение кнопок-радио с формы
if weightsList:
button = random.choices(buttons_list, weightsList[header], k=1)[0].click()
else:
buttons_list[random.randint(0, len(buttons_list) - 1)].click()
def main():
global driver
url = 'https://docs.google.com/forms/d/1f716YOLUrKhtjTlR4hYiEWkgwjqylR5fCPxWsHQKJqY/viewform'
# url = int(input('Введите ссылку на форму: '))
respondents = int(input(datetime.now().strftime(
'[%X] ') + 'Введите желаемое число респондентов: '))
print(datetime.now().strftime('[%X] ') + 'Начало')
log('Новый опрос')
with progressbar.ProgressBar(max_value=respondents) as bar:
for i in range(respondents):
options = webdriver.firefox.options.Options()
options.headless = True
driver = webdriver.Firefox(options=options)
bar.update(i)
driver.get(url)
button_by_text('Далее')
profile_maker()
while True:
if button_by_text('Далее'):
buildozer()
else:
button_by_text('Отправить')
break
log('Опрошен')
driver.quit()
log('Опрос завершен')
print(datetime.now().strftime('[%X] ') + 'Завершено')
def another_main():
global driver
url = 'https://docs.google.com/forms/d/e/1FAIpQLSeyfRwOKKsj7w7btlsH6qKhm6VtL0oprjUakUCkN8SPi_su4w/viewform'
respondents = int(input(datetime.now().strftime(
'[%X] ') + 'Введите желаемое число респондентов: '))
print(datetime.now().strftime('[%X] ') + 'Начало')
with progressbar.ProgressBar(max_value=respondents) as bar:
for i in range(respondents):
options = webdriver.firefox.options.Options()
options.headless = True
driver = webdriver.Firefox(options=options)
bar.update(i)
driver.get(url)
button_by_text('Далее')
for i in range(3):
try:
buildozer()
except:
pass
button_by_text('Далее')
another_profile_maker()
button_by_text('Отправить')
driver.quit()
print(datetime.now().strftime('[%X] ') + 'Завершено')
if __name__ == '__main__':
main()