Introdutório
Este artigo é uma continuação deste artigo . Nele, examinamos a criação e configuração das funções de nuvem yandex do bot de telegrama. E hoje vamos considerar conectar os telegramas do bot ao banco de dados e salvar qualquer informação sobre o usuário com quem o bot se comunica.
Usaremos o Yandex Cloud Database como banco de dados .
Tarefas
Crie um banco de dados;
Prepare a base para conexão;
Instale dependências;
Adicione uma tabela ao banco de dados para armazenar o usuário;
Salvar informações sobre o usuário de entrada em uma mensagem de telegrama;
Obtenha informações e envie para o usuário a partir do banco de dados.
Criação de banco de dados
A tarefa mais simples em nossa lista, precisamos ir para o Yandex Cloud Console em nossa conta. Em seguida, selecione Banco de dados Yandex no menu do console de controle.
Onde encontrar o botão

Clique no botão . Aqui podemos definir o nome e o tipo de base. Como um tipo, eu recomendo escolher Serverless, pois temos muito pouco tráfego e não armazenaremos muitos dados. Bem feito! Criamos um banco de dados.
Configurando uma conexão de banco de dados
Para conectar o banco de dados, precisamos criar nossa própria lista de tarefas:
Criação de conta de serviço e obtenção de chaves de acesso ao banco de dados;
python (boto3);
.


editor. .

" " " ". - . DocAPI Yandex Cloud Database.
( Yandex Database), - " ". 3.7 preview ( ).

'requirements.txt', . boto3, SDK AWS, Yandex Database DynamoDB. 2 - .

!
. / 1 , . .
import json
import logging
import os
import boto3
from botocore.exceptions import ClientError
def read_user(user_id, dynamodb=None):
if not dynamodb:
dynamodb = boto3.resource(
'dynamodb',
endpoint_url=os.environ.get('USER_STORAGE_URL'),
region_name = 'us-east-1',
aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'),
aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
)
table = dynamodb.Table('Users')
try:
response = table.get_item(Key={'user_id': str(user_id)})
except ClientError as e:
print(e.response['Error']['Message'])
else:
return response
def create_user(user_id, first_name, dynamodb=None):
if not dynamodb:
dynamodb = boto3.resource(
'dynamodb',
endpoint_url=os.environ.get('USER_STORAGE_URL'),
region_name = 'us-east-1',
aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'),
aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
)
table = dynamodb.Table('Users')
response = table.put_item(
Item={
'user_id': str(user_id),
'first_name': str(first_name)
}
)
return response
def handler(event, context):
dynamodb = boto3.resource(
'dynamodb',
endpoint_url=os.environ.get('USER_STORAGE_URL'),
region_name = 'us-east-1',
aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'),
aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
)
body = json.loads(event['body'])
user_query = read_user(body['message']['chat']['id'], dynamodb)
if 'Item' not in user_query:
create_user(body['message']['chat']['id'], body['message']['from']['first_name'], dynamodb)
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json'
},
'body': json.dumps({
'method': 'sendMessage',
'chat_id': body['message']['chat']['id'],
'text': '! :)'
}),
'isBase64Encoded': False
}
user = user_query['Item']
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json'
},
'body': json.dumps({
'method': 'sendMessage',
'chat_id': body['message']['chat']['id'],
'text': f', {user["first_name"]}!'
}),
'isBase64Encoded': False
}
3 .
KEY , , (Document API).


:
dynamodb = boto3.resource(
'dynamodb',
endpoint_url=os.environ.get('USER_STORAGE_URL'),
region_name = 'us-east-1',
aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'),
aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
)
boto3 . endpoint_url - , - .
, !
/ . , . 1 :
import os
import boto3
def create_user_table():
dynamodb = boto3.resource(
'dynamodb',
endpoint_url=USER_STORAGE_URL,
region_name = 'us-east-1',
aws_access_key_id = AWS_ACCESS_KEY_ID,
aws_secret_access_key = AWS_SECRET_ACCESS_KEY
)
table = dynamodb.create_table(
TableName = 'Users',
KeySchema=[
{
'AttributeName': 'user_id',
'KeyType': 'HASH' # Partition key
}
],
AttributeDefinitions=[
{'AttributeName': 'user_id', 'AttributeType': 'S'}
]
)
return table
create_user_table()
, 1 . , , . .
dynamodb.create_table. (TableName), (KeySchema) (AttributeDefinitions). . .
main.py :
def read_user(user_id, dynamodb=None):
if not dynamodb:
dynamodb = boto3.resource(
'dynamodb',
endpoint_url=os.environ.get('USER_STORAGE_URL'),
region_name = 'us-east-1',
aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'),
aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
)
table = dynamodb.Table('Users')
try:
response = table.get_item(Key={'user_id': str(user_id)})
except ClientError as e:
print(e.response['Error']['Message'])
else:
return response
user_id ( id ) ().
, user_id first_name , :
def create_user(user_id, first_name, dynamodb=None):
if not dynamodb:
dynamodb = boto3.resource(
'dynamodb',
endpoint_url=os.environ.get('USER_STORAGE_URL'),
region_name = 'us-east-1',
aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'),
aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
)
table = dynamodb.Table('Users')
response = table.put_item(
Item={
'user_id': str(user_id),
'first_name': str(first_name)
}
)
return response
:
def handler(event, context):
dynamodb = boto3.resource(
'dynamodb',
endpoint_url=os.environ.get('USER_STORAGE_URL'),
region_name = 'us-east-1',
aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'),
aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
)
body = json.loads(event['body'])
user_query = read_user(body['message']['chat']['id'], dynamodb)
if 'Item' not in user_query:
create_user(body['message']['chat']['id'], body['message']['from']['first_name'], dynamodb)
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json'
},
'body': json.dumps({
'method': 'sendMessage',
'chat_id': body['message']['chat']['id'],
'text': '! :)'
}),
'isBase64Encoded': False
}
user = user_query['Item']
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json'
},
'body': json.dumps({
'method': 'sendMessage',
'chat_id': body['message']['chat']['id'],
'text': f', {user["first_name"]}!'
}),
'isBase64Encoded': False
}
10 12 . 10 , 11 . 12 .

, . .
No próximo passo pretendo desenvolver um menu e já implementar um aplicativo no qual seja possível simplesmente fazer qualquer pedido.