You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:修复Telegram Bot发送频道消息的三种代码异常问题

Telegram频道消息推送问题修复方案

问题分析

方案1:WebClient报错

DllNotFoundException: winhttp.dll 多因环境权限限制(程序无加载系统DLL权限)或WebClient在特定环境(如Unity、受限容器)下的兼容性问题,且WebClient已被标记为过时,不建议继续使用。

方案2:CookieContainer初始化异常

该错误源于静态HttpClient实例初始化时,系统无法创建CookieContainer,通常是环境网络配置限制或静态实例生命周期冲突导致。

方案3:无报错但无消息

日志显示成功却收不到消息,核心原因大概率是:

  • CHATID格式错误:频道ID必须是-100开头的数字ID(而非@频道用户名),可通过调用getUpdates接口确认正确ID。
  • Get请求参数未编码:消息含特殊字符(空格、&、中文)时,直接拼接URL会导致参数解析错误,Telegram未实际处理请求。
  • 成功判断逻辑失效:仅依赖IsSuccessful判断HTTP状态码,未解析Telegram返回的JSON响应(可能返回200但ok: false)。

修复后的可行方案

推荐使用HttpClient并调整初始化逻辑,同时严格解析Telegram响应确保推送成功:

using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

public async Task<bool> SendTelegramMessage(string token, string chatId, string message)
{
    using var httpClient = new HttpClient();
    var apiUrl = $"https://api.telegram.org/bot{token}/sendMessage";
    
    var payload = new
    {
        chat_id = chatId,
        text = message
    };
    
    var jsonPayload = JsonSerializer.Serialize(payload);
    var content = new StringContent(jsonPayload, Encoding.UTF8, "application/json");
    
    try
    {
        var response = await httpClient.PostAsync(apiUrl, content);
        var responseBody = await response.Content.ReadAsStringAsync();
        
        // 解析Telegram响应,确认实际推送结果
        var telegramResponse = JsonSerializer.Deserialize<TelegramApiResponse>(responseBody);
        
        if (telegramResponse?.Ok == true)
        {
            Console.WriteLine($"消息发送成功: {message}");
            return true;
        }
        else
        {
            Console.WriteLine($"Telegram API错误: {telegramResponse?.Description}");
            return false;
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"请求异常: {ex.Message}");
        return false;
    }
}

// 解析Telegram响应的模型类
public class TelegramApiResponse
{
    public bool Ok { get; set; }
    public string Description { get; set; }
}

使用注意事项

  1. 确认CHATID正确性:调用https://api.telegram.org/bot{你的TOKEN}/getUpdates,找到频道消息对应的chat.id(格式为-100xxxxxxxxx)。
  2. 权限验证:确保Bot已添加为频道管理员,且拥有「发送消息」权限。
  3. 编码兼容:采用Post请求+JSON payload,避免Get请求的参数编码问题,支持所有特殊字符与中文。
  4. 结果校验:必须解析Telegram响应体的ok字段,而非仅依赖HTTP状态码。

原有方案快速修复(方案3)

添加响应体解析逻辑,改用Post请求避免参数编码问题:

public void PostRequest(string msg)
{
    try
    {
        var url = $"https://api.telegram.org/bot{TOKEN}/sendMessage";
        var formData = new System.Collections.Specialized.NameValueCollection();
        formData.Add("chat_id", CHATID);
        formData.Add("text", msg);
        
        var response = Http.Post(url, formData);
        var responseBody = response.ReadAsString();
        
        Print(url);
        Print("响应内容: " + responseBody);
        
        // 解析响应判断实际结果
        var json = JsonSerializer.Deserialize<TelegramApiResponse>(responseBody);
        if (json?.Ok == true)
        {
            Print("Success");
        }
        else
        {
            Print($"Error: {json?.Description}");
        }
    }
    catch (Exception e)
    {
        Print($"EXCEPTION: {e.Message}\n{e.StackTrace}");
    }
}

// 需引入同上方的TelegramApiResponse类

内容的提问来源于stack exchange,提问作者Cmsmc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:14:57