我只是在搜索如何自动搜索如何向电报用户发送每日消息。大多数结果导致将消息发送到机器人(用户订阅) - 简而言之,当用户连接到特定的机器人时,该机器人将消息发送给用户。另一件事是安排消息的电报功能,但没有选择每天重复时间表的选项。这些根本不是我想要的。我想要的是自动化将消息从我自己的帐户发送给特定用户并每天进行。
经过更彻底的搜索,我终于找到了一个Python库telethon,该库将消息发送给Telegram用户使用几行代码非常简单。我将在下面描述我经历的过程。
首先,我们需要我们的电报api_id
和api_hash
。请记住,它不能与其他任何人共享,因为它是通往我们身份验证的桥梁。
为此,您需要在此处登录:https://my.telegram.org/auth?to=apps使用您的电话号码和国家代码。然后,您将要求提供确认代码。如果您以前从未生成应用程序配置,则需要输入一些信息。然后,您可以继续获取您的api_id
和api_hash
,然后将其用于授权您的身份发送消息。您应该有下面的图像。
api_id
和api_hash
将用于建立电报客户端。之后,我们可以启动客户端并执行任何API功能。
from telethon import TelegramClient, events, sync
client = TelegramClient('session_name', api_id, api_hash)
client.start()
只是一个旁注,我将api_id
和api_hash
的值设置为环境变量,然后以下如下:
import os
api_id = os.getenv("TELEGRAM_API_ID")
api_hash = os.getenv("TELEGRAM_API_HASH")
然后,在这种情况下是呼叫客户端函数的问题,在这种情况下为send_massage
。就像以下一样容易:
client.send_message(username, randomize_message())
username
是带有@
符号的目标(接收器)。例如@janesoo
然后,如何设置脚本每天发送消息。为此,我使用了Python库schedule。我设置了一个特定的小时,并随机做了一分钟(所以接收器不会怀疑它是自动化的,但总的来说是在这里:
schedule.every().day.at(f"00:{randomize_minute()}").do(send_message)
while True:
schedule.run_pending()
time.sleep(1)
最后一个while True
是确保代码保持运行。
最后一个注意事项是,当您第一次运行该应用程序时,您将提示输入您的电话号码和确认代码。但是,您将在主机机上登录一段时间(更长的时间),即使停止应用程序并再次运行后,也不必这样做。
这样,我们可以轻松地向任何电报用户发送每日消息。
这是完整的脚本:
import os
import schedule
import time
import random
from telethon import TelegramClient, events, sync
MESSAGES = [
"good night!",
"good night ;)",
"dobrou noc!",
"dobrou noc ;)"
]
#in order to get the info below you need to request here: https://my.telegram.org/apps
api_id = os.getenv("TELEGRAM_API_ID")
api_hash = os.getenv("TELEGRAM_API_HASH")
#this is a telegram username with @ as prefix
username = os.getenv("TARGET_TELEGRAM_USERNAME")
client = TelegramClient('session_name', api_id, api_hash)
client.start()
def randomize_minute():
return random.randint(0,59)
def randomize_message():
return random.choice(MESSAGES)
def send_message():
try:
client.send_message(username, randomize_message())
except Exception as e:
print(e)
schedule.every().day.at(f"00:{randomize_minute()}").do(send_message)
while True:
schedule.run_pending()
time.sleep(1)