Untitled
unknown
plain_text
a year ago
7.5 kB
5
Indexable
Never
import sys import requests import pandas as pd from bs4 import BeautifulSoup from telegram import Update, InlineKeyboardMarkup, InlineKeyboardButton from telegram.ext import Updater, CommandHandler, MessageHandler, ConversationHandler, CallbackContext, Filters, CallbackQueryHandler # Tokeniniz TOKEN = "6685924267:AAF7fVqfRAb4-BScXGPSDHhys8MDBjqKstA" # Diyalog durumları SELECTING_ACTION = 1 ENTERING_RANK = 2 # Başarı sıralama verilerini tutmak için bir DataFrame df = None # Kullanıcıların sayfa numaralarını ve başarı sıralamalarını saklamak için bir sözlük user_data = {} # Her sayfada görüntülenecek üniversite sayısı PAGE_SIZE = 5 # Verileri web sitesinden otomatik olarak çek def fetch_data(): global df url = 'https://www.basarisiralamalari.com/tip-fakultesi-2024-basari-siralama-ve-taban-puanlari/' response = requests.get(url) if response.status_code == 200: page_content = response.text soup = BeautifulSoup(page_content, 'html.parser') tbody = soup.find('tbody') rows = tbody.find_all('tr') data = [] for row in rows: cells = row.find_all('td') row_data = [cell.get_text(strip=True) for cell in cells] data.append(row_data) df = pd.DataFrame(data, columns=['Üniversite Adı', 'Bölüm', 'Puan Türü', 'Kontenjan', 'Yerleştirme Puanı', 'Başarı Sırası']) df.to_excel('Sıralamalar.xlsx', index=False) # İlk kod bloğu: Verileri web sitesinden al ve Excel'e kaydet def scrape_data(update: Update, context: CallbackContext) -> int: fetch_data() update.message.reply_text("Veriler başarıyla çekildi ve Sıralamalar.xlsx'e kaydedildi.") return SELECTING_ACTION # Başarı sırasını giren kullanıcıyı işleyin def enter_rank(update: Update, context: CallbackContext) -> int: user = update.message.from_user text = update.message.text try: rank = float(text.replace(',', '.')) global df if df is None: update.message.reply_text("Önce verileri çekmek için /scrape komutunu kullanın.") return SELECTING_ACTION user_id = update.message.chat_id user_data[user_id] = {'rank': rank, 'page': 1} send_page(update, 1) except ValueError: update.message.reply_text("Lütfen geçerli bir başarı sırası girin. Örnek: 21482") return SELECTING_ACTION # Sayfa düğmesi işleme alındığında çağrılır def button(update: Update, context: CallbackContext) -> None: query = update.callback_query user_id = query.message.chat_id user_page = user_data[user_id]['page'] if query.data == "prev_page": user_data[user_id]['page'] = max(1, user_page - 1) elif query.data == "next_page": user_data[user_id]['page'] += 1 send_page(query, user_data[user_id]['page']) # Sayfa numarasına göre sonuçları gönder def send_page(query, page: int): user_id = query.message.chat_id # query kullanarak chat_id'yi al user_rank = user_data[user_id]['rank'] user_page = page # Kullanıcı başarı sırası girmemişse işlem yapma if user_rank is None: query.message.reply_text("Lütfen önce başarı sıranızı girin.") return start_index = (user_page - 1) * PAGE_SIZE end_index = start_index + PAGE_SIZE universities = [] for i, row in df.iterrows(): try: row_rank = float(row['Başarı Sırası'].replace('.', '')) if user_rank <= row_rank: universities.append((row['Üniversite Adı'], row['Bölüm'], row_rank)) except ValueError: continue if universities: max_pages = (len(universities) + PAGE_SIZE - 1) // PAGE_SIZE message = f"YERLEŞEBİLECEĞİNİZ ÜNİVERSİTELER (Sayfa {user_page} / {max_pages}):\n\n" for uni in universities[start_index:end_index]: message += f"Üniversite Adı: {uni[0]}\n" message += f"Bölüm: {uni[1]}\n" message += f"Başarı Sırası: {uni[2]}\n\n" # Mesajları birden çok parçaya bölmek max_message_length = 4000 # Telegram mesaj uzunluğu sınırı while message: query.message.reply_text(message[:max_message_length]) message = message[max_message_length:] # Sayfa düğmelerini gönder keyboard = [] if user_page > 1: keyboard.append([InlineKeyboardButton("Önceki Sayfa", callback_data="prev_page")]) if user_page < max_pages: keyboard.append([InlineKeyboardButton("Sonraki Sayfa", callback_data="next_page")]) reply_markup = InlineKeyboardMarkup(keyboard) query.message.reply_text("Sayfa düğmelerini kullanarak sonuçları görüntüleyebilirsiniz.", reply_markup=reply_markup) else: message = "Üzgünüz! Herhangi bir yere yerleştirilemediniz." query.message.reply_text(message) # /start komutu ile botu başlatın ve verileri çekin def start(update: Update, context: CallbackContext) -> int: user = update.message.from_user fetch_data() # Verileri otomatik olarak çekin user_data[update.message.chat_id] = {'rank': None, 'page': 1} # Başarı sırasını sıfırla ve sayfa numarasını ayarla # Başlatma mesajını gönderirken sadece "Puan Hesapla" butonunu ekleyin reply_markup = InlineKeyboardMarkup([ [InlineKeyboardButton("Puan Hesapla", url="https://ertansinansahin.com/yks-tyt-ayt-puan-hesaplama-ve-siralama-hesaplama/")], ]) update.message.reply_text( f"Merhaba {user.first_name}! Sıralama bazlı tercih sonuçlarına hoş geldiniz. Başarı sıranızı girerek hangi üniversitelere yerleşebileceğinizi öğrenebilirsiniz." "\nBaşarı sıranızı girin veya /cancel ile işlemi iptal edin.", reply_markup=reply_markup ) return ENTERING_RANK # İşlemi iptal edin def cancel(update: Update, context: CallbackContext) -> int: user = update.message.from_user user_data[update.message.chat_id] = {'rank': None, 'page': 1} # Başarı sırasını sıfırla ve sayfa numarasını ayarla update.message.reply_text(f"{user.first_name}, işlem iptal edildi.") return SELECTING_ACTION # Ana fonksiyon def main() -> None: updater = Updater(TOKEN, use_context=True) dp = updater.dispatcher conv_handler = ConversationHandler( entry_points=[CommandHandler('start', start)], states={ SELECTING_ACTION: [ MessageHandler( Filters.regex(r'^[\d,]+$'), enter_rank, ) ], ENTERING_RANK: [ MessageHandler( Filters.text & ~Filters.regex(r'^[\d,]+$'), enter_rank, ), CallbackQueryHandler(button, pattern="^siralama_gir$"), # "Sıralama Gir" butonuna tıklamayı işle ], }, fallbacks=[CommandHandler('cancel', cancel)], ) dp.add_handler(conv_handler) dp.add_handler(CommandHandler('scrape', scrape_data)) dp.add_handler(CallbackQueryHandler(button)) # Bu satır butonların kaybolmasını önler updater.start_polling() updater.idle() if __name__ == '__main__': main()