comment puis-je ouvrir une URL depuis mon programme C++?
En Ruby, vous pouvez faire
%x(open https://google.com)
Quel est l'équivalent en C++? Je me demande s'il existe une solution indépendante de la plate-forme. Mais s'il n'y en a pas, j'aimerais mieux Unix/Mac :)
Voici mon code:
#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;
}
Votre question peut vouloir dire deux choses différentes ... 1) Ouvrez une page Web avec un navigateur.
ShellExecute(0, 0, L"http://www.google.com", 0, 0 , SW_SHOW );
Cela devrait fonctionner, cela ouvre le fichier avec le programme associé. Devrait ouvrir le navigateur, il est généralement par défaut . 2) Obtenez le code de la page Web et vous le rendre vous-même ou faire autre chose. Pour cela, je voudrais lire ceci ou/et ceci
J'espère que c'est au moins un peu utile.
EDIT: Vous n’avez pas remarqué ce que vous demandez pour UNIX, cela ne fonctionne que sous Windows.
Voici un exemple de code Windows utilisant 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;
}
C n’est pas aussi sophistiqué que le langage de script que vous avez mentionné. Mais si vous voulez éviter la programmation par sockets, essayez Curl. Curl est une excellente bibliothèque C et possède de nombreuses fonctionnalités. Je l'utilise depuis des années et le recommande toujours. Il inclut également des programmes autonomes pour les tests ou l’utilisation de Shell.
Il y a déjà des réponses pour Windows. Sous Linux, j’ai remarqué que open https://www.google.com
lance toujours le navigateur à partir de Shell afin que vous puissiez essayer:
system("open https://your.domain/uri");
c'est dire
system(("open "s + url).c_str()); // c++
J'ai eu BEAUCOUP plus de chance en utilisant ShellExecuteA (). J'ai entendu dire qu'il y a beaucoup de risques de sécurité lorsque vous utilisez "system ()". C'est ce que j'ai proposé avec mon propre code.
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. Son utilisation WinAPI si je suis correct. Donc, ce n'est pas une solution multiplateforme.