Python İle Instagram Masaüstü Uygulaması

Instagram kullananlar bilecektir, default olarak bilgisayar üzerinden Instagram’a resim yükleyemiyorsunuz. Bunun yerine tarayıcıyı çeşitli şekillerde manipüle etmek zorunda kalıyorsunuz. Ben de “bunu neden elle yapmak yerine Python’a yaptırmayayım ki?” dedim ve araştırmaya koyuldum.

İlk olarak aklıma Selenium modülü geldi. Kendi başıma bir şeyler yapmaya çalıştım ama pek başarılı olamadım. Tekrar araştırmaya koyuldum ve “–user-agent” diye bir şey buldum. Bu argümanı kullanarak tarayıcıyı mobilden, yani telefondan giriyormuşuz gibi kandırabiliyoruz.

Örnek kod:

chrome_options.add_argument('--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1')

Zaten verdiğim kod satırını incelerseniz demek istediğim şeyi anlarsınız. Farklı cihazlar için: https://developers.whatismybrowser.com/useragents/explore/

Altta verdiğim örnek kod ile gayet güzel bir şekilde tarayıcıyı kandırıp telefondan girmişiz gibi gösterebiliyoruz.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1')
driver = webdriver.Chrome(options = chrome_options)
driver.get('https://www.instagram.com')

Fakat bir sorun vardı. Programı her kapatıp açtığımda yeniden giriş yapmam gerekiyordu, pencere boyutunu değiştirdiğimde yine ilk açıldığı haline dönüyordu. Yani hiç bir bilgilerimi kaydetmiyordu. Bu gerçekten çok can sıkıcı bir şeydi!

Tekrar araştırmaya koyuldum. Çünkü Selenium hakkında hiç bir şey bilmiyordum. Bu istediğim şeyin yapılıp yapılamayacağı hakkında bile fikrim yoktu. Kısa süre içinde “user-data-dir” argümanını buldum. Bilgisayarda yüklü olan Google Chrome uygulamasının ayarlarını bizim kullanacağımız googledriver modülüne göndermemizi sağlıyordu bu argüman.

Örnek kod:

chrome_options.add_argument('user-data-dir=C:/Users/{Bilgisayar Adı}/AppData/Local/Google/Chrome/User Data/Default')

Her şey çok güzeldi. Artık tekrar tekrar giriş yapmama gerek kalmayacak, pencere boyutunu da istediğim gibi ayarlayabilecektim. Ama bir şeyler yanlıştı. Tarayıcının üstünde bulunan adres çubuğu ve sekmeler bütün doğallığı ortadan kaldırıyordu benim için. Bu uygulamayı kullanacaksam onların orada olmaması gerekiyordu! Peki ne yaptım? Tekrar araştırdım. :slight_smile:

Öncelikle bunu Google Chrome ayarlarını kurcalayarak çözmeye çalıştım. Sonuç: Hiç bir şekilde Chrome bunları gizlememe izin vermiyordu. Gece boyunca araştırmama devam ettim. Bu gereksiz şeyleri nasıl gizleyebilirdim? Kesinlikle onlar oradayken bu programı kullanmak istemiyordum.

Şöyle bir yöntem bulmuştum; Chrome üzerinden sayfayı kısayol olarak masaüstüne kaydettiğim zaman o kısayoldan açtığımda bambaşka bir tasarımla açılıyordu. Yani sekmeler ve adres çubuğu yoktu! İşte bu tam olarak istediğim şeydi. Fakat “yine” büyük bir sorun vardı. Selenium modülünü çalıştırdığım zaman zaten bir tarayıcı açıyordu. Benim bu kısayolu kullanabilmem için Selenium’un açtığı tarayıcıyı açmaması gerekiyordu. Yine sorun, yine sorun… :frowning:

Tahmin edeceğiniz gibi tekrar web yollarına koyuldum. Bunu nasıl engelleyebilirdim? Bir yandan araştırıyor, bir yandan düşünüyordum. Ve yine bir şeyler bulmuştum: “headless” argümanı. Bu argüman Selenium modülünde tarayıcıyı açmadan modülü çalıştırıyordu.

O da ne? Yeni bir şey daha öğrendim. Bu argüman “user-data-dir” argümanı ile çalışmıyordu! İçim içimi yemeye başlamıştı artık. Neden?! Sadece bilgisayar üzerinden kolayca Instagram’a yaptığım 3D modelleme çalışmalarını atmak istiyordum! Bu kadar zor olmamalıydı!

Yine de pes etmedim! :angry: “Python kesinlikle Google Chrome’u yenebilir” diye düşündüm. Ben de headless argümanı yerine farklı çözüm yolları aradım. Peki ya arka planda bu kısayolu çalıştırıp ardından Selenium’un açtığı tarayıcıyı kapatırsam? Hmm… Bunu kodla değil de elle yaptığımda işe yaramıştı. Neden kodla da yapılmasındı ki? Şimdi Python üzerinden kısayolları açabilmek için nelerin gerekli olduğunu öğrenmem gerekiyordu. Ve evet, hemen bulmuştum. win32com.shell.shell ve win32event modülleri.

Yazdığım kodlarla değişiklik yaparak şu hale getirdim:

from selenium import webdriver  
from selenium.webdriver.common.keys import Keys  
from selenium.webdriver.chrome.options import Options
import win32com.shell.shell as shell
import win32event

chrome_options = Options()
chrome_options.add_argument('--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1')
chrome_options.add_argument('user-data-dir=C:/Users/Root/AppData/Local/Google/Chrome/User Data/Default')
driver = webdriver.Chrome(options=chrome_options)

se_ret = shell.ShellExecuteEx(fMask=0x140, lpFile=r'Instagram.lnk', nShow=1)
win32event.WaitForSingleObject(se_ret['hProcess'], -1)

driver.get('https://www.instagram.com')
driver.close()

Bir program yazarken yazılımcının (en azından benim) başıma gelenleri anlattım. Umarım okurken sıkılmamışsınızdır. Sonucunda da yazdığım şey harika bir şekilde çalışıyordu! Ben de sizinle paylaşmak istedim. :smiley:

Ekran Görüntüsü:

Ekleme: Pencerenin üstünde çıkan “Chrome is being controlled by automated test software” yazısını kaldırmak istiyorsanız add_argument’lerin altına şu kodları yazmanız yeterli.

chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
6 Likes