(文章编辑中)

问题:

  使用Ptrade内置的send_qywx函数向自己的企业微信账号发送消息,Ptrade终端显示“企业微信消息发送成功”,但实际上企业微信收不到消息。

(相关链接:API文档 - send_qywx发送企业微信信息


原因

  阿猪测试了三家券商,都存在前述问题。阿猪推测应该是send_qywx函数已经和现在的企业微信不兼容了。


解决方法

一、自己写代码替代send_qywx

1、获取Ptrade服务器的IP地址

  新建一个策略,写入如下代码,记得将Corpid、Secret、Agentid替换成你自己的。

(相关链接:企业自建应用

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
import requests, json, datetime

def initialize(context): #初始化模块,每次启动策略时触发执行一次
pass

def before_trading_start(context, data): #每个交易日开盘前触发执行一次
Content = str(datetime.datetime.now()) # 消息内容,可随意替换
Status = SendMessage(msg) #运行SendMessage函数
print(Status) #显示SendMessage函数返回的结果

def SendMessage(msg):
#生成Token
Corpid = '替换为你的企业ID'
Secret = '替换为你的自建应用密钥'
Agentid = '替换为你的自建应用Agentid'
Url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
Data = {"corpid": Corpid, "corpsecret": Secret}
r = requests.get(url=Url, params=Data, verify=False)
#print(r.json())

if r.json()['errcode'] != 0:
return False
else:
Token = r.json()['access_token']

Partyid = '1' #部门id,根据你的实际情况替换
Subject = '企业自建应用消息测试' # 消息标题,可随意替换

# 发送消息
Url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % Token
Data = {"toparty": Partyid, "msgtype": "text", "agentid": Agentid, "text": {"content": Subject + '\n' + msg}, "safe": "0"}
r = requests.post(url=Url, data=json.dumps(Data), verify=False)
return r.json()

  运行这个策略,Ptrade终端会显示如下报错信息。这表明Ptrade服务器与企业微信服务器的通信正常,但是Ptrade服务器的IP不在企业微信服务器的白名单内,被企业微信拒绝了。记住这个红框内的字符串,它就是Ptrade服务器的IP地址,后边会用到。


2、设置可信域名

  在电脑浏览器中登录企业微信的管理后台,依次点击“应用”-你用于发送通知的自建应用,进入自建应用的管理界面。我们的目的是将Ptrade服务器的IP地址添加入“企业可信IP”名单中。

  如果直接点击“企业可信IP”的“配置”,会提示“请先设置可信域名”,所以需要先设置可信域名。(相关阅读:企业内部开发配置域名指引)

  如果你没有自己的域名,可以随便找一个免费的虚拟主机、函数计算应用,一般都会自带二级或多级域名,只要域名没有被企业微信屏蔽就可以用。因为免费服务不稳定,资源有时效性,所以阿猪不打算专门写教程,具体方法请大家自行百度。


3、设置可信IP

  可信域名设置成功后,就可以继续设置可信IP了。点击“企业可信IP”中的“配置”,然后将前边得到的Ptrade服务器IP复制进来,再点击“确定”就可以了。

  在阿猪测试的三家券商中,有两家添加可信IP后就可以正常从Ptrade发送企业微信消息了,有一家添加可信IP时提示“IP属于第三方服务商”,无法在自建应用中使用。对于后者,从技术层面讲是可以解决的,但是在操作层面涉及到券商的配合问题,可行性较差。而且我们的主要目的是用策略赚钱,而不是搞技术研究,所以不再深入讨论,感兴趣的读者可以参考企业可信IP配置指引自行研究。


4、在策略中加入消息发送模块

  既然Ptrade内置的send_qywx函数已经失效,那我们就得自己写代码来替代。其实前边的代码就是一个完整的示例代码,只要替换成你的id和密钥就可以正常使用。

  读者可以根据自己的需要在适当的时候调用SendMessage函数。例如我们想在下单后向企业微信发送成交结果,只需把成交结果作为参数传递给SendMessage函数就可以了。


二、使用替代方案

  如果嫌上边的方法麻烦,或者遇到券商的IP无法设为可信IP的情形,可以尝试下边的方法作为替代方案。

1、使用email

(1)使用Ptrade内置的send_email函数

  关于send_email函数的使用方法,读者可以参考API文档中的send_email - 发送邮箱信息。

(2)使用python内置的smtplib等模块

  关于使用python内置模块实现发送email的方法,请读者先自行百度,后续阿猪会考虑在入门教程或者FAQ中专门写一篇文章来介绍。

2、使用企业微信的群机器人

  是的,你没看错,又是通过企业微信。只不过这里不是使用企业自建应用发送消息,而是通过企业微信群的机器人来发送消息,“秘诀”就在于通过群机器人发送消息不受IP限制。

(1)创建一个企业微信群

(2)添加一个群机器人

(3)获取token

(4)在策略中加入消息发送模块