Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.

Autor Téma: "aplikace" bakaláři a <div>y  (Přečteno 3530 krát)

Kamil Hanus

  • Člen
  • **
  • Příspěvků: 221
    • Zobrazit profil
    • kamilhanus.cz
"aplikace" bakaláři a <div>y
« kdy: 29 Listopad 2011, 19:29:01 »
Ahoj,
dělám na takovém skriptu, který automaticky stahuje rozvrh z webového rozhraní bakalářů a uživatel si bude moci kdykoliv zobrazit rozvrh, aniž by se zdlouhavě přihlašovat a proklikávat. Většina z vás určitě na střední nechodí, nebo bakaláře nepoužívá. Na ty, kteří je máte, bych měl malou prosbu. Nevím zda je všude struktura webu stejná nebo se mění IDčka <div>ů. U nás máme třeba tabulku rozvrhu v divu <div class="modulincenter">. Je to tak všude, nebo to máte jinak?

Pokud by to někdo chtěl vyzkoušet, tady je skript, ale vyžaduje instalaci python-pyquery a python-mechanize

Kód: [Vybrat]
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#       bakalari.py
#       
#       Copyright 2011 Kamil Hanus <ja@kamilhanus.cz>
#       
     

import mechanize
from pyquery import PyQuery as pq
import os, sys
from time import ctime, strftime, localtime
from time import time as Time
import commands as Com
import re

BROWSER = "CHROMIUM" # CHROME or CHROMIUM or FIREFOX of FIREFOX-NIGHTLY
LOGIN = ""
PASSWORD = ""
DISPLAY_RESOLUTION = "1280x1024"
html_file_path = "%s/.rozvrh.html" % os.getenv("HOME")

for parameter in sys.argv:
if parameter == "-no-browser":
RunningFromCron = True
else:
RunningFromCron = False

def time():
time_value=strftime("%Y-%m-%d %H:%M:%S", localtime())
return time_value

def write(File, Msg, CoN):
File.write(Msg)
File.flush()
if CoN == 1:
File.close()

def OpenBrowser():
if RunningFromCron != True:
if BROWSER.lower() == "chrome":
print "chrome"
os.system("google-chrome --app=file://"+html_file_path)
elif BROWSER.lower() == "chromium":
print "chromium"
os.system("chromium-browser --app=file://"+html_file_path)
elif BROWSER.lower() == "firefox":
print "ff"
os.system("firefox -new-window file://"+html_file_path)
else:
print "nightly"
os.system("firefox-trunk -new-window file://"+html_file_path)

def WriteOpenHTML(message, time_update):
file = open(html_file_path, 'w')
if time_update != None:
write(file, html % (display, styl, message, time_update), 1)
else:
write(file, message, 1)
OpenBrowser()
#os.remove(file_name)

def connection_error():
write(log_file, "%s\tNastala chyba - Není možné se připojit k serveru.\n%s\tBěh scriptu ukončen.\n" % (time(), time()), 1)
IsHtmlGenerated=1
try:
html_file=open(html_file_path, "r+")
except:
WriteOpenHTML("Chyba aktualizace - Nebylo možné navázat spojení se serverem...<br>", time())
IsHtmlGenerated=0
sys.exit(1)
html_file_content=html_file.read()
if (IsHtmlGenerated == 1 and html_file_content != ""):
html_file.close()
html_file_trs=len(re.findall("<tr>", html_file_content))
print html_file_content
if (html_file_trs > 0 and len(re.findall("Server", html_file_content)) ==0):
new_html_file = re.sub("Poslední", "Server není dostupný. Poslední platná", html_file_content)
WriteOpenHTML(new_html_file, None)
else:
OpenBrowser()
else:
WriteOpenHTML("Chyba aktualizace - Nebylo možné navázat spojení se serverem...<br>", time())
OpenBrowser()
sys.exit(1)



log_file_location = "%s/baka.log" % os.getenv("HOME")
log_file = open(log_file_location, "a")
write(log_file, "%s\tSpouštím script.\n" % time(), 0)

