Untitled
Anonymous
plain_text
09/15/2023 6:25 PM
9.8 KB
30
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...