Spaces:
Runtime error
Runtime error
from telegram.ext.filters import Filters | |
from telegram.ext.messagehandler import MessageHandler | |
from telegram import Update, ParseMode | |
from telegram.ext import (Updater, | |
PicklePersistence, | |
CommandHandler, | |
CallbackQueryHandler, | |
CallbackContext, | |
ConversationHandler) | |
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, ForceReply, ReplyKeyboardMarkup | |
import requests | |
import hashlib | |
import sqlite3 | |
import re | |
from bs4 import BeautifulSoup | |
bot_token = '5415345086:AAFsaAWlJcgMd0Wii1Z8UgzpgSrfSZM1ZWw' | |
admin = 37087739 | |
############################################# | |
EXPECT_STATUS, EXPECT_USERNAME, EXPECT_PASSWORD, EXPECT_SUBMIT, EXPECT_BACK, EXPECT_BUTTON_CLICK = range(6) | |
def start(update: Update, context: CallbackContext): | |
chat_id = update.effective_chat.id | |
text = ('به ربات پرتال دانشجویی خوش آمدید 🌹') | |
update.message.reply_text(text, reply_markup=main_keyboard) | |
def set_info_handler(update: Update, context: CallbackContext): | |
username = context.user_data.get('username', 'تنظیم نشده است') | |
password = context.user_data.get('password', 'تنظیم نشده است') | |
text = (f'نام کاربری: {username}\n' | |
f'رمز عبور: {password}\n\n' | |
'لطفا یک گزینه را انتخاب نمایید') | |
button = [ [InlineKeyboardButton('رمز عبور', callback_data='pass'), | |
InlineKeyboardButton('نام کاربری', callback_data='user')], | |
[InlineKeyboardButton('ورود و دریافت نمرات', callback_data='login_portal')], | |
[InlineKeyboardButton('بازگشت', callback_data='cancel')], | |
] | |
inline_keyboard = InlineKeyboardMarkup(button) | |
update.message.reply_text(text, reply_markup=inline_keyboard) | |
return EXPECT_BUTTON_CLICK | |
def button_click_handler(update: Update, context: CallbackContext): | |
chat_id = update.effective_chat.id | |
query = update.callback_query | |
query.answer() | |
query.delete_message() | |
if query.data == 'login_portal': | |
web_url = 'https://pooya.um.ac.ir/gateway/PuyaAuthenticate.php' | |
resp = session.get(web_url, headers=headers) | |
soup = BeautifulSoup(resp.content, 'html.parser') | |
img_src = soup.find('img', id='secimg')['src'] | |
filename = 'C:/Users/Home/OneDrive/Desktop/captcha.png' | |
capcha_src = 'https://pooya.um.ac.ir' + img_src[2:] | |
context.user_data['captcha'] = capcha_src | |
context.bot.send_photo(chat_id, photo=capcha_src) | |
context.bot.send_message(chat_id, text='کد کپچا را وارد کنید', reply_markup=ForceReply()) | |
return EXPECT_SUBMIT | |
elif query.data == 'user': | |
context.bot.send_message(chat_id, text='نام کاربری خود را وارد کنید', reply_markup=ForceReply()) | |
return EXPECT_USERNAME | |
elif query.data == 'pass': | |
context.bot.send_message(chat_id, text='رمز عبور خود را وارد کنید', reply_markup=ForceReply()) | |
return EXPECT_PASSWORD | |
elif query.data == 'cancel': | |
query.answer('Opeartion canceled!') | |
return ConversationHandler.END | |
def hash_password(text): | |
password = hashlib.md5() | |
password.update(text.encode('utf-8')) | |
return password.hexdigest() | |
def login_portal(update: Update, context: CallbackContext): | |
chat_id = update.effective_chat.id | |
captcha = update.message.text | |
USER = context.user_data['username'] | |
PASS = context.user_data['password'] | |
capcha_src = context.user_data['captcha'] | |
login_data = { 'UserPassword': hash_password(PASS), | |
'pswdStatus': '', | |
'UserID': USER, | |
'DummyVar': '', | |
'rand2': capcha_src[capcha_src.find('rand2=')+6:], | |
'mysecpngco': captcha | |
} | |
req_url = 'https://pooya.um.ac.ir/gateway/UserInterim.php' | |
resp = session.post(req_url, data=login_data) | |
if resp.status_code == 200: | |
grade_list = session.get('https://pooya.um.ac.ir/educ/educfac/stuShowEducationalLogFromGradeList.php', headers=headers) | |
soup = BeautifulSoup(grade_list.content, 'html.parser') | |
data = [item.text.splitlines() for item in soup.find_all('tr', bgcolor="#E8E8FF")] | |
mean = [item.text.splitlines() for item in soup.find_all('tr', bgcolor="#C4C4FF")][1][3] | |
mark = '\n'.join([f'{i+1}) {row[2]}, {row[5]} ({row[8]})' for i, row in enumerate(data)]) | |
text = f'{mark}\nمعدل: {mean}' | |
context.bot.send_message(chat_id, text) | |
else: | |
print('Login faild!') | |
return ConversationHandler.END | |
def set_password(update: Update, context: CallbackContext): | |
context.user_data['password'] = update.message.text | |
update.message.reply_text('رمز عبور با موفقیت ثبت شد', reply_markup=main_keyboard) | |
return ConversationHandler.END | |
def set_username(update: Update, context: CallbackContext): | |
context.user_data['username'] = update.message.text | |
update.message.reply_text('نام کاربری با موفقیت ثبت شد', reply_markup=main_keyboard) | |
return ConversationHandler.END | |
def cancel(update: Update, context: CallbackContext): | |
update.message.reply_text('منوی اصلی', reply_markup=main_keyboard) | |
return ConversationHandler.END | |
############################################# | |
if __name__ == '__main__': | |
# Session | |
session = requests.session() | |
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'} | |
# Bot details | |
updater = Updater(token=bot_token) | |
updater.dispatcher.add_handler(CommandHandler('start', start)) | |
updater.dispatcher.add_handler(ConversationHandler( | |
entry_points=[MessageHandler(Filters.regex('ورود به پرتال دانشجویی'), set_info_handler)], | |
states={ | |
EXPECT_USERNAME: [MessageHandler(Filters.text, set_username)], | |
EXPECT_PASSWORD: [MessageHandler(Filters.text, set_password)], | |
EXPECT_SUBMIT: [MessageHandler(Filters.text, login_portal)], | |
EXPECT_BUTTON_CLICK: [CallbackQueryHandler(button_click_handler)], | |
EXPECT_BACK : [CallbackQueryHandler('cancel', start)] | |
}, | |
fallbacks=[MessageHandler(Filters.regex('cancel'), cancel)], | |
)) | |
buttons = [['ورود به پرتال دانشجویی']] | |
main_buttons = [row[::-1] for row in buttons] | |
main_keyboard = ReplyKeyboardMarkup(main_buttons, one_time_keyboard=True, resize_keyboard=True) | |
updater.start_polling() | |
print('Bot started ..........') |