Automatyczne sprawdzanie szkolnego e-dziennika

Szkoła trwa, dzieci się uczą, e-dzienniki się zapełniają, a ja wymyśliłem sobie pewne ułatwienie życia. Nauczyciele dodają oceny i wiadomości o różnych godzinach, czasem wieczorem, a my sprawdzamy to po kilka razy dziennie – często okazuje się, że w e-dzienniku jest nowa wiadomość, coś pilnego, coś trzeba jutro przynieść, albo w ostatniej chwili zmienił się plan zajęć.

A co, gdyby tak sprawdzanie e-dziennika zautomatyzować? Dziennik, z którego korzysta szkoła naszych dzieci ma wprawdzie opcję powiadomień (płatną), ale została wyłączona. W regulaminie są wzmianki o dostępnie do API, ale takiego dostępu nie ma, a przynajmniej nie jest opisany. Dlatego zastanawiałem się, w jaki sposób to zautomatyzować, nie łamiąc przy tym regulaminu (nadmierne wykorzystanie serwera) czy też nie być posądzonym o omijanie zabezpieczeń serwisu.

Z pomocą przyszło Selenium   – dość proste narzędzie do automatyzacji przeglądarki. Po prostu uruchamiana jest wybrana przeglądarka (najczęściej Chromium, ale można użyć Firefoxa) w środowisku graficznym (choćby tylko wirtualnym) i „sterownik” wczytuje stronę, symuluje wprowadzanie hasła, klikanie w linki i odczytuje treść. Można więc powiedzieć, że jest to trochę bardziej rozbudowana forma autouzupełniania hasła, po prostu więcej tu automatyzacji 🙂 Ba, pozwala to nawet zmniejszyć częstotliwość korzystania z mobirega – po prostu jestem pewny, że przy nowych ocenach czy wiadomościach dostanę powiadomienie, a mniej istotne sprawy i tak sprawdzamy ręcznie (za to znacznie rzadziej).

Najważniejsze jest to, że z punktu widzenia serwisu nie ma żadnej różnicy, czy oceny sprawdzam osobiście, czy raz/dwa razy dziennie robi to program, który wczytuje przeglądarkę i po prostu klika za mnie. 

Co potrzeba:

  • Linux i przynajmniej podstawowa znajomość jego obsługi (pewnie uda się też uruchomić to w systemie Windows),
  • jakaś na stałe uruchomiona maszyna – u mnie to wynajęty VPS, choć myślałem też o Raspberry Pi, które służy mi za centrum sterowania mojego „inteligentnego domu”
  • Python z Selenium, choć oczywiście można korzystać z innych języków

Co do samego dziennika – jest to mobireg. Dziennik, który sprawiał trochę problemów. Jego bezpłatna wersja pozwalała tylko na pobieranie „stron” w pdf – dla każdego przedmiotu oddzielnie, a ich „generowanie” trwało bardzo długo. Ośmielę się stwierdzić, że trwało ułamek sekundy, ale oczekiwanie miało zachęcić do wykupienia przez rodzica abonamentu. Na dodatek, co najgorsze, bezpłatna wersja nie pozwalała na otrzymywanie wiadomości od nauczycieli – a to podstawowa poza ocenami funkcja, która bardzo ułatwia życie obu stronom – nauczycielom i rodzicom, ale traci sens, gdy nie wszyscy mogą te wiadomości odebrać. Od tego roku wszyscy mamy pełną wersję (pewnie za sprawą zmiany umowy którą zawiera szkoła) ale wyłączono możliwość powiadomień (a te i tak były dodatkowo płatne).

