C ile CURL Kütüphanesini Kullanarak Web İstekleri Yapmak! (Proxy, Get, Post)

Bunjo

Uzman üye
14 Ara 2020
1,591
1,893
I Won

6449ti9.gif

pDHFoUY.png


C dilinde web istekleri göndermek için birçok yöntem vardır, ancak CURL kütüphanesi bu işlemi kolaylaştırır. Bu yazıda, CURL kütüphanesini kullanarak basit web istekleri nasıl gönderileceğini öğreneceksiniz. Şimdi, CURL kütüphanesini kullanarak nasıl HTTP GET ve POST istekleri göndereceğimizi görelim.

pDHFoUY.png


CURL Hakkında

libcurl, URL aktarıcı kütüphanesi olarak bilinen ve birçok farklı ağ protokolünü destekleyen bir C kütüphanesidir. Genellikle ağ iletişimi gerektiren uygulamalar için kullanılır. İşte libcurl hakkında bilmeniz gereken bazı temel noktalar:

Protokol Desteği: libcurl, HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, LDAP, SMB, SMTP, POP3, IMAP, RTSP, RTMP ve daha birçok protokolü destekler.

Çapraz Platform Desteği: libcurl, birçok farklı işletim sistemi ve platformda kullanılabilir, bunlar arasında Linux, macOS, Windows, Unix benzeri sistemler ve daha fazlası bulunmaktadır.
API Kullanımı: libcurl'ün API'si oldukça esnektir ve genişletilebilir. Bu API, çeşitli istek seçeneklerini belirlemenize, yanıt almanıza ve hata yönetimini yapmanıza olanak tanır.

Özellikler: Kütüphane, proxy desteği, çerez yönetimi, SSL sertifikası doğrulama, yeniden deneme, paralel bağlantılar ve daha birçok gelişmiş özelliği destekler.
Kullanım Alanları: Web tarayıcıları, dosya indirme araçları, sunucu yönetimi yazılımları, veri toplama ve daha birçok farklı uygulama alanında kullanılabilir.

Dökümantasyon ve Topluluk: libcurl'ün kapsamlı bir dökümantasyonu bulunmaktadır.

Ayrıca, birçok çevrimiçi forum ve topluluk, kullanıcıların yardımlaşması ve sorunlarını çözmesi için mevcuttur.


pDHFoUY.png


Kütüphane Kurulumu

Bash:
sudo apt-get install libcurl4-openssl-dev

as9ligp.png


pDHFoUY.png


GET İsteği Yollamak

C:
#include <stdio.h>
#include <curl/curl.h>

int main(void) {
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();

    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://httpbin.org/get");

        res = curl_easy_perform(curl);

        if(res == CURLE_OK) {
            printf("Successfully!");
        } else {
            printf("Unsuccessfully");
        }

        curl_easy_cleanup(curl);
    }

    return 0;
}

#include <stdio.h>: Bu satır, standart giriş/çıkış işlevlerini içeren C dilindeki standart kütüphane olan stdio.h kütüphanesini ekler.

#include <curl/curl.h>: Bu satır, CURL kütüphanesinin C dilinde kullanımını sağlayan curl.h başlık dosyasını ekler.

int main(void) { }: C dilinde programın giriş noktasını belirtir. int türünde bir değer döndüren ve parametre almayan bir main fonksiyonu tanımlar.

CURL *curl;: CURL işleyicisi için bir işaretçi değişkeni tanımlar.

CURLcode res;: CURL işlevlerinin geri dönüş kodunu tutmak için bir değişken tanımlar.

curl = curl_easy_init();: CURL kütüphanesini başlatır ve başlatılan işleyiciyi curl değişkenine atar.

if(curl) { }: curl işleyicisi başarıyla başlatıldıysa bu bloğa girer.

curl_easy_setopt(curl, CURLOPT_URL, "https://httpbin.org/get");: Belirtilen URL'e GET isteği yapılacağını belirtmek için CURL işleyicisinin seçeneklerini ayarlar.

res = curl_easy_perform(curl);: Belirtilen URL'e GET isteği gönderir ve yanıtı alır. Yanıt işlenirken oluşabilecek herhangi bir hata res değişkenine atanır.

if(res == CURLE_OK) { } else { }: curl_easy_perform işlevi başarıyla tamamlandıysa bu bloğa girer ve "Successfully!" mesajını yazdırır. Aksi takdirde, yani herhangi bir hata oluştuysa "Unsuccessfully" mesajını yazdırır.

curl_easy_cleanup(curl);: Kullanılan CURL işleyicisini temizler ve belleği serbest bırakır.


return 0;: Programın başarıyla sonlandığını belirtir ve 0 değeriyle çıkar.

pDHFoUY.png


Proxy Kullanmak

C:
#include <stdio.h>
#include <curl/curl.h>

int main(void) {
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();

    if(curl) {
        curl_easy_setopt(curl, CURLOPT_PROXY, "202.131.65.110:80");
        curl_easy_setopt(curl, CURLOPT_URL, "http://httpbin.org/get");

        res = curl_easy_perform(curl);

        if(res == CURLE_OK) {
            printf("Successfully!");
        } else {
            printf("Unsuccessfully");
        }

        curl_easy_cleanup(curl);
    }

    return 0;
}

Diğer koddan farklı olarak eklenen

"curl_easy_setopt(curl, CURLOPT_PROXY, "202.131.65.110:80");"

kodu istekte kullanılacak http(s) proxy değerini ayarlıyor.

Çıktı:

CoffeeScript:
┌──(root㉿ruby)-[~/Desktop]
└─# gcc main.c -o web -lcurl              
                                                                             
┌──(root㉿ruby)-[~/Desktop]
└─# ./web
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "Proxy-Connection": "Keep-Alive",
    "X-Amzn-Trace-Id": "Root=1-66267d28-36de895d3a739d873ed1681f"
  },
  "origin": "202.131.65.110",
  "url": "http://httpbin.org/get"
}
Successfully!

Dönen internet protokol adresi proxy adresine eşit olmuştur.

pDHFoUY.png


Header Eklemek

C:
#include <stdio.h>
#include <curl/curl.h>

int main()
{
    CURL *curl;
    CURLcode res;
    struct curl_slist *headers = NULL;

    curl = curl_easy_init();
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_PROXY, "202.131.65.110:80");
        curl_easy_setopt(curl, CURLOPT_URL, "http://httpbin.org/get");

        headers = curl_slist_append(headers, "X-Custom-Header: MyCustomValue"); // Başlık
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

        res = curl_easy_perform(curl);

        // Özel başlığı sildikten sonra libcurl'ü kapat/temizle
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    }
    return 0;
}

Şeklinde isteğe başlıklarınızı ekleyebilirsiniz.

Çıktı:

JSON:
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "Proxy-Connection": "Keep-Alive",
    "X-Amzn-Trace-Id": "Root=1-66267ff8-28410e671ee14d4b1d7e1f41",
    "X-Custom-Header": "MyCustomValue"
  },
  "origin": "202.131.65.110",
  "url": "http://httpbin.org/get"
}


pDHFoUY.png


Cookie Eklemek

C:
#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
    CURL *curl;
    CURLcode res;
    struct curl_slist *headers = NULL;

    curl = curl_easy_init();
    if(curl) {
        // Proxy ayarlarını belirle
        curl_easy_setopt(curl, CURLOPT_PROXY, "202.131.65.110:80");

        // İstek yapılacak URL belirleniyor
        curl_easy_setopt(curl, CURLOPT_URL, "http://httpbin.org/get");

        // Özel başlık eklemek
        headers = curl_slist_append(headers, "Custom-Bunjo: BunjoHeader");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

        // Cookie eklemek
        curl_easy_setopt(curl, CURLOPT_COOKIE, "bunjoid=1; username=\"bunjo\"");

        // İstek yapma işlemi
        res = curl_easy_perform(curl);

        // Hata kontrolü
        if(res != CURLE_OK)
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));

        // Özel başlık listesini serbest bırak
        curl_slist_free_all(headers);

        // libcurl'ü kapat
        curl_easy_cleanup(curl);
    }
    return 0;
}

Bu şekilde cookie çiftlerinizi ";" ile ayırarak ekleyebilirsiniz. Metin verileri için tek tırnakta kullanabilirsiniz.

Çıktı:

JSON:
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Cookie": "bunjoid=1; username=\"bunjo\"",
    "Custom-Bunjo": "BunjoHeader",
    "Host": "httpbin.org",
    "Proxy-Connection": "Keep-Alive",
    "X-Amzn-Trace-Id": "Root=1-662680ea-4366955154cef04f3654e7a7"
  },
  "origin": "202.131.65.110",
  "url": "http://httpbin.org/get"
}

pDHFoUY.png


Post İsteği


C:
#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
    CURL *curl;
    CURLcode res;
    struct curl_slist *headers = NULL;

    curl = curl_easy_init();
    if(curl) {
        // Proxy ayarlarını belirle
        curl_easy_setopt(curl, CURLOPT_PROXY, "202.131.65.110:80");

        // İstek yapılacak URL belirleniyor
        curl_easy_setopt(curl, CURLOPT_URL, "http://httpbin.org/post");

        // Özel başlık eklemek
        headers = curl_slist_append(headers, "Custom-Bunjo: BunjoHeader");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

        // Post verisini belirle
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "bunjoid=1&username=bunjo");

        // İstek yapma işlemi
        res = curl_easy_perform(curl);

        // Hata kontrolü
        if(res != CURLE_OK)
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));

        // Özel başlık listesini serbest bırak
        curl_slist_free_all(headers);

        // libcurl'ü kapat
        curl_easy_cleanup(curl);
    }
    return 0;
}


Post verilerinizi "&" ile ayırarak verileri ekleyebilirsiniz.

Çıktı:
C:
{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "bunjoid": "1",
    "username": "bunjo"
  },
  "headers": {
    "Accept": "*/*",
    "Content-Length": "24",
    "Content-Type": "application/x-www-form-urlencoded",
    "Custom-Bunjo": "BunjoHeader",
    "Host": "httpbin.org",
    "Proxy-Connection": "Keep-Alive",
    "X-Amzn-Trace-Id": "Root=1-6626817d-79deb016104a3c5d58b07a98"
  },
  "json": null,
  "origin": "202.131.65.110",
  "url": "http://httpbin.org/post"
}


Daha fazlası için doküman.

İyi forumlar!
 
Moderatör tarafında düzenlendi:

teux

Katılımcı Üye
23 Ocak 2023
959
1,332

6449ti9.gif

pDHFoUY.png


C dilinde web istekleri göndermek için birçok yöntem vardır, ancak CURL kütüphanesi bu işlemi kolaylaştırır. Bu yazıda, CURL kütüphanesini kullanarak basit web istekleri nasıl gönderileceğini öğreneceksiniz. Şimdi, CURL kütüphanesini kullanarak nasıl HTTP GET ve POST istekleri göndereceğimizi görelim.

pDHFoUY.png


CURL Hakkında

libcurl, URL aktarıcı kütüphanesi olarak bilinen ve birçok farklı ağ protokolünü destekleyen bir C kütüphanesidir. Genellikle ağ iletişimi gerektiren uygulamalar için kullanılır. İşte libcurl hakkında bilmeniz gereken bazı temel noktalar:

Protokol Desteği: libcurl, HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, LDAP, SMB, SMTP, POP3, IMAP, RTSP, RTMP ve daha birçok protokolü destekler.

Çapraz Platform Desteği: libcurl, birçok farklı işletim sistemi ve platformda kullanılabilir, bunlar arasında Linux, macOS, Windows, Unix benzeri sistemler ve daha fazlası bulunmaktadır.
API Kullanımı: libcurl'ün API'si oldukça esnektir ve genişletilebilir. Bu API, çeşitli istek seçeneklerini belirlemenize, yanıt almanıza ve hata yönetimini yapmanıza olanak tanır.

Özellikler: Kütüphane, proxy desteği, çerez yönetimi, SSL sertifikası doğrulama, yeniden deneme, paralel bağlantılar ve daha birçok gelişmiş özelliği destekler.
Kullanım Alanları: Web tarayıcıları, dosya indirme araçları, sunucu yönetimi yazılımları, veri toplama ve daha birçok farklı uygulama alanında kullanılabilir.

Dökümantasyon ve Topluluk: libcurl'ün kapsamlı bir dökümantasyonu bulunmaktadır.

Ayrıca, birçok çevrimiçi forum ve topluluk, kullanıcıların yardımlaşması ve sorunlarını çözmesi için mevcuttur.


pDHFoUY.png


Kütüphane Kurulumu

Bash:
sudo apt-get install libcurl4-openssl-dev

as9ligp.png


pDHFoUY.png


GET İsteği Yollamak

C:
#include <stdio.h>
#include <curl/curl.h>

int main(void) {
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();

    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://httpbin.org/get");

        res = curl_easy_perform(curl);

        if(res == CURLE_OK) {
            printf("Successfully!");
        } else {
            printf("Unsuccessfully");
        }

        curl_easy_cleanup(curl);
    }

    return 0;
}

#include <stdio.h>: Bu satır, standart giriş/çıkış işlevlerini içeren C dilindeki standart kütüphane olan stdio.h kütüphanesini ekler.

#include <curl/curl.h>: Bu satır, CURL kütüphanesinin C dilinde kullanımını sağlayan curl.h başlık dosyasını ekler.

int main(void) { }: C dilinde programın giriş noktasını belirtir. int türünde bir değer döndüren ve parametre almayan bir main fonksiyonu tanımlar.

CURL *curl;: CURL işleyicisi için bir işaretçi değişkeni tanımlar.

CURLcode res;: CURL işlevlerinin geri dönüş kodunu tutmak için bir değişken tanımlar.

curl = curl_easy_init();: CURL kütüphanesini başlatır ve başlatılan işleyiciyi curl değişkenine atar.

if(curl) { }: curl işleyicisi başarıyla başlatıldıysa bu bloğa girer.

curl_easy_setopt(curl, CURLOPT_URL, "https://httpbin.org/get");: Belirtilen URL'e GET isteği yapılacağını belirtmek için CURL işleyicisinin seçeneklerini ayarlar.

res = curl_easy_perform(curl);: Belirtilen URL'e GET isteği gönderir ve yanıtı alır. Yanıt işlenirken oluşabilecek herhangi bir hata res değişkenine atanır.

if(res == CURLE_OK) { } else { }: curl_easy_perform işlevi başarıyla tamamlandıysa bu bloğa girer ve "Successfully!" mesajını yazdırır. Aksi takdirde, yani herhangi bir hata oluştuysa "Unsuccessfully" mesajını yazdırır.

curl_easy_cleanup(curl);: Kullanılan CURL işleyicisini temizler ve belleği serbest bırakır.


return 0;: Programın başarıyla sonlandığını belirtir ve 0 değeriyle çıkar.

pDHFoUY.png


Proxy Kullanmak

C:
#include <stdio.h>
#include <curl/curl.h>

int main(void) {
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();

    if(curl) {
        curl_easy_setopt(curl, CURLOPT_PROXY, "202.131.65.110:80");
        curl_easy_setopt(curl, CURLOPT_URL, "http://httpbin.org/get");

        res = curl_easy_perform(curl);

        if(res == CURLE_OK) {
            printf("Successfully!");
        } else {
            printf("Unsuccessfully");
        }

        curl_easy_cleanup(curl);
    }

    return 0;
}

Diğer koddan farklı olarak eklenen

"curl_easy_setopt(curl, CURLOPT_PROXY, "202.131.65.110:80");"

kodu istekte kullanılacak http(s) proxy değerini ayarlıyor.

Çıktı:

CoffeeScript:
┌──(root㉿ruby)-[~/Desktop]
└─# gcc main.c -o web -lcurl              
                                                                             
┌──(root㉿ruby)-[~/Desktop]
└─# ./web
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "Proxy-Connection": "Keep-Alive",
    "X-Amzn-Trace-Id": "Root=1-66267d28-36de895d3a739d873ed1681f"
  },
  "origin": "202.131.65.110",
  "url": "http://httpbin.org/get"
}
Successfully!

Dönen internet protokol adresi proxy adresine eşit olmuştur.

pDHFoUY.png


Header Eklemek

C:
#include <stdio.h>
#include <curl/curl.h>

int main()
{
    CURL *curl;
    CURLcode res;
    struct curl_slist *headers = NULL;

    curl = curl_easy_init();
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_PROXY, "202.131.65.110:80");
        curl_easy_setopt(curl, CURLOPT_URL, "http://httpbin.org/get");

        headers = curl_slist_append(headers, "X-Custom-Header: MyCustomValue"); // Başlık
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

        res = curl_easy_perform(curl);

        // Özel başlığı sildikten sonra libcurl'ü kapat/temizle
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    }
    return 0;
}

Şeklinde isteğe başlıklarınızı ekleyebilirsiniz.

Çıktı:

JSON:
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "Proxy-Connection": "Keep-Alive",
    "X-Amzn-Trace-Id": "Root=1-66267ff8-28410e671ee14d4b1d7e1f41",
    "X-Custom-Header": "MyCustomValue"
  },
  "origin": "202.131.65.110",
  "url": "http://httpbin.org/get"
}


pDHFoUY.png


Cookie Eklemek

C:
#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
    CURL *curl;
    CURLcode res;
    struct curl_slist *headers = NULL;

    curl = curl_easy_init();
    if(curl) {
        // Proxy ayarlarını belirle
        curl_easy_setopt(curl, CURLOPT_PROXY, "202.131.65.110:80");

        // İstek yapılacak URL belirleniyor
        curl_easy_setopt(curl, CURLOPT_URL, "http://httpbin.org/get");

        // Özel başlık eklemek
        headers = curl_slist_append(headers, "Custom-Bunjo: BunjoHeader");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

        // Cookie eklemek
        curl_easy_setopt(curl, CURLOPT_COOKIE, "bunjoid=1; username=\"bunjo\"");

        // İstek yapma işlemi
        res = curl_easy_perform(curl);

        // Hata kontrolü
        if(res != CURLE_OK)
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));

        // Özel başlık listesini serbest bırak
        curl_slist_free_all(headers);

        // libcurl'ü kapat
        curl_easy_cleanup(curl);
    }
    return 0;
}

Bu şekilde cookie çiftlerinizi ";" ile ayırarak ekleyebilirsiniz. Metin verileri için tek tırnakta kullanabilirsiniz.

Çıktı:

JSON:
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Cookie": "bunjoid=1; username=\"bunjo\"",
    "Custom-Bunjo": "BunjoHeader",
    "Host": "httpbin.org",
    "Proxy-Connection": "Keep-Alive",
    "X-Amzn-Trace-Id": "Root=1-662680ea-4366955154cef04f3654e7a7"
  },
  "origin": "202.131.65.110",
  "url": "http://httpbin.org/get"
}

pDHFoUY.png


Post İsteği


C:
#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
    CURL *curl;
    CURLcode res;
    struct curl_slist *headers = NULL;

    curl = curl_easy_init();
    if(curl) {
        // Proxy ayarlarını belirle
        curl_easy_setopt(curl, CURLOPT_PROXY, "202.131.65.110:80");

        // İstek yapılacak URL belirleniyor
        curl_easy_setopt(curl, CURLOPT_URL, "http://httpbin.org/post");

        // Özel başlık eklemek
        headers = curl_slist_append(headers, "Custom-Bunjo: BunjoHeader");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

        // Post verisini belirle
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "bunjoid=1&username=bunjo");

        // İstek yapma işlemi
        res = curl_easy_perform(curl);

        // Hata kontrolü
        if(res != CURLE_OK)
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));

        // Özel başlık listesini serbest bırak
        curl_slist_free_all(headers);

        // libcurl'ü kapat
        curl_easy_cleanup(curl);
    }
    return 0;
}


Post verilerinizi "&" ile ayırarak verileri ekleyebilirsiniz.

Çıktı:
C:
{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "bunjoid": "1",
    "username": "bunjo"
  },
  "headers": {
    "Accept": "*/*",
    "Content-Length": "24",
    "Content-Type": "application/x-www-form-urlencoded",
    "Custom-Bunjo": "BunjoHeader",
    "Host": "httpbin.org",
    "Proxy-Connection": "Keep-Alive",
    "X-Amzn-Trace-Id": "Root=1-6626817d-79deb016104a3c5d58b07a98"
  },
  "json": null,
  "origin": "202.131.65.110",
  "url": "http://httpbin.org/post"
}


Daha fazlası için doküman.

İyi forumlar!
eline sağlık canım
 
Ü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.