首页 > 解决方案 > Telegram api在c中返回400错误请求

问题描述

我想将一些数据从传感器节点发送到电报机器人并执行从机器人接收到的命令到节点。我正在编写一个简单的 c 程序来执行 getMe api 命令并检查响应。套接字连接成功并将数据正确写入服务器,但总是电报服务器回复我:

HTTP/1.1 400 Bad Request
Server: nginx/1.18.0
Date: Fri, 22 Oct 2021 12:05:01 GMT
Content-Type: text/html
Content-Length: 157
Connection: close

<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html> 

我在用:

主机名:api.telegram.org 端口:443

这是我的c代码

#include <winsock2.h>
#include <winsock.h>
#include <stdio.h>
#define MSG_SIZE 1024
#define REPLY_SIZE 65536
int main()
{

    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData;
    int iResult;
    struct hostent *remoteHost;
    char host_name[] = "api.telegram.org";
    unsigned short port = 443;
    struct in_addr addr;
    
    int s = -1;
    
    struct sockaddr_in server;
    
    DWORD dwError;
    
    unsigned int recv_size;
    
    char message[MSG_SIZE] = {0};
    char server_reply[REPLY_SIZE] = {0};
    
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed: %d\n", iResult);
        return 1;
    }

   remoteHost = gethostbyname(host_name);
    
    if (remoteHost == NULL) {
        printf("Error : %d",WSAGetLastError());
    }
    else {
        if((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)    {
                printf("Error: Could not create socket: %s. Exiting..\n", strerror(errno));
                exit(1);
            }

            // Fill in server's address
            memset(&server, 0, sizeof(server));
            server.sin_addr.s_addr =  *(u_long *) remoteHost->h_addr_list[0];
            server.sin_family = AF_INET;
            server.sin_port = htons(port);

            // Connect to server
            if (connect(s, (struct sockaddr *)(&server), sizeof(server)) < 0) {
                printf("Error: Could not connect to server: %s. Exiting..\n", strerror(errno));
                exit(1);
            }
            char rheader[] = {"GET /bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getMe HTTP/1.1\r\n User-Agent: MOZILLA\r\n Host: api.telegram.org\r\n Accept: */*\r\n Connection: Close\r\n\r\n"}; 
            
            printf("Request: \n%s\nWaiting for server reply..\n",rheader);                        
            if(send(s, rheader, strlen(rheader), 0) < 0) {
                printf("Error: Could not send http request to server: %s. Exiting..\n", strerror(errno));
                exit(1);
            }
            
            if((recv_size = recv(s, server_reply, REPLY_SIZE, 0)) < 0) {
                printf("Error: Something wrong happened while getting reply from server: %s. Exiting..\n", strerror(errno));
                exit(1);
            }
        
            server_reply[REPLY_SIZE - 1] = 0;
        
            printf("\nServer Reply:\n\n");
            printf("%s\n", server_reply);
        
            closesocket(s);
            WSACleanup();
        
            exit(0);
    }
    return 0;
}

标签: chttptelegramtelegram-botwinsockets

解决方案


推荐阅读