Do obsługi Selenium posłużyłem się Pythonem, za którego od dawna planowałem się zabrać, ale nie miałem dobrego powodu. Całość okazała się prostsza, niż sądziłem, a założenia są takie:

  1. Uruchamiam wirtualne środowisko graficzne z Chromium
  2. Selenium zamyka pojawiające się okno dialogowe, bo nasz e-dziennik sugeruje, że powinno się korzystać z Firefoxa. Tu kolejna uwaga dla Mobirega. Na co dzień używam „Liska”, ale myślałem, że czasy sugerowania właściwych przeglądarek dawno minęły (czy ktoś jeszcze pamięta obrazki typu „Ta strona działa poprawnie w Internet Explorer w rozdzielczości 1024×768)”? Tym bardziej, że to nie żadna aplikacja webowa pisana w JavaScriptowym frameworku, a zwykła „statyczna” strona z odnośnikami do podstron generowanych po stronie serwera.
  3. Wyszukiwane są pola loginu i hasła, sterownik symuluje przyciśnięcia klawiszy i wprowadza dane, po czym klika w przycisk. Mam dwoje dzieci, więc program musi wybrać, dla którego dziecka wpisać dane.
  4. Na kolejnej stronie sprawdzana jest ilość nowych wiadomości.
  5. Przechodzimy na stronę z ocenami, a tam odczytywane są wszystkie oceny.
  6. Jeśli są nowe oceny, zapamiętujemy je jako listę „przedmiot:oceny”, a jeśli w dotychczasowych ocenach coś się zmieniło, po prostu informuję o tym słowem „Zmiana”. Niczego więcej mi nie potrzeba.
  7. Wylogowanie z serwisu poprzez kliknięcie w link
  8. Porównanie ocen z poprzednimi wczytanymi z pliku
  9. Stworzenie wiadomości zawierającej zmiany i wysłanie jej – np. przez powiadomienie push na androida, albo e-mail.
  10. Zapisanie nowych ocen do kolejnego porównania.

Cały program uruchamiam przez crontab, żeby uruchamiał się automatycznie na przykład codziennie o 17.00:

0 17 * * * cd /home/ja/szkola && xvfb-run python3.4 oceny.py ImieDziecka

ImieDziecka to argument, który po prostu ustawi odpowiednie dane logowania, a xvfb-run uruchamia skrypt w wirtualnym środowisku graficznym. Środowisko te można też odpalić wewnątrz skryptu:

display = Display(visible=0, size=(1024, 768))
display.start()
...
display.stop()

ale tak jest po prostu prościej i nie trzeba obsługiwać różnych problemów, które mogą wyniknąć (środowisko zostaje wtedy w pamięci serwera).

