Untitled
unknown
plain_text
2 years ago
7.5 kB
10
Indexable
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()
Editor is loading...