Michele
Michele

Reputation: 553

Sending messages with Telegram - APIs or CLI?

I would like to be able to send a message to a group chat in Telegram. I want to run a python script (which makes some operations that already works) and then, if some parameters have some values the script should send a message to a group chat through Telegram. I am using Ubuntu, and Python 2.7

I think, if I am not wrong, that I have two ways to do that:

I think that the first way is longer, so a good idea might be using the Way Two.

In this case I really don't know how to proceed. I don't know lots about scripts in linux, but I tried to do this:

#!/bin/bash
cd /home/username/tg
echo "msg user#******** messagehere" | ./telegram
sleep 10
echo "quit" | ./telegram

this works at a half: it sends the message correctly, but then the process remains open. And second problem, I have no clue on how to call that from python and how to pass some value to this script. The value that I would like to pass to the script is the "messagehere" var: this would be a 100/200 characters message, defined from inside the python script.

Does anyone has any clues on that? Thanks for replies, I hope this might be useful for someone else.

Upvotes: 32

Views: 53627

Answers (7)

nealmcb
nealmcb

Reputation: 13451

Here I have ported @ChrisBrand's very handy and minimal answer, which worked in Python 2, to Python 3. The original also didn't work out-of-the box, so I've automated the extraction of a proper chat-id parameter, which allows you to respond to the sender of the first message you read. Note that this will fail if you haven't received any messages so far, etc.

Finally, I read the bot_id out of the environment so it doesn't have to appear insecurely in any source code. To use this, at least from Linux, first do export TELEGRAM_TOKEN=<value via botfather>

import os
import json
from urllib.request import urlopen
from urllib.parse import urlencode

# Generate a bot ID here: https://core.telegram.org/bots#botfather
bot_id = os.getenv('TELEGRAM_TOKEN')

# Request latest messages
result = urlopen(f"https://api.telegram.org/bot{bot_id}/getUpdates").read()
print(result)

# Extract the chat-id for replying to the first message provided.
chat_id = json.loads(result)["result"][0]["message"]["from"]["id"]

# Send a message back 
result = urlopen(f"https://api.telegram.org/bot{bot_id}/sendMessage", urlencode({ "chat_id": chat_id, "text": 'my message' }).encode('utf-8')).read()
print(result)

Upvotes: 0

Charles Okwuagwu
Charles Okwuagwu

Reputation: 10876

I would recommend the first option.

Once you are comfortable with generating an AuthKey, you should start to get a handle on the documentation.

To help, I have written a detailed step-by step guide of how I wrote the AuthKey generation code from scratch here.

It's in vb.net, but the steps should help you do same in python.

Upvotes: 0

Chris Brand
Chris Brand

Reputation: 1990

Telegram recently released their new Bot API which makes sending/receiving messages trivial. I suggest you also take a look at that and see if it fits your needs, it beats wrapping the client library or integrating with their MTProto API.

import urllib
import urllib2

# Generate a bot ID here: https://core.telegram.org/bots#botfather
bot_id = "{YOUR_BOT_ID}"

# Request latest messages
result = urllib2.urlopen("https://api.telegram.org/bot" + bot_id + "/getUpdates").read()
print result

# Send a message to a chat room (chat room ID retrieved from getUpdates)
result = urllib2.urlopen("https://api.telegram.org/bot" + bot_id + "/sendMessage", urllib.urlencode({ "chat_id": 0, "text": 'my message' })).read()
print result

Unfortunately I haven't seen any Python libraries you can interact directly with, but here is a NodeJS equivalent I worked on for reference.

Upvotes: 31

nfgf
nfgf

Reputation: 561

Since version 1.05 you can use the -P option to accept messages from a socket, which is a third option to solve your problem. Sorry that it is not really the answer to your question, but I am not able to comment your question because I do not have enough reputation.

Upvotes: 10

ShlomiK
ShlomiK

Reputation: 73

I'm working with pytg which could be found here: A Python package that wraps around Telegram messenger CLI

it works pretty good. I already have a python bot based on that project

Upvotes: 5

Fahad Alduraibi
Fahad Alduraibi

Reputation: 382

You can use safe_quit to terminate the connection instead since it waits until everything is done before closing the connection and termination the application

#!/bin/bash
cd /home/username/tg
echo "msg user#******** messagehere\nsafe_quit\n" | ./telegram

use this as a simple script and call it from python code as the other answer suggested.

Upvotes: 2

Guillermo Olmedo
Guillermo Olmedo

Reputation: 196

First create a bash script for telegram called tg.sh:

#!/bin/bash
now=$(date)
to=$1
subject=$2
body=$3
tgpath=/home/youruser/tg
LOGFILE="/home/youruser/tg.log"
cd ${tgpath}
${tgpath}/telegram -k ${tgpath}/tg-server.pub -W <<EOF
msg $to $subject
safe_quit
EOF
echo "$now Recipient=$to Message=$subject" >> ${LOGFILE}
echo "Finished" >> ${LOGFILE}

Then put the script in the same folder than your python script, and give it +x permission with chmod +x tg.sh

And finally from python, you can do:

import subprocess
subprocess.call(["./tg.sh", "user#****", "message here"])

Upvotes: 5

Related Questions