├── README.md ├── ding.py └── server.py /README.md: -------------------------------------------------------------------------------- 1 | # Python_ChatGPT_ForDingding_OpenAi 2 | 3 | ## 基于 https://github.com/rawandahmad698/PyChatGPT 4 | 5 | ## 启动server端接受C端的钉钉机器人返回的信息 6 | 7 | ``` 8 | python3 server.py 9 | ``` 10 | 11 | ## 使用Dingding实例向C端发送信息 12 | 13 | ``` 14 | dingding = DingDing("appkey","appSecret") 15 | 16 | chat = Chat(email="OpenAi邮箱", password="OpenAi密码",proxies="代理地址") 17 | 18 | answer = chat.ask("你好") 19 | 20 | # 单聊 21 | #dingding.send_message('uid',answer) 22 | 23 | # 群聊 24 | #dingding.send_user('uid',answer) 25 | 26 | print(answer) 27 | ``` 28 | -------------------------------------------------------------------------------- /ding.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import json 3 | 4 | 5 | from pychatgpt import Chat 6 | 7 | 8 | 9 | class DingDing: 10 | 11 | 12 | def __init__(self,appKey=None,appSecret=None) -> None: 13 | 14 | self._appKey = appKey 15 | 16 | self._appSecret = appSecret 17 | 18 | self._token = self.get_token() 19 | 20 | # 机器人webhook地址 21 | self._webhook = "" 22 | 23 | 24 | 25 | 26 | def get_token(self): 27 | 28 | res = requests.post("https://api.dingtalk.com/v1.0/oauth2/accessToken",data=json.dumps({"appKey":self._appKey,"appSecret":self._appSecret}),headers={"Content-Type":"application/json"}) 29 | 30 | token = res.json()["accessToken"] 31 | 32 | return token 33 | 34 | # 单聊 35 | def send_message(self,uid,message): 36 | 37 | res = requests.post("https://api.dingtalk.com/v1.0/robot/oToMessages/batchSend",data=json.dumps({"robotCode":self._appKey,"userIds":[uid],"msgKey":"sampleText","msgParam":'{"content":"'+message+'"}'}),headers={"Content-Type":"application/json","x-acs-dingtalk-access-token":self._token}) 38 | 39 | print(res.text) 40 | 41 | # 群聊 42 | def send_user(self,uid,message): 43 | 44 | data = { 45 | "at": { 46 | "atUserIds": [ 47 | uid 48 | ] 49 | }, 50 | "text": { 51 | "content": message 52 | }, 53 | "msgtype": "text" 54 | } 55 | 56 | res = requests.post(self._webhook,data=json.dumps(data),headers={"Content-Type":"application/json"}) 57 | 58 | print(res.text) 59 | 60 | 61 | 62 | 63 | if __name__ == '__main__': 64 | 65 | dingding = DingDing("appkey","appSecret") 66 | 67 | chat = Chat(email="OpenAi邮箱", password="OpenAi密码",proxies="代理地址") 68 | 69 | answer = chat.ask("你好") 70 | 71 | # 单聊 72 | #dingding.send_message('uid',answer) 73 | 74 | # 群聊 75 | #dingding.send_user('uid',answer) 76 | 77 | print(answer) 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /server.py: -------------------------------------------------------------------------------- 1 | 2 | import hmac 3 | import hashlib 4 | import base64 5 | import json 6 | import tornado 7 | 8 | from tornado.options import define, options 9 | define('port', default=8000, help='default port',type=int) 10 | 11 | class Robot(tornado.web.RequestHandler): 12 | 13 | async def post(self): 14 | 15 | 16 | timestamp = self.request.headers.get('timestamp', None) 17 | 18 | sign = self.request.headers.get('sign', None) 19 | app_secret = '钉钉机器人秘钥' 20 | app_secret_enc = app_secret.encode('utf-8') 21 | string_to_sign = '{}\n{}'.format(timestamp, app_secret) 22 | string_to_sign_enc = string_to_sign.encode('utf-8') 23 | hmac_code = hmac.new(app_secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest() 24 | my_sign = base64.b64encode(hmac_code).decode('utf-8') 25 | if sign != my_sign: 26 | return self.finish({"errcode":1,"msg":"签名有误"}) 27 | data = json.loads(self.request.body) 28 | text = data['text']["content"] 29 | atUsers = data.get("atUsers",None) 30 | uid = data.get("senderStaffId",None) 31 | return self.finish({"errcode":0,"msg":text}) 32 | 33 | urlpatterns = [ 34 | (r"/robot_chat/",Robot), 35 | ] 36 | 37 | 38 | # 创建Tornado实例 39 | application = tornado.web.Application(urlpatterns,debug=True) 40 | 41 | 42 | 43 | 44 | if __name__ == "__main__": 45 | tornado.options.parse_command_line() 46 | application.listen(options.port) 47 | tornado.ioloop.IOLoop.instance().start() --------------------------------------------------------------------------------