How to Telegram auto Posting bot in Group? - python

i am searching for a solution. I hava a bot which post by /start command some stuff i need. But id like that the bot do this in a defined time, maybe every 6h.
Hope someone could help me.
import telegram
from telegram.ext import Updater
from telegram.ext import CommandHandler
from tracker import get_prices
telegram_bot_token = "xxx-xxx"
updater = Updater(token=telegram_bot_token, use_context=True)
dispatcher = updater.dispatcher
def start(update, context):
chat_id = update.effective_chat.id
message = ""
crypto_data = get_prices()
for i in crypto_data:
coin = crypto_data[i]["coin"]
price = crypto_data[i]["price"]
change_day = crypto_data[i]["change_day"]
change_hour = crypto_data[i]["change_hour"]
message += f"Coin: {coin}\nPrice: ${price:,.2f}\nHour Change: {change_hour:.3f}%\nDay Change: {change_day:.3f}%\n\n"
context.bot.send_message(chat_id=chat_id, text=message)
dispatcher.add_handler(CommandHandler("start", start))
updater.start_polling()
I was testing something an could add an timer, but is there a way to loop the programm with while True: ?
import telegram
from telegram.ext import Updater
from telegram.ext import CommandHandler
from tracker import get_prices
import threading
import time
telegram_bot_token = "xxx:xxx"
updater = Updater(token=telegram_bot_token, use_context=True)
dispatcher = updater.dispatcher
def message_timer(update, context):
time.sleep(10)
chat_id = update.effective_chat.id
message = ""
crypto_data = get_prices()
for i in crypto_data:
coin = crypto_data[i]["coin"]
price = crypto_data[i]["price"]
change_day = crypto_data[i]["change_day"]
change_hour = crypto_data[i]["change_hour"]
message += f"Coin: {coin}\nPrice: ${price:,.2f}\nHour Change: {change_hour:.3f}%\nDay Change: {change_day:.3f}%\n\n"
context.bot.send_message(chat_id=chat_id, text=message)
dispatcher.add_handler(CommandHandler("start", message_timer))
updater.start_polling()

Related

Telegram bot - Updater

This code is supposed to take up prices from 2 indexes from yahoo finance nd send them to the user when a text is sent in the chat:
import requests
import telegram
from bs4 import BeautifulSoup
def get_price(symbol):
url = f"https://finance.yahoo.com/quote/{symbol}"
page = requests.get(url)
soup = BeautifulSoup(page.content, "html.parser")
price = soup.find("span", {"data-reactid": "14"}).get_text()
return price
def check_price(update, context):
symbols = ["^DJI", "^GSPC"]
prices = [get_price(symbol) for symbol in symbols]
message = "DJI: " + prices[0] + "\n" + "GSPC: " + prices[1]
context.bot.send_message(chat_id=update.message.chat_id, text=message)
token = "TOKEN NAME"
bot = telegram.Bot(token)
updater = telegram.Updater(token, use_context=True)
dispatcher = updater.dispatcher
price_handler = CommandHandler("price", check_price)
dispatcher.add_handler(price_handler)
updater.start_polling()
`
However, it gives an error:
\stocks.py", line 21, in <module>
updater = telegram.Updater(token, use_context=True)
AttributeError: module 'telegram' has no attribute 'Updater'. Did you mean: 'Update'?
I have tried updating the telegram libruary and installing Updater, but it didn't work.
I have also tried other variations of the code:
import requests
import telegram
from telegram import Updater, InlineKeyboardButton, InlineKeyboardMarkup
def get_price(symbol):
url = f"https://finance.yahoo.com/quote/{symbol}"
page = requests.get(url)
text = page.text
start = text.find("data-reactid=\"50\"") + len("data-reactid=\"50\"") + 1
end = text.find("</span>", start)
price = text[start:end].strip()
return price
def main():
token = "BOT_TOKEN_GOES_HERE"
updater = Updater(token)
dp = updater.dispatcher
def handle_text_message(update, context):
chat_id = update.message.chat_id
message = update.message.text
dji_price = get_price("%5EDJI")
sp_price = get_price("%5EGSPC")
bot.send_message(chat_id=chat_id, text=f"DJI Price: {dji_price}\nSP Price: {sp_price}")
dp.add_handler(MessageHandler(Filters.text, handle_text_message))
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()
But it gives a similar error due to Updater:
stocks.py", line 3, in <module>
from telegram import Updater, InlineKeyboardButton, InlineKeyboardMarkup
ImportError: cannot import name 'Updater' from 'telegram' (C:\Users\AppData\Local\Programs\Python\Python310\lib\site-packages\telegram\__init__.py)
There is no class Updater in the telegram package. There is telegram.Update and there is telegram.ext.Updater both of which have very litte to do with each other. The tutorial explains this in more detail.
Please also note that you're using a version <= 13.15 of the python-telegram-bot libray. That version is no longer being supported. If you're new to python-telegram-bot, I recommend to get started with v20.
Disclaimer: I'm currently the maintainer of python-telegram-bot

I am trying to create a telegram bot, I am getting error in command handler it is for casual talk

Below is my telegram bot code.
I am trying to get input from user and return eventually I will give input to my ML model:
def chat(s):
return s
def handle_message(update: Update, context: CallbackContext):
print("inside")
tx = update.message.text
re = chat(tx)
update.message.reply_text(re)
def main():
updater = Updater("API_KEY",use_context=True)
dp = updater.dispatcher
dp.add_handler(CommandHandler(Filters.text,handle_message))
dp.add_error_handler(error)
updater.start_polling()
updater.idle()
Here is the error I am getting:
File "C:\Users\NAMIT\AppData\Local\Programs\Python\Python39\lib\site- packages\telegram\ext\commandhandler.py", line 161, in __init__
self.command = [x.lower() for x in command]
TypeError: '_Text' object is not iterable
You have to use MessageHandler instead of CommandHandler
#dp.add_handler(CommandHandler(Filters.text, handle_message))
dp.add_handler(MessageHandler(Filters.text, handle_message))
Minimal working code:
import os
import logging
from telegram.ext import Updater, MessageHandler, CommandHandler, Filters
TOKEN = os.getenv('TELEGRAM_TOKEN')
def error(update, context):
logger.warning('Update "%s" caused error "%s"', update, context.error)
def chat(s):
return s
def handle_message(update, context):
print("inside")
tx = update.message.text
re = chat(tx)
update.message.reply_text(re)
def main():
updater = Updater(token=TOKEN, use_context=True)
dp = updater.dispatcher
#dp.add_handler(CommandHandler(Filters.text, handle_message))
dp.add_handler(MessageHandler(Filters.text, handle_message))
dp.add_error_handler(error)
updater.start_polling()
updater.idle()
main()

How Can I add URL for Inlinekeyboard in Telegram Bot

I want to create a button that when I click on it will send the file to me in the telegram.
from config import TOKEN
from telegram import MessageEntity, ReplyKeyboardMarkup, Update
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater
from telegram.ext import CallbackContext
from telegram.ext import CommandHandler
from telegram.ext import MessageHandler, Filters
from telegram.ext import CallbackQueryHandler
import logging
import urllib.request , json
updater = Updater(token= TOKEN, use_context= True)
dispathcer = updater.dispatcher
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO)
download_url_link = 'https://saavn.me/songs?link='
home_page = 'https://saavn.me/home'
def readjson(url):
req = urllib.request.urlopen(url)
return json.loads(req.read().decode())
def start(update: Update, context: CallbackContext):
text= "Welcome #{username}".format(username = update.effective_user.username)
update.message.reply_text(text)
def download(update: Update, context: CallbackContext):
x = update.message.parse_entities(types = MessageEntity.URL)
msg = update.message.reply_text("Working on it...")
for i in x:
try:
rjson = read_json(end_point_link + x[i])
name = rjson["results"]['name']
download_link = rjson["results"]["downloadUrl"][4]["link"]
quality = rjson["results"]["downloadUrl"][4]["quality"]
msg.delete()
dl = update.message.reply_document(download_link, caption="Here is {} and quality is {}".format(name, quality))
keyboard = [
[
InlineKeyboardButton('128KB', callback_data=dl),
InlineKeyboardButton('320kb', callback_data=dl),
]
]
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text("Please choose:",
reply_markup=reply_markup)
except:
continue
if 'error' in rjson:
continue
return
msg.edit_text("I can't fetch from that url. try again!")
dont work inlinekeyboard and just send for me link download and dont show my buttons
start_handler = CommandHandler('start', start)
download_hundler = MessageHandler(Filters.entity(MessageEntity.URL), download)
button_handler = CallbackQueryHandler(button)
dispathcer.add_handler(start_handler)
dispathcer.add_handler(download_hundler)
dispathcer.add_handler(button_handler)
updater.start_polling()
I run the program and the file is sent to me but it does not ask me 128 or 320 and it automatically sends the file why?
In the keyboard section, you should have a unique callback data for each button. for example:
keyboard = [
[
InlineKeyboardButton('128KB', callback_data='dl-128'),
InlineKeyboardButton('320kb', callback_data='dl-320'),
]
]
Then you should create a function to handle callback query:
def button(update: Update, context: CallbackContext):
data = update.callback_query.data
quality = int(data.split('-')[1])
if quality == 128:
# send 128kb file
elif quality == 320:
# send 320kb file
after that, you should create a callback handler with your preferred pattern. For this example it would be:
button_handler = CallbackQueryHandler(button, pattern='dl-')
dispathcer.add_handler(button_handler)

Aiogram python InlineKeyboard

I have some code:
master = InlineKeyboardMarkup()
master.add(InlineKeyboardButton(text='7(800)555-35-35', url='tel:+78005553535'),
InlineKeyboardButton(text='8(800)555-35-35', url='tel:+88005553535'))
But when I try to summon this keyboard I have an error:
aiogram.utils.exceptions.BadRequest: Wrong http url
You need to write the code as follows:
main.py
from aiogram
import Bot, Dispatcher, executor, types
import keyboards as kb
bot = Bot(token = 'BOT_TOKEN')
dp = Dispatcher(bot)
#dp.message_handler(commands = ['inline'])
async def show_items(message: types.Message):
await message.answer('It is buttons', reply_markup = kb.start_keyboard)
if __name__ == '__main__':
executor.start_polling(dp, skip_updates = True)
keybords.py
from aiogram.types
import ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton
inline_keyboard = InlineKeyboardButton(text='7(800)555-35-35', url = 'tel:+78005553535'),
InlineKeyboardButton(text='8(800)555-35-35', url = 'tel:+88005553535')
start_keyboard = ReplyKeyboardMarkup(resize_keyboard = True).add(inline_keyboard)

How to loop in python Telegram bot conversation handler

bot doesn't come back to the start message after running once.
import logging
from config import TOKEN, hello_msg, key1_msg
import mysql.connector
from telegram.ext import Filters, ConversationHandler, CommandHandler, MessageHandler,
Filters, Updater, InlineQueryHandler, CallbackQueryHandler, CallbackContext
from telegram import InlineQueryResultArticle, InputTextMessageContent,
InlineKeyboardButton, InlineKeyboardMarkup, Update
CHOOSING, CHOOSING2 = range(2)
keyboard1 = [
[InlineKeyboardButton("Welcome Message", callback_data = 'welcome_Message')],
[InlineKeyboardButton("Commands", callback_data = 'Commands')],
[InlineKeyboardButton("Links to our website", callback_data = 'links_to_our_websites')],
[InlineKeyboardButton("Demo Try", callback_data = 'Demo_try')],
[InlineKeyboardButton("register", callback_data = 'register')],
[InlineKeyboardButton("Contact us", callback_data = 'Contact_us')]
]
def start(update: Update, context: CallbackContext):
global up, cal
up = update
cal = CallbackContext
context.bot.send_message(chat_id = update.effective_chat.id, text = hello_msg)
reply_markup = InlineKeyboardMarkup(keyboard1)
update.message.reply_text("please Choose: ", reply_markup = reply_markup)
return CHOOSING
def button1(update: Update, context: CallbackContext):
query = update.callback_query
query.answer()
answer = query.data
context.bot.send_message(chat_id = update.effective_chat.id, text = key1_msg[answer])
return CHOOSING
def main():
updater = Updater(TOKEN, use_context=True)
dp = updater.dispatcher
new = ConversationHandler(entry_points = [CommandHandler("start", start)], states = {CHOOSING : [MessageHandler(Filters.regex('^(Welcome Message|Commands|Links to our website|Demo Try|register|Contact us)$'), start)]},fallbacks=[MessageHandler(Filters.regex('^start$'), sart)])
dp.add_handler(new)
dp.add_handler(CallbackQueryHandler(button1))
updater.start_polling()
updater.idle()
if __name__ == "__main__":
main()
I want to run the start command again right after a user will choose an option from a button...
I wanna learn how to pass parameters when giving handlers inside the conversation handler.
thank you.

Categories

Resources