Last active
December 29, 2015 07:39
-
-
Save sushain97/7637221 to your computer and use it in GitHub Desktop.
Checks user's Skyward account against given requirements and writes results to encrypted log file
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import requests, ssl, sys, pprint, binascii, os, lxml.html | |
from Crypto.Cipher import DES | |
from requests.adapters import HTTPAdapter | |
from requests.packages.urllib3.poolmanager import PoolManager | |
def checkClass(classData): | |
rows = ['period', 'class', 'description', 'term', 'teacher', 'cp1', 'pr1', 'cp2', 'pr2', 'ct1', 't1', 'cp3', 'pr3', 'cp4', 'pr4', 'ct2', 't2', 'se1', 's1', 'cp5', 'pr5', 'pr6', 'ct3', 't3', 'cp7', 'pr7', 'cp8', 'pr8', 'ct4', 't4', 'se2', 's2', 'fin'] | |
classRequirements = { | |
'MA662': 80, #Multivariable Calculus | |
'MA351': 80, #Calculus BC | |
'MA451': 85, #Statistics | |
'MA241': 85, #Pre-Calculus | |
'MA231': 85, #Algebra II | |
'MA221': 85 #Geometry | |
} | |
if classData[rows.index(period)]: | |
classNumber = classData[rows.index('class')] | |
score = int(classData[rows.index(period)]) | |
if classNumber[0:2] == 'MA' and classNumber in classRequirements: | |
return score >= classRequirements[classNumber] | |
elif classNumber[0:2] == 'MA': | |
return False | |
else: | |
return score >= 80 | |
else: | |
return True | |
class MyAdapter(HTTPAdapter): | |
def init_poolmanager(self, connections, maxsize, block=False): | |
self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, block=block, ssl_version=ssl.PROTOCOL_TLSv1) | |
if __name__ == '__main__': | |
username = sys.argv[1] | |
password = sys.argv[2] | |
period = sys.argv[3].lower() | |
data ='''requestAction=eel&method=extrainfo&codeType=tryLogin&codeValue={0}&hCompName=SKYWEB13J&hOSName=Windows%20NT&login={0}&password={1}&SecurityMenuID=0&HomePageMenuID=0&hNavSearchOption=all&hSecCache=0%20items%20in%200%20entities&CurrentProgram=skyportlogin.w&CurrentVersion=010142&SuperVersion=011728&PaCVersion=05.13.10.00.05-10.2&Browser=Chrome&BrowserVersion=31&BrowserPlatform=Win32&TouchDevice=false&noheader=yes&duserid=-1&hIPInfo=76.30.97.235&HomePage=sepadm01.w&loginID=-1&hUseCGIIP=yes&UserSecLevel=5&UserLookupLevel=5&hAnon=bjlbYpAByijcxUsV&pState=TX&pCountry=US&hDistSerial=0001c004&hDisplayBorder=true&hAlternateColors=true&screenWidth=1920&screenHeight=1080&hforgotLoginPage=seplog01&userAgent=Mozilla%2F5.0%20(Windows%20NT%206.1%3B%20WOW64)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F31.0.1650.57%20Safari%2F537.36&osName=Windows%207&brwsInfo=Chrome%2031&subversion=31&supported=true&pageused=Desktop&recordLimit=30&hOpenSave=no&hButtonHotKeyIDs=bCancel&hButtonHotKeys=B&hLoadTime=.066&cUserRole=family%2Fstudent&fwtimestamp=1385334952071'''.format(username, password) | |
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36', | |
'Content-Type': 'application/x-www-form-urlencoded', | |
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', | |
'Accept-Encoding': 'gzip,deflate,sdch', | |
'Accept-Language': 'en-US,en;q=0.8,ca;q=0.6', | |
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36', | |
'Connection': 'keep-alive', | |
'Origin': 'https://skyward-fbprod.iscorp.com', | |
'Cache-Control': 'max-age=0', | |
} | |
webInterfaceURL = 'https://skyward-fbprod.iscorp.com/scripts/wsisa.dll/WService=wsedufortbendtx/seplog01.w' | |
authURL = 'https://skyward-fbprod.iscorp.com/scripts/wsisa.dll/WService=wsedufortbendtx/skyporthttp.w' | |
homeURL = 'https://skyward-fbprod.iscorp.com/scripts/wsisa.dll/WService=wsedufortbendtx/sfhome01.w' | |
gradeBookURL = 'https://skyward-fbprod.iscorp.com/scripts/wsisa.dll/WService=wsedufortbendtx/sfgradebook001.w' | |
oldGradeBookURL = 'https://skyward-fbprod.iscorp.com/scripts/wsisa.dll/WService=wsedufortbendtx/sfwgrd01.w?TS=0' | |
s = requests.Session() | |
s.mount('https://', MyAdapter()) | |
s.get(webInterfaceURL) | |
r = s.post(authURL, data=data, headers=headers, verify=False) | |
sessionVars = r.text[:r.text.find('^sfwmnu')].replace('<li>', '').split('^') | |
dwd = sessionVars[0] | |
recid = sessionVars[2] | |
web_data_recid = sessionVars[1] | |
wfaacl = sessionVars[3] | |
student = sessionVars[4] | |
userid = sessionVars[5] | |
data = 'User-Type=2&web-data-recid=' + web_data_recid + '&Student=' + student + '&Entity=001&wfaacl-recid=' + recid + '&config-id=14' | |
r = s.post(oldGradeBookURL, data=data, headers=headers, verify=False) | |
classesData = [] | |
html = lxml.html.fromstring(r.text) | |
studentName = html.cssselect('.NameHeader')[0].text_content().replace('\xa0', '').replace('Student: ', '') | |
classRows = html.cssselect('.sched001') | |
for classRow in classRows: | |
classData = [] | |
for td in classRow: | |
classData.append(td.text_content().replace('\xa0', '').replace('\n', '').replace('\t', '').strip()) | |
classData[1] = classData[1][0:classData[1].find('/')] | |
classesData.append(classData) | |
requirementsNotFulfilled = [] | |
print(studentName) | |
for classData in classesData: | |
#print('_'.join(classData)) | |
fullfillsRequirements = checkClass(classData) | |
if not fullfillsRequirements: | |
requirementsNotFulfilled.append(classData) | |
print(requirementsNotFulfilled) | |
plaintext = '%s ==== %s' % (studentName, str(requirementsNotFulfilled)) | |
DESInstance = DES.new('PRIVATE_ENCRYPTION_KEY_HERE', DES.MODE_ECB) | |
ciphertext = DESInstance.encrypt(plaintext + (8 - len(plaintext) % 8) * 'X') | |
with open('log.txt', 'ab') as logFile: | |
logFile.write(binascii.hexlify(ciphertext) + b'\r\n') | |
os.system('cls' if os.name=='nt' else 'clear') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment