5分钟内:用python写出用于文档识别的telegram(一)一步步打造Bot-电报telegram技巧分享

Python编写telegram

我们将讨论怎样将辨认技能(用于辨认护照、银行卡等)嵌入到你的应用程序中。怎样使用智能IDReader辨认库的Python接口并编写一个简单的Telegram bot?且听这回剖析。

趁便说一下,已经扩展了受支持的编程语言列表,如今包括c++、C、c#、Objective-C、Swift、Java和Python,以及一些深奥的语言,如Visual Basic,固然另有PHP。我们支持全部盛行的和小众的的操作系统和架构。

一如既往,用于Python的Smart IDReader SDK的演示版本以及Telegram bot实现的源代码都公布在Github上,可以通过引用来访问。


预备工作

我们需要几个SDK的文件:

辨认库的Python接口(pySmartIdEngine.py)

动态c++内核辨认(在Linux中,_pySmartIdEngine.so)

设置存档(* .zip)

编写Telegram bot,我们选择的是telepot

辨认内核的交互。

你可以在文档中找到关于这个库的具体信息,在这里,我们只要最须要的信息内容。

连接库并设置辨认引擎:

# We connect the python-interface of the recognition library

import pySmartIdEngine as se

# Path to the configuration filesmartid_config_path = ‘bundle_mock_smart_idreader.zip’

# Create the recognition engine, it’s best to do it once and keep it in memory

smartid_engine = se.RecognitionEngine (smartid_config_path)

编写图像辨认函数:

def recognize_image_file (smartid_engine, image_file_path):

# Get the default settings and include the required types of documents

session_settings = smartid_engine.CreateSessionSettings () session_settings.AddEnabledDocumentTypes (‘rus.passport.national’)

# Create a recognition session

session = smartid_engine.SpawnSession (session_settings)

# Recognize the image result = session.ProcessImageFile (image_file_path)

# Convert recognized string fields to dict

recognized_fields = {}

for field_name in result.GetStringFieldNames ():

field = result.GetStringField (field_name)

recognized_fields [field_name] = field.GetValue (). GetUtf8String ()

# Return the JSON string representation of recognized fields

return json.dumps (recognized_fields, ensure_ascii = False, indent = 2)


创建机器人来辨认发送的图像

遵照简单的路径,并以telepot文档为例。我们需要编写一个类,该类的对象将为每个聊天创建,并在此中实现on_chat_message函数。别的,在结构函数中,我们将转移之前创建的辨认引擎,这样它就不会浪费时间来每次创建:

import telepot

from telepot.delegate import per_chat_id, create_open, pave_event_space

from telepot.loop import MessageLoop

class SmartIDReaderBot(telepot.helper.ChatHandler):

def __init__(self, seed_tuple, smartid_engine, **kwargs):

self.smartid_engine = smartid_engine

super(SmartIDReaderBot, self).__init__(seed_tuple, **kwargs)

def on_chat_message(self, msg):

try:

content_type, chat_type, chat_id = telepot.glance(msg)

if content_type in [‘document’, ‘photo’]: content = msg[content_type] if

content_type == ‘document’ \

else msg[content_type][-1]

if ‘file_id’ in content:

# Скачиваем файл изображения

downloads_dir = ‘downloaded_images’

os.makedirs(downloads_dir, exist_ok=True)

temp_path = os.path.join(downloads_dir,

‘chat_%d_id_%d_temp.png’ % (chat_id, msg[‘message_id’]))

self.bot.download_file(content[‘file_id’], temp_path)

# Распознаем изображение

recognition_result_str = recognize_image_file(

self.smartid_engine, temp_path)

# Посылаем сообщение с результатом распознавания

self.send_message(recognition_result_str)

else:

self.send_message(“Send me a photo and I’ll recognize it!”)

except Exception as e:

self.send_message(‘Exception: %s’ % e.message)

def send_message(self, message):

self.sender.sendMessage(message)

print(message)

最后,创建并运行机器人:

# Creating a bot

bot = telepot.DelegatorBot (args.token, [

pave_event_space () (

per_chat_id (), create_open,

SmartIDReaderBot, smartid_engine, timeout = 1000000)

])

# Run the bot

MessageLoop (bot) .run_as_thread ()

while 1:

time.sleep (10)

在注册后,你要得到唯一的令牌机器人。假如你从未创建过机器人,Telegram的官方网站上有具体的说明。


结论

以上便是全部关于用Python写出用于文档辨认的Telegram Bot的内容!

请留意,该产品的特点是完全自主的——不需要网络。但是假如你想用网络来使用Telegram,你也可以很轻易地长途辨认文件。

如需更多信息,请留言。

Step 3. Prepare development environment

先创建一个专案目次


$ mkdir $project_name

进入专案目次


$ cd $project_name

install 开发 Chatbot 需要的 Module


$ pipenv install –three python-telegram-bot flask gunicorn requests

参数及 module 说明


–three

用 Python 3 创建虚拟环境


python-telegram-bot

Telegram Bot API wrapper.


flask

Web framework. Using for building webhook API.


gunicorn

Python WSGI HTTP server for UNIX. Using for deploying web server.


requests

HTTP client library.

安装完后,专案目次中会增长两个档案


Project Directory

├── Pipfile.lock

└── Pipfile

Take a look at

Pipfile

接着,在专案目次中新增一个 config file,把 Chatbot 所用到 Service 的 key 及 secret 都写在 config file 中。这么做的长处如下:

  1. service key 及 secret 不应该写在程式码里,制止由于有做版本控制,在 git commit & push 后将秘密资讯袒露在 public repository
  2. 会合管理,日后若需要变动 key,直接编辑 config file 即可,不用更动程式码,也能确保程式中有效到 key 及 secret 的模组都市同步更新
  3. 摆设专案时,比起在 server 设定环境变数,loading config file 的方法会越发方便轻易

Python 有预设的 Configuration file parser module

在专案目次中新增

config.ini

档案


$ touch config.ini

编辑成以下格式

使用时,把各 service 申请到的

token

/

key

/

secret

放在

=

背面即可,比方:


[TELEGRAM]

ACCESS_TOKEN = 606248605:AAGv_TOJdNNMc_v3toHK_X6M-dev_1tG-JA

至此开发环境预备完成,专案目次中共有三个档案


Project Directory

├── config.ini

├── Pipfile.lock

└── Pipfile

Step 4. Develop first echo chatbot

这一步会先完成一个鹦鹉回话 Chatbot,解说 python-telegram-bot 提供哪些模组帮助我们做 Telegram Bot 开发。

在专案目次中,新增

main.py

档案


$ touch main.py

程式码如下

完成后,就可以用

pipenv

running。在专案目次中实行以下下令


$ pipenv run python3 main.py

Flask server 就会开始运行


* Serving Flask app “main” (lazy loading)

* Environment: production

WARNING: Do not use the development server in a production environment.

Use a production WSGI server instead.

* Debug mode: on

2018-06-15 16:38:07,843 – werkzeug – INFO – * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

2018-06-15 16:38:07,845 – werkzeug – INFO – * Restarting with stat

2018-06-15 16:38:08,279 – werkzeug – WARNING – * Debugger is active!

2018-06-15 16:38:08,324 – werkzeug – INFO – * Debugger PIN: 244-087-163

但是程式是在本机运行,要怎么让使用者传送给 Telegram Bot 的讯息可以透过 webhook 传送给本机 web server 呢?

此时就可以用 ngrok 服务,它会帮我们在 cloud 创建 public domain 对 local 端的 poxy。实行以下下令


$ ngrok http 5000

5000 恰好对应 Flask App listening 的 port

Session Status online
Session Expires 7 hours, 58 minutes
Version 2.2.8
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http://76f2a29d.ngrok.io -> localhost:5000
Forwarding https://76f2a29d.ngrok.io -> localhost:5000
Connections ttl opn rt1 rt5 p50 p90
2 0 0.03 0.01 1.21 1.89

接下来就可以把

https://76f2a29d.ngrok.io/hook

设定为 Telegram Bot 的 webhook。

请留意, ngrok 只有在 development 使用,production 环境还是会将程式摆设到正式的 service

设定 Telegram Bot webhook 的方法可参考 文件 ,透过browser进入以下连结

https://api.telegram.org/bot{$token}/setWebhook?url={$webhook_url}


$token



$webhook_url

请换成在 Step 1 申请到的,比方:

https://api.telegram.org/bot606248605:AAGv_TOJdNNMc_v3toHK_X6M-dev_1tG-JA/setWebhook?url=https://bcf4cd97.ngrok.io/hook

看到browser出现以下讯息,就表现 webhook 设定成功了


{

ok: true,

result: true,

description: “Webhook was set”

}

开始和 Chatbot 对话,它就会向鹦鹉一样回答你传给它的讯息。

会讲怎样用 OLAMI Open API 为 Chatbot 增长 NLP 功能,让 Chatbot 可以根据使用者讯息判定须回答的内容,比方扣问股市、气候。

典范 完备程式码

假如想要把现阶段的 Chatbot 摆设上 production 环境,步骤可以参考最后一篇文章的 Step 9. Deployment

网上有许多有关Telegram Bot开发的文章,我之前并没有计划写什么作弊条,这段时间下来,发现大量的文章基本都差不多,还是天下文章一大抄为主。实在官方的文档写的非常不错,只是偶然我们想一个问题等看明白时才发现假如有一句话能点破就好了。别的,有些工具似乎确实从来没有人讲起,以是记在这里,防备自己忘掉。这个文档我会逐步加,没准哪天就会又多点什么,假如有什么想讨论的欢迎留言。

Photo by Greg Rakozy on Unsplash

首先,我们重要使用的是Python,不是由于别的,只是由于我嘻歡。使用的Bot库是python-telegram-bot,使用它的缘故只是由于我用了一下没发现有什么特殊的问题。

怎样使用机器人约请User参加私有频道或群

每个管理员的约请链接是不一样的,可以使用bot.get_chat返回的chat中的invite_link得到链接。但是你会发现这货并不是天生有invite_link,你需要用bot.export_chat_invite_link来重置link,否则你会得到一个None。

记得加函数到dispather里去


dp.add_handler(CommandHandler([“join”], channel_cmd))

有关支付的调用

网上有关支付的调用的说明非常少,预计是全部的人都在使用xx宝和xx支付吧。我试用了一下官方建议的支付平台Stripe真的非常赞,在API和管理界面上秒杀上面两个货。在内部调用上也是很的流畅。

申请什么的官方都有,写了也没什么意思。一个支付重要有以下两个函数构成,一个函数是表现出支付界面,如这样:

这里要留意,provider_token是stripe的token,不是bot token。然后是两个回调函数:

这里precheckout_callback是用户写完全部的信息,点支付后回调的,之后你的bot会向stripe发起支持处置,而successful_payment_callback是stripe处置完成后的回调。这之中完全大概由于网络问题什么的断开。最牛的是,假如出错了,你并不会在这里有时机try到什么Exception,但是日记里却会有这样的屎一样的工具:

固然要记得把这些都加到dispatcher里去

这样就可以通过

/辣条

这样的下令调用支持,在用户写完后和支付处置完成后来调用这两个函数了。

支付三步的串联

上面我们说了支付是三个回调,我们假如需要理解这三步到底是什么样的转化率,这就需要一个可以跟踪的工具。


payload = “Custom-Payload-1234567”

这个参数在发起支付时去使用:


context.bot.send_invoice(chat_id, title, description, payload,provider_token, start_parameter, currency, prices)

这个参数的使用就是为了串起这三个步骤,在第二次回调precheckout_callback时,update里的pre_checkout_query中会有一个invoice_payload就会是相同的内容。第三步回调successful_payment_callback时,update.message.successful_payment.invoice_payload也是相同的内容。这个payload也可以在支付平台上的生意业务里查到。实在支持平台也会天生一个最终生意业务成功的根据,会存在update.message.successful_payment.provider_payment_charge_id中。

payload里有什么样的工具比较好呢?我自己在内里参加了这些工具:

. 商品代码,你会发现背面三步都没有任何与商品有关的工具,为了debug和日后查对方便,payload里有商品代码最省事了。

.uuid,用于把每个支付区离开。

InlineKeyboardMarkup假如url和callback_data都有会怎样

假如我们将两者都定义了,如下代码

replay_markup = InlineKeyboardMarkup([[InlineKeyboardButton("参加频道",url=link,callback_data='start:addchannel')]])update.message.reply_text(text=msg,reply_markup=replay_markup)

你会看到这样的消息

点击按钮后只会加载url,不会产生callback(实在能产生callback多好玩啊,就可以非常简单的做点击转化率统计了)

本文网址:

http://www.1cm8858.com/d/20201015214029_4024_3138104214/home

Ten articles before and after

财联社电报如何评价?-电报telegram技巧分享

幼稚园?人满两千开童车!allpostsofthechanneltelegrams呵呵-电报telegram技巧分享

中文汉字电报码对照表文库电码-电报telegram技巧分享

看看战火纷飞中的摩尔斯电码查询0132417625892624-电报telegram技巧分享

电报Telegram手机端如何改为中文版-电报telegram技巧分享

中华人民共和国民法典合同法-电报telegram技巧分享

电报老司机频道telegram群组狼-电报telegram技巧分享

ios版telegram注册不了苹果怎么-电报telegram技巧分享

telegram:苹果配合俄罗斯政府要求-电报telegram技巧分享

百度云泄密流出某电报收费群推特大神joker被捕前最后作品毒龙口爆啪啪极品纹身妹最新-电报telegram技巧分享