zhaoqingang
2025-02-06 bcc63761bdc4c1604c9275a3c5cdf8a483ad5611
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import asyncio
import json
import time
from datetime import datetime, timedelta
 
from sqlalchemy.future import select
 
from app.config.agent_base_url import RG_USER_LOGIN, DF_USER_LOGIN
from app.config.config import settings
from app.config.const import chat_server, workflow_server
from app.models import UserTokenModel
from app.models.app_token_model import AppToken
from app.models.base_model import SessionLocal
from app.models.postgresql_base_model import get_pdb, PostgresqlSessionLocal
from app.service.ragflow import RagflowService
from app.service.v2.app_driver.chat_data import ChatBaseApply
from app.utils.password_handle import password_decrypted
 
 
async def sync_token():
    """
    1.获取到user_token表中的账号
    2.判断是否超过12小时,超过则获取新的token
    3.未超过12小时,则测试token有效性,chat_ping接口,返回401,则重新获取token
    4.token获取:login
    df:/console/api/workspaces
    rg:/v1/system/version
    5.跟新本地token和kong网关token
    :return:
    """
    app_data = [{"token_id": chat_server, "url": f"{settings.fwr_base_url}{RG_USER_LOGIN}",
                 "data": {"email": "", "password": ""}, "is_crypt": True},
                {"token_id": workflow_server, "url": f"{settings.dify_base_url}{DF_USER_LOGIN}",
                 "data": {"email": "", "password": "", "remember_me": True, "language": "zh-Hans"}, "is_crypt": False}]
 
    async def sync_token_chat(token_id, url, data, is_crypt):
        db = SessionLocal()
        # pdb = PostgresqlSessionLocal()
        current_time = datetime.now() - timedelta(hours=12)
        try:
            user_token = db.query(UserTokenModel).filter(UserTokenModel.id == token_id).first()
 
            if user_token and (user_token.updated_at < current_time or not user_token.access_token):
                chat = ChatBaseApply()
                data["email"] = user_token.account
                if is_crypt:
                    data["password"] = await chat.password_encrypt(await password_decrypted(user_token.password))
                else:
                    data["password"] = await password_decrypted(user_token.password)
                res = await chat.chat_login(url, data, {'Content-Type': 'application/json'})
                if res:
                    access_token = res["data"]["access_token"]
                    user_token.access_token = access_token
                    user_token.updated_at = datetime.now()
                    db.commit()
        except Exception as e:
            print(e)
        finally:
            db.close()
            # await pdb.close()
 
    tasks = []
    for app in app_data:
        tasks.append(asyncio.create_task(sync_token_chat(app["token_id"], app["url"], app["data"], app["is_crypt"])))
    done, pending = await asyncio.wait(tasks, return_when=asyncio.ALL_COMPLETED)
 
 
 
def start_sync_token_task():
    asyncio.run(sync_token())
 
 
if __name__ == "__main__":
 
 
 
    start_sync_token_task()