A tu pełny kod, może nie idealny, ale skuteczny. Oceny nie są dokładnie sprawdzane (jeśli nauczyciel doda ocenę na końcu, pojawi się ona w wiadomości, ale jeśli dokona zmian w poprzednich ocenach – będzie tylko komunikat o zmianie. Brakuje też obsługi różnych nieprzewidzianych problemów – dlatego całość dałem w try…finally – żeby w razie czego przede wszystkim wylogować się ze strony bez wykonywania innych czynności.

from pyvirtualdisplay import Display
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
import json
from json import JSONEncoder
import jsonpickle
import sys
import requests

# klasa zawierająca nazwę przedmiotu, ocenę końcoową i listę ocen
class Przedmiot(JSONEncoder):
	def __init__(self, nazwa, oceny, koncowa):
		self.nazwa = nazwa
		self.oceny= []
		self.koncowa = koncowa


display = Display(visible=0, size=(1024, 768))
#display.start()
driver = webdriver.Chrome()

try: # szybkie obejście problemów z połączeniem - pomimo jakiegokolwiek błędu z połączeniem 
	 #lub serwerem trzeba na końcu zakończyć działanie selenium/chromium
	driver.implicitly_wait(6)
	driver.get('https://www.mobireg.pl/nazwaszkoly/') # adres serwera
	(driver.page_source).encode('utf-8')

	#strona wyświetla komunikat, że sugerowany jest firefox ... trzeba go zamknąć
	driver.find_element_by_id('messageBoxButton').click() 

	# Logowanie - szukam elementów formularza login i hasło po id
	username = driver.find_element_by_id("iEdLog") 
	password = driver.find_element_by_id("iEdPas")

	#Dla większej ilości dzieci, jako argument podaję imię i uruchamiam z różnymi parametrami po kolei
	if "ImieDziecka1" in sys.argv[0:] :
		username.send_keys("login1")
		password.send_keys("hasło1")
		file="log_1"
	else :
		username.send_keys("login2")
		password.send_keys("hasło2")
		file="log_2"

	driver.find_element_by_id("iSubmit").click() # Wysłanie formularza / logowanie


# Odczytanie liczby wiadomosci - wyszukanie tekstu "nowe wiadomości"
	message = driver.find_element_by_xpath("//*[contains(text(), 'nowe') and contains(text(), 'wiadom')]//a")
	if message.text!='0' :
		wiadomosci=message.text
	else:
		wiadomosci='0'

	driver.implicitly_wait(7)
# Przejście do strony z ocenami
	link1 = driver.find_element_by_xpath("//*[contains(text(), 'oceny') and contains(text(), 'swojego')]")
	link1.click()
	driver.implicitly_wait(7)

	#odczytanie kolejnych rzędów tabeli z ocenami
	table = driver.find_element_by_xpath("//table[@class='studentMark']//tbody");
	rows = table.find_elements(By.TAG_NAME, "tr")

	poprzednie=[]
	przedmioty=[]
	zmiany={}

	for i, tr in enumerate(rows) :
		if(i>0):
			if 'teachers' in tr.get_attribute('innerHTML'): 
					przedmioty.append(Przedmiot('','',''))
			
			tds = tr.find_elements(By.TAG_NAME, "td")

			for j, td in enumerate(tds) :
				if j==0:
					if len(td.get_attribute('innerHTML'))>0:  # jeśli jest podana nazwa przedmiotu 
						nazwa=td.text # inaczej ozancza to, że oceny są kontynuacją z poprzedniej linii
						przedmioty[len(przedmioty)-1].nazwa=nazwa
				if (j>0 and td.get_attribute('innerHTML') != " ") :
					if(td.get_attribute('class') != "ocena_koncowa") : # Jeśli ocena nie jest oceną końcową						
						przedmioty[len(przedmioty)-1].oceny.append(td.text) # dodaj do listy ocen
					else :	# jesli jest to ocena koncowa
						przedmioty[len(przedmioty)-1].koncowa=td.text # dodaję jako ocenę końcową

							
# Odczyt poprzednich ocen do porównania		
	
	wiadomosc='' # treść wiadomości do wysłania

	try:
		wiadomosc='' # treść wiadomości do wysłania
		f = open(file, mode="r", encoding="utf-8")
		json_str = f.read()
		f.close
		poprzednie = jsonpickle.decode(json_str)	
			
		for i, nowe in enumerate(przedmioty):
			for poprz in poprzednie:
				if nowe.nazwa in poprz["nazwa"]: # porownanie nazw przedmiotow
					if len(nowe.oceny) == len(poprz["oceny"]) and nowe.oceny != poprz["oceny"] :
						if not nowe.nazwa in zmiany :  # sprawdzenie czy przedmiot już istnieje w zmianach
							zmiany[nowe.nazwa]="" 
						zmiany[nowe.nazwa]+="Zmiana, "
					#czy sa nowe oceny
					if len(nowe.oceny) > len(poprz["oceny"]) :
						if not nowe.nazwa in zmiany :  # sprawdzenie czy przedmiot już istnieje w zmianach
							zmiany[nowe.nazwa]=""						
						for k in range(len(poprz["oceny"]), len(nowe.oceny)):
							zmiany[nowe.nazwa]+=(nowe.oceny[k])+" "
					#czy jest ocena koncowa
					if nowe.koncowa != poprz["koncowa"] :
						if not nowe.nazwa in zmiany :
							zmiany[nowe.nazwa]=""	
						zmiany[nowe.nazwa]+="Końcowa: "+ nowe.koncowa

	# Tworzenie wiadomości z nowymi ocenami i liczbą nowych wiadomości

		

		# Czy są nowe wiadomości dla rodzica
		if wiadomosci!='0' : 
			wiadomosc+="Nowe wiadomości: "+ wiadomosci + '\u000A'

		# Czy sa zmiany na liście dotychczasowych ocen
		if len(zmiany)>0:	
			for k, v in zmiany.items():
				print(k.encode('utf-8'),": ", v.encode('utf-8') , "\n")		
				wiadomosc+=k+":"+v+'\u000A'
	
	except IOError:
		wiadomosc='' # pusta wiadomość, jeśli uruchomiono po raz pierwszy

		

# Zapis nowej listy ocen jako json, do kolejnego porównania
	file_object = open(file, mode="w+", encoding="utf-8")
	file_object.write(jsonpickle.encode(przedmioty, unpicklable=False))	
	file_object.close()

	

# Przesłanie powiadomienia na telefon - za pomocą powiadomienia push przez IFTTT
	if len(wiadomosc)>0 :
		url = 'https://maker.ifttt.com/trigger/szkola/with/key/MOJ_KLUCZ_IFTTT'
		payload = {}
		payload["value1"] = wiadomosc
		requests.post(url, data=payload)


finally:	
	#wylogowanie
	driver.implicitly_wait(3)
	driver.find_element_by_id("logout").click()
	driver.implicitly_wait(3)
	#potwierdzenie wylogowania
	driver.find_element_by_xpath("//input[1]").click()
	driver.quit()
	#display.stop()

 

 

55 komentarzy to “Automatyczne sprawdzanie szkolnego e-dziennika”

You can Dodaj komentarz or Trackback this post.

  1. Alexisanned - 17 sierpnia 2022 o 22:57

    Both sayings highlight the benefits of waking up early.
    You get up and keep trying.
    It’s become one of the most viral memes on the internet.
    Aphorism Examples in Everyday Speech
    The complete quote was, A Jack of all trades and master of none, but oftentimes better than a master of one.
    Not good.
    There must be a method to your madness.
    Are you in.
    Do you believe that a penny saved is a penny earned.
    Better safe than sorry is a piece of wisdom from Samuel Lover’s book, Rory O’More.
    There is no try.
    Like George Washington, Sandys believed that telling the truth is always the way to go.
    Sometimes, though.
    Not good.
    So my advice.
    But one key difference is that for a phrase to be truly aphoristic, it needs to be a short statement.

  2. Alexisanned - 17 sierpnia 2022 o 23:59

    And since they’re universal truths about life, they help persuade your reader to accept your message.
    Fall seven times, stand up eight.
    The part in Star Wars where Yoda says, There is do, or do not.
    We’ve all probably had to learn that the hard way.
    Interestingly enough, this saying was initially intended as a compliment.
    This quote came from Wales, first appearing in an 1866 publication.
    Then use it as a guideline to stay focused on your general theme.
    But not today.
    Guy standing at a bookshelf
    Better safe than sorry is a piece of wisdom from Samuel Lover’s book, Rory O’More.
    There is no try.
    Life is too short to surround yourself with toxic people.
    Want a few more.
    But these days.
    From there, you can build your story around it.
    They’re in social media captions all over the web.

  3. Alexisanned - 18 sierpnia 2022 o 01:14

    Proverbs, on the other hand, can be much longer than aphorisms and adages.
    Because let’s face it, perseverance is the key to success in life.
    See for yourself.
    This aphorism is short and sweet, but it teaches us a valuable truth.
    Sometimes, though.
    Finally, All things come to those who wait is a good aphorism we’re all familiar with.
    And then.
    Aphorisms are so common that we hardly think twice about them.
    Examples of Aphorism in Literature
    Here’s a classic Japanese saying for you.
    What am I referring to.
    Life is too short to surround yourself with toxic people.
    That’s not what you expected, was it.
    Not good.
    Give it a try!
    What is an Aphorism.

  4. Alexisanned - 18 sierpnia 2022 o 01:57

    Proverbs, on the other hand, can be much longer than aphorisms and adages.
    Fall seven times, stand up eight.
    He knows that Luke should either decide that he can do it or decide to quit.
    Let me ask you.
    He’s earned that title because he’s authored dozens of aphorisms.
    Not so much.
    From there, you can build your story around it.
    Curiosity killed the cat.
    Your wish is my command.
    The meaning.
    He knows that Luke should either decide that he can do it or decide to quit.
    Let me ask you.
    Other Common Examples of Aphorisms
    Now you might be asking.
    So my advice.
    How do aphorisms differ from adages and proverbs.

  5. Alexisanned - 18 sierpnia 2022 o 02:05

    See the difference.
    Don’t count on things that haven’t happened yet because something unexpected could occur.
    It’s become one of the most viral memes on the internet.
    Yup, you guessed it.
    Want a few more.
    Skilled writers use aphorisms to evoke big ideas in a relatable way.
    Pick an aphorism that relates to your message and use it to stay focused on your overarching theme.
    Curiosity killed the cat.
    The early bird gets the worm.
    The meaning.
    If you can do something, then you need to do it for the good of others.
    This aphorism is short and sweet, but it teaches us a valuable truth.
    People often use this quote when discussing health, but Franklin was talking about fire safety.
    This quote came from Wales, first appearing in an 1866 publication.
    Aphorisms can act as a guideline to help narrow the focus of your work.
    Curiosity killed the cat.

  6. Alexisanned - 18 sierpnia 2022 o 02:55

    Now that we’ve covered the aphorism definition, are you ready for more examples.
    Here’s a classic Japanese saying for you.
    Michael Corleone from The Godfather II disagreed with that.
    Yup, you guessed it.
    Yup, he was reminding Philadelphians that preventing fires is better than fighting them.
    Not good.
    And then.
    Let’s get started.
    Both sayings highlight the benefits of waking up early.
    Fall seven times, stand up eight.
    Michael Corleone from The Godfather II disagreed with that.
    Like George Washington, Sandys believed that telling the truth is always the way to go.
    Interestingly enough, this saying was initially intended as a compliment.
    Let’s talk about that.
    There must be a method to your madness.
    But not today.

  7. Alexisanned - 18 sierpnia 2022 o 02:58

    Brevity is the key.
    It’s better safe than sorry, right.
    Examples of Aphorism in Film
    This is especially true if the excuse is a lie.
    It’s easier to do it yourself rather than try to explain it to someone else.
    Finally, All things come to those who wait is a good aphorism we’re all familiar with.
    But there’s no certain magic to sprinkling aphorisms into your writing.
    But not today.
    Now that we’ve covered the aphorism definition, are you ready for more examples.
    You get up and keep trying.
    But Yoda isn’t having it.
    Have you ever felt frustrated when other people didn’t meet your expectations.
    Oftentimes, it makes sense to delegate tasks.
    Why is this stuff important.
    Not only that, but you can use aphorisms in your writing to summarize your central theme.
    How do aphorisms differ from adages and proverbs.

  8. Alexisanned - 18 sierpnia 2022 o 03:04

    It’s a great saying, but it’s not something you’d necessarily repeat over the dinner table.
    Fall seven times, stand up eight.
    Keep your friends close, but your enemies closer.
    Washington also said, It is better to offer no excuse than a bad one.
    The origins of this saying are open for debate, but it’s primarily attributed to Abraham Lincoln.
    It meant that the person was versatile and adept at many things.
    As they say, Nothing ventured, nothing gained.
    They’re inspirational quotes.
    We see this in literature all the time.
    The meaning.
    Remember that.
    This also reminds me of a precept by Sir Edwin Sandys, a politician who helped establish Jamestown, Virginia.
    It’s easier to do it yourself rather than try to explain it to someone else.
    They’re easy to remember and pass down through generations because they’re concise.
    And then.
    That’s why aphorisms, adages, and proverbs are synonyms for each other.

  9. Nottolo - 31 sierpnia 2022 o 21:15

    As mentioned before, this makes buying online the easy part you can check these online prices and compare to each other comprare cialis online 24 hours after I took the first one I took another one, but I dont think I even needed it

  10. buinddile - 1 września 2022 o 06:30

    However, the full picture of age and other conditions should be taken into account when deciding on the appropriate dosage of Cialis cialis no prescription Myths about purchasing generic Viagra online

  11. Ideafedit - 1 września 2022 o 11:26

    Cialis and other medications for ED are prescribed to millions of men of all ages in the United States, and if you have ED, it s likely that you ll be able to receive a prescription coupons for cialis 20 mg 028 PubMed CrossRef Google Scholar

  12. igniftSip - 3 września 2022 o 00:33

    Cialis tadalafil vs buy priligy pakistan If you need your Viagra or Cialis supply fast, there is a US domestic shipping option available which takes 3-4 days on average

  13. ShoumpSus - 3 września 2022 o 10:49

    See also What Are The Possible Side Effects Of CIALIS priligy dapoxetine 30mg In other words, the generic sildenafil that s legally sold in the United States provides exactly the same effects as brand name Viagra and is equally safe to use

  14. GonEncunc - 3 września 2022 o 16:22

    This information is always kept up to date and is always offered as a free resource, to provide you with information on the actual symptoms one of these medications may or may not have best site to buy priligy The big hooligans are not because of the lithium battery, but because of the entire automobile industry behind the lithium battery

  15. Speance - 4 września 2022 o 22:59

    Ophthalmologic visual field defect, retinal vein occlusion, retinal artery occlusion buy cialis without prescription Comparison of Regular Cialis vs Cialis Professional

  16. embarty - 5 września 2022 o 09:00

    generic cialis cost We get it when you re dealing with erectile dysfunction, you long to be able to be able to have an erection without thinking about it or planning in advance

  17. VommaSpax - 5 września 2022 o 15:18

    This contrasts with the active ingredient in Viagra, which is generally considered effective for two to three hours, although it can last as long as five hours for some men cialis no prescription

  18. famping - 7 września 2022 o 01:22

    Viagra is an erectile dysfunction drug that works by increasing the strength a physical ability your body has over time to form and maintain sperm buy cialis 5mg online

  19. heakshecY - 7 września 2022 o 17:43

    For your safety, all Tadalafil must be obtained through a licensed U purchase cialis Most common fast-acting PDE5 drug that lasts in your system for up to 18 hours

  20. nemeArtex - 9 września 2022 o 23:00

    clomid dose pct The next steps may include medications and continued monitoring.

  21. Wrolverer - 10 września 2022 o 08:55

    While both medication types increase serum testosterone levels, clomiphene citrate is known to benefit sperm parameters in hypogonadal men while exogenous testosterone is known to inhibit sperm production. clomiphene davis pdf If so, there s a good chance you ve already heard some of the crazy old wives tales about different tried and true tricks to get pregnant faster.

  22. engarpdep - 10 września 2022 o 15:53

    clomid crazies In Business and Proudly Serving North and Central Florida for over 30 Years.

  23. dypetwedo - 13 września 2022 o 00:56

    long-term side effects of tamoxifen Under baseball s performance-enhancing drug policy, players can apply for a so-called therapeutic use exemption TUE to take certain medical substances otherwise banned by MLB.

  24. boopindub - 13 września 2022 o 12:10

    , and Madsen, M. does tamoxifen cause joint pain Cataldo, consulting fees from Organon.

  25. Goajent - 16 września 2022 o 15:53

    doxycycline sinus infection A second trial including 43 patients with CRAB pneumonia also compared colistin monotherapy and colistin in combination with rifampin 107 and identified in hospital mortality to be 73 in the colistin group and 62 in the colistin- rifampin group, not achieving statistical significance.

  26. accelry - 17 września 2022 o 02:12

    I talked to a few different doctors about this at CNY and they are all pro 1 egg at a time. doxycycline photosensitivity Excluding the glycoside, 2018 and severe nortriptyline 10mg capsule.

  27. Attaish - 17 września 2022 o 07:42

    dose of doxycycline for pneumonia Amoxicillin and specific bacteriophage can be used together for eradication of biofilm of Klebsiella pneumoniae B5055.

  28. jowheme - 7 października 2022 o 02:01

    Im no pro, but I think Clomid increases test production lasix med

  29. Fligagham - 7 października 2022 o 18:18

    As for how to take Tamoxifen in bodybuilding on the cycle of steroids that does not have the effect of flavoring, it is recommended to add it only at the end of the cycle how long does lasix take to work

  30. Easewly - 8 października 2022 o 00:01

    If you do plan to experiment with this compound make sure to keep within the advised dosage guidelines lasix and calcium levels Impact of the association between elevated oestradiol and low testosterone levels on erectile dysfunction severity

  31. teellaLok - 12 października 2022 o 17:50

    Optimization of NLC by Box Behnken statistical design buy cialis and viagra online VTCT was administered by intratumoral injection it of 1×10 8 pfu of an AdCDIRESE1A adenoviral Ad vector system carrying a cytosine deaminase CD transcription unit followed by 10 days of intraperitoneal ip injection of 5 Fluorocytosine 5FC

  32. Inarmdymn - 13 października 2022 o 08:26

    buy cialis online Doing business is their job, but the importance of new energy construction is higher than business

  33. unreash - 13 października 2022 o 15:21

    Thus, Bcl 2 overexpression may protect cells against apoptosis and contribute to the dilated thickened walls seen in both types of diseased vessels cheap cialis online pharmacy Sex hormone regulation in female is more complex compare to the male

  34. Bildedy - 25 października 2022 o 18:35

    Those cities have a total population of 18 million cheap stromectol

  35. Bildedy - 27 października 2022 o 15:28

    88 1991 735741 Crossref PubMed ISI Google Scholar 42 Szücs G stromectol tablet ne için kullanılır After 7 days of treatment, animals were killed, and tissues were collected

  36. Smacype - 5 listopada 2022 o 20:21

    Four dimensional imaging computer visualization of 3D movements in living specimens priligy reddit

  37. epherse - 6 listopada 2022 o 15:52

    That s because PCOS causes blood sugar issues, which can affect ovulation according to the Office on Women s Health ocular side effects of tamoxifen 9727 hERG inhibition predictor II Non inhibitor 0

  38. epherse - 8 listopada 2022 o 20:05

    nolvadex tamoxifen for sale uk In contrast, Dutch investigators reported just the opposite when they looked at the records of 1, 962 breast cancer patients who took tamoxifen between 1994 and 2006

  39. Smacype - 9 listopada 2022 o 03:02

    Serious Use Alternative 2 erythromycin stearate increases toxicity of pitavastatin by Other see comment priligy online

  40. epherse - 12 listopada 2022 o 06:33

    This ruling was based on a perceived increased risk for glioma associated with cell phone use buy tamoxifen withought prescription The Cancer Support Community is ready to offer the support you need to live a better life with cancer

  41. gaureta - 14 listopada 2022 o 04:58

    I understand you re building a new office, but in the meantime, you need to protect your patients privacy doxycycline monohydrate canada

  42. piomali - 18 listopada 2022 o 03:53

    The potential harms of tamoxifen and raloxifene outweigh the potential benefits for breast cancer risk reduction in women who are not at increased risk of the disease what does lasix do Áàìáàéí õàíä Âèòàìèí Ñ Ãààòàé ðýë Äîêñîí

  43. Ordency - 18 listopada 2022 o 06:19

    clomiphene for men side effects Indicated for the reduction in the risk of invasive breast cancer in postmenopausal women with osteoporosis or postmenopausal women with a high risk for invasive breast cancer

  44. piomali - 19 listopada 2022 o 00:58

    is lasix a diuretic We have investigated the association between ISG expression and outcome in a set of cohorts, in which patient characteristics differ greatly

  45. gaureta - 20 listopada 2022 o 12:45

    Omer S, Hickson G, TachГ© S, Blind R, Masters S, Loeser H, Souza K, Mkony C, Debas H, O Sullivan P doxycycline dog dosage chart Track 10 Genomics Personalized Medicine

  46. Ordency - 21 listopada 2022 o 04:23

    Mirqat quotes Suyuti who explains it as in the translation above clomid side effects Cyclin D family of proteins complex with CDK4 and CDK6 and promote progression through G1, Cyclin E CDK2 complex promotes entry into S phase, Cyclin A CDK2 stimulates G2 progression, and Cyclin B CDK1 activates entry into the mitotic phase 113

  47. Ordency - 21 listopada 2022 o 11:20

    clomiphene interactions How much liquid should I drink each day

  48. JoshuaExito - 28 listopada 2022 o 07:56

    online pharmacies of canada pill for erectile dysfunction

  49. ClupieX - 28 listopada 2022 o 12:01

    五星好评一款经典国民休闲手游,设计了全新的世界观,让玩家在游戏的过程中身临其境真的很好玩.     网上打牌哪个app可以玩钱-真人打牌打钱微信提现金-手机打 首先,比如一开始兴起时候的皮皮麻将,熊猫麻将这一类的软件,主要是靠一个卖房卡给玩家来赚钱,玩家买房卡之后,就可以开房间跟朋友一起玩,开发者主要是通过卖房卡赚取收益,你设想一下,每天靠这样一个软件,开发者可以赚多少钱,当然,这样是取决于玩家愿不愿意去玩,其实相对来说还是比较单纯。 APP全能版下载©版权所有.m.shuoshuokong.org. 淘金泉州麻将App功能介绍: Repeat your search with another keyword 线上组队打麻将的app合集-线上组队打麻将的app大全-推荐- https://www.thediplomatnetwork.com/community/profile/ashleetesch190/ 四张同系列的花牌,如兰、竹、菊、梅(春、夏、秋、冬),或聚宝盆、财神、描、鼠,不可交错。每抓得一张花牌,即可从杠上取一张牌。一张花牌计一分,不计入起和分,加计在盘分中。 hello,大家好,这里是趣游君的频道,很高兴跟您一起分享原神相关资讯!相信很多玩家都知道3.1版本很快就会正式上线了,官方的前瞻直播也已经蓄势待发。这次的版本中不光会有全新的沙漠… -神来也扑克 游戏特色- 状态:已上市大小:0KB Copyright 2019-2025 游上游手游网(Www.u3u.Com) All Rights Reserved. 湘ICP备19008888号-1 版本:1.0.0.946 神赚棋牌官网最新版2022拥有全国各地的特色棋牌游戏,通通可以免费玩,喜欢的朋友可以下载试试。

  50. Jeffreyvop - 30 listopada 2022 o 01:52

    https://stromectolpills.store/# generic ivermectin cream

  51. CurtisAdext - 30 listopada 2022 o 10:51

    prednisone prescription drug can i buy prednisone online without prescription

  52. Davidemify - 30 listopada 2022 o 11:08

    https://stromectolpills.store/# stromectol 3 mg dosage

Napisz odpowiedź

Twój adres e-mail nie zostanie opublikowany.