Добавление синхронной версии вызовов API, ещё комментарии и упрощение

This commit is contained in:
justuser-31 2025-11-02 19:42:04 +03:00
parent 3aa4f7206d
commit 849ad4b2d4
4 changed files with 146 additions and 6 deletions

View File

@ -1,5 +1,5 @@
from aiohttp import ClientSession from aiohttp import ClientSession
from json import dumps, loads from json import loads
import asyncio import asyncio
from db import read, write from db import read, write

View File

@ -4,49 +4,92 @@
# Именно здесь вы можете тыкать UserAPI. # Именно здесь вы можете тыкать UserAPI.
# Секция UserAPI - для вас. # Секция UserAPI - для вас.
# #
# ⚠️ Если вы не дружите с асинхроном ⚠️
# То есть не знаете что такое await, async и т.п.
# То, пожалуйста, перейдите в call2user_api_sync.py
#
# Если вы не находитесь на сервере (а вы не находитесь), вам нужно поменять url_prefix. # Если вы не находитесь на сервере (а вы не находитесь), вам нужно поменять url_prefix.
# Сделать формата 'https://vpc-api.del.pw' (если эта ссылка не устарела) # Сделать формата 'https://vpc-api.del.pw' (если эта ссылка не устарела)
# #
# Секция SystemAPI и call2api.py вам не нужен, но можете его изучить. # Секция SystemAPI и call2api.py вам не нужен, но можете его изучить.
# Эта часть кода взаимодействует с SystemAPI, который недоступен. # Эта часть кода взаимодействует с SystemAPI, который недоступен.
#
# Для использования просто импортировать этот файл и использовать функции:
# ```
# from call2user_api import *
# ...
# user = await user_in_db(username, user_token)
# ```
# Можете переносить файл куда хотите, но вместе с db.py (функция read() + авто-создание конфигурации)
# ---------------------- # ----------------------
global url_prefix # Загрузка префикса UserAPI
url_prefix = 'http://127.0.0.1:8010/' # (МЕНЯЙТЕ URL!!! если нужно, в config.json)
from db import read
import asyncio
CONFIG = asyncio.run(read())
url_prefix = CONFIG['user_api_url']
from call2api import call # Библиотеки для работы call()
from aiohttp import ClientSession
from json import loads
async def call(api_url, data, pre=True, fix=True):
url = (url_prefix + api_url) if pre else api_url
async with ClientSession() as session:
async with session.post(url, json=data) as response:
text = await response.text()
try:
json = loads(text)
if 'detail' in json:
return json['detail']
else:
return json
except:
if fix:
return text.replace('"', '')
else:
return text
#------------------------------------------------------------ #------------------------------------------------------------
# UserAPI # UserAPI
#------------------------------------------------------------ #------------------------------------------------------------
# Получение информации о токене
async def get_user_token_info(username, user_token): async def get_user_token_info(username, user_token):
data = {'username': username, 'user_token': user_token} data = {'username': username, 'user_token': user_token}
return await call('api/get_user_token_info/', data) return await call('api/get_user_token_info/', data)
# Получение пользователя (ник, айди ТГ, ДС и т.п.)
async def user_in_db(username, user_token): async def user_in_db(username, user_token):
data = {'username': username, 'user_token': user_token} data = {'username': username, 'user_token': user_token}
return await call('api/user_in_db/', data) return await call('api/user_in_db/', data)
# Перевод монет
async def transfer_coins(username, user_token, async def transfer_coins(username, user_token,
dst_username, amount): dst_username, amount):
data = {'username': username, 'user_token': user_token, data = {'username': username, 'user_token': user_token,
'dst_username': dst_username, 'amount': amount} 'dst_username': dst_username, 'amount': amount}
return await call('api/transfer_coins/', data) return await call('api/transfer_coins/', data)
# Получение глобальной статистики
async def get_stats(username, user_token): async def get_stats(username, user_token):
data = {'username': username, 'user_token': user_token} data = {'username': username, 'user_token': user_token}
return await call('api/get_stats/', data) return await call('api/get_stats/', data)
# Создание счёта на оплату, чтобы проверить оплачен ли он
# Использование в боте: /pay <ник> <сумма> <invoice_id>
async def create_invoice(username, user_token, amount=None): async def create_invoice(username, user_token, amount=None):
data = {'username': username, 'user_token': user_token} data = {'username': username, 'user_token': user_token}
if amount: if amount:
data['amount'] = amount data['amount'] = amount
return await call('api/create_invoice/', data) return await call('api/create_invoice/', data)
# Удаление счёта на оплату по invoice_id
async def delete_invoice(username, user_token, id): async def delete_invoice(username, user_token, id):
data = {'username': username, 'user_token': user_token, 'id': id} data = {'username': username, 'user_token': user_token, 'id': id}
return await call('api/delete_invoice/', data) return await call('api/delete_invoice/', data)
# Получение информации о счёте на оплату:
# конечный получатель, сумма, статус (оплачен/нет: True/False)
async def get_invoice(username, user_token, id): async def get_invoice(username, user_token, id):
data = {'username': username, 'user_token': user_token, 'id': id} data = {'username': username, 'user_token': user_token, 'id': id}
return await call('api/get_invoice/', data) return await call('api/get_invoice/', data)
@ -56,6 +99,7 @@ async def get_invoice(username, user_token, id):
#------------------------------------------------------------ #------------------------------------------------------------
# SystemAPI usage only # SystemAPI usage only
#------------------------------------------------------------ #------------------------------------------------------------
# Здесь вы ничего не используете, пропускайте
async def register_user_token(token, user_token): async def register_user_token(token, user_token):
data = {'token': token, 'user_token': user_token} data = {'token': token, 'user_token': user_token}
return await call('api/register_user_token/', data) return await call('api/register_user_token/', data)