styl='''
.rozbunka {
font-size:10px;
width:650px;
table-layout:fixed;
border-collapse:collapse;
border-width:1px;
border-style:solid;
}
.rozbunka td {
 text-align :center;
 vertical-align:middle;
}
.roznumhod {
font-size:10px;
font-weight:bold;
}
.rozpopishod {
font-size:8px;
font-weight:normal;
margin:0px;
padding:0px;
}
.rozden {
font-size:10px;
font-weight:bold;
height:65px;
}
.rozpredmet1 {
font-size:14px;
font-weight:bold;
border-left-style:solid;
border-left-width:1px;
border-top-style:solid;
border-top-width:1px;
margin:0px;
padding:0px;
vertical-align:middle;
height:100%;
}
.rozpredmet1div {
vertical-align:middle;
height:100%;
width:100%;
text-align:center;
}
.rozpredmet1div a
{
 text-decoration:none;
}
.rozpredmet1div a:hover {
 text-decoration :underline;
}

.rozpredmet1div a:visited {
 text-decoration :none;
}
.rozpredmet1div a:link {
 text-decoration :none;
}
.rozpredmet1zm {
font-size:14px;
font-weight:bold;
border-left-style:solid;
border-left-width:1px;
border-top-style:solid;
border-top-width:1px;
margin:0px;
padding:0px;
vertical-align:middle;
}
.rozpredmet1zmdiv {
vertical-align:middle;
}
.rozpredmetprazdny {
font-size:14px;
font-weight:bold;
border-left-style:solid;
border-left-width:1px;
border-top-style:solid;
border-top-width:1px;
margin:0px;
padding:0px;
vertical-align:middle;
}
.rozucitel1 {
font-size:12px;
font-style:italic;
font-weight:bold;
border-left-style:solid;
border-left-width:1px;
}
.rozucitel1zm {
font-size:12px;
font-style:italic;
font-weight:bold;
border-left-style:solid;
border-left-width:1px;
}
.rozskupina1 {
font-size:9px;
font-weight:normal;
border-left-style:solid;
border-left-width:1px;
}
.rozskupina1zm {
font-size:9px;
font-weight:normal;
border-left-style:solid;
border-left-width:1px;
}
.rozmistnost1 {
font-size:9px;
font-weight:normal;
font-style:italic;
}
.rozmistnost1zm {
font-size:9px;
font-weight:normal;
font-style:italic;
}
.rozmistnost1only {
border-left-style:solid;
border-left-width:1px;
font-size:9px;
font-weight:normal;
font-style:italic;
}
.rozmistnost1onlyzm {
border-left-style:solid;
border-left-width:1px;
font-size:9px;
font-weight:normal;
font-style:italic;
}
.rozpredmet1abs {
font-size:14px;
font-weight:bold;
border-left-style:solid;
border-left-width:1px;
border-top-style:solid;
border-top-width:1px;
margin:0px;
padding:0px;
}
.rozucitel1abs {
font-size:12px;
font-style:italic;
font-weight:bold;
border-left-style:solid;
border-left-width:1px;
}
.rozskupina1abs {
font-size:9px;
font-weight:normal;
border-left-style:solid;
border-left-width:1px;
}
.rozmistnost1abs {
font-size:9px;
font-weight:normal;
font-style:italic;
}
.rozmistnost1onlyabs {
border-left-style:solid;
border-left-width:1px;
font-size:9px;
font-weight:normal;
font-style:italic;
}
.rozpredmet2 {
font-size:11px;
font-weight:bold;
border-top-style:solid;
border-top-width:1px;
margin:0px;
padding:0px;
}
.rozpredmet2prvni {
font-size:11px;
font-weight:bold;
margin:0px;
padding:0px;
}
.rozucitel2 {
font-size:8px;
font-style:italic;
font-weight:bold;
}
.rozskupina2 {
font-size:8px;
font-weight:normal;
}
.rozmistnost2 {
font-size:8px;
font-weight:normal;
font-style:italic;
}
.rozmistnost2only {
font-size:8px;
font-weight:normal;
font-style:italic;
}
.rozbunka2 {
font-size:8px;
border-collapse:collapse;
border-width:1px;
padding:0;
margin:0;
height:65px;
vertical-align:middle;
}
.rozseznampred {
font-size:13px;
font-weight:normal;
padding-left:10px;
padding-right:10px;
}
.rozseznampred td {
padding:3px;
text-align:left;
}
.rozseznamucit {
font-size:13px;
font-weight:normal;
padding-left:10px;
padding-right:10px;
}
.rozseznamhlava {
font-size:11px;
font-weight:bold;
border-width:1px;
border-style:solid;
}
.rozseznamhlava td {
padding:4px;
text-align:left;
}
.rozbunka {
background-color:#FFFFF0;
border-color:gray;
}
.roznumhod {
background-color:#FFFFFF;
}
.rozpopishod {
background-color:#FFFFFF;
}
.rozden {
background-color:#FFFFFF;
}
.rozpredmet1 {
border-left-color:gray;
border-top-color:gray;
}
.rozpredmet1div a
{
color:#8B5A2B;
}
.rozpredmet1div a:link
{
color:#8B5A2B;
}
.rozpredmet1div a:visited
{
color:#8B5A2B;
}
.rozpredmet1zm {
border-left-color:gray;
border-top-color:gray;
background-color:#FFC1C1;
}
.rozpredmetprazdny {
background-color:#F5F5F5;
border-left-color:gray;
border-top-color:gray;
}
.rozucitel1 {
color:#FF0000;
border-left-color:gray;
}
.rozucitel1zm {
color:#FF0000;
border-left-color:gray;
background-color:#FFC1C1;
}
.rozskupina1 {
border-left-color:gray;
}
.rozskupina1zm {
border-left-color:gray;
background-color:#FFC1C1;
}
.rozmistnost1zm {
background-color:#FFC1C1;
}
.rozmistnost1only {
border-left-color:gray;
}
.rozmistnost1onlyzm {
border-left-color:gray;
background-color:#FFC1C1;
}
.rozpredmet1abs {
border-left-color:gray;
border-top-color:gray;
background-color:#ADD8E6;
}
.rozucitel1abs {
color:#FF0000;
border-left-color:gray;
background-color:#ADD8E6;
}
.rozskupina1abs {
border-left-color:gray;
background-color:#ADD8E6;
}
.rozmistnost1abs {
background-color:#ADD8E6;
}
.rozmistnost1onlyabs {
border-left-color:gray;
background-color:#ADD8E6;
}
.rozpredmet2 {
background-color:#FFFFF0;
border-top-color:gray;
}
.rozpredmet2prvni {
background-color:#FFFFF0;
}
.rozucitel2 {
background-color:#FFFFF0;
color:#FF0000;
}
.rozskupina2 {
background-color:#FFFFF0;
}
.rozmistnost2 {
background-color:#FFFFF0;
}
.rozmistnost2only {
background-color:#FFFFF0;
}
.rozbunka2 {
background-color:#FFFFF0;
border-color:gray;
}
.rozseznampred {
background-color:#FFFFFF;
}
.rozseznamucit {
background-color:#FFFFFF;
}
.rozseznamhlava {
 background:url('content.jpg');
 background-repeat:repeat-x;
 border-color:#e9dc4b;
}
'''
html="""
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>\n
<head>\n
\t<script>
\t\tself.moveTo(%s);
\t\tself.resizeTo(675,415);
\t</script>
\t<meta http-equiv="content-type" content="text/html; charset=utf-8">
\t<title>Rozhrh hodin T3A</title> 
\t<style type="text/css">
\t%s
\t</style>
</head>\n
<body>
%s
Poslední aktualizace: %s
<body>\n
<html>
"""
#display = "%s,%s" % ((D.Display().screen().root.get_geometry().width-670)/2, (D.Display().screen().root.get_geometry().height-395)/2 )
#os.system('echo `/usr/bin/xrandr` | /bin/grep -o -E [[:digit:]]..?.x[[:digit:]].?.. >> /tmp/res.tmp')
#tmp_display_file = open("/tmp/res.tmp", "r")
#tmp_display = tmp_display_file.readlines()[0][:-1]
#tmp_display_file.close()
try:
# tmp_display=Com.getstatusoutput("echo `/usr/bin/xrandr` | /bin/grep -o -E [[:digit:]]..?.x[[:digit:]].?..")[1].split("\n")[0]
# display="%s,%s" % ((int(tmp_display.split("x")[0])-670)/2, (int(tmp_display.split("x")[1])-415)/2)
os.system('echo `/usr/bin/xrandr -d :0.0` | /bin/grep -o -E [[:digit:]]..?.x[[:digit:]].?.. >> /tmp/res.tmp')
tmp_display_file = open("/tmp/res.tmp", "r")
tmp_display = tmp_display_file.readlines()[0][:-1]
tmp_display_file.close()
display="%s,%s" % ((int(tmp_display.split("x")[0])-670)/2, (int(tmp_display.split("x")[1])-415)/2)
except:
write(log_file, "%s\tNebyo možné rozpoznat rozlišení displeje. Použije se zadaná hodnota." % time(), 0)
tmp_display=DISPLAY_RESOLUTION
display="%s,%s" % ((int(tmp_display.split("x")[0])-670)/2, (int(tmp_display.split("x")[1])-415)/2)
write(log_file, "%s\tDisplay OK.\n" % time(), 0)

