Untitled
unknown
plain_text
2 years ago
7.5 kB
12
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...