Python Techolay çekiliş scripti

  • Konuyu başlatan Konuyu başlatan 2426
  • Başlangıç Tarihi Başlangıç Tarihi
  • Mesaj Mesaj 26
  • Görüntüleme Görüntüleme 2B
  • Etiketler Etiketler
    techolay
Hocam bu arada kodu yeniden güncelledim. Kazanan ve yedek kazanan sayısı belirlemeyi ekledim. Sanırsam GitHub üzerinden de yayınlanabiliyor fakat dediğim gibi kullanmayı bilmediğim için buradan yayınlayacağım. Kurulum için ek bir modül indirmeye gerek yok.
[CODE lang="python" title="Bahsettiğim Güncelleme"]import requests
from bs4 import BeautifulSoup
import random
import tkinter as tk
from tkinter import messagebox

def get_usernames(url, page_count=1):
usernames = []
selected_usernames = set()
for page in range(1, page_count + 1):
response = requests.get(f"{url}?page={page}")
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
comments = soup.find_all(class_='m-userContent')
for comment in comments:
if "Katılıyorum." in comment.text:
username = comment.find_previous(class_='username').text.strip()
if username is None:
username = ""
if username not in selected_usernames:
usernames.append(username)
selected_usernames.add(username)
return usernames

def select_winner(usernames):
if usernames:
winner = random.choice(usernames)
return winner
else:
return None

def select_backup_winner(usernames, winner):
remaining_users = [user for user in usernames if user != winner]
if remaining_users:
backup_winner = random.choice(remaining_users)
return backup_winner
else:
return None

def run_giveaway():
url = url_entry.get()
page_count = int(page_count_entry.get())
usernames = get_usernames(url, page_count)

# Remove the first participant (the one who posted the initial message)
if usernames:
usernames.pop(0)

total_participants_label.config(text=f"Katılanlar: {len(usernames)}")

participant_list.delete(0, tk.END)
for username in usernames:
participant_list.insert(tk.END, username)

winner_count = int(winner_count_entry.get())
backup_count = int(backup_count_entry.get())

winners = []
backup_winners = []

for _ in range(winner_count):
winner = select_winner(usernames)
if winner:
winners.append(winner)
usernames.remove(winner)

for _ in range(backup_count):
backup_winner = select_backup_winner(usernames, random.choice(winners) if winners else None)
if backup_winner:
backup_winners.append(backup_winner)
usernames.remove(backup_winner)

if winners:
winner_label.config(text=f"Kazananlar: {', '.join(winners)}")
if backup_winners:
winner_label.config(text=f"Kazananlar: {', '.join(winners)}\nYedek Kazananlar: {', '.join(backup_winners)}")
else:
winner_label.config(text=f"Kazananlar: {', '.join(winners)}\nYedek Kazanan bulunamadı.")
else:
winner_label.config(text="Katılım gösteren kullanıcı bulunamadı.")

# Create the main UI window
root = tk.Tk()
root.title("Çekiliş Kazanan Seçici")

# Create UI elements
url_label = tk.Label(root, text="Çekiliş konusunun linkini girin:")
url_entry = tk.Entry(root, width=50)
page_count_label = tk.Label(root, text="Sayfa sayısını girin:")
page_count_entry = tk.Entry(root, width=10)
winner_count_label = tk.Label(root, text="Kazanan sayısını girin:")
winner_count_entry = tk.Entry(root, width=10)
backup_count_label = tk.Label(root, text="Yedek kazanan sayısını girin:")
backup_count_entry = tk.Entry(root, width=10)
run_button = tk.Button(root, text="Çekilişi Başlat", command=run_giveaway)
total_participants_label = tk.Label(root, text="")
participant_list = tk.Listbox(root, width=50, height=10)
winner_label = tk.Label(root, text="")

# Arrange UI elements
url_label.pack()
url_entry.pack()
page_count_label.pack()
page_count_entry.pack()
winner_count_label.pack()
winner_count_entry.pack()
backup_count_label.pack()
backup_count_entry.pack()
run_button.pack()
total_participants_label.pack()
participant_list.pack()
winner_label.pack()

# Start the UI event loop
root.mainloop()
[/CODE]
 