browser = mechanize.Browser()
browser.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
browser.addheaders = [('User-agent', 'Opera/9.80 (X11; Linux i686; U; en) Presto/2.7.62 Version/11.00')]
try:
start_time=Time()
browser.open("http://baka.spse.dobruska.cz/baka/login.aspx")
except:
connection_error()

browser.select_form("aspnetForm")
browser.form["ctl00$cphmain$TextBoxjmeno"] = LOGIN
browser.form["ctl00$cphmain$TextBoxheslo"] = PASSWORD
write(log_file, "%s\tVyber formular - OK.\n" % time(), 0)
try:
browser.submit()
except:
connection_error()

try:
browser.open("http://baka.spse.dobruska.cz/baka/prehled.aspx?s=6")
except:
connection_error()
end_time=Time()
result_time=ctime(end_time-start_time)
write(log_file, "%s\tInformace byly staženy za %sm %ss.\n" % (time(), result_time.split(":")[1], result_time.split(":")[2][:-5]), 0)

doc = browser.response().read().decode("utf-8")
div = doc[doc.find("modulincenter")+15:doc.find("</tbody></table>")+16]

WriteOpenHTML(div.encode("utf-8"), time())

write(log_file, "%s\tBěh scriptu ukončen.\n" % time(),1)

sys.exit(0)

