<filename>sabis_terminal.py
import requests
import json
import click
from getpass import getpass
from bs4 import BeautifulSoup as soup
from tabulate import tabulate;

data = {}
dersler = []
notlar  = []
tokenName = <PASSWORD>"
loginUrl = "https://sabis.sakarya.edu.tr/tr/Login"
ana_sayfa_url = "https://ogr.sakarya.edu.tr/"

def get_anti_CSRF(page):
    try:
        antiCSRF = page.find("input",{"name":tokenName})["value"]
        return antiCSRF
    except:
        pass

def help():
    print("SABIS TERMINAL - a tool for accessing sabis through the command line using scraping\nexit - çıkmak için\nd {sayı} - dönem seçmek için 1-GÜZ 2-BAHAR 3-YAZ\nclear - ekranı temizle")

def get_term(donem):
    dersler.clear()
    notlar.clear()
    dersler_url  = ana_sayfa_url + "tr/Ders?donem=" + str(donem)
    try:
        dersler_html = soup(session.get(dersler_url).text,"html.parser")
    except ConnectionError:
        exit("connection closed by the server.")
    panels = dersler_html.findAll("div",{"class":"panel"})

    x = 0

    for panel in panels:
        ders_ismi = panel.find("h5").find("a").text
        grup = dersler_html.findAll("td")[0].text.strip()

        notlar_html = panel.findAll("a",{"class":"list-group-item"})

        ders_notlari = []
        for note_html in notlar_html:
            row = note_html.findAll("div",{"class":"col-xs-2"})
            calisma = note_html.find("div",{"class":"col-xs-6"}).text.strip()

            try:
                oran = float(row[0].text.strip().replace(",","."))
                puan = float(row[1].find("hy").text.strip().replace(",","."))
            except (ValueError,AttributeError):
                puan = 0.0

            ders_notlari.append([calisma,oran,puan])

        notlar.append(ders_notlari)
        dersler.append([x,ders_ismi,grup])
        x += 1

def calculate_final_grade(marks):
    final_grade = 0
    for mark in marks:
        final_grade += (mark[1]*mark[2])/100
    return final_grade

def print_term(donem):
    get_term(donem)
    print(str(donem)+". dönem seçilmiştir")
    print(tabulate(dersler,["NO","Ders","Grup"],tablefmt="rst"))

try:
    cache = open("data.json","r+")
    file_data  = json.load(cache)
    data["no"] = file_data.get("no")
    data["donem"] = file_data.get("donem")
    cache.close()
except (FileNotFoundError,ValueError):
    pass

try:
    username = data["no"]
    print("Kullanıcı adı: %s"%(data["no"]))
except KeyError:
    username = input("Kullanıcı adı: ")

password = <PASSWORD>("<PASSWORD>        : ")

session = requests.Session()
page_html = soup(session.get(loginUrl).text,"html.parser")

loginData = {
    "UserName" : username,
    "Password" : password,
    tokenName : get_anti_CSRF(page_html)
}

loginRequest = session.post(
    loginUrl,
    loginData
)

ana_sayfa_html =  soup(session.get(ana_sayfa_url).text,"html.parser")

if get_anti_CSRF(ana_sayfa_html):
    exit("Hatalı giriş")

studentName = ana_sayfa_html.findAll("strong")[0].text

print("Merhaba %s\nyardım için 'help' gir." % (studentName))

try:
    print_term(data["donem"])
except KeyError:
    pass

while True:
    i = input().split()
    get_term(data.get("donem"))
    try:
        ders = int(i[0])
        print(dersler[ders][1])
        print(tabulate(notlar[ders],["Çalışma","Oran","Not"],tablefmt="rst",floatfmt=".2f"))
        print("Başarı Notu: %.2f"%(calculate_final_grade(notlar[ders])))
    except (IndexError,ValueError):
        pass

    if(i[0] == "exit"):
        break
    elif(i[0] == "donem"):
        try:
            print_term(i[1])
            data["donem"] = i[1]
        except KeyError:
            print("Hata! sadece 1 ile 3 arasında sayı girebilirsin.")
    elif(i[0] == "help"):
        help()
    elif(i[0] == "clear"):
        click.clear()

cache = open("data.json","w")
json.dump({
    "no"      :username,
    "donem"   :data.get("donem")
},cache)
cache.close()
exit("Güle güle")

