Как открыть URL-адрес из C++?

Как открыть URL-адрес из C++?

27.06.2013 08:01:17 Просмотров 17 Источник

как открыть URL-адрес из моей программы на C++?

В Рубине вы можете это сделать

%x(open https://google.com)

Что эквивалентно в C++? Интересно, существует ли независимое от платформы решение. Но если нет, я бы предпочел Unix/Mac лучше :)

Вот мой код.:

#include <stdio.h>
#include <string.h>
#include <fstream>

int main (int argc, char *argv[])
{
    char url[1000] = "https://www.google.com";

    std::fstream fs;
    fs.open(url);
    fs.close();

    return 0;
}
У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c#comment25170918_17347950
Библиотеки, подобные Qt, предоставляют независимый от платформы способ сделать это. В самом языке c++ нет ничего, что могло бы обеспечить это.
https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c#comment25171038_17347950
Почему название этого вопроса полностью отличается от фактического предмета?
https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c#comment25171202_17347950
Извините, это было исправлено. Спасибо.
https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c#comment25171203_17347950
Я думаю, что правка названия сделала его еще хуже. URL-адрес-это не программа.
https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c#comment25171208_17347950
Керл хорош, как указывали другие люди. Но, вероятно, есть что-то подобное в окружающей среде, которую вы используете. Это было бы лучше, так как вам не нужно добавлять дополнительную библиотеку, и это было бы больше в стиле остальной части вашего приложения.
https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c#comment25171375_17347950
Вы хотите запустить браузер по умолчанию из кода C++ и открыть url-адрес или вы хотите загрузить веб-страницу в приложение c++ для собственной обработки html?

Ответы - Как открыть URL-адрес из C++? / How do I open a URL from C++?

Является ответом!
rectummelancolique

27.06.2013 08:06:04

Используйте libcurl, вот простой пример .

EDIT: если речь идет о запуске веб-браузера с C++, вы можете вызвать команду оболочки с systemв системе POSIX:

system("<mybrowser> http://google.com");

Заменив <mybrowser>на браузер, который вы хотите запустить.

https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c/17348035#comment25696437_17348035
Ваше обновление-это именно то, что я хотел. Смотрите приложение по адресу gist.github.com/rodrigoalvesvieira/662e400f34dd9de38176
user2513931

27.06.2013 08:07:20

C не так высокоуровневый, как упомянутый вами язык сценариев. Но если вы хотите держаться подальше от программирования на основе сокетов, попробуйте Curl. Curl-это отличная библиотека C и имеет множество функций. Я использую его в течение многих лет и всегда рекомендую его. Он также включает в себя некоторые автономные программы для тестирования или использования оболочки.

https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c/17348061#comment25171329_17348061
@rodrigoalves Curl доступен практически на любой ОС, включая множество разновидностей как Windows, так и Linux. Стоит потратить время, чтобы научиться этому. Он имеет много, много отличных особенностей.
https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c/17348061#comment25171476_17348061
Да. Я часто пользовался терминалом, в основном для тестирования выходов API и тому подобного. Никогда из программы на C++, Тхо.
ST3

27.06.2013 08:13:18

Ваш вопрос может означать две разные вещи:

1.) Откройте веб-страницу с помощью браузера.

#include <windows.h>
#include <shellapi.h>
...
ShellExecute(0, 0, L"http://www.google.com", 0, 0 , SW_SHOW );

Это должно сработать, он открывает файл с соответствующей программой. Следует открыть браузер, который обычно является веб-браузером по умолчанию.


2.) Получите код веб-страницы, и вы будете рендерить его самостоятельно или делать что-то другое. Для этого я рекомендую прочитать это или/и это .


Надеюсь, это хоть немного поможет.

EDIT: не заметил, что вы просите UNIX, это работает только на Windows.

https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c/17348170#comment25171445_17348170
это только для окон, верно? Я имею в виду Шеллексекут. В любом случае спасибо
https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c/17348170#comment25171465_17348170
Это единственное решение для windows для запуска браузера по умолчанию, чтобы открыть URL-адрес. ОП упомянул независимым от платформы. Qt обеспечит это, хотя это было бы довольно тяжело именно для этой задачи..
https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c/17348170#comment25171531_17348170
Просто чтобы сделать этот вопрос немного более интересным: что, если я хочу запустить обычную терминальную программу из моего кода C/C++. Есть ли выход? Например, запустите cd
https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c/17348170#comment25171657_17348170
Вы можете использовать функцию system() для запуска программы. И я имею в виду исполняемую программу, а не документ.
https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c/17348170#comment70438480_17348170
Аргумент 3 не должен быть строкой wide-char: удалите Lили используйте ShellExecuteW.
https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c/17348170#comment70460647_17348170
@Salvador ShellExecute-это макрос, который расширяется до ShellExecuteAили ShellExecuteW. Я не видел никого, кто бы использовал настройки компиляции, чтобы сделать его расширенным в версию в настоящее время.
Software_Designer

27.06.2013 10:33:22

Вот пример кода windows, использующего winsock.

#include <winsock2.h>
#include <windows.h>
#include <iostream>
#include <string>
#include <locale>
#pragma comment(lib,"ws2_32.lib")
using namespace std;

string website_HTML;
locale local;


void get_Website(char *url );

int main ()
{
    //open website
    get_Website("www.google.com" );

    //format website HTML
    for (size_t i=0; i<website_HTML.length(); ++i) 
        website_HTML[i]= tolower(website_HTML[i],local);

    //display HTML
    cout <<website_HTML;

    cout<<"\n\n";



    return 0;
}



//***************************
void get_Website(char *url )
{
    WSADATA wsaData;
    SOCKET Socket;
    SOCKADDR_IN SockAddr;


    int lineCount=0;
    int rowCount=0;

    struct hostent *host;
    char *get_http= new char[256];

        memset(get_http,' ', sizeof(get_http) );
        strcpy(get_http,"GET / HTTP/1.1\r\nHost: ");
        strcat(get_http,url);
        strcat(get_http,"\r\nConnection: close\r\n\r\n");

        if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) 
        {
            cout << "WSAStartup failed.\n";
            system("pause");
            //return 1;
        }

        Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
        host = gethostbyname(url);

        SockAddr.sin_port=htons(80);
        SockAddr.sin_family=AF_INET;
        SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);

        cout << "Connecting to "<< url<<" ...\n";

        if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr)) != 0)
        {
            cout << "Could not connect";
            system("pause");
            //return 1;
        }

        cout << "Connected.\n";     
        send(Socket,get_http, strlen(get_http),0 );

        char buffer[10000];

        int nDataLength;
            while ((nDataLength = recv(Socket,buffer,10000,0)) > 0)
            {       
                int i = 0;

                while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') 
                {                    
                    website_HTML+=buffer[i];                     
                    i += 1;
                }               
            }
        closesocket(Socket);
        WSACleanup();

            delete[] get_http;
}
https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c/17350719#comment25175804_17350719
Это на самом деле то, что название потока в настоящее время говорит, однако я считаю из комментариев, что вопрос на самом деле "как я могу открыть url-адрес в браузере по умолчанию из кода c++, используя независимый от платформы метод?"
ahogen

02.06.2014 09:33:06

Мне гораздо больше повезло с использованием ShellExecuteA (). Я слышал, что есть много рисков для безопасности, когда вы используете "system()". Вот что я придумал для своего собственного кода.

void SearchWeb( string word )
{    
    string base_URL = "http://www.bing.com/search?q=";
    string search_URL = "dummy";
    search_URL = base_URL + word;

    cout << "Searching for: \"" << word << "\"\n";

    ShellExecuteA(NULL, "open", search_URL.c_str(), NULL, NULL, SW_SHOWNORMAL);
}

p. s. его использование WinAPI, если я прав. Так что это не мультиплатформенное решение.

https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c/24000160#comment48733170_24000160
Спасибо, что поймали ошибку с кавычками. Очевидно, что-то было удалено, когда я копировал свой код.
invadev

22.01.2015 02:23:59

Создайте функцию и скопируйте код с помощью winsock, который уже упоминался в Software_Developer.

например:

#ifdef _WIN32

// this is required only for windows

if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
{

  //...

}

#endif

код winsock здесь

#ifdef _WIN32

WSACleanup();

#endif
recolic

07.01.2018 08:12:38

Для windows уже есть ответы. В linux я заметил open https://www.google.comвсегда запускайте браузер из оболочки, так что вы можете попробовать:

system("open https://your.domain/uri");

вот и скажи

system(("open "s + url).c_str()); // c++

https://linux.die.net/man/1/open

https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c/48134540#comment93270491_48134540
@SebastianMach я прикрепил неправильную ссылку. Это должен быть man 1 open. Только что починил.
https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c/48134540#comment99677169_48134540
Это создаст уязвимость удаленного выполнения, если url-адрес определен пользователем
https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c/48134540#comment99677351_48134540
@rubenwardy это точно. И уязвимость может быть исправлена с помощью execvили проверки url перед подделкой cmd.
https://stackoverflow.com/questions/17347950/how-do-i-open-a-url-from-c/48134540#comment99677425_48134540
Как бы вы использовали execv, если вы не знаете название программы? Или вы просто используете open в качестве имени программы?
yhu420

09.01.2020 12:01:41

Для сред linux можно использовать xdg-open. Он установлен по умолчанию в большинстве дистрибутивов. Преимущество над принятым ответом состоит в том, что он открывает предпочтительный браузер пользователя.

$ xdg-open https://google.com
$ xdg-open steam://run/10

Конечно, вы можете обернуть это в вызов system().

Закрыть X