Proliz'in öğrenci otomasyonunun bazen çok can sıkıcı olabilen oldukça hantal bir yapısı var. Örneğin ders programı girişinde sadece bir dersin saatini ve yerini belirlemek için normalde sunucuya birkaç sayı göndermek yeterli olacakken, ASPnin her yerde kullanılmaması gereken bir özelliği yüzünden tüm sayfa içeriği tekrar tekrar sunucuya gidip oradan geri geliyor. Neredeyse her tıklamada "yükleniyor" yazısıyla karşılaşıp gereksiz veri trafiğinin bitmesini bekliyorsunuz...
Eklenti yardımıyla klavyeden giriş yapmanıza gerek kalmadan herşeyi fare yardımıyla halledebilirsiniz. Ders programı giriş ekranındayken simgeye tıkladığınızda eklenti, dersleri ve sınıfları otomasyondan çeker, örgüne göre ders saatlerini, ders aralarını kendi hesaplar ve sisteme kendi girer. Size sadece seçeneklerden hızlıca seçim yapmak kalır. Formdan forma atlamadan, sade bir arayüz üzerinden ders programının tamamını girebilirsiniz.
Eklentiyi kullanmak için aşağıdaki dosyaları oluşturup Chrome'a chrome://extensions arayüzünden yüklemeniz yeterli.
dpgy.js:
/* ***** Ders Programı Giriş Yardımcısı ***** * Öğrenci otomasyonuna ders programı girişini * biraz olsun kolaylaştırmak için... * 20/01/2019 * http://huseyinatasoy.com ********************************************** */ function uyari(m) { var e=document.getElementById('bilgi'); e.innerHTML=m; e.style.color='red'; } function bilgi(m) { var e=document.getElementById('bilgi'); e.innerHTML=m; e.style.color='green'; } function lazimsaSifir(s) { return (s<10?'0':'')+s; } function aralikliSaatler(sDkBas,sDkSon,dersSuresiDk,araDk) { if(sDkSon[0]>23) sDkSon[0]=23; var secenekler=''; var araMs=araDk*60*1000; var dersSuresiMs=dersSuresiDk*60*1000; var t=new Date(); t.setHours(sDkBas[0]); t.setMinutes(sDkBas[1]); var sDkToplamDk=sDkSon[0]*60+sDkSon[1]; while(t.getHours()*60+t.getMinutes()<sDkToplamDk) { secenekler+='<option>'; secenekler+=lazimsaSifir(t.getHours())+':'+lazimsaSifir(t.getMinutes())+'-'; t=new Date(t.getTime()+dersSuresiMs); secenekler+=lazimsaSifir(t.getHours())+':'+lazimsaSifir(t.getMinutes()); secenekler+='</option>'; t=new Date(t.getTime()+araMs); } return secenekler; } var viewStateZimbirtisi,viewStateG; function gonder(e) { var s=e.value; var s1=s.substr(6,5); var s2=s.substr(12,5); u=url.replace('start.aspx','ders_programi_kayit.aspx'); ref=url; s=`fetch("`+u+`", { "credentials":"include", "headers": { "accept":"*/*", "accept-language":"tr,en;q=0.9", "cache-control":"no-cache", "content-type":"application/x-www-form-urlencoded; charset=UTF-8", "x-microsoftajax":"Delta=true", "x-requested-with":"XMLHttpRequest" }, "referrer":"`+ref+`", "referrerPolicy":"no-referrer-when-downgrade", "body":"ScriptManager1=UpdatePanel1%7CbtnKaydet&cmbFakulte=-1` +`&cmbDerslik=`+document.getElementById('siniflar').value +`&cmb_gunler=`+document.getElementsByTagName('select')[1].selectedIndex +`&txtBasSaat=`+encodeURIComponent(s1) +`&txtBitSaat=`+encodeURIComponent(s2) +`&__VIEWSTATE=`+encodeURIComponent(viewStateZimbirtisi) +`&__VIEWSTATEGENERATOR=`+encodeURIComponent(viewStateG) +`&txtAciklama=&__EVENTTARGET=&__EVENTARGUMENT=&__LASTFOCUS=&__SCROLLPOSITIONX=0&__SCROLLPOSITIONY=0&__ASYNCPOST=true&btnKaydet=Kaydet", "method":"POST", "mode":"cors" }).then(function() { document.getElementById("bailwal_overlay_frame").contentWindow .document.getElementById("grd_ders_hareket") .getElementsByTagName("tr")[`+(document.getElementById("dersler").selectedIndex)+`] .getElementsByTagName("td")[0].click(); });`; chrome.tabs.executeScript(sekmeId,{code:s}); } function hazirla() { var e=document.getElementById('ilkS'); var i=e.selectedIndex; var j=document.getElementById('sonS').selectedIndex; var icerik=''; var s=e.getElementsByTagName('option'); for(var k=i;k<=j;k++) icerik+='<input type="button" value="Ekle: '+s[k].value+'">'; if(icerik=='') icerik='-'; document.getElementById('butonlar').innerHTML=icerik; var e=document.getElementsByTagName('input'); for(i=0;i<e.length;i++) e[i].addEventListener('click',function(){ this.style.color='#ddd';this.style.backgroundColor='#191';gonder(this); }); } function hazirsaYenile() { var hazirMiydi=(document.getElementById('butonlar').innerHTML.trim()!=''); if(hazirMiydi) hazirla(); return hazirMiydi; } var url; function dersleriCek() { var js=` var dersSayisi=0, satirlar=null, ogretim=1; try { var ifD=document.getElementById('bailwal_overlay_frame').contentWindow.document; satirlar=ifD.getElementById('grd_ders_hareket').getElementsByTagName('tr'); dersSayisi=satirlar.length-3; if(ifD.getElementById('select2-cmb_prog-container').innerText.indexOf('İÖ')>0) ogretim=2; }catch(e){} var dersler=''; for(var i=1;i<=dersSayisi;i++) dersler+='<option>'+satirlar[i].getElementsByTagName('td')[2].innerText.trim()+'</option>'; Array(dersSayisi,dersler,ogretim); `; chrome.tabs.executeScript(sekmeId,{code:js},function(snc) { snc=snc[0]; var dersS=parseInt(snc[0]); if(dersS>0) { bilgi('Dersi seçin.'); var saatler='<option>Seçiniz...</option>', ogretim=parseInt(snc[2]); if(ogretim==1) saatler+=aralikliSaatler([8,30],[12,0],45,10)+aralikliSaatler([13,30],[17,0],45,10); else saatler+= aralikliSaatler([17,0],[23,0],45,5); document.getElementById('frm').innerHTML='<h2>Ders Listesi:</h2> <select id="dersler"><option>Seçiniz...</option>'+snc[1]+'</select>' +'<h2>Gün:</h2> <select><option>Pazartesi</option><option>Salı</option><option>Çarşamba</option><option>Perşembe</option><option>Cuma</option><option>Cumartesi</option></select>' +'<table><tr><td><h2>İlk dersin saati:</h2></td><td><h2>Son dersin saati:</h2></td></tr>' +'<tr><td><select id="ilkS"></select></td><td><select id="sonS"></select></td></tr></table>'; var ilkS=document.getElementById('ilkS'); var sonS=document.getElementById('sonS'); document.getElementById('dersler').addEventListener('change',function() { document.getElementById('butonlar').innerHTML=''; if(this.selectedIndex<1) return; chrome.tabs.executeScript(sekmeId,{ code:"document.getElementById('bailwal_overlay_frame').contentWindow.document.getElementById('grd_ders_hareket').getElementsByTagName('tr')["+(this.selectedIndex)+"].getElementsByTagName('td')[0].click()" }); ilkS.innerHTML=saatler; sonS.innerHTML=saatler; bilgi('Günü ve ilk ders saatini seçin'); }); var s=document.getElementsByTagName('select'); ilkS.addEventListener('change',function() { if(!hazirsaYenile()) { chrome.tabs.executeScript(sekmeId,{ code:"document.getElementById('bailwal_overlay_frame').contentWindow.document.getElementById('btnEkle').click()" }); bilgi('Ekleme formunun tamamen yüklenmesini bekleyin, ardından son ders saatini seçin.'); } }); sonS.addEventListener('change',function() { var js=` var url, viewStateG='', viewStateZimbirtisi='', siniflar=-1; try { var icCerceve=document.getElementById('bailwal_overlay_frame').contentWindow; var icCerceve2=icCerceve.document.getElementById('bailwal_overlay_frame').contentWindow; siniflar=icCerceve2.document.getElementById('cmbDerslik').innerHTML; url=icCerceve2.document.URL; viewStateZimbirtisi=icCerceve2.document.getElementById('__VIEWSTATE').value; viewStateG=icCerceve2.document.getElementById('__VIEWSTATEGENERATOR').value; icCerceve.document.getElementById('bailwal_span_overlay_window_question').nextSibling.nextSibling.click(); }catch(e){} Array(siniflar,viewStateG,viewStateZimbirtisi,url); `; chrome.tabs.executeScript(sekmeId,{code:js},function(snc) { snc=snc[0]; if(parseInt(snc[0])!=-1) { document.getElementById('sinif').innerHTML='<h2>Sınıf:</h2> <select id="siniflar"><option>Seçiniz...</option>'+snc[0]+'</select>'; } if(snc[1]!='') { viewStateG=snc[1]; viewStateZimbirtisi=snc[2]; url=snc[3]; } }); if(!hazirsaYenile()) bilgi('Dersin yapılacağı sınıfı seçin.'); }); document.getElementById('sinif').addEventListener('change',function() { hazirla(); bilgi('Şimdi her bir butona tıkladıktan sonra eklenen saatin sayfada belirmesini bekleyin.'); }); } else { uyari('Giriş yaptıktan sonra ders giriş formunu açmanız gerekiyor.'); } }); } var sekmeId=1; document.addEventListener('DOMContentLoaded',function() { chrome.tabs.query({active:true,currentWindow:true},function(sekmeler) { sekmeId=sekmeler[0].id; var url=sekmeler[0].url; if(!url.startsWith('https://obs.iste.edu.tr/')) { var d=document.getElementById('frm'); d.style.color='red'; d.innerHTML='Otomasyonda değilsiniz. Yönlendirilmek için <a target="_blank" href="https://obs.iste.edu.tr/">tıklayınız</a>.'; return; } bilgi('Hazırlanıyor...'); dersleriCek(); }); });
dpgy.html:
<!doctype html> <html> <head> <title>Ders Programı Girişi</title> <style type="text/css"> body { margin:10px;padding:10px;padding-top:0;min-width:250px; } h1 { font-size:15px;text-align:center; } h2 { font-size:13px;margin:10px 0 4px 0; } hr { background-color:#777;border:none;height:1px;margin:10px -10px; } #frm { min-width:300px; } table { width:100%; } table td { padding:0;margin:0; } #siteye,#bilgi { text-align:center;margin-top:10px; } #bilgi { font-size:14px; } a { color:blue;text-decoration:none; } #siteye a { color:#999; } select { padding:5px;width:100%;border-radius:5px;outline:none; } option { padding:5px; } img { height:2em;vertical-align:middle;padding:0 10px; } #butonlar { text-align:center; } input[type=button] { margin:10px 5px;margin-bottom:0;padding:5px;border-radius:5px;background:#ddd;border:1px #aaa solid; } </style> <script src="dpgy.js"></script> </head> <body> <h1><img src="dpgy_simge.png">Ders Programı Girişi<img src="dpgy_simge.png"></h1><hr> <div id="frm"></div> <div id="sinif"></div> <div id="butonlar"></div> <div id="bilgi"></div> <div id="siteye"><a href="http://huseyinatasoy.com" target="_blank">huseyinatasoy.com</a></div> </body> </html>
manifest.json:
{ "manifest_version": 2, "name": "Ders Programı Giriş Yardımcısı", "description": "Prolizin insanı kanser etme potansiyeline sahip ders programı ekleme arayüzü için bir yardımcı eklenti.", "version": "1.0", "browser_action": { "default_icon": "dpgy_simge.png", "default_popup": "dpgy.html" }, "permissions": [ "activeTab" ] }
Ve son olarak dpgy_simge.png:
Proliz gibi sistemleri anlamanızı beklemiyoruz zaten,
anlasaydınız (kanser v.b.) bu yorumları yapmadınız zaten,
Çok biliyorsanız siz kanser etmeyen bir uygulama yazın ve dağıtın,
Yazdığınız uygulamalarda kullanıcılardan kullanıcı adı ve şifre alıyorsunuz,
bu KVKK ve diğer yasalar gereği ciddi bir suçtur.
Merhaba Gökhan bey, otomasyonun pek çok kısmının aktif kullanıcısıyım ve ben de bir yazılımcıyım. Amacım kötülemek değil, bazı kısımların kötü kurgulandığını düşünüyorum sadece. Yoksa arkasında büyük emek var, bundan şüphem yok.
Kullanıcıdan kullanıcı adı ve şifre girişi istediğim programı (Yoklama Yardımcısı isimli programı kastettiniz sanırım) kendi kişisel kullanımım için yazdım ve onu dağıtmıyorum. Ama amacım, yukarıda da dediğim gibi sistemi kötülemek değil, işleri kolaylaştırmak.
Bence kullanıcılardan, özellikle akademik taraftan geri dönüş alabileceğiniz bir mekanizma kurarsanız, hizmeti alan taraf olarak biz kullanıcılar için harika olur. Çünkü bazı şeyler gerçekten daha hızlı halledilebilir ve zaman bizim için çok değerli...
insanları resmi kurumlardaki kimliğinizi kullanarak aldatıyorsunuz,
resmi kurum kimliğiniz ile elde ettiğiniz verileri paylaşamazsınız, dağıtamazsınız,
Üslubunuz niye daha da çirkinleşti anlamadım.
Hangi resmi kimliğimle kimi aldatmışım? Hangi bilgiyi nerede paylaşmış ya da dağıtmışım? Bir iftira atıyorsunuz; buyurun ispatını yapın. Varsa mağdur olan herhangi bir şekilde veya hakkında bilmişlik tasladığınız yasalara bir aykırılık durumu varsa buyurun elinizden geldiğince şikayet edin beni, ismim cismim belli. Hatta bana mail adresi bırakın size kimlik numaramı, adresimi falan da göndereyim.
İnsanlara parayla hizmet satıyorsunuz ve hizmeti kullanan kullanıcıların eleştirilerine tahammül edemiyorsunuz. Ben bir kullanıcınız ve dolayısıyla müşteriniz sayılırım. Bu nasıl üslup?
Umarım gerçekten Proliz'in bir çalışanı değilsinizdir (yorumun gönderildiği ip adresi prolize ait). Birazdan bu çirkinlikle ilgili Proliz'le de iletişime geçeceğim...