Son düzenleme:

Birazdan bakacağım.
 
Python:
import random
import requests
from bs4 import BeautifulSoup

def get_usernames(url, page_count=1):
    usernames = []
    selected_usernames = set()
    for page in range(1, page_count + 1):
        response = requests.get(f"{url}?page={page}")
        if response.status_code == 200:
            soup = BeautifulSoup(response.text, "html.parser")
            comments = soup.find_all(class_="m-userContent")
            for comment in comments:
                username_tag = comment.find_previous(class_="username")
                if username_tag is not None:
                    username = username_tag.text.strip()
                    if username and username.lower() not in selected_usernames:
                        if "katılıyorum" in comment.text.lower():
                            usernames.append(username)
                            selected_usernames.add(username.lower())
    return usernames

def select_winner(usernames):
    if usernames:
        winner = random.choice(usernames)
        print("Kazanan:", winner)
    else:
        print("Katılım gösteren kullanıcı bulunamadı.")

def main():
    url = input("Çekiliş konusunun linkini girin: ")
    page_count = int(input("Sayfa sayısını girin: "))
    usernames = get_usernames(url, page_count)
    print("Toplam katılımcı sayısı:", len(usernames))
    print("Çekilişe katılan kullanıcılar:")
    for username in usernames:
        print(username)
    select_winner(usernames)

if __name__ == "__main__":
    print("wyltre tarafından yapılmıştır. github.com/wyltre")
    main()
Artık "katılıyorum" ifadesi geçtiği anda katıldı olarak alıyor.
 
Son düzenleme:
Konuyu hortlatıyorum ama bir çekiliş planlıyorum ve hiç çekiliş tarzı bir şey yapmadım şimdiye kadar. Bu kodu kullansam işime yarar mı, tam olarak nasıl kullanabilirim?
 
Konuyu daha önce gördüm gibi hatırlıyorum ama son mesaj ile tekrar görünce göz atarım diye kaydetmiştim. Göz atma fırsatı buldum. Öncelikle söylediklerimi hakaret olarak algılamayın. Kibar eleştiri falan diye düşünün.

Konu tek kelimeyle berbat. En basitinden son mesajda görülebildiği gibi. İnsanlar kullanamıyor. Sıradan insanlardan Python kurmalarını, üstüne 2 tane kütüphane kurmalarını bekliyorsunuz. Hadi kütüphane affedilebilir ama durup dururken sisteme Python kurulması kadar gereksiz az şey var. Kütüphaneler için bir requirements.txt dosyası bile hazırlanmamış.

Konuda kod paylaşmayı amaçlayan 6 mesaj var ve bunlardan sadece 2'si başarılı. Çünkü yönetim kullanmayın dememe rağmen kod renklendiren uygulamayı kullanmış, üyeler de kullanmayın dememe rağmen bu özelliği kullanmış. Sonra da artık eklenti mi bozuldu, başka eklentiye mi geçildi, eklentiye güncelleme mi geldi bilmem. Bir regex ile forumdaki tüm mesajlar elden geçirilip düzeltilebilecek bir şey ama kim bilir ne zamandır bu halde ve ne kadar süre böyle kalacak. Bahsi geçen 2 mesajı da konu sahibi atmış, diğer mesajlardaki kodlar okunabilir halde olmadığı için okumaya çalışmayacağım.

İlk mesaj. Bu tip bir programın biraz daha genel amaçlı olmasını bekliyor insan. Katılıyorum dışında şeyler isteyen veya apaçık bir şekilde belirtmemiş olsa dahi başka kelimeleri de kabul etmek isteyenler olabilir. Bu yok.
Kullanıcılar bitiş tarihi istiyor, yok.
Yedek yok.
Konu sahibini saymama yok.
Sayfa sayısını girmek gerekiyor.
İlk mesajda değil, üçüncü mesajda denedim ama konu bağlantısı https://techolay.net/sosyal/konu/techolay-cekilis-scripti.12016/page-3 gibi hatalı verilirse çalışmıyor.
Alıntı mesajları göz ardı etme yok. Forum halkı devasa mesajları alıntılayıp 2 gramlık cevap yazmayı sever. Bunu bilmiyor olamazsınız.
Bu tip bir konuda sonradan konuşulmasına rağmen ilk mesaja yapılmış bir düzenleme yok. GitHub bağlantısından sonra kod paylaşılmaması daha mantıklı olurdu gibi geliyor.

İkinci mesajda koda bakmadan; yedek eklenmiş, konu sahibini saymama değil de ilk mesaj sayılmamış.

Üçüncü mesaj. Hayır, bütün XenForo forumlarında çalışmıyor. Örnek. Muhtemelen Technopat'ta denediniz, o kadar. Çok çeşitli tasarımlar yapılabiliyor. Sırf bunu göstermek için kodu formatlıyorum. Belki bakmak isteyen olur diye sürprizbozan içinde.

Kod:
import requests
from bs4 import BeautifulSoup
import random

def get_usernames(url, page_count=1):
    usernames = []
    selected_usernames = set()
    for page in range(1, page_count + 1):
        response = requests.get(f"{url}?page={page}")
        if response.status_code == 200:
            soup = BeautifulSoup(response.text, 'html.parser')
            comments = soup.find_all(class_='m-userContent')
            for comment in comments:
                if "Katılıyorum." in comment.text:
                    username = comment.find_previous(class_='username').text.strip()
                    if username is None:
                        username = ""
                    if username not in selected_usernames:
                        usernames.append(username)
                        selected_usernames.add(username)
    return usernames

def select_winner(usernames):
    if usernames:
        winner = random.choice(usernames)
        print("|||||||||||||||||||||||||KAZANAN:", winner, "||||||||||||||||||||||||||")
    else:
        print("Katılım gösteren kullanıcı bulunamadı.")

def main():
    url = input("Çekiliş konusunun linkini girin: ")
    page_count = int(input("Sayfa sayısını girin: "))
    usernames = get_usernames(url, page_count)
    print("Toplam katılımcı sayısı:", len(usernames))
    print("Çekilişe katılan kullanıcılar:")
    for username in usernames:
        print(username)
    print("____________________________")
    select_winner(usernames)

if __name__ == "__main__":
    print("wyltre tarafından yapılmıştır. github.com/wyltre")
    main()

input("Kapatmak İçin Enter Tuşuna Basın.")

Konuda da repoda da bir .exe muhabbeti dönmüş ama ortalıkta yok. İmzasız olacağı için kullanımı çok kolay olmayacaktır diye düşünüyorum. Kaldı ki insanların .exe'ye güvenmemesi beklenir.

Python yazıp GitHub Actions ile çalıştırmak aklıma geldi. Localde sizde nasıl çalışıyor anlamadım ama bende header koymadan requests çalışmıyor. 403 verip duruyor. Başkaları için de böyle olmaması için bir sebep yok bence. Koyduğum header ile GitHub Actions üzerinde çalışmadı, Cloudflare ağlayıp duruyor. Bypass etmenin yolunu bulan varsa sanıyorum ki kullanım açısından nispeten rahat olacaktır diyecektim ama bir kontrol edeyim dediğimde yanlış hatırladığımı fark ettim. Google hesabıyla GitHub hesabı oluşturulabiliyor diye aklımda kalmış. Tüm uçları ballı değnek mübarek.
Bir şekilde halledilebilecek bir şeydir muhtemelen ama kullanıcı deneyimi açısından herhalde en rahatı tarayıcı eklentisi olacaktır.

Asıl sorun kimsenin konudan haberdar olmaması. Tüm çekilişlerde kullanılsa dahi o kadar çok çekiliş olmuyor. 1 saat harcasanız dahi 1 yılda kaç çekiliş oluyor? Ctrl + F ile kelime filtreleyip isimleri bir siteye yapıştırmaya kıyasla ne kadar tasarruf ettirmiş oluyorsunuz? Çekiliş yapanlar 1 yılda toplam 1 saat harcıyor mudur?
Bu yüzden harcanan emeğe değmediğini düşünüyorum.
 
Begendim guzel bir script olmus. Fakat console app'ten ziyade ayni mantikla JS'e cevrilip Chrome eklentisi olarak kullanilabilir.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…