<p>出现403错误有两个原因。要模拟来自Viber的webhook请求,必须发送<code>X-Viber-Content-Signature</code>头。此外,该值必须是使用auth令牌和webhook负载计算的SHA256哈希,如其API文档中在<a href="https://developers.viber.com/docs/api/rest-bot-api/#callbacks" rel="noreferrer">Callbacks</a>下所述。在</p>
<p>我相信你有两个选择。如果您只想验证您的代码是否正确地接收到webhook,您可以暂时注释掉<code>verify_signature()</code>行。Viber(或任何webhook源)不需要验证webhook请求。通常,开发人员会假设Viber提供的库能够正确地测试代码,因此通常不需要再次测试它们的功能。您还可以考虑模拟函数,因为在本例中这非常简单。在</p>
<p>如果您真的想测试Viber的签名验证,那么您需要实现我首先提到的两个原因。下面是您在测试webhook发送代码时需要做的基本操作。请注意,我只包括您需要的新代码下面,请合并到您的其他测试代码。在</p>
<pre class="lang-py prettyprint-override"><code>import json
import hmac
import hashlib
# Compute SHA256 hex digest signature using auth token and payload.
auth_token = 'xxx-xxx-xxx'
signature = hmac.new(
key=auth_token.encode('ascii'),
msg=data.encode('ascii'),
digestmod=hashlib.sha256
).hexdigest()
# Send test webhook request with computed signature in header.
response = requests.post(
webhook_url,
data=json.dumps(data),
headers={
'X-Viber-Content-Signature': signature,
'Content-Type': 'application/json'
},
verify='E:\\Docs\\learn_py\\viberbot\\certificate.pem'
)
</code></pre>
<p>注意@tukan指出了<a href="https://github.com/Viber/viber-bot-python/blob/0cc12efb61f67a55e8afa7e15c78d3e8b8511af8/viberbot/api/api.py#L91" rel="noreferrer">viber-bot-python</a>repo中的<code>_calculate_message_signature()</code>函数,它显示了签名是如何计算的。在</p>