Untitled

 avatar
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...