שליחת קובץ PDF בוואטסאפ ב-API
-
אני משתמש בשירות
https://green-api.org.il/en/docs/api/sending/SendFileByUrl/
לשליחת ואטסאפ בAPI אני רוצה לשלוח קובץ PDF שאני יוצר בשרת, URL קובץ נשלח לי טוב, אבל כאשר אני יוצר את הקובץ לא נשלח הבנתי שצריך להעלות לשרת זמני, יש משהו שהם מציעים ביצעתי משהו, אבל זה נכשל לי, כנראה אני שולח בפורמט הלא נכון.
זה בערך הקוד שלי, אשמח לעזרה.
תודה רבה.export async function createTicket(cardItems) { const rubik = await fetch('https://fonts.gstatic.com/s/rubik/v14/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-B4i1Uw.woff').then(res => res.buffer()); // const barcode128 = await fetch('https://fonts.gstatic.com/s/librebarcode128/v16/cIfnMbdUsUoiW3O_hVviCwVjuLtXeJ_D.woff').then(res => res.buffer()); const doc = new PDFDocument({ autoFirstPage: false }); for (const cardItem of cardItems) { // barcode128 await writeTicket(doc, cardItem, { rubik, }); } doc.end(); return doc } let pdfStream = await createTicket(cardItems) sendPdfWhatsApp(pdfStream, '0500000000') const FormData = require('form-data'); const fs = require('fs'); const { Readable } = require('stream'); const ID_INSTANCE = "71XXXXXXXXXX"; const API_TOKEN_INSTANCE = "cab7d122fff64a~~~~~~~~~04c80b5"; async function uploadPdfAndSendWhatsApp(pdfStream, phoneNumber) { try { // שלב 1: העלאת הקובץ ל-Green-API const form = new FormData(); form.append('file', pdfStream, 'ticket.pdf'); // הוספת ה-PDF לטופס const uploadResponse = await axios.post(`https://media.green-api.com/waInstance${ID_INSTANCE}/uploadFile/${API_TOKEN_INSTANCE}`, form, { headers: { ...form.getHeaders(), }, }); const urlFile = uploadResponse.data.urlFile; console.log(12121212,urlFile); // שלב 2: שליחת ה-URL בוואטסאפ const sendResponse = await axios.post(`https://api.green-api.com/waInstance${ID_INSTANCE}/sendFileByUrl/${API_TOKEN_INSTANCE}`, { chatId: `${phoneNumber}@c.us`, urlFile: urlFile, fileName: 'ticket.pdf', }, { headers: { 'Content-Type': 'application/json' }, }); console.log(sendResponse.data); return sendResponse.data; } catch (error) { console.error(error); throw error; } } // יצירת Readable Stream מתוך ה-PDF function bufferToStream(buffer) { const stream = new Readable(); stream.push(buffer); stream.push(null); // אינדיקציה על סוף הזרם return stream; } // המרה של ה-PDF ל-Stream ושליחה async function sendPdfWhatsApp(pdfBuffer, phoneNumber) { const pdfStream = bufferToStream(pdfBuffer); await uploadPdfAndSendWhatsApp(pdfStream, phoneNumber); }
-
@אבי-203 כתב בשליחת קובץ PDF בוואטסאפ ב-API:
לכאורה פספסת משהו קטן, ציטוט מתוך התיעוד:
The minimum interval for sending messages from the queue using the SendFileByUpload method is 5 seconds.
הייתי מציע לך להוסיף פונקציה
function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); };
ובשורה 44 הייתי מוסיף
await sleep(5000);
-
@צדיק-תמים זה צפוי להיות בערך 20000 קבצי PDF
לא מתלהב שישב אצלי בשרת, בשעה שיש לי בו פעילות אחרת חשובה.מעדיף שיהיה בשרת יעודי רק לזה.
פניתי היום לכמה, יש מצב שזה לא דבר שבשגרה? אין שרת שאני יכול להעלות לו ב-API ולקבל במיידי URL? -
@אבי-203 ברור שיש, s3/bucket ועוד,
אבל אם אני מבין נכון green-api עצמם מציעים API ייעודי לזה (הקבצים נמחקים אחרי 15 יום): https://green-api.org.il/en/docs/api/sending/UploadFileThe method is designed to upload a file to the cloud storage, which can be sent using the sendFileByUrl method. It also allows you to avoid errors in receiving files from external storages and speed up sending messages, for example, in a mailing script.
כמו כן יש להם מתודה לשליחה ישירות עם הקובץ מצורף בform data:
https://green-api.org.il/en/docs/api/sending/SendFileByUpload -
@צדיק-תמים מעריך את ההשקעה.
האמת שגם את זה לא הצלחתי כנראה אני מסתבך בפירמוט של זה לפני השליחה.
בפועל 15 יום זה באמת לא מספיק לי, אני צריך חודשיים בערך.זה כמעט כל הקוד שלי, אני מרגיש שאיפה שהוא בפורמט הקובץ בהעלאה אני מקשקש בלי הבנה.
import wixData from 'wix-data'; export async function sendwatssap() { let torem = { "smsnumber": 0, "semmale": "XXXXXXX", "hir": "בני ברק", "ctovet2": "XXXXXXXX", "sem": "XXXXX", "mail": "XXXXXX", "phon": "XXXXXXXX", "status": true, "ctovet1": "הXXXXX 11", "wat": "XXX", "mishpaha": "XXX", "ctovet": "XXXX 11", }, cardsid= "a35c0f81-a4a5-4aa4-8a3b-42561d8e023d"; const results5 = await wixData.query("card").eq("torem", cardsid).limit(500).find({ suppressAuth: true }) const tozaot = results5.items; let ards = [] await tozaot.forEach((item2) => { let card = { "imeg": item2.imeg, "name": item2.sem, "address": torem.ctovet2, "phone": item2.phone, "_id": item2._id, "number": item2.ms, "number2": item2.ms, "sug": item2.sug, } ards.push(card) }) const ticketsArray = ards const emailAddress = torem.mail const id = cardsid const doc = await createTicket(ticketsArray) const buffers = []; doc.on('data', buffers.push.bind(buffers)); doc.on('end', () => { const pdfData = Buffer.concat(buffers); sendPdfWhatsApp(pdfData, '05XXXXXXX'); }); } export async function createTicket(cardItems) { const rubik = await fetch('https://fonts.gstatic.com/s/rubik/v14/iJWZBXyIfDnIV5PNhY1KTN7Z-Yh-B4i1Uw.woff').then(res => res.buffer()); // const barcode128 = await fetch('https://fonts.gstatic.com/s/librebarcode128/v16/cIfnMbdUsUoiW3O_hVviCwVjuLtXeJ_D.woff').then(res => res.buffer()); const doc = new PDFDocument({ autoFirstPage: false }); for (const cardItem of cardItems) { // barcode128 await writeTicket(doc, cardItem, { rubik, }); } doc.end(); return doc } const FormData = require('form-data'); const fs = require('fs'); const { Readable } = require('stream'); const ID_INSTANCE = "7XXXXXXX8"; const API_TOKEN_INSTANCE = "cabXXXXXXXXXXXXXXXb5"; async function uploadPdfAndSendWhatsApp(pdfStream, phoneNumber) { try { // שלב 1: העלאת הקובץ ל-Green-API const form = new FormData(); form.append('file', pdfStream, 'ticket.pdf'); // הוספת ה-PDF לטופס const uploadResponse = await axios.post(`https://media.green-api.com/waInstance${ID_INSTANCE}/uploadFile/${API_TOKEN_INSTANCE}`, form, { headers: { ...form.getHeaders(), }, }); await sleep(6000); console.log(666666666666666666666,uploadResponse); const urlFile = uploadResponse.data.urlFile; console.log(12121212,urlFile); // שלב 2: שליחת ה-URL בוואטסאפ const sendResponse = await axios.post(`https://api.green-api.com/waInstance${ID_INSTANCE}/sendFileByUrl/${API_TOKEN_INSTANCE}`, { chatId: `${phoneNumber}@c.us`, urlFile: urlFile, fileName: 'ticket.pdf', }, { headers: { 'Content-Type': 'application/json' }, }); console.log(sendResponse.data); return sendResponse.data; } catch (error) { console.error(error); throw error; } } // יצירת Readable Stream מתוך ה-PDF function bufferToStream(buffer) { const stream = new Readable(); stream.push(buffer); stream.push(null); // אינדיקציה על סוף הזרם return stream; } // המרה של ה-PDF ל-Stream ושליחה async function sendPdfWhatsApp(pdfBuffer, phoneNumber) { try { const pdfStream = bufferToStream(pdfBuffer); await uploadPdfAndSendWhatsApp(pdfStream, phoneNumber); } catch (error) { console.error(error); throw error; } } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
-
@אבי-203 לא פירטת מה הבעיה בשליחה, אבל יש שם קטע מיותר של
bufferToStream
וכן הפרמטר השלישי שלform.append
הוא אובייקט ולא סטרינג, תנסה ככה:form.append('file', pdfBuffer, { filename: 'ticket.pdf' });
לגבי אחסון של הקבצי PDF שכמו שאני מבין אתה רוצה בכל מקרה ומחוץ לשרת, אני חושב שהמקובל זה s3 או google storage. שים לב לא לפתוח בשום אופן את הדלי לכל העולם
-
@אבי-203 כתב בשליחת קובץ PDF בוואטסאפ ב-API:
אם אני לא טועה, אם אני אמחק את הקבוץ והמשתמש לא הוריד את הקובץ מהואטסאפ אז זה כבר לא יהיה ניתן להורדה.
א. תנסה..
ב. למיטב ידיעתי בכל מקרה של שליחה קובץ בוואטסאפ זה מועלה לשרתי וואצאפ וזמין להורדה למשתמש כשבועיים או חודש.
כמו בשליחה במכשיר גם את תשלח ותמחק מהמכשיר שלך עדיין המקבל יוכל להוריד את הקובץ -
@אבי-203 כתב בשליחת קובץ PDF בוואטסאפ ב-API:
מקווה שזה אכן נשאר להרבה זמן.
למיטב ידיעתי זה לא משנה כלום מה שמחקת בשרת.
מתי הקמפיין? כמה זמן יש לך לוודא שזה זמין?
מה שכן, כך בחשבון שייתכן שמישהו ייזכר בדוחות של שנת המס עוד שנה שהוא צריך שליחה חוזרת של הקובץ, מה תעשה אז? השאלה אם מדובר בקבלות לצרכי מס.