Untitled

mail@pastecode.io avatar
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()