<filename>sabis_terminal.py
import requests
import json
import click
from getpass import getpass
from bs4 import BeautifulSoup as soup
from tabulate import tabulate;

data = {}
dersler = []
notlar  = []
tokenName = <PASSWORD>"
loginUrl = "https://sabis.sakarya.edu.tr/tr/Login"
ana_sayfa_url = "https://ogr.sakarya.edu.tr/"

def get_anti_CSRF(page):
    try:
        antiCSRF = page.find("input",{"name":tokenName})["value"]
        return antiCSRF
    except:
        pass

def help():
    print("SABIS TERMINAL - a tool for accessing sabis through the command line using scraping\nexit - çıkmak için\nd {sayı} - dönem seçmek için 1-GÜZ 2-BAHAR 3-YAZ\nclear - ekranı temizle")

def get_term(donem):
    dersler.clear()
    notlar.clear()
    dersler_url  = ana_sayfa_url + "tr/Ders?donem=" + str(donem)
    try:
        dersler_html = soup(session.get(dersler_url).text,"html.parser")
    except ConnectionError:
        exit("connection closed by the server.")
    panels = dersler_html.findAll("div",{"class":"panel"})

    x = 0

    for panel in panels:
        ders_ismi = panel.find("h5").find("a").text
        grup = dersler_html.findAll("td")[0].text.strip()

        notlar_html = panel.findAll("a",{"class":"list-group-item"})

        ders_notlari = []
        for note_html in notlar_html:
            row = note_html.findAll("div",{"class":"col-xs-2"})
            calisma = note_html.find("div",{"class":"col-xs-6"}).text.strip()

            try:
                oran = float(row[0].text.strip().replace(",","."))
                puan = float(row[1].find("hy").text.strip().replace(",","."))
            except (ValueError,AttributeError):
                puan = 0.0

            ders_notlari.append([calisma,oran,puan])

        notlar.append(ders_notlari)
        dersler.append([x,ders_ismi,grup])
        x += 1

def calculate_final_grade(marks):
    final_grade = 0
    for mark in marks:
        final_grade += (mark[1]*mark[2])/100
    return final_grade

def print_term(donem):
    get_term(donem)
    print(str(donem)+". dönem seçilmiştir")
    print(tabulate(dersler,["NO","Ders","Grup"],tablefmt="rst"))

try:
    cache = open("data.json","r+")
    file_data  = json.load(cache)
    data["no"] = file_data.get("no")
    data["donem"] = file_data.get("donem")
    cache.close()
except (FileNotFoundError,ValueError):
    pass

try:
    username = data["no"]
    print("Kullanıcı adı: %s"%(data["no"]))
except KeyError:
    username = input("Kullanıcı adı: ")

password = <PASSWORD>("<PASSWORD>        : ")

session = requests.Session()
page_html = soup(session.get(loginUrl).text,"html.parser")

loginData = {
    "UserName" : username,
    "Password" : password,
    tokenName : get_anti_CSRF(page_html)
}

loginRequest = session.post(
    loginUrl,
    loginData
)

ana_sayfa_html =  soup(session.get(ana_sayfa_url).text,"html.parser")

if get_anti_CSRF(ana_sayfa_html):
    exit("Hatalı giriş")

studentName = ana_sayfa_html.findAll("strong")[0].text

print("Merhaba %s\nyardım için 'help' gir." % (studentName))

try:
    print_term(data["donem"])
except KeyError:
    pass

while True:
    i = input().split()
    get_term(data.get("donem"))
    try:
        ders = int(i[0])
        print(dersler[ders][1])
        print(tabulate(notlar[ders],["Çalışma","Oran","Not"],tablefmt="rst",floatfmt=".2f"))
        print("Başarı Notu: %.2f"%(calculate_final_grade(notlar[ders])))
    except (IndexError,ValueError):
        pass

    if(i[0] == "exit"):
        break
    elif(i[0] == "donem"):
        try:
            print_term(i[1])
            data["donem"] = i[1]
        except KeyError:
            print("Hata! sadece 1 ile 3 arasında sayı girebilirsin.")
    elif(i[0] == "help"):
        help()
    elif(i[0] == "clear"):
        click.clear()

cache = open("data.json","w")
json.dump({
    "no"      :username,
    "donem"   :data.get("donem")
},cache)
cache.close()
exit("Güle güle")
