Python Google Forms | Авто заполнение гугл форм
Задача
Продолжаю изучать Python на простых заказах (задачах, примерах).
Сегодня увидел заказ на работу, где требовалось написать скрипт для автоматического заполнения Google формы (анкеты, опроса). Скорее всего решили кого-то заспамить, процесс не одобряю, но задача интересная.
Требуется случайная генерация Фамилии, имени, электронной почты, номера телефона и заполнение вариантов анкеты.
Подготовка поля
Чтобы никому ничего не ломать и не мешать, создаю у себя аналогичную гугл форму для экспериментов. Так же выбрал сохранение результатов в гугл таблицу для удобства работы.
Как и в задаче, Фамилия, Имя, Номер телефона, Email, Пол, Список для множественного выбора, Выбор из выпадающего списка.
Необходимо заполнить так, чтоб нельзя было отличить от заполнения живого человека и при этом в последнем поле выбирать «Mikrotik»
Анализ гугл формы
Для заполнения данных с Python необходимо понять какие данные в эту форму передать.
Открываю в браузере страницу формы и включаю режим разработчика.
Нужны ID заполняемых форм. Копирую их в блокнот и подписываю какой за что отвечает:
emailAddress: email
entry.1745782649: Фамилия Имя
entry.1065332859: Телефон
entry.1671460138: Лучший производитель из списка
entry.1180824424: Пол (Radio button)
entry.2064015836: Выберите слова которые сможете расшифровать полностью (Check list)
Так же в режиме разработчика, есть более простой способ собрать эти данные.
- Заполняем таблицу
- Отправляем
- Вкладка Network
- name — formRespone
- Поле Form Data
Форму посмотрел, как заполняется понял перехожу к коду
Python отправка данных в Google Forms
Для отправки данных в гугл форму использую библиотеку requests.
pip install requests
Копирую ссылку на форму в значение GoogleURL и заполняю поле form_data с нужными значениями.
import requests
GoogleURL = 'https://docs.google.com/forms/d/e/1FAIpQLSdBfczTD5A5IRcQEyBM2Id9cbRigaalPiDCaQhA_c4NawN0pA'
urlResponse = GoogleURL+'/formResponse'
urlReferer = GoogleURL+'/viewform'
form_data = {'entry.1745782649': 'Фамилия Имя',
'entry.1180824424':'Муж',
'entry.2064015836': {'RSTP','DHCP'},
'entry.1671460138':'Mikrotik',
'emailAddress':'test@mail.ru',
'entry.1065332859':'+79091505050' }
user_agent = {'Referer':urlReferer,'User-Agent': "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36"}
r = requests.post(urlResponse, data=form_data, headers=user_agent)
Такой простой код для проверки можно запустить и получить результаты, убедится что форма отправки работает.
Теперь необходимо сгенерировать данные
Python mimesis генерация данных человека
Для генерации данных о человеке использую библиотеку mimesis.
pip install mimesis
Очень интересная библиотека подробнее ознакомиться можно на официальном сайте, статья на хабр.
Пример
import mimesis
from mimesis import Person
from mimesis import locales
pers = Person(locales.RU)
GenderList = ['MALE', 'FEMALE']
if random.choice(GenderList) == 'MALE':
GenRandom = mimesis.enums.Gender.MALE
Gender = 'Муж'
else:
GenRandom = mimesis.enums.Gender.FEMALE
Gender = 'Жен'
name = pers.full_name(GenRandom)
email = pers.email(domains=['mail.ru','yandex.ru','list.ru','gmail.com','bk.ru'])
phone = pers.telephone(mask='+7(9##)#######')
print(f'{name}, {Gender}, {email}, {phone}')
Вывод: Эльга Левашова, Жен, lionka1922@yandex.ru, +7(950)4904305
- Выбрал русскую локализацию.
- Случайный выбор пола
- Генерация имени
- Генерация email почты
- Генерация номера телефона
Для почты выбрал русские домены, т.к. по умолчанию он использует outlook.com, yahoo.com, live.com. Добавил более стандартные для России домены
Так же добавил маску для телефона в более привычном формате, можно еще использовать случайные маски т.к. разные люди по своему заполняют телефон.
Для случайного выбора из разных вариантов в форме добавляю их в список и вытаскиваю случайное значение из словаря
check_list = ['RSTP', 'IPSEC', 'DHCP', 'DNS', 'MSTP']
random.choice(check_list)
Важно значения должно быть точно такими же как на форме, иначе не примет ответ. Даже если регистр не совпадает.
Кроме этого можно с помощью mimesis генерировать другие данные:
pers = Person(mimesis.locales.RU)
print("Научная степень:", pers.academic_degree())
print("Национальность:", pers.nationality())
print("Работа:", pers.occupation())
print("Университет:", pers.university())
>>> Научная степень: Специалист
>>> Национальность: Англичанка
>>> Работа: Бармен
>>> Университет: Государственная морская академия имени адмирала С.О. Макарова
Адресные данные:
adrRU = Address(mimesis.locales.RU)
print("Адрес:", adrRU.address())
print("Город:", adrRU.city())
print("Координаты:", adrRU.coordinates())
print("Улица:", adrRU.street_name())
>>> Адрес: ул. Лихоборская 73
>>> Город: Волгореченск
>>> Координаты: {'longitude': -44.258845, 'latitude': 50.719573}
>>> Улица: Украинская
Данные времени:
dt = Datetime(mimesis.locales.RU)
print("Случайная полная дата:", dt.datetime(1998, 2045), type(dt.datetime(1998, 2045)))
print("Случайная дата:", dt.date(1998, 2045), type(dt.date(1998, 2045)))
print("Дата форматированная:", dt.formatted_datetime("%m_%d_%y %H:%M:%S"))
print("День недели:", dt.day_of_week(), dt.day_of_week(abbr=True))
print("Периодичность:", dt.periodicity())
print("Век:", dt.century())
>>> Случайная полная дата: 2029-01-21 01:59:42.671179 <class 'datetime.datetime'>
>>> Случайная дата: 2019-06-11 <class 'datetime.date'>
>>> Дата форматированная: 04_10_06 10:11:03
>>> День недели: Вторник Вт.
>>> Периодичность: Ежедневно
>>> Век: XXI
Итоги
В результате получился вот такой код. Осталось только поставить случайный интервал времени и запускать.
import requests
import mimesis
from mimesis import Person
from mimesis import locales
import random
GoogleURL = 'https://docs.google.com/forms/d/e/1FAIpQLSdBfczTD5A5IRcQEyBM2Id9cbRigaalPiDCaQhA_c4NawN0pA'
urlResponse = GoogleURL+'/formResponse'
urlReferer = GoogleURL+'/viewform'
pers = Person(locales.RU)
GenderList = ['MALE', 'FEMALE']
if random.choice(GenderList) == 'MALE':
GenRandom = mimesis.enums.Gender.MALE
Gender = 'Муж'
else:
GenRandom = mimesis.enums.Gender.FEMALE
Gender = 'Жен'
name = pers.full_name(GenRandom)
email = pers.email(domains=['mail.ru','yandex.ru','list.ru','gmail.com','bk.ru'])
phone = pers.telephone(mask='+7(9##)#######')
print(f'{name}, {Gender}, {email}, {phone}')
check_list = ['RSTP', 'IPSEC', 'DHCP', 'DNS', 'MSTP']
form_data = {'entry.1745782649': name,
'entry.1180824424':Gender,
'entry.2064015836': {random.choice(check_list),random.choice(check_list)},
'entry.1671460138':'Mikrotik',
'emailAddress':email,
'entry.1065332859':phone
}
user_agent = {'Referer':urlReferer,'User-Agent': "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36"}
r = requests.post(urlResponse, data=form_data, headers=user_agent)
Если кто подскажет как улучшить код, сделать красивее и изящнее, буду только рад.
Ссылка на GitHub
Это явно спамеры, но с выражения улыбнуло)
xD
На телефонах 100% нужны случайные маски т.к. сильно выделяется. И имена очень своеобразные)
имена да, русских то имён тут нет совсем, доработать наверное можно как-то и будет шик
А если у гугл формы 2 страницы и более, то что тогда добавить в код?
еще не встречал таких форм, необходимо будет проверить код страницы, но есть подозрения если ID правильные то без разницы с какой он страницы.
Он заполняет только первую страницу формы , а остальные игнорирует, даже если ID правильные
Как вариант попробуйте get запрос для имитации перехода на 2 страницу, и после него ID со второй страницы
Добавьте поле «pageHistory» в словарь с ответами на вопросы. Значение должно быть вида «0,1» (если 2 страницы).
Спасибо за дополнение
Как быть с Гугл формами где нужно авторизоваться в Гугл аккаунт, это можно автоматизировать через запросы?