现代编程:经过25年的休息或我为Telegram编写机器人后的回顾

当您对此一无所知并决定时,任务似乎很简单。

在一天的“奇妙”一天中,我意识到自己对参加众多论坛不感兴趣,但我想创建自己的频道并分享“智慧”。

我喜欢其中包含机器人的Telegram功能,因此在此创建了博客形式的频道。 他开始寻找机器人来帮助编写信息.... 而且因为我不想找到它。 好吧,自己写。 建议聪明人用Python编写。

我在149页上阅读了Internet上的第一个教程。 我很熟悉Pascal,FoxPro,Interbase,甚至20年前(哈哈哈哈哈哈遍了三遍)我都卖掉了我的程序,但后来以某种方式没有奏效,我开始交易。 顺便说一下,作为程序员的工作对我设置编码员的任务有很大帮助。 但是回到Python,似乎没有什么复杂的,因为也可以使用BASIC进行编程,这不是我的大学文凭,因为它是在Assembler上使用MIG验证生成器的硬件-软件复合体的。 一个问题,是很久以前的,所以回到标题上看-这很简单,因为我对该任务一无所知,但是值得一试。

我认为将项目从智能手机移植到Android最为方便,因为它随时可用。 所以说:

  1. Pydroid 3-适用于Python 3的IDE实际上是适用于Android的Python。
  2. @BotFather,在Telegram中,我们安装了所有bot的父亲-您将需要它来获取bot的标识符并进行基本设置。
  3. Rebootr应用程序,用于在heroku上启动项目。
  4. GIT用于存储库在线托管的应用程序。
  5. Windscribe在任何地方都没有VPN?
  6. Termux终端仿真器和Linux环境。

底线是什么? 从理论上讲,在智能手机上进行编程是可能的,但实际上是不可能的。 尽可能检查代码,纠正错误,调查性能。

这么长的介绍,以及我想从我的机器人中得到什么。 最初,在我看来,在消息末尾添加#标签就足够了。 然后想到了通过链接到我的频道“覆盖”它的想法,因此通过重新发布,频道的来源将受到更多的吸引。 然后,他添加了源链接的自动化功能,我从那里获得了消息。 接下来,我要离题了。 广告当然是进步的引擎。 但是有时它的数量会上升。 我之所以选择电报,是因为我有机会与后者抗衡。 我尊重我频道的读者,因此我从广告中清除了Ineta上发现的有趣新闻,并将其发送到该频道。 同时,我尊重作者,并且几乎总是以“阅读更多...”的形式提供到源的链接。 由于不喜欢广告,我从YouTube下载了内容并将其作为视频文件上传到我的频道中。 在某个时刻,下载视频的机器人变得疯狂,并开始每小时向我发送广告。 因此,在我的机器人程序中,有机会从YouTube下载视频。 最近,顺便说一句,我遇到了这个机器人的作者,他很惊讶,因为 据他说,他每月仅“发送”广告20次。 制作水印的机器人也发生了同样的事情-将其发送到熔炉,我有机会制作水印。

为了从头开始编写程序,我不得不在Internet上搜索很多信息。 我希望那些跟随我的脚步的人会有所帮助。 所以我从哪里获得信息以及使用了什么:

  1. 关于Habrr的文章确实帮助了我。 因此,我不会重写如何以及如何安装。 一切都在那里。 顺便说一句,我以个人方式与作者联系,他们从未拒绝过我的帮助。
  2. github一种在线存储库托管服务,具有分布式版本控制和源代码控制功能的所有功能。 底漆
  3. heroku是基于云的PaaS平台,支持多种编程语言。 很快就抛弃了他。
  4. pyTelegramBotAPI-为电报编写机器人时的主要库之一。
  5. Bot拼写教程
  6. 适用于初学者的Python 3
  7. 机器人:给开发人员的信息
  8. HTML参考
  9. 没有VPN,无处不在?

将显示第二个题外话或战争计划。 当我开始编写机器人时,我首先看到的是别人的代码。 如果没有卡门蒂人,几乎无法理解:

大地像我们的胸部一样颤抖
一群人混在一起,人,
和一千枪的抽射
合并成长啸...

莱蒙托夫(Lermontov)撰写了有关代码的文章。 堆包含函数,装饰器。 没有代码美,没有人关心资源。 尽管美女最有可能被古怪的受虐狂所见。 熟悉的程序员短语“看程序,也许您能弄清楚”的意思很快就传到我身上。 我遇到的最重要的爆炸事件是,当我最终意识到代码是事件驱动的,而不是顺序的。 这是一个不同的水平。

第二个问题是缺乏好的文档。 即使在巴苏姆。 我举一个例子。 我把照片发给电报,他无耻地摇了摇。 事实证明,在该行中写入了无效的参数:

file_info = bot.get_file(message.photo[-1].file_id) 

什么是文档? 我们去源头

图片

图片

这是一个数组。 您可以沿着它走,研究返回的尺寸。 谢谢,聪明的人建议了些什么。 虽然我在说什么,但即使大师不知所措。

编写水印代码时,我使用了免费字体,然后将其变粗了,我将该解决方案应用于以像素偏移量显示消息三遍,我不知道该解决方案的美观程度,但是它可以工作。

 font = ImageFont.truetype("Pillow/Tests/fonts/FreeMono.ttf", width//20) pos = (width//4, height - height//10) text = skanal drawing.text(pos, text, fill=black, font=font) pos = (1 + width // 4, 1 + height - height // 10) drawing.text(pos, text, fill=black, font=font) pos = (2 + width // 4, 2 + height - height // 10) drawing.text(pos, text, fill=black, font=font) 

如您所见,位置也取决于图像的大小,字体高度。 我立刻想到了一个有趣的观点:尽管字体是PIL库不可或缺的一部分,但由于第一行说它在本地可用,但是在Docker中却没有。 解决方法是将其下载到存储库,将路径添加到环境文件,然后在程序中写入另一个路径。

对我来说,另一个不可理解的事情发生在使用PIL库处理后(紧接在水印之后)的图片。 我将其发送给我的机器人:

  with open(photo_path, 'rb') as fi: bot.send_photo(message.chat.id, fi) 

一切都很好,我喜欢这张照片。 然后,我需要在图片上添加评论,看看所有内容是否在一起看起来都很漂亮? 我们写:

 bot.send_photo(message.chat.id, message.photo[-1].file_id, caption=' ') 

由于某种原因,未经处理的原始图片会进入机器人。 好吧,让我们尝试愚弄一下:getupdates.offset -1没有意义,Telegram确信这是同一张照片。 好的,我们这样做:

  with open(photo_path, 'rb') as fi: info = bot.send_photo(message.chat.id, fi) 

改写:

 bot.send_photo(message.chat.id, info.photo[-1].file_id, caption=' ') 

结果相同-显示原始图片。 而且只有用info替换第一个参数中的message才能获得所需的结果。

我还将为您提供一些来自YouTube的有趣的入门级代码(注意:没有错误检查):

 elif message.entities: #    pkanal = 6 for item in message.entities: if item.type == "url" and message.text.find(' ') == -1: if 'youtube.com' in message.text or 'youtu.be' in message.text: #    ydl_opts = {'outtmpl': '/tmp/f.mp3', 'preferredcodec': 'mp3', 'max_filesize': 60000000} link_of_the_video = message.text with youtube_dl.YoutubeDL(ydl_opts) as ydl: ydl.download([link_of_the_video]) bot.delete_message(message.chat.id, message.message_id) if os.path.exists('/tmp/f.mp3'): #   video = open('/tmp/f.mp3', 'rb') bot.send_video(message.chat.id, video) os.remove('/tmp/f.mp3') pkanal = 6 else: #   bot.send_message(message.chat.id, '  ', parse_mode='html', disable_web_page_preview=True) 

对我来说,绊脚石是实体是一个数组数组,您需要“遍历”整个数组,以便机器人了解我们正在使用链接。 事实证明,用户将链接作为“共享”从YouTube发送到机器人,因此该示例中也写有“ youtu.be”。 我没有想到立即将文件发送到Telegram的方法,因此我们将其保存,发送然后删除。 在测试期间,我立即得知人们将开始下载巨型文件-后来我不得不引入限制。

在发布僵尸程序之前,突然变得很清楚,我没有检查该频道的访问权限。 例如,知道我的频道后,任何漫游器用户都可以在那里发送消息,因为 该机器人是管理员。 我不得不紧急检查:

 if message.from_user.id in [adm_obj.user.id for adm_obj in bot.get_chat_administrators(chat_id)]: 

在这里,我们从通道中获取管理员列表,并查看消息的作者是否也是管理员。

关于您如何与Roskomnadzor战斗的几句话。 由于对API的访问被阻止,因此要在本地开发漫游器,您需要以某种方式将流量通过我们英勇的防御者。 您可以通过两种方式执行此操作-通过VPN或通过代理。 最简单,最快,最“正常”的方法是ssh隧道:我们在客户端和代理服务器之间建立连接,我们在本地主机上获得一个端口,可以从一侧发送流量,该端口将从另一端发出(已经在德国的某个地方)。 为方便起见,您可以添加一些与此连接类似的自动化功能-桌面上的脚本和快捷方式,如有必要,它们将启动它。 所谓“正常”方法,是指我们自己控制进入和退出点的情况-左侧是我们的笔记本电脑,右侧是德国的VPS。 在中间,可以根据需要截取尽可能多的流量,将其加密,在出口处,我们发现自己处于另一州的管辖范围内,俄罗斯联邦的法律并不适用于此。 另外,我们还另外保证,除非自己完成操作,否则不会更改或关闭代理服务器。 即 与任何VPN叔叔不同,我们对未来充满信心和信心。

剧本

 /home/user/proxy.sh 

脚本代码

 #!/bin/bash ssh -f -D 1080 user@12.34.56.78 sleep 72000 

与服务器建立连接并且端口打开后,我们需要以某种方式将流量定向到服务器。 走在阻力最小的道路上,并且为了不考虑如何在IDE \ docker \ python中配置代理,您完全可以进行一个设置,proxychains就是这样的设置。 如果使用此实用程序运行任何软件,则它将通过配置中注册的代理链重定向流量。

 /etc/proxychains.conf 

在我们的情况下,这是一条链,编写起来并不困难。

 socks5 127.0.0.1 1080 

另一个未配置VPN(讽刺)的拐杖是从PyCharm启动Python应用程序的一种方式。 在简单的情况下,要通过代理链运行应用程序,只需编写代理链app.py即可。 但是IDE总是需要一个解释器。 解决这个问题很容易-创建一个新的“运行配置”,选择一个shell脚本。 并填写字段

图片

之后,从IDE的角度来看,启动采用以下形式:proxychains python3 app.py-这正是我们所需要的。 因此,当我们要启动一个项目时,我们需要做的就是在桌面上运行脚本,然后单击ide中的“播放”按钮启动bot,其他所有魔术将由proxychains和ssh完成。

最后,对机器人进行编写,测试。 接下来是什么? 一方面,我想宣布自己,另一方面,我认为这对某人真的很方便。 在这里,我们面临着另一个电报问题; 它没有单一的渠道和漫游器目录。 很可能存在类似于我的机器人,但我重复一次,但没有找到它。 在电车的某个地方,一个人坐着受苦,他想在通道中精美地布置一条消息,他用笔做所有事情。

如果您已经运行过我的漫游器,那么您会看到有一个#Advertising标签。 怎么会这样 -你问。 在这里,我讨论了最终用户的问题-许多用户在其频道上张贴广告,并很快习惯于使用该机器人编写消息,他们要求我添加。 您可能不喜欢广告,要与之抗争,但这对用户来说是苛刻且必要的现实。

该项目是非营利性的,因此我认为您可以将漫游器本身称为@SGK_espace_bot。

这是视频的使用方法
如有建设性的批评,我将不胜感激。

Source: https://habr.com/ru/post/zh-CN477178/


All Articles