Rozlišení displeje se vyplňovat nemusí, většinou by se mělo zjistit automaticky. Finálka to není, musím ještě zjistit jak natáhnout změny na další týden a stálý rozvrh. Bohužel ve wiresharku jsou všechny dotazy na server stejné, takže tudy to nepůjde...

//EDIT: Málem bych zapomněl na nejdůležitější, musí se změnit adresy webu. Zde bych taky prosil o info, zda data za za lomítkem v adrese jsou stejné, nebo to je jiné.
« Poslední změna: 05 Prosinec 2011, 19:53:05 od Kamil Hanus »
Only wimps use tape backup: _real_ men just upload their important stuff on ftp, and let the rest of the world mirror it ;)

starenka

  • Závislák
  • ****
  • Příspěvků: 1276
  • Karma: plynová [zapalovač] [hasičák]
    • Zobrazit profil
    • /home/starenka
Re:"aplikace" bakaláři a <div>y
« Odpověď #1 kdy: 03 Prosinec 2011, 22:22:19 »
Na snifovani a jednodussi manipulaci/save POST/GETu primo z browseru zkus httpfox nebo tamperdata (nemusis se srat s wiresharkem). Btw ten kod je teda ehehe.... hmm... nevim jak to rict.. zkus treba pro zacatek pouzit logging argparse/optparse a nejakej template system...
mojenka | blozinek v2 | starej blozinek | krotim hady za penize | UJ! Kalužátor

Debian testing vrní v Thinkpadu X200/bedně/EEE 900a, MasoX Tiger v lampe

Kamil Hanus

  • Člen
  • **
  • Příspěvků: 221
    • Zobrazit profil
    • kamilhanus.cz
Re:"aplikace" bakaláři a <div>y
« Odpověď #2 kdy: 05 Prosinec 2011, 19:52:51 »
Nakonec jsem si v tamperdata všiml, že odesílá trochu pozměněný požadavek, takže by to snad mohlo jít. O těch parserech pro argumenty jsem neměl tušení, určitě to asi bude lepší na ošetření neplatných požadavků. I když u takovéhoto skriptu je to celkem jedno...

Každopádně díky za rady ;)
Only wimps use tape backup: _real_ men just upload their important stuff on ftp, and let the rest of the world mirror it ;)