Python Requests modülü kullanımı

Noises

Üye
22 Ağu 2017
165
0
26
Balıkesir
pip install requests

bro ısınamadım ben bu pythona ya bi öğreneyim dedim bakalım merak ettim diye çıktık yola stynaxı çok farklı geldi bana :D c# alıştığım için bi afalladım pythona geçince.
bide boşluk sorunu canımı sıkıyor pythonun. bakıyorum kod da sorun yok boşluklar iyi değil diye hata veriyor.
 

b0mb

Katılımcı Üye
14 Mar 2017
471
1
İzmir
bro ısınamadım ben bu pythona ya bi öğreneyim dedim bakalım merak ettim diye çıktık yola stynaxı çok farklı geldi bana :D c# alıştığım için bi afalladım pythona geçince.
bide boşluk sorunu canımı sıkıyor pythonun. bakıyorum kod da sorun yok boşluklar iyi değil diye hata veriyor.

Boşluk yerine tab kullanabilirsin. Python çok güzeldir :)
 

py_pow

Yeni üye
3 Ara 2022
50
36
Python Requests Modülü:

Öncelikle merhaba, uzunca bir süre aranızda olamayacağım ve giderken en azından bir konu bırakmak istedim. Python'da requests modülünü anlatacağım..

Nedir:


Requests modülü ,sloganında da olduğu gibi -Http for Humans-, "urllib3" tabanlı organik HTTP paketleri göndermenize yarayan modüldür.

Yükleme:

Requests modülü en kolay şekilde "pip install requests" şeklinde yüklenebilir.


Yapılabilecekler:

-> Brute Force atak scripti yazabilirsiniz.

-> HTTP istekleri gönderebilirsiniz.

-> Bir sitenin unicode dönüşüm biçimini görebilirsiniz.

Ve daha niceleri...


Kullanım örnekleri

Kod:
[/COLOR][/B][/CENTER]
[B][COLOR=White]
[CENTER]>>> import requests #modülümüzü içe aktaralım

>>> r = requests.get('https://github.com/login', auth=('Hacknology', ŞİFRE)) #github'a bağlanalım. Herhangi bir site olabilir bu

>>> r.status_code #Başarılı olmuş mu diye bakalım

200


Gördüğümüz gibi HTTP 200 döndürdü. Nedir bu 200?:

200 OK Tamam

201 Created Oluşturuldu

202 Accepted Onaylandı

203 Non-Authoritative Information Yetersiz Bilgi

204 No Content İçerik Yok

205 Reset Content İçeriği Baştan al

206 Partial Content Kısmi İçerik

207 Multi-Status WebDAV :Çok-Statü

210 Content Different WebDAV :Farklı İçerik




Tabii hepimiz en çok '404'ü biliriz :p "Sayfa bulunamadı". 200'de başarılı olduğunu gösterir. Şimdi unicode biçimine bakalım isterseniz:

Kod:
[/COLOR][/B][/CENTER]
[B][COLOR=White]
[CENTER]>>> r.encoding

'utf-8'


Gördüğümüz gibi utf-8 miş. Sitenin görüntülenen sayfasındaki içerik kodlarına da ulaşabiliriz (Chrome da ctrl+u şeklinde eriştiğimiz)

Kod:
[/COLOR][/B][/CENTER]
[B][COLOR=White]
[CENTER]>>> r.text


GET METODUNDA PARAMETRELER:

Üstte get metodundan küçük bir örnek vermiştik. Site url'sindeki parametreleri kullanarak sitedeki dosyalar değişkene atanabilir.

Misalen..

"http://www.sallatykka.com/web/index.php?id=31"

Bu örnek sitemiz olsun. (SQL açığı var bu arada. Anka belki ilgilenir)

burda 'id' değerinden sonra gelen '31' parametresi ayarlanabilir.

Kod:
[/COLOR][/B][/CENTER]
[B][COLOR=White]
[CENTER]import requests

r = requests.get("http://www.sallatykka.com/web/index.php",

                 params = {'id':31})

print(r.url)


Bize tam url'yi verecek, pekii bu ne işimize yarayacak?



-->Eğer biz burdaki id değerini sürekli 1 arttırıp base değerinden farklı bir sayı döndürenleri (bkz:HTTP durum kodlar) ayırırsak bir "web crawler" yapabiliriz.

Örnekle anlatayım:



1- Request modülünü içe aktaralım

2- Kullanıcıdan bir id değeri isteyelim

3- id değerini url üzerinde yerine koyalım

4- 200 döndürüyorsa bir listeye yazalım.

Kod:
[/COLOR][/B][/CENTER]
[B][COLOR=White]
[CENTER]import requests

id_deger = int(input('[*]Bir id değeri girin: '))

r = requests.get("http://www.sallatykka.com/web/index.php",

                 params = {'id':id_deger})

if r.status_code == 200:

    print('Bulundu!')

    print(r.url)


Kod:
[/COLOR][/B][/CENTER]
[B][COLOR=White]
[CENTER][*]Bir id değeri girin: 32

Bulundu!

http://www.sallatykka.com/web/index.php?id=32

>>>




JSON:

Öncelikle... Json nedir?

Google'a göre JSON:

"JSON, programlama dilinden bağımsız olan Xml'e alternatif olarak kullanılan javascript tabanlı veri değişim formatıdır. JSON'un amacı veri alış verişi yaparken daha küçük boyutlarda veri alıp göndermektir.Bu özellikleri sayesinde JSON ile çok hızlı web uygulamaları oluşturabilir."

Örneğin:


Kod:
[/B][/CENTER]
[B]
[CENTER]{

   "tur":"met.l",

   "grup":"System of a Down"

}


Peki biz bu jsondan nasıl faydalanırız?

requests modülünün .json() özelliği tam da bunun için. Yukarıda GET parametresinden bahsetmiştik. Burda küçük bir kod parçacığı ile json'u decode edebiliyoruz

Örnek:


Kod:
>>> import requests[/B][/CENTER]
[B]
[CENTER]r = requests.get('https://api.github.com/events')

>>> r.json()

[{'type': 'CreateEvent', 'id': '5226537554', 'actor': {'id': 12762300, 'gravatar_id': '', ...


diye başlayıp uzuuunca devam eden bir metin döndürdü gördüğünüz gibi.

Ayrıca, json kütüphanesi ile de beraber kullanılabilir.


Kod:
[/B][/CENTER]
[B]
[CENTER]>>> import json

>>> import requests

>>> url = "https://api.github.com/some/endpoint"

>>> hckn0 = {'some': 'data'}

>>> r.requests.post(url, data=json.dumps(hckn0))

>>> r = requests.post(url, data=json.dumps(hckn0))

>>> print(r.text)

{"message":"Not Found","docu_mentation_url":"https://developer.github.com/v3"}


Üstteki kod parçacığında bahsetmediğimiz tek şey POST methodu, hemen geçelim

POST:

Post istekleri genellikle url'de görünmesini istemediğimiz zamanlarda kullanılır. Misal "get" metodunda yazdığımız veriler adres çubugunda gösterilirdi fakat POST'da gösterilmez.

Yani misalen web geçmişinde, önceki bir sitenin adres çubuğunda bilgilerimizin görünmesini engeller.


Python'da kullanımı:

Kod:
[/B][/CENTER]
[B]
[CENTER]>>> payl = {'key1': 'value1', 'key2': 'value2'}

>>> r = requests.post("http://httpbin.org/post", data=payl)

>>> print(r.text)

{

  "args": {}, 

  "data": "", 

  "files": {}, 

  "form": {

    "key1": "value1", 

    "key2": "value2"

  }, 

  "headers": {

    "Accept": "*/*", 

    "Accept-Encoding": "gzip, deflate", 

    "Content-Length": "23", 

    "Content-Type": "application/x-www-form-urlencoded", 

    "Host": "httpbin.org", 

    "User-Agent": "python-requests/2.13.0"

  }, 

  "json": null, 

  "origin": "62.248.25.231", 

  "url": "http://httpbin.org/post"

}


Peki aynısını GET ile yapsaydık ne olacaktı?

Kod:
[/B][/CENTER]
[B]
[CENTER]>>> r = requests.get("http://httpbin.org/post", data=payl)

>>> print(r.text)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">

<title>405 Method Not Allowed</title>

<h1>Method Not Allowed</h1>

<p>The method is not allowed for the requested URL.</p>


Farkı gördünüz değil mi? işte POST metodu tam da burada yardımıza koşuyor.

Dönüt başlıkları:

Az önceki "'tur':'met.l'" örneğim aklımıza gelsin. Diyelimki onlarca başlık var ve biz birisini seçmeliyiz. Nasıl yapardık?

".headers" denilen yapı bu günler için aranan kan. Kullanımı get ve post'a oldukça benzer de olsa küçük farklılıklar mevcut. Nasıl efendim?


Kod:
[/B][/CENTER]
[B]
[CENTER]r = requests.post("http://httpbin.org/post", data=payl)

>>> r.headers['Content-Type']

'application/json'

>>>


tabii ki, -çoğu zaman olduğu gibi- burda da farklı yöntemler mevcut.

Kod:
[/B][/CENTER]
[B]
[CENTER]>>> r.headers.get('content-type')

'application/json'






SESSION:

HTTP üzerinden bağlantılar yaparken bazen "cookie" kullanmamız gerekir. Bu gibi durumlarda "session" kullanırız. Ayrıca aynı host'a birden fazla istek gönderecekseniz, TCP tekrarlandığında, önemli bir performans artışı sağlar. (Örnek: Brute Force)

Basitçe;

Kod:
>>> import requests[/COLOR][/B][/CENTER]
[B][COLOR=White]
[CENTER]>>> s = requests.Session()

>>> s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')

<Response [200]>

>>> r = s.get('http://httpbin.org/cookies')

>>> print(r.text)

{

  "cookies": {

    "sessioncookie": "123456789"

  }

}



>>>


Bu şekilde kullanılır, ayrıca kendi yazdığım wordpress brute force tool'da da kullanımını görebilirsiniz.

Kod:
r = session.post(site, data={"log":"admin","pwd":sifre},timeout=5)

Bu günlük bu kadar, kendinize çok iyi bakın. Diğer yazımızda görüşmek üzere
Merhaba. Web scraping denemeye başladım fakat kullanacağım Websitesi cloudflare kullandığı için user agent da kullansam 403 döndürüyor Python bunuka ilgili bir kütüphane vardı denedim ise yaramadı sizin öneriniz nedir?
 

Rold

Üye
3 Ara 2022
77
32
Python Requests Modülü:

Öncelikle merhaba, uzunca bir süre aranızda olamayacağım ve giderken en azından bir konu bırakmak istedim. Python'da requests modülünü anlatacağım..

Nedir:


Requests modülü ,sloganında da olduğu gibi -Http for Humans-, "urllib3" tabanlı organik HTTP paketleri göndermenize yarayan modüldür.

Yükleme:

Requests modülü en kolay şekilde "pip install requests" şeklinde yüklenebilir.


Yapılabilecekler:

-> Brute Force atak scripti yazabilirsiniz.

-> HTTP istekleri gönderebilirsiniz.

-> Bir sitenin unicode dönüşüm biçimini görebilirsiniz.

Ve daha niceleri...


Kullanım örnekleri

Kod:
[/COLOR][/B][/CENTER]
[B][COLOR=White]
[CENTER]>>> import requests #modülümüzü içe aktaralım

>>> r = requests.get('https://github.com/login', auth=('Hacknology', ŞİFRE)) #github'a bağlanalım. Herhangi bir site olabilir bu

>>> r.status_code #Başarılı olmuş mu diye bakalım

200


Gördüğümüz gibi HTTP 200 döndürdü. Nedir bu 200?:

200 OK Tamam

201 Created Oluşturuldu

202 Accepted Onaylandı

203 Non-Authoritative Information Yetersiz Bilgi

204 No Content İçerik Yok

205 Reset Content İçeriği Baştan al

206 Partial Content Kısmi İçerik

207 Multi-Status WebDAV :Çok-Statü

210 Content Different WebDAV :Farklı İçerik




Tabii hepimiz en çok '404'ü biliriz :p "Sayfa bulunamadı". 200'de başarılı olduğunu gösterir. Şimdi unicode biçimine bakalım isterseniz:

Kod:
[/COLOR][/B][/CENTER]
[B][COLOR=White]
[CENTER]>>> r.encoding

'utf-8'


Gördüğümüz gibi utf-8 miş. Sitenin görüntülenen sayfasındaki içerik kodlarına da ulaşabiliriz (Chrome da ctrl+u şeklinde eriştiğimiz)

Kod:
[/COLOR][/B][/CENTER]
[B][COLOR=White]
[CENTER]>>> r.text


GET METODUNDA PARAMETRELER:

Üstte get metodundan küçük bir örnek vermiştik. Site url'sindeki parametreleri kullanarak sitedeki dosyalar değişkene atanabilir.

Misalen..

"http://www.sallatykka.com/web/index.php?id=31"

Bu örnek sitemiz olsun. (SQL açığı var bu arada. Anka belki ilgilenir)

burda 'id' değerinden sonra gelen '31' parametresi ayarlanabilir.

Kod:
[/COLOR][/B][/CENTER]
[B][COLOR=White]
[CENTER]import requests

r = requests.get("http://www.sallatykka.com/web/index.php",

                 params = {'id':31})

print(r.url)


Bize tam url'yi verecek, pekii bu ne işimize yarayacak?



-->Eğer biz burdaki id değerini sürekli 1 arttırıp base değerinden farklı bir sayı döndürenleri (bkz:HTTP durum kodlar) ayırırsak bir "web crawler" yapabiliriz.

Örnekle anlatayım:



1- Request modülünü içe aktaralım

2- Kullanıcıdan bir id değeri isteyelim

3- id değerini url üzerinde yerine koyalım

4- 200 döndürüyorsa bir listeye yazalım.

Kod:
[/COLOR][/B][/CENTER]
[B][COLOR=White]
[CENTER]import requests

id_deger = int(input('[*]Bir id değeri girin: '))

r = requests.get("http://www.sallatykka.com/web/index.php",

                 params = {'id':id_deger})

if r.status_code == 200:

    print('Bulundu!')

    print(r.url)


Kod:
[/COLOR][/B][/CENTER]
[B][COLOR=White]
[CENTER][*]Bir id değeri girin: 32

Bulundu!

http://www.sallatykka.com/web/index.php?id=32

>>>




JSON:

Öncelikle... Json nedir?

Google'a göre JSON:

"JSON, programlama dilinden bağımsız olan Xml'e alternatif olarak kullanılan javascript tabanlı veri değişim formatıdır. JSON'un amacı veri alış verişi yaparken daha küçük boyutlarda veri alıp göndermektir.Bu özellikleri sayesinde JSON ile çok hızlı web uygulamaları oluşturabilir."

Örneğin:


Kod:
[/B][/CENTER]
[B]
[CENTER]{

   "tur":"met.l",

   "grup":"System of a Down"

}


Peki biz bu jsondan nasıl faydalanırız?

requests modülünün .json() özelliği tam da bunun için. Yukarıda GET parametresinden bahsetmiştik. Burda küçük bir kod parçacığı ile json'u decode edebiliyoruz

Örnek:


Kod:
>>> import requests[/B][/CENTER]
[B]
[CENTER]r = requests.get('https://api.github.com/events')

>>> r.json()

[{'type': 'CreateEvent', 'id': '5226537554', 'actor': {'id': 12762300, 'gravatar_id': '', ...


diye başlayıp uzuuunca devam eden bir metin döndürdü gördüğünüz gibi.

Ayrıca, json kütüphanesi ile de beraber kullanılabilir.


Kod:
[/B][/CENTER]
[B]
[CENTER]>>> import json

>>> import requests

>>> url = "https://api.github.com/some/endpoint"

>>> hckn0 = {'some': 'data'}

>>> r.requests.post(url, data=json.dumps(hckn0))

>>> r = requests.post(url, data=json.dumps(hckn0))

>>> print(r.text)

{"message":"Not Found","docu_mentation_url":"https://developer.github.com/v3"}


Üstteki kod parçacığında bahsetmediğimiz tek şey POST methodu, hemen geçelim

POST:

Post istekleri genellikle url'de görünmesini istemediğimiz zamanlarda kullanılır. Misal "get" metodunda yazdığımız veriler adres çubugunda gösterilirdi fakat POST'da gösterilmez.

Yani misalen web geçmişinde, önceki bir sitenin adres çubuğunda bilgilerimizin görünmesini engeller.


Python'da kullanımı:

Kod:
[/B][/CENTER]
[B]
[CENTER]>>> payl = {'key1': 'value1', 'key2': 'value2'}

>>> r = requests.post("http://httpbin.org/post", data=payl)

>>> print(r.text)

{

  "args": {}, 

  "data": "", 

  "files": {}, 

  "form": {

    "key1": "value1", 

    "key2": "value2"

  }, 

  "headers": {

    "Accept": "*/*", 

    "Accept-Encoding": "gzip, deflate", 

    "Content-Length": "23", 

    "Content-Type": "application/x-www-form-urlencoded", 

    "Host": "httpbin.org", 

    "User-Agent": "python-requests/2.13.0"

  }, 

  "json": null, 

  "origin": "62.248.25.231", 

  "url": "http://httpbin.org/post"

}


Peki aynısını GET ile yapsaydık ne olacaktı?

Kod:
[/B][/CENTER]
[B]
[CENTER]>>> r = requests.get("http://httpbin.org/post", data=payl)

>>> print(r.text)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">

<title>405 Method Not Allowed</title>

<h1>Method Not Allowed</h1>

<p>The method is not allowed for the requested URL.</p>


Farkı gördünüz değil mi? işte POST metodu tam da burada yardımıza koşuyor.

Dönüt başlıkları:

Az önceki "'tur':'met.l'" örneğim aklımıza gelsin. Diyelimki onlarca başlık var ve biz birisini seçmeliyiz. Nasıl yapardık?

".headers" denilen yapı bu günler için aranan kan. Kullanımı get ve post'a oldukça benzer de olsa küçük farklılıklar mevcut. Nasıl efendim?


Kod:
[/B][/CENTER]
[B]
[CENTER]r = requests.post("http://httpbin.org/post", data=payl)

>>> r.headers['Content-Type']

'application/json'

>>>


tabii ki, -çoğu zaman olduğu gibi- burda da farklı yöntemler mevcut.

Kod:
[/B][/CENTER]
[B]
[CENTER]>>> r.headers.get('content-type')

'application/json'






SESSION:

HTTP üzerinden bağlantılar yaparken bazen "cookie" kullanmamız gerekir. Bu gibi durumlarda "session" kullanırız. Ayrıca aynı host'a birden fazla istek gönderecekseniz, TCP tekrarlandığında, önemli bir performans artışı sağlar. (Örnek: Brute Force)

Basitçe;

Kod:
>>> import requests[/COLOR][/B][/CENTER]
[B][COLOR=White]
[CENTER]>>> s = requests.Session()

>>> s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')

<Response [200]>

>>> r = s.get('http://httpbin.org/cookies')

>>> print(r.text)

{

  "cookies": {

    "sessioncookie": "123456789"

  }

}



>>>


Bu şekilde kullanılır, ayrıca kendi yazdığım wordpress brute force tool'da da kullanımını görebilirsiniz.

Kod:
r = session.post(site, data={"log":"admin","pwd":sifre},timeout=5)

Bu günlük bu kadar, kendinize çok iyi bakın. Diğer yazımızda görüşmek üzere

Elinize Sağlık Hocam. :)



Onlar ; Görünmeyen Kahramanlar...
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.