1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import random
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.chrome.options import Options
duolingo_user = os.environ['DULOINGO_USER']
duolingo_pw = os.environ['DULOINGO_PW']
def get_chrome_driver(nojs: bool):
chrome_driver_path = "/Users/t.shears/Downloads/chromedriver_83"
if nojs:
chrome_options = Options()
chrome_options.add_experimental_option( "prefs",{'profile.managed_default_content_settings.javascript': 2})
return webdriver.Chrome(chrome_driver_path,chrome_options=chrome_options)
return webdriver.Chrome(chrome_driver_path)
driver = get_chrome_driver(nojs=False);
def get_random_wait():
return random.randint(1,3)
def main():
try:
driver.get(f"https://www.duolingo.com/?isLoggingIn=true")
ActionChains(driver).pause(get_random_wait()).perform()
i_have_account_el = driver.find_element_by_css_selector('[data-test="have-account"]')
i_have_account_el.click()
ActionChains(driver).pause(get_random_wait()).perform()
email_input = driver.find_element_by_css_selector('[data-test="email-input"]')
email_input.send_keys(duolingo_user)
ActionChains(driver).pause(get_random_wait()).perform()
pw_input = driver.find_element_by_css_selector('[data-test="password-input"]')
# todo: get pw from env
pw_input.send_keys(duolingo_pw)
ActionChains(driver).pause(get_random_wait()).perform()
login_btn_el = driver.find_element_by_css_selector('[data-test="register-button"]')
login_btn_el.click()
ActionChains(driver).pause(5).perform()
while True:
driver.get(f"https://www.duolingo.com/profile/BTBTravis/following")
ActionChains(driver).pause(get_random_wait() + 15).perform()
try:
friend_anchors = driver.find_elements_by_css_selector('.xdvY3 a')
friend_urls = []
for anchorEl in friend_anchors:
friend_urls.append(anchorEl.get_attribute('href'))
for url in friend_urls:
driver.get(url)
ActionChains(driver).pause(get_random_wait() + 10).perform()
follow_btn_el = driver.find_element_by_css_selector('._91Tq4._2JXBr button')
follow_btn_el.click()
ActionChains(driver).pause(get_random_wait() + 3).perform()
except:
print("problem retrying")
finally:
driver.quit()
main()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
[packages]
requests = "*"
selenium = "*"
[requires]
python_version = "3.8"