编程语言 / 计算机技术 · 2021年2月23日 0

使用python操作telegram——telethon

前言

最近闲得没事干,于是想看看有没有什么法子操作telegram。

如果你不知道什么是telegram,那就没必要再看了~

 

 

 

 


起步

申请API_id

首先,我们要申请成为telegram的开发者,打开telegram的网站——https://my.telegram.org/

在Your Phone Number一栏输入你注册电报的手机号(注意,一定是已经注册了电报),注意加国区号(比如86),然后会让你填一个验证码,注意!这个验证码不是发到你填的手机上,而是发给了这个账号对应的电报,打开你的电报就可以看到验证码,然后你就填下去就好了。

 

然后会让你填一个表格,随便填写即可,注意有的会要求数字字符都得有,url啥的都可以不填,然后提交所填即可。

再然后你就可以看到你的api_id、api_hash这两个东西了,快拷贝到txt里。

 

telethon

然后我们打开python开发环境,安装telethon包

pip3 install telethon

安装完成后,我们就可以贴上下面的代码来测试一下:

from telethon import TelegramClient, events, sync

api_id = 马赛克  # 用户api_id
api_hash = '马赛克'  # 用户 api_hash
phone_number = '+马赛克'  # 用户号码
client = TelegramClient(phone_number, api_id, api_hash)
import time
async def main():

    await client.send_message('老大', 'Hello, myself!')
    
    # You can, of course, use markdown in your messages:
    message = await client.send_message(
        'me',
        'This message has **bold**, `code`, __italics__ and '
        'a [nice website](https://example.com)!',
        link_preview=False
    )
    # You can reply to messages directly if you have a message object
    await message.reply('Cool!')

    # You can print the message history of any chat:
    async for message in client.iter_messages('老大'):
        print(message.text)
        # You can download media from messages, too!
        # The method will return the path where the file was saved.
        if message.photo:
            path = await message.download_media()
            print('File saved to', path)  # printed after download is done

while 1:
    with client:
        client.loop.run_until_complete(main())
    time.sleep(10)

上面的程序是我用官网的案例改写的,首次运行还需要验证一下电报登录,和上面一样,在tg里看验证码。

上面的老大是我的一个联系人,请替换成一个你的联系人。

上面的代码成功运行,则你会看见:

  1. 每隔十秒你的账号给一个叫“老大”的联系人发送消息“Hello, myself!”
  2. 每隔十秒你的账号给自己发送  ‘This message has bold,code, italics and a nice website!’
  3. 在你发送上面的消息后,你会立刻再回复自己的那条消息,回复了一句“Cool!”
  4. 每隔十秒,你和联系人“老大”的消息记录就会被一一打印,如果有图片会被保存,保存地址会被打印

聪明的你应该也已经猜到上面语句的各个作用了吧,哈哈,这是个好开头。

 

补充:关于async/await

以下内容转载自这篇文章

什么是协程、异步。

举个例子:假设有1个洗衣房,里面有10台洗衣机,有一个洗衣工在负责这10台洗衣机。那么洗衣房就相当于1个进程,洗衣工就相当1个线程。如果有10个洗衣工,就相当于10个线程,1个进程是可以开多线程的。这就是多线程!

那么协程呢?先不急。大家都知道,洗衣机洗衣服是需要等待时间的,如果10个洗衣工,1人负责1台洗衣机,这样效率肯定会提高,但是不觉得浪费资源吗?明明1 个人能做的事,却要10个人来做。只是把衣服放进去,打开开关,就没事做了,等衣服洗好再拿出来就可以了。就算很多人来洗衣服,1个人也足以应付了,开好第一台洗衣机,在等待的时候去开第二台洗衣机,再开第三台,……直到有衣服洗好了,就回来把衣服取出来,接着再取另一台的(哪台洗好先就取哪台,所以协程是无序的)。这就是计算机的协程!洗衣机就是执行的方法。

当你程序中方法需要等待时间的话,就可以用协程,效率高,消耗资源少。

好了!现在来总结一下:

洗衣房 ==> 进程

洗衣工 ==> 线程

洗衣机 ==> 方法(函数)

Unity里也有这个概念,协程就是将一个方法暂时的挂起,处理其他的东西的时候在某种特定情况下会回头再来继续这个方法

二、async\await 的使用

正常的函数在执行时是不会中断的,所以你要写一个能够中断的函数,就需要添加async关键。

async 用来声明一个函数为异步函数,异步函数的特点是能在函数执行过程中挂起,去执行其他异步函数,等到挂起条件(假设挂起条件是sleep(5))消失后,也就是5秒到了再回来执行。

await 用来用来声明程序挂起,比如异步程序执行到某一步时需要等待的时间很长,就将此挂起,去执行其他的异步程序。await 后面只能跟异步程序或有__await__属性的对象,因为异步程序与一般程序不同。假设有两个异步函数async a,async b,a中的某一步有await,当程序碰到关键字await b()后,异步程序挂起后去执行另一个异步b程序,就是从函数内部跳出去执行其他函数,当挂起条件消失后,不管b是否执行完,要马上从b程序中跳出来,回到原程序执行原来的操作。如果await后面跟的b函数不是异步函数,那么操作就只能等b执行完再返回,无法在b执行的过程中返回。如果要在b执行完才返回,也就不需要用await关键字了,直接调用b函数就行。所以这就需要await后面跟的是异步函数了。在一个异步函数中,可以不止一次挂起,也就是可以用多个await。

 


更多使用

监听事件

async def main():
    await client.send_message('老大', 'Hello, myself!')

@client.on(events.NewMessage(pattern='(?i)hi|hello'))
async def handler(event):
    await event.respond('Hey!')

while 1:
    with client:
        client.loop.run_until_complete(main())
    time.sleep(10)

 

 

 

 

 

 

 


 

 

 

商业转载 请联系作者获得授权,非商业转载 请标明出处,谢谢

是的,我就是计算机界的枭雄!