yj
2026-03-31 033d919018b3a3e12755f008c0b9093364942512
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
o
Öph;ã
@s´ddlmZmZmZmZddlZddlmZddlm    Z    ddl
Z
ddl Z ddl Z ddl Z ddlZddlmZddlZddlmZeeƒZeƒZeƒZe ¡Zej e¡dd„Ze je jd    e  ¡e  d
¡gd e  e¡Z d d „Z!dd„Z"dd„Z#ej$dddgddd„ƒZ%dd„Z&dd„Z'ddej(ej)dddfdd„Z*ed krØz e!ƒe"ƒde_+Wne,yÉZ-ze  .d!e-›¡e/d"ƒWYdZ-[-ndZ-[-wwe  0d#¡ej1d$d%d&dSdS)'é)ÚFlaskÚrequestÚabortÚjsonifyN)ÚDatabaseManager)Ú
WeComUtils)Ú RedisManager)Ú global_configcCsFtj d¡rtdƒ }t |¡WdƒS1swYtdƒ‚)Nz config.jsonu"配置文件 config.json ä¸å­˜åœ¨)ÚosÚpathÚexistsÚopenÚjsonÚloadÚFileNotFoundError)Úf©rú*E:\project\python\wecom-dify-bridge\app.pyÚ load_configs
 
 ÿrz4%(asctime)s - %(name)s - %(levelname)s - %(message)szapp.log)ÚlevelÚformatÚhandlersc
CsNzt d¡t ¡t d¡WdSty&}z    t d|›¡‚d}~ww)u初始化应用zInitializing application...z$Database initialized and data cachedzInitialization error: N)ÚloggerÚinfoÚ
db_managerÚinit_dbÚ    ExceptionÚerror©ÚerrrÚinitialize_app1s
€þr cCsdd„}tj|dd ¡dS)u启动后台任务c
Ssbt d¡    z
tƒt d¡Wnty/}zt d|›¡t d¡WYd}~nd}~wwq)NzMessage persister startedTé<zMessage persister error: )rrÚpersist_expired_messagesÚtimeÚsleeprrrrrrÚmessage_persister@s
€þüz1start_background_tasks.<locals>.message_persisterT)ÚtargetÚdaemonN)Ú    threadingÚThreadÚstart)r%rrrÚstart_background_tasks>s
r+c Cs|tj›d}tƒ}d}|dkrAtjj||d\}}|D]!}t|tƒr(| d¡}n|}|     d¡}t
|ƒdkr<|  |d¡q|dkst |ƒ}t   ¡}td    ƒtd
|›ƒ|D]e}t |¡}t |¡}    td |›ƒtd |›ƒtd |    ›ƒ|szqV|dd}
||
tjkr»zt |||    ¡t |¡t d|›¡WqVtyº} zt d|›d| ›¡WYd} ~ qVd} ~ wwqVdS)u持久化过期消息z:user_messages:*Ú0r)ÚcursorÚmatchúutf-8ú:ééu执行持久化zkeys:zuser_id:z    messages:zconversation_id:éÿÿÿÿÚ    timestampzPersisted messages for user: z$Failed to persist messages for user z: N)ÚconfigÚREDIS_KEY_PREFIXÚsetÚ redis_managerÚredisÚscanÚ
isinstanceÚbytesÚdecodeÚsplitÚlenÚaddÚlistr#ÚprintÚget_user_messagesÚget_user_conversation_idÚMYSQL_PERSIST_EXPIRErÚsave_message_historyÚclear_user_messagesrrrr) ÚpatternÚ
unique_idsr-ÚkeysÚkeyÚkey_strÚpartsÚ current_timeÚmessagesÚconversation_idÚlast_message_timerrrrr"MsL 
 
 €õ
 
 
"€ÿûör"z/wecom/callbackÚGETÚPOST)Úmethodsc
Ãszt dtj›d¡i}ttdƒsBztƒtƒdt_t d¡Wnt    yA}zt 
d|›¡t ddƒWYd    }~nd    }~wwtjd
kr„tj   d d ¡}tj   d d ¡}tj   dd ¡}tj   dd ¡}t ||||¡\}}|dkrxt d¡|St 
d¡t ddƒd    Stjdkr;tj   d d ¡}tj   d d ¡}tj   dd ¡}t d|›d|›d|›¡tj d¡}t d|›¡i}    zt ||||¡\}}    |     d¡}    t |    ¡}    Wnt    yò}zt 
d|›¡t ddƒWYd    }~nd    }~ww|    ddkr#t t|    ||ƒ¡t |    dd |    d!¡}
tj|
dd"} t | ||¡\}}t|ƒS|    dd#kr4t|    ||ƒ}t|ƒSt d$¡d%Sd    S)&u!企业微信机器人回调接口z    Received z request at /wecom/callbackÚ initializedTzApplication initializedzInitialization failed: iôzServer initialization failedNrRÚ msg_signatureÚr4ÚnonceÚechostrrz!Signature verification successfulzSignature verification failedi“rSz#POST request params: msg_signature=z , timestamp=z, nonce=r/z post data: zError processing message: ézFailed to process messageÚmsgtypeÚtextÚfromÚuseridÚmsgid©ÚfirstÚstreamz;Ignoring non-text message of type or non-group chat of typeÚsuccess)rrrÚmethodÚhasattrÚappr r+rUrrrÚargsÚgetrÚ
verify_urlÚdatar=Ú decrypt_msgrÚloadsÚasyncioÚ create_taskÚhandler_text_requestÚgenerate_stream_idÚcreate_response_messageÚ encrypt_msgrÚhandler_stream_request) ÚresponserrVr4rXrYÚretÚ reply_echostrÚ    post_dataÚmsg_dataÚ    stream_idÚ response_textrrrÚwecom_callback{sl€
€þ
 
 
 
€þ 
Ør{c
 
Ãs&|dd}|d}t ||¡}|dd tjd¡}| ¡}t|›d|›ƒt |¡}z|s>t     |d|¡t 
|d    ¡t   d
¡Wnt y^}zt  d |›¡WYd}~nd}~wwt |¡}    z|sut|||ii|    |d WdSWdSt y’}zt  d |›¡WYd}~dSd}~ww)Nr]r^r_r\ÚcontentrWz-user: Úuserr,zStored user message in RediszFailed to store user message: )Úqueryr_r}ÚinputsÚfilesrPryzFailed to call Dify API: )rrpÚreplacer5ÚWECOM_BOT_NAMEÚstriprBr8Ú exists_streamÚadd_user_messageÚadd_stream_lockrrrrrDÚsend_chat_message)
rxrXr4Úuser_idÚmsg_idryÚ msg_contentr„rrPrrrroÅs4€  
 €ÿ
ÿ€ÿrocCsj|dd}t |¡rt |¡}t |||¡\}}|Stj|dd}t |||¡\}}t d|›¡|S)NrbÚidTr`u 流式 json: )r8r„rrqrrrÚdebug)rxrXr4ryrzrurtrrrrsês 
 
rsÚ default_userTc
 
Csˆ|stdƒ‚|s tdƒ‚|r|dkrtdƒ‚| d¡›d}
d|›dd    œ} |d
||d œ} |r3|| d <i| d <i| d<zeddddœ} tj|
| | dd}|jdkrc| ¡}| dd¡| d d¡ddœ} n<z| ¡}d|j›d| dd¡›}|||jdœ} Wntjy˜d|j›d|j›}|||jdœ} Ynwtj     
|¡‚WnZtj    j yµd|ddœ} tj     
d¡‚tj    j yÉd|ddœ} tj     
d¡‚tj    j
yÞ}zd|ddœ} |‚d }~wt yú}zd|d!dœ} tj     
d"t|ƒ›¡‚d }~ww| d#dks    | d#d$krt |d%| d¡t || d ¡t | d¡}t ||¡t || d#¡t || d ¡t|›d&| d›ƒd S)'ue
    å‘送聊天消息到 Dify API
 
    å‚æ•°:
        query (str): ç”¨æˆ·è¾“å…¥/提问内容
        conversation_id (str, optional): ä¼šè¯ ID,用于继续之前的对话
        user (str): ç”¨æˆ·æ ‡è¯†ï¼Œç”¨äºŽå®šä¹‰ç»ˆç«¯ç”¨æˆ·çš„身份
        api_key (str): Dify API å¯†é’¥
        base_url (str): Dify API åŸºç¡€ URL
        inputs (dict, optional): App å®šä¹‰çš„各变量值
        auto_generate_name (bool): æ˜¯å¦è‡ªåŠ¨ç”Ÿæˆæ ‡é¢˜
 
    è¿”回:
        dict: API å“åº”结果
 
    å¼‚常:
        requests.exceptions.RequestException: ç½‘络请求异常
        ValueError: å‚数验证失败
    uquery å‚数不能为空uuser å‚æ•°ä¸èƒ½ä¸ºç©ºÚ YOUR_API_KEYu请设置有效的 API å¯†é’¥ú/z/chat-messageszBearer zapplication/json)Ú Authorizationz Content-TypeÚblocking)r~Ú response_moder}Úauto_generate_namerPrr€rWr)ÚanswerrPÚstatuséx)ÚurlÚheadersrÚtimeoutéÈr”u API é”™è¯¯: z - Úmessageu 未知错误u3请求超时,请检查网络连接或稍后重试i˜u2连接失败,请检查网络连接和 API åœ°å€rZu 请求错误iæNiçu未知错误: r•Ú200Ú    assistantz -assistant: )Ú
ValueErrorÚrstripÚrequestsÚpostÚ status_coderrhÚJSONDecodeErrorr\Ú
exceptionsÚRequestExceptionÚTimeoutÚConnectionErrorrÚstrr8r…Úadd_conversation_idrÚsplit_string_safelyÚadd_stream_chunksÚadd_stream_statusrB)r~r_ryrPr}Úapi_keyÚbase_urlrr“r€r—r˜ÚpayloadÚresrtÚ response_jsonÚ
error_dataÚ    error_msgrÚchunksrrrr‡ s®! þüýü
 
 
ý
ý
ýþ éý ý ý€ý€ú     r‡Ú__main__z"Failed to initialize application: ézStarting Flask applicationz0.0.0.0iG)ÚhostÚport)2ÚflaskrrrrrmÚdatabaserÚ wecom_utilsrr#r(Úloggingr rr8rr
Úconfig_managerr    Ú__name__rfrÚ
get_configr5Ú from_objectrÚ basicConfigÚDEBUGÚ StreamHandlerÚ FileHandlerÚ    getLoggerrr r+r"Úrouter{rorsÚ DIFY_API_KEYÚDIFY_API_BASE_URLr‡rUrrÚcriticalÚexitrÚrunrrrrÚ<module>sn         þý
 .
I%%
ö
€þ
ô