我目前正在为 WhatsApp 编写一个聊天机器人。 我使用 360dialog 平台,这使得可以使用 WhatsApp Business API。
当客户端发送消息时,我在应用程序的日志中看到以下 JSON 对象:
{
"messages": [
{
"from": "77773336633",
"id": "ABGGd3c1cGY_Ago61ytHsZknvtLv",
"image": {
"id": "ffd23134-2dae-4fed-b5f8-0ce7867b6ddd",
"mime_type": "image/jpeg",
"sha256": "bd02100d961b5a1dbaae1dd645485ebbfeda77b44e82c015f1cf29b05654ccb9"
},
"timestamp": "1605703542",
"type": "image"
}
],
"contacts": [
{
"profile": {
"name": "Nurzhan Nogerbek"
},
"wa_id": "77773336633"
}
]
}
我在文档中找不到有关如何下载此文件的任何信息。 就我而言,我想上传客户端发送到我的文件存储的图像文件。 请告诉我 WhatsApp API 中的哪个 URL 方法负责此机制?
P.S. 同时,我可以向客户发送文件。此信息可在官方文档中找到。
这非常棘手,因为邮递员可以工作,但 C# 不适合我,我花了两天时间试图找到解决方案,最后做了以下代码,该代码在 C# 中工作:
using HttpClient _httpClient = new HttpClient();
Uri uri = new Uri(mediaUrl);
var fileName = $"{DateTime.Now.ToString("yyyyMMddhhmmss")}.jpeg";
string filePath = $"Files\\{fileName}";
// NOTE: to save bandwidth, request compressed content
_httpClient.DefaultRequestHeaders.AcceptEncoding.Clear();
_httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
_httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));
_httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("br"));
// NOTE: accept all languages
_httpClient.DefaultRequestHeaders.AcceptLanguage.Clear();
_httpClient.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("*"));
// NOTE: accept all media types
_httpClient.DefaultRequestHeaders.Accept.Clear();
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("image/jpeg"));
var productValue = new ProductInfoHeaderValue("ScraperBot", "1.0");
var commentValue = new ProductInfoHeaderValue("(+http://www.API.com/ScraperBot.html)");
_httpClient.DefaultRequestHeaders.UserAgent.Add(productValue);
_httpClient.DefaultRequestHeaders.UserAgent.Add(commentValue);
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", {WhatsApp_Access_Token});
HttpResponseMessage response = await _httpClient.GetAsync(uri);
response.EnsureSuccessStatusCode();
var mediaType = response?.Content?.Headers?.ContentType?.MediaType ?? string.Empty;
var imageBytes = await response.Content.ReadAsByteArrayAsync();
using (var fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
fs.Write(imageBytes, 0, imageBytes.Length);
}
此处,{WhatsApp_Access_Token} 是您的 Whatsapp API 永久令牌。
如果您有任何问题或疑问,请在评论中给我留言。
也许会有帮助,试试看吧:-
const URL = `https://lookaside.fbsbx.com/whatsapp_business/attachments/?mid=1104480873777230&ext=1662705250&hash=ATuMx352sLrhKUegbQZSC8oLl3J5Vy3Z49lO4HwTUKWRYQ`;
const FROM = `video`;
const config = {
method: 'get',
url: URL, //PASS THE URL HERE, WHICH YOU RECEIVED WITH THE HELP OF MEDIA ID
headers: {
'Authorization': `Bearer ${token}`
},
responseType: 'arraybuffer'
};
axios(config)
.then(function (response) {
const ext = response.headers['content-type'].split("/")[1];
fs.writeFileSync(`${FROM}.${ext}`, response.data);
})
.catch(function (error) {
console.log(error);
});
我看到了这个帖子,它终于帮助我找到了解决方案。以下是在 Whatsapp 消息中检索媒体 ID 的完整 C# 代码。没有代理的问题是 facebook 会回复一条消息,表示没有代理则不支持浏览器。
string whatsappBaseUrl = "https://graph.facebook.com/v15.0/";
string mediaId = "id you received in message";
string accesstoken = "Your Whatsapp Access Token";
string agentHeader = "WhatsApp/2.19.81 A";
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accesstoken);
string url = $"{whatsappBaseUrl}{mediaId}";
var getMediaUrl = await _httpClient.GetAsync(url);
if (getMediaUrl.IsSuccessStatusCode)
{
_httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(agentHeader);
var response = await _httpClient.GetByteArrayAsync(mediaUrl);
Stream stream = new MemoryStream(response);
}
官方文档在 https://developers.facebook.com/docs/whatsapp/api/media中有一个关于此的会话。
基本上,您必须发出 GET 请求才能下载媒体。
curl --request GET \
--url https://waba.360dialog.io/v1/media/{media id} \
--header 'D360-API-KEY: {your api token}'
对于整个消息周期(接收请求、下载音频文件并使用 OpenAI 的 Whisper 进行转录),使用 Python:
定义文件检索、保存、转录功能:
def retrieve_text(media_id, audio_name = 'received_audio'):
url = f"https://graph.facebook.com/v17.0/{media_id}/" # the media id obtained in the webhook
headers = {'Authorization': f'Bearer {access_token}' } # enter your access token here
response = requests.get(url, headers=headers) # get the message
file_url = response.json()['url'] # get the file url
response = requests.get(file_url, headers=headers) # get the file binary
open(audio_name+'.ogg', 'wb').write(response.content) # save the received file
audio_file = open(audio_name+'.ogg', "rb") # open the file
transcript = openai.Audio.transcribe("whisper-1", audio_file) # transcribe with OpenAI API
return transcript.text # return the transcription
然后,在您的 Webhook 中收到请求后:
incoming_msg = request.json
#messages = incoming_msg['entry'][0]['changes'][0]['value']['messages'][0]
media_id = message[0]['audio']['id']
retrieve_text(media_id)