Merhaba. Öncelikle ne yaptığımı anlatayım daha sonrasında sorumu size yönelticem ki beni daha iyi anlayın.
Önceki açtığım Şu konudan sonra orada yaptığımı bırakıp kenara çekildim ve kendi kendime dedim ki, twitchte olan moderasyon botlarından bende kendime ait olan bir tanesini yapmalıyım dedim. Başladım işe koyulmaya. Twitchin dökümanından verilebilen izinlere, izinler doğrultusunda neler yaptırabileceğime, Kullanıcının bağırarak (CAPS LOCK açık bir şekilde) mesaj yazdığını tespit ettiğinde chatten silmesine(yayıncı ve moderatörler hariç), kullanıcıların kullanabileceği özel komutlar, yalnızca moderatörlerin ve yayıncının kullanabildiği bazı komutlar ekledim, Yayının başlığını değiştirebilme özelliği ekledim. Kısacası MooBot’un yapabildiklerini aşağı yukarı bende yapmaya çalıştım. Adını verdiğim botu diğer kullanıcılara da sorduğumda “Bir internet sitesi var ordan oradan yapıyorsun” dediklerini gördüm. Demeleri üzerine botu inceledim ve böyle bir şeyi bende yapabilirim diye düşündüm. Hiç tecrübemin olmadığı flask framework’ünü kurdum. Videolar ve yazılar okuyarak ordan burdan bakarak biraz yol kat ettim. Database kullanımına baktım normal sqlite3’ü denedim sonrasında baktığımda sqlalchemy diye bir method olduğunu gördüm. Fazla karmaşık ve sanki biraz gereksiz bir kullanım gibi geldi. sonrasını düşünerek hareket etmeye çalıştığımdan firebase adında google’ın da işin içinde bulunduğu(önceden bildiğim ama kullanamadığım) bir veri tabanını gördüm. Veri tabanı demek yanlış olur keza çok kapsamlı o yüzden ne diyeceğimi bilmiyorum Onu kullanarak içerisine yayıncının access tokenini kayıt ettim sonrası ordan alıp okuma tabiiki oralar daha sonra halledilir
Bir ana sayfa yaptım (sadece “Ana sayfa” ve “Twitch ile giriş yap” butonu var). Gördüm ki yönlendirme(redirect) denilen bir durum varmış (botun yalnızca ilgili kanalda kullanılabilmesi için örneğin başlığı değiştir denince ilgili kanala ait yayının başlığını değiştirmek gibi…) Bu yönlendirme linki de şu şekilde: (https://id.twitch.tv/oauth2/authorize?client_id=rhxkti3axfpp3cuc50g03hp1j3jroq&redirect_uri=http://localhost:5000&response_type=code&scope=chat:read+chat:edit+channel:moderate+channel:manage:broadcast+channel:read:editors+channel:read:subscriptions+user:read:email)
Buradaki yönlendirme sonucu ilgili twitch adresimizi girmek üzere bir pencereye yönlendiriyor. Girildikten sonra “Yetkilendir” butonuna basılıyor. Basıldıktan sonra verdiğim yönlendirme linkini incelerseniz redirect_uri
parametresine karşılık gelen argumanda benim ana sayfama yönlendiriyor. Yönlendirme işleminin hemen ardından ana sayfamın bulunduğu urlde code
adında bir parametre oluşuyor. Bu parametredeki değerle post işlemi yaparak bizim BEARER
kodumuz yani access token
'ımızi vermiş oluyor.
Buraya kadar yaptıklarımı kod olarak atıyorum.
Flask ile ilgili app.py
from pprint import pprint
from flask import Flask,render_template,request,redirect,url_for
from util.twitch_ import TwitchAPI
from util.twitch_ import FireBase_DB
imgProfile = None
app = Flask(__name__)
@app.route("/")
def homePage(): # app.py ilk çalıştığında homePage adında yanı bu fonksiyon çalışıyor.
global imgProfile
code = request.args.get("code")
if code: # fonksiyon çalıştıktan sonra eğer url de "code" adında bir parametreye sahip arguman varsa
twitch = TwitchAPI(code) # kendi oluşturduğum sınıfa arguman olarak veriyorum bunun kod kısmınıda paylaşıcam
token = twitch.getToken() # ilgili BEARER kodumu (access token) alıyorum
user = twitch.getUser(token) # Yayıncı hakkında bilgi aldığım bir method arguman olarak tokeni gönderiyorum
userN = user["data"][0]["display_name"] # Yayıncının adını barındıran json formatından ayıklanan yayıncı adı
imgProfile = user["data"][0]["profile_image_url"] # Yayıncının profil resmini barındıran json formatından ayıklanan yayıncı profil resmi
db.write(token) # FireBase_DB adını verdiğim sınıfımdaki methodu kullanıyorum. arguman olarak token değişkenini veriyorum. Bu FireBase(google)'de RealtimeDatabase'e yazıyor.
return redirect(url_for("login", streamer=userN)) # redirect ile içerisine girilen url'ye yönlendiriliyor. url_for fonksiyonu ile kendi "login" adını verdiğim fonksiyona yönlendiriyorum ikinci aldığı parametre yayıncının adı oluyor
else: # fonksiyon çalıştıktan sonra eğer url de "code" adında bir parametreye sahip arguman yoksa
return render_template("index.html") # ana sayfanın görüntüsü
@app.route("/login/r/<streamer>") # Dinamik bir url oluşturuyorum fonksiyona girdiğim parametre ile buraya yazdığım dinamik değerin adı aynı olmalı üstteki url_for da da keza öyle
def login(streamer):
return render_template("login.html", streamer=streamer,img=imgProfile) # html sayfasında görebilmek için parametre olarak veriyorum vermesemde olur bu o kadar muhim değil
if __name__ == "__main__":
db = FireBase_DB() # kendi oluşturduğum sınıfı çağırıyorum
app.run(debug=True) # Kaydettikten sonra otomatik yeniden başlatması için debug parametresini True olarak ayarlıyorum
Şimdi kod açıklamalarında sözünü ettiğim, kendim oluşturduğum sınıfların kodunu veriyorum:
util klasörü Firebase ve Twitch ile ilgili twitch_.py dosyası
import requests
from firebase_admin import credentials
from firebase_admin import db
import firebase_admin # google'ın oluşturduğu FireBase ile ilgili modül
class TwitchAPI:
def __init__(self,code:str) -> None:
"Yönlendirilen URL'deki code parametresine karşılık gelen argumanı gir"
self.code = code
def getUser(self,access:str) -> dict: # https://api.twitch.tv/helix/users
"Yayıncı Hakkında bilgi verir sözlük tipinde değer döndürür"
__headers = {
"Authorization" : f"Bearer {access}",
"Client-Id" : "rhxkti3axfpp3cuc50g03hp1j3jroq" # ilgili botun twitch tarafından verilen client id'si
}
self.resp = requests.get("https://api.twitch.tv/helix/users",headers=__headers).json()
return self.resp
def getToken(self) -> dict: # https://id.twitch.tv/oauth2/token"
"Twitch için gerekli `access_token` anahtarını alır"
__params = {
"client_id": "rhxkti3axfpp3cuc50g03hp1j3jroq", # ilgili botun twitch tarafından verilen client id'si
"client_secret": "<client_secret adresim(bot olarak kullandığım hesabın)>",
"code" : self.code,
"grant_type" : "authorization_code",
"redirect_uri" : "http://localhost:5000"
}
response = requests.post("https://id.twitch.tv/oauth2/token",params=__params).json()
return response["access_token"]
class FireBase_DB(TwitchAPI):
def __init__(self) -> None:
if not firebase_admin._apps:
__cred = credentials.Certificate("flaskprojesi-sdk.json")
firebase_admin.initialize_app(__cred,{"databaseURL":"<databasenin bulunduğu url>"})
self.ref = db.reference("Streamers") # "Streamers" adında bir başlık(doğru telaffuz mu bilmiyorum) oluşturdum
def write(self,bearer:str) -> None:
"Yayıncıya ait `Bearer` kodunu Veri tabanına yazar"
json_data = super().getUser(bearer)
self.ref.update({json_data["data"][0]["display_name"] : bearer}) # yayıncı "key" olmak üzere "value" karşılığı Bearer kodunu yazdırıyorum
def read(self,user:str): # Burayı henüz düzenlemedim ekledim sonrasında ayarlayacağım
"Kullanıcı adına ait bearer kodu döndürür"
return self.ref.get()[user]
Takıldığım nokta şu; Yönlendirme işleminde code
değerini alıp ardından token değerine sahip oluyorum evet bu çok iyi. Aldıktan sonra kullanıcı kendi sayfasına yönlendirme yöntemini GET methodu ile yapıyor. Yani bu durum şu oluyor: https://localhost:5000/login/r/arif yazan herhangi bir kişi benim sayfama girmiş oluyor. bunu POST methodu ile yaptığımda da bana yapılamacağına dair bir uyarı veriyor. Ben bu duruma bir önlem alamıyorum. Şimdi bunun bir ss’ini atıyorum:
Unutmadan söyleyeyim en başta twitch yönlendirme urlsini html dosyasında a
etiketinde kullanıyorum
Hemen onun da kodunu buraya yazıyorum:
Ana sayfanın bulunduğu html sayfası index.html
Html konusunda neredeyse hiç bilgi ve tecrübe sahibi değilim sürekli deneyerek geldiğim durum şuanki gördüğünüz gibi
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
<title>Ana Sayfa</title>
</head>
<body>
<h1>Ana Sayfa</h1>
<a href="https://id.twitch.tv/oauth2/authorize?client_id=rhxkti3axfpp3cuc50g03hp1j3jroq&redirect_uri=http://localhost:5000&response_type=code&scope=chat:read+chat:edit+channel:moderate+channel:manage:broadcast+channel:read:editors+channel:read:subscriptions+user:read:email" class="btn btn-warning">Connect with Twitch</a>
<script src="/static/js/bootstrap.bundle.min.js"></script>
</body>
</html>
Takıldığım diğer bir nokta ise şu; Atıyorum kullanıcı bir kez giriş yaptı. Siteye tekrar girmeye kalktığında kullanıcı sayfasına nasıl yönlendirebilirim ? Sonuçta bilgisayarda “.ini” dosyası gibi bir dosya kaydettirip ordan durum sorgulatma yapamam her nihayetinde bu bir internet sitesi (en azından öyle )
Çok uzun oldu farkındayım fakat başka nasıl açıklayabilirdim bilmiyorum. Yardımlarınız için şimdiden teşekkür ediyorum.