Spaces:
Sleeping
Sleeping
| from flask import Flask, render_template, redirect, url_for, request, session, send_file | |
| # from cookie import fetch_new_cookies | |
| from bs4 import BeautifulSoup | |
| import pandas as pd | |
| import threading | |
| import requests | |
| import tempfile | |
| import json | |
| import os | |
| # Setup Flask app | |
| app = Flask(__name__) | |
| app.secret_key = 'the_data_of_KV' | |
| # Global variable to store student data | |
| student_data = [] | |
| url = "https://epay.unionbankofindia.co.in/kvchallan/welcome.aspx" | |
| # cookies = [] | |
| # fetch_cookie = fetch_new_cookies() | |
| # if fetch_cookie: | |
| # cookies.append(fetch_cookie) | |
| # else: | |
| # print("Failed to fetch cookies.") | |
| # cookie = cookies[0] if cookies else None | |
| cookie = "e1qvm22s3ouzn2njrla4yv45" | |
| headers = { | |
| 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', | |
| 'Accept-Language': 'en-US,en;q=0.9', | |
| 'Cache-Control': 'max-age=0', | |
| 'Connection': 'keep-alive', | |
| 'Content-Type': 'application/x-www-form-urlencoded', | |
| 'Cookie': f'ASP.NET_SessionId={cookie}', | |
| 'DNT': '1', | |
| 'Origin': 'https://epay.unionbankofindia.co.in', | |
| 'Referer': 'https://epay.unionbankofindia.co.in/kvchallan/default.aspx', | |
| 'Sec-Fetch-Dest': 'document', | |
| 'Sec-Fetch-Mode': 'navigate', | |
| 'Sec-Fetch-Site': 'same-origin', | |
| 'Upgrade-Insecure-Requests': '1', | |
| 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0', | |
| 'sec-ch-ua': '"Not)A;Brand";v="99", "Microsoft Edge";v="127", "Chromium";v="127"', | |
| 'sec-ch-ua-mobile': '?0', | |
| 'sec-ch-ua-platform': '"Windows"' | |
| } | |
| def main(payload): | |
| student = payload.split('=')[1] | |
| print(f"Checking for student code {student}...") | |
| response = requests.post(url, headers=headers, data=payload) | |
| data = response.text | |
| if 'ctl00_ContentPlaceHolder1_lblName' in data: | |
| name = data.split('ctl00_ContentPlaceHolder1_lblName">')[1].split('</span>')[0] | |
| else: | |
| return None | |
| if name == '': | |
| return None | |
| else: | |
| dob = data.split('ctl00_ContentPlaceHolder1_lblDOB">')[1].split('</span>')[0] | |
| ubiId = data.split('ctl00_ContentPlaceHolder1_lblUnique">')[1].split('</span>')[0] | |
| Class = data.split('ctl00_ContentPlaceHolder1_lblClass">')[1].split('</span>')[0] | |
| school = data.split('ctl00_ContentPlaceHolder1_lblSchoolName">')[1].split('</span>')[0] | |
| # Parsing HTML with BeautifulSoup to extract VIEWSTATE and other form data | |
| soup = BeautifulSoup(data, 'html.parser') | |
| viewstate = soup.find('input', {'id': '__VIEWSTATE'})['value'] | |
| eventvalidation = soup.find('input', {'id': '__EVENTVALIDATION'})['value'] | |
| # Prepare the payload for the POST request to simulate the button click | |
| button_payload = { | |
| '__VIEWSTATE': viewstate, | |
| '__EVENTVALIDATION': eventvalidation, | |
| '__EVENTTARGET': 'ctl00$ContentPlaceHolder1$lnkChallan', | |
| '__EVENTARGUMENT': '', | |
| 'student_code': student | |
| } | |
| # Send the POST request to generate the challan | |
| challan_response = requests.post(url, headers=headers, data=button_payload) | |
| challan_data = challan_response.text | |
| if challan_data.splitlines()[0].strip() == "<script>alert('Student is not active, can not generate challan!');</script>": | |
| current_status = "No" | |
| else: | |
| current_status = "Yes" | |
| json_entry = ( | |
| '\t{\n' | |
| f' "name": "{name}",\n' | |
| f' "dob": "{dob}",\n' | |
| f' "ubiId": "{ubiId}",\n' | |
| f' "class": "{Class}",\n' | |
| f' "school": "{school}",\n' | |
| f' "enrolled": "{current_status}"\n' | |
| ' }' | |
| ) | |
| with open('data.json', 'w') as f: | |
| json.dump(student_data, f, indent=4) | |
| print(f"Name: {name}\nDOB: {dob}\nUBI ID: {ubiId}\nClass: {Class}\nSchool: {school}\nCurrently Enrolled: {current_status}\n") | |
| return { | |
| "name": name, | |
| "dob": dob, | |
| "ubiId": ubiId, | |
| "class": Class, | |
| "school": school, | |
| "enrolled": current_status | |
| } | |
| # Background thread function | |
| def background_worker(): | |
| payload = 'student_code=321456109002825' # Starting point | |
| consecutive_failures = 0 | |
| year = int(payload.split('=')[1][7:9]) | |
| while True: | |
| result = main(payload) | |
| if result is None: | |
| consecutive_failures += 1 | |
| else: | |
| consecutive_failures = 0 # Reset on success | |
| student_data.append(result) | |
| if consecutive_failures == 100: # Increment year after 100 failures | |
| consecutive_failures = 0 | |
| admission_number = int(payload.split('=')[1][-6:]) - 100 | |
| year += 1 | |
| payload = f'student_code=3214561{year}{admission_number :06d}' | |
| # Increment student_code | |
| student_number = int(payload.split('=')[1]) | |
| payload = f'student_code={student_number + 1:015d}' | |
| # Start the background worker thread | |
| threading.Thread(target=background_worker, daemon=True).start() | |
| def index(): | |
| if 'logged_in' in session and session['logged_in']: | |
| return redirect(url_for('dashboard')) | |
| return render_template('login.html') | |
| def login(): | |
| username = request.form['username'] | |
| password = request.form['password'] | |
| # Replace with actual authentication logic | |
| login_username = os.getenv("username") | |
| login_password = os.getenv("password") | |
| if username == login_username and password == login_password: | |
| session['logged_in'] = True | |
| return redirect(url_for('dashboard')) | |
| return 'Invalid credentials', 401 | |
| def logout(): | |
| session.pop('logged_in', None) | |
| return redirect(url_for('index')) | |
| def dashboard(): | |
| if 'logged_in' not in session or not session['logged_in']: | |
| return redirect(url_for('index')) | |
| return render_template('dashboard.html', data=student_data) | |
| def download(): | |
| if 'logged_in' not in session or not session['logged_in']: | |
| return redirect(url_for('index')) | |
| # Convert student data to a DataFrame | |
| columns = ['Name', 'DOB', 'UBI ID', 'Class', 'School', 'Enrolled'] | |
| data = [] | |
| for student in student_data: | |
| data.append([ | |
| student['name'], | |
| student['dob'], | |
| student['ubiId'], | |
| student['class'], | |
| student['school'], | |
| student['enrolled'] | |
| ]) | |
| df = pd.DataFrame(data, columns=columns) | |
| # Save to a temporary Excel file | |
| temp_dir = tempfile.gettempdir() | |
| file_path = f"{temp_dir}/student_data.xlsx" | |
| df.to_excel(file_path, index=False) | |
| # Send the file to the user | |
| return send_file(file_path, as_attachment=True, download_name='student_data.xlsx') | |
| if __name__ == '__main__': | |
| app.run(debug=True) |