我做了一个电报机器人,它根据请求使用pyTelegramBotAPI包装器发送照片.所以我尝试放置一个虚拟照片URL并测试机器人是否可以发送图像,但它失败并出现以下错误.
telebot.apihelper.ApiException: sendPhoto failed. Returned result: <Response [400]>
我不确定错误是什么,但如何正确地使用Telegram Bot API从URL发送照片?这是我的代码
import telebot
import time
import urllib
from io import BytesIO
from PIL import Image
TOKEN = '<token here>'
url='http://scontent-b.cdninstagram.com/hphotos-xfa1/t51.2885-15/e15/10919672_584633251672188_179950734_n.jpg'
def listener(*messages):
for m in messages:
chatid = m.chat.id
if m.content_type == 'text':
text = m.text
name = m.fromUser.first_name
msgid = m.message_id
if(text.startswith('/photo')):
img = BytesIO(urllib.request.urlopen(url).read())
tb.send_chat_action(chatid, 'upload_photo')
tb.send_photo(chatid, img, reply_to_message_id=msgid)
tb = telebot.TeleBot(TOKEN)
tb.get_update() # cache exist message
tb.set_update_listener(listener) #register listener
tb.polling()
while True:
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
我不确定我是否错过了一些东西.
我几天前在youtube上看过这个教程.这非常有趣,所以我决定制作一个自己的机器人.我使用教程中的代码作为模板:
<?php
$bottoken = "*****";
$website = "https://api.telegram.org/bot".$bottoken;
$update = file_get_contents('php://input');
$updatearray = json_decode($update, TRUE);
$length = count($updatearray["result"]);
$chatid = $updatearray["result"][$length-1]["message"]["chat"]["id"];
$text = $updatearray["result"][$length-1]["message"]["text"];
if($text == 'hy'){
file_get_contents($website."/sendmessage?chat_id=".$chatid."&text=hello");
}
elseif($text == 'ciao'){
file_get_contents($website."/sendmessage?chat_id=".$chatid."&text=bye");
}
Run Code Online (Sandbox Code Playgroud)
如果我手动执行脚本,脚本会起作用.但是,当我使用webhook时,它不再起作用了.该教程说这$update = file_get_contents('php://input');是正确的方式,以前使用$update = file_get_contents($website."/getupdates");.我的问题如何php://input自动执行脚本?该脚本位于"one.com"的服务器上,证书也来自"one.com".
在电报API文档中,我看到:“您可以将file_id作为String 传递,以重新发送已经在电报服务器上的照片”,但是我找不到获取上载文件的file_id的方法。我怎么才能得到它?
我正在开发一个Telegram机器人,我想知道一个用户,它已经开始与我的机器人进行私人聊天,是否看到机器人发送了某个消息,并知道他什么时候看到它.
有可能这样做吗?
非常感谢你.
我想用Node.js创建一个Telegram Bot,并且正在使用Telegraf。我知道我可以回答这样的消息:
app.hears('hi', (ctx) => ctx.reply('Hey there!'))
Run Code Online (Sandbox Code Playgroud)
但是,如何在没有收到消息的情况下发送消息?我想读取文件,并且总是在文件更改后才想发送消息。
const Telegraf = require('telegraf');
var fs = require('fs');
const app = new Telegraf(process.env.BOT_TOKEN);
var filePath = "C:\\path\\to\\my\\file.txt";
fs.watchFile(filePath, function() {
file = fs.readFileSync(filePath);
// Send message to chat or group with the file content here
console.log("File content at: " + new Date() + " is: \n" + file);
})
Run Code Online (Sandbox Code Playgroud)
如果有人可以帮助我会很好。
我开始使用Telegram Widget API,它运行良好,但我找不到有关如何在以后注销用户的任何信息.如果用户决定使用不同的电报帐户,这可能很有用.
单击登录按钮后,您将被重定向到oauth.telegram.org,如果已经授权,您将无法注销.
我发现工作的唯一方法是手动删除设置为oauth.telegram.org的cookie的明显方法,或者单击授权页面右上角的注销,如果授权已经给出,则不会显示... SampleBot登录
通过检查代码,您可以看到如何执行注销: 注销功能
但是,您始终需要该哈希才能使链接正常工作.
然后,您始终可以选择断开电报本身: 电报断开连接
有没有任何程序化的方法来实现这一目标?
谢谢
我现在需要发送股票市场数据和格式很糟糕.需要发送一些类似的东西
| Symbol | Price | Change |
|--------|-------|--------|
| ABC | 20.85 | 1.626 |
| DEF | 78.95 | 0.099 |
| GHI | 23.45 | 0.192 |
| JKL | 98.85 | 0.292 |
Run Code Online (Sandbox Code Playgroud)
这就是我尝试过的.
| 符号| 价格| 改变|
| -------- | ------- | -------- |
| ABC | 20.85 | 1.626 |
| DEF | 78.95 | 0.099 |
| GHI | 23.45 | 0.192 |
JKL | 98.85 | 0.292 |
我有两个电报机器人,上次我注意到,第二个机器人变慢了.
我的研究表明,sendMessage调用有两个不同的时间.
curl "https://api.telegram.org/bot123456789:AAAAAAAAABBBBBBBBCCCCCCC/sendMessage?chat_id=987654321&text=HI"
Run Code Online (Sandbox Code Playgroud)
这是两个不同机器人的输出:
拨打第一个(快速)
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 224 100 224 0 0 491 0 --:--:-- --:--:-- --:--:-- 492
Run Code Online (Sandbox Code Playgroud)
呼叫第二个机器人(慢)
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 227 100 227 0 0 43 0 0:00:05 0:00:05 --:--:-- 59
Run Code Online (Sandbox Code Playgroud)
第一个sendMessage立即运行.
第二个时间花费= 5秒!
它总是2-6秒.有谁知道原因?
对不起我的英语不好.
我创建了一个向用户显示调查向导的应用程序。当用户启动/ start命令时,我将调用AddProject:
const Telegraf = require('telegraf');
const bot = new Telegraf(process.env.BOT_TOKEN);
const session = require('telegraf/session');
bot.use(session());
const main = new TelegrafInlineMenu("Welcome.");
main.setCommand('start');
main.simpleButton('Start Survey', 'START_SURVEY', {
doFunc: async ctx => surveyController.AddProject(ctx, bot)
});
Run Code Online (Sandbox Code Playgroud)
基本上,以上代码创建了一个菜单,其中显示了标签Welcome(欢迎)和一个按钮以启动调查。当用户单击按钮时,从SurveyController调用方法AddProject:
const Composer = require('telegraf/composer');
const stepHandler = new Composer();
const Stage = require('telegraf/stage');
const WizardScene = require('telegraf/scenes/wizard');
const userController = require('../controllers/user.controller');
module.exports = {
AddProject: async function (ctx, bot) {
const superWizard = new WizardScene('super-wizard',
(ctx) => {
ctx.reply('Step 1', Markup.inlineKeyboard([
Markup.urlButton('??', 'http://telegraf.js.org'),
Markup.callbackButton('?? …Run Code Online (Sandbox Code Playgroud) 我有一个电报机器人,它使用此代码向某个机器人发布消息。
import telegram
from telegram import ParseMode
def send_msg(text):
token = '1*****:AAF*************esns'
chat_id = "34*****4"
bot = telegram.Bot(token=token)
bot.sendMessage(chat_id=chat_id, text=text, parse_mode=ParseMode.MARKDOWN_V2)
Run Code Online (Sandbox Code Playgroud)
我想知道的是,电报机器人是否可以向我的频道发送消息,我已将其设置为管理员,而不是其自己的名为 somebot 的频道。
telegram-bot ×10
telegram ×7
node.js ×3
telegraf ×2
curl ×1
javascript ×1
php ×1
python ×1
sendmessage ×1