1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| void WikiPedia(string mot)
{
static WSADATA wsaData;
SSL_CTX *Context= NULL;
SSL *SSL =NULL;
SOCKET Socket;
sockaddr_in addr{ 0 };
ADDRINFO hints;
ADDRINFO *pResult;
int ret;
char CBuffer[BUF_LEN] = "";
std::string SBufferUTF8;
//forme requette fr.wikipedia.org/w/api.php?format=xml&action=query&prop=extracts&redirects&exintro=&explaintext=&titles=voiture
std::string Request = "GET /w/api.php?format=xml&action=query&prop=extracts&redirects&exintro=&explaintext=&titles="+ mot + " HTTP/1.1\r\n" \
"Host: fr.wikipedia.org\r\n" \
"Connection: close\r\n\r\n";
std::string HOST = "fr.wikipedia.org";
//Init Open SSL et Winsock
WSAStartup(MAKEWORD(2, 2), &wsaData);
SSL_load_error_strings();
SSL_library_init();
OpenSSL_add_all_algorithms();
Context = SSL_CTX_new(SSLv23_client_method());
SSL_CTX_set_mode(Context, SSL_MODE_AUTO_RETRY);
SSL = SSL_new(Context);
Socket = socket(AF_INET, SOCK_STREAM, 0);
memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_ALL;
hints.ai_family = PF_INET;
hints.ai_protocol = IPPROTO_IPV4;
getaddrinfo(HOST.c_str(), nullptr, &hints, &pResult);
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = *((ULONG*)&(((sockaddr_in*)pResult->ai_addr)->sin_addr));
addr.sin_port = htons(443);
connect(Socket, (struct sockaddr*)&addr, sizeof(addr));
SSL_set_fd(SSL, Socket);
SSL_set_connect_state(SSL);
ret = SSL_connect(SSL);
ret = SSL_write(SSL, Request.c_str(), Request.size());
// Récuperation des données
while ((ret = SSL_read(SSL, CBuffer, BUF_LEN - 1)) > 0)
{
SBufferUTF8.append(CBuffer, ret);
}
//Conversion UTF8 en windows-1252
int size_needed = MultiByteToWideChar(CP_UTF8, 0, &SBufferUTF8[0], SBufferUTF8.size(), NULL, 0);
std::wstring SBuffer1252(size_needed, 0);
MultiByteToWideChar(CP_UTF8, 0, &SBufferUTF8[0], SBufferUTF8.size(), &SBuffer1252[0], size_needed);
//Garder que la définition
std::string::size_type Position = SBuffer1252.find(L"preserve");
std::string::size_type Position2 = SBuffer1252.find(L"</api>");
std::wstring Definition = SBuffer1252.substr(Position+10, Position2-Position-43);
//affiche la définition
wcout << Definition;
//Nettoyage,Close SSL et Winsock
SSL_shutdown(SSL);
SSL_free(SSL);
SSL_CTX_free(Context);
closesocket(Socket);
WSACleanup();
} |
Partager