View File

@ -0,0 +1,95 @@
# HERE WE GO
# -------- RUS ---------
# ⚠️ Для тех, кто не понял ⚠️
# Именно здесь вы можете тыкать UserAPI.
# Секция UserAPI - для вас.
#
# ⚠️ Если вы хотите с асинхрон ⚠️
# Перейдите в call2user_api.py
#
# Если вы не находитесь на сервере (а вы не находитесь), вам нужно поменять url_prefix.
# Сделать формата 'https://vpc-api.del.pw' (если эта ссылка не устарела)
#
# Секция SystemAPI и call2api.py вам не нужен, но можете его изучить.
# Эта часть кода взаимодействует с SystemAPI, который недоступен.
#
# Для использования просто импортировать этот файл и использовать функции:
# ```
# from call2user_api_sync import *
# ...
# user = user_in_db(username, user_token)
# ```
# Можете переносить файл куда хотите, но вместе с db.py (функция read() + авто-создание конфигурации)
# ----------------------
# Загрузка префикса UserAPI
# (МЕНЯЙТЕ URL!!! если нужно, в config.json)
from db import read
import requests
from json import loads
# Synchronous database read
CONFIG = read()
url_prefix = CONFIG['user_api_url']
def call(api_url, data, pre=True, fix=True):
url = (url_prefix + api_url) if pre else api_url
with requests.Session() as session:
response = session.post(url, json=data)
text = response.text
try:
json = loads(text)
if 'detail' in json:
return json['detail']
else:
return json
except:
if fix:
return text.replace('"', '')
else:
return text
#------------------------------------------------------------
# UserAPI
#------------------------------------------------------------
# Получение информации о токене
def get_user_token_info(username, user_token):
data = {'username': username, 'user_token': user_token}
return call('api/get_user_token_info/', data)
# Получение пользователя (ник, айди ТГ, ДС и т.п.)
def user_in_db(username, user_token):
data = {'username': username, 'user_token': user_token}
return call('api/user_in_db/', data)
# Перевод монет
def transfer_coins(username, user_token,
dst_username, amount):
data = {'username': username, 'user_token': user_token,
'dst_username': dst_username, 'amount': amount}
return call('api/transfer_coins/', data)
# Получение глобальной статистики
def get_stats(username, user_token):
data = {'username': username, 'user_token': user_token}
return call('api/get_stats/', data)
# Создание счёта на оплату, чтобы проверить оплачен ли он
# Использование в боте: /pay <ник> <сумма> <invoice_id>
def create_invoice(username, user_token, amount=None):
data = {'username': username, 'user_token': user_token}
if amount:
data['amount'] = amount
return call('api/create_invoice/', data)
# Удаление счёта на оплату по invoice_id
def delete_invoice(username, user_token, id):
data = {'username': username, 'user_token': user_token, 'id': id}
return call('api/delete_invoice/', data)
# Получение информации о счёте на оплату:
# конечный получатель, сумма, статус (оплачен/нет: True/False)
def get_invoice(username, user_token, id):
data = {'username': username, 'user_token': user_token, 'id': id}
return call('api/get_invoice/', data)
#------------------------- END ------------------------------

View File

@ -49,8 +49,9 @@ class UserToken(SQLModel, table=True):
#------------------------------------------------------------ #------------------------------------------------------------
config_file = 'config.json' config_file = 'config.json'
if not path.exists(config_file): if not path.exists(config_file):
db = {'system_api_token': 'None', db = {'system_api_token': 'You_can_skip_this',
'system_api_url': 'None'} 'system_api_url': 'You_can_skip_this',
'user_api_url': 'https://vpc-api.del.pw/'}
js = json.dumps(db, indent=2) js = json.dumps(db, indent=2)
with open(config_file, "w") as outfile: with open(config_file, "w") as outfile:
outfile.write(js) outfile.write(js)