Skip to content

Instantly share code, notes, and snippets.

@sushain97
Last active December 29, 2015 07:39
Show Gist options
  • Save sushain97/7637221 to your computer and use it in GitHub Desktop.
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
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