עזרה בהגדרות לקו נסיעות שיתופיות בAPI
-
@יצמח-פורקניה
יש לך שרת שביקשת ממנו קוד?!
אתה צריך שרת כדי שזה יעבוד.
אם יהיה לך שרת יש לי קוד שעובד בדיוק בשביל מערכת כזו. -
@אA יש לי שרת באתר חינמי
-
@יצמח-פורקניה
אוקי.
אני אנסה לשבת על הקוד שלך כשיהיה לי זמן ונראה. -
@יצמח-פורקניה שרת חינמי לא טוב לימות המשיח בד"כ
-
@עידו מה זאת אומרת לא טוב, ביינתיים לדעתי הבעיה בהגדרות זה של הבינה מלאכותית, אני נכנס והAPI אומר לי שהמספר שלי לא מזוהה ומעביר אותי להקלטת השם ואז הוא מחכה להקשת ספרה (במקום הקלטה) ולאחר הספרה הראשונה הוא שואל לאישור הקישו 1 וכו' ושוב חוזר המספר לא מזוהה
נראה לי שהשרת עובד פשוט הקוד של הAPI לא עובד
אם מישהו יכול להעלות קוד מינימלי שאוכל לבדוק אם הAPI עובד אשמח מאוד -
@יצמח-פורקניה מה ההגדרות בשלוחה?
איזה שרת? -
ההגדרות בשלוחה
type=api api_link=https://yemot-rides.onrender.com/ivr-api api_add_id=yes api_add_phone=yesהשרת כתוב ב-Node.js עם פריימוורק Express, והוא מאוחסן ב-Render. מסד הנתונים הוא MongoDB Atlas.
את הקוד העליתי בהודעה קודמת -
@יצמח-פורקניה
א"א לגשת לקוד.
תעלה אותו לכאן בתור קוד. -
@יצמח-פורקניה כתב בעזרה בהגדרות לקו נסיעות שיתופיות בAPI:
שלום לכולם,
אני רוצה לבנות קו טלפוני לנסיעות שיתופיות בין ירושלים לבני ברק, אשמח אם תוכלו לכוון אותי איך לעשות את זה:
רישום חד-פעמי:
אני רוצה שכל מי שנכנס לקו יעבור זיהוי. אם הוא לא רשום, המערכת תבקש ממנו להקליט שם פעם אחת וזהו – מעכשיו והלאה המערכת תזהה אותו אוטומטית ותשמיע את השם שלו לפני כל מודעה שהוא מפרסם.הוספה לקובץ EnterIDValName, וכו'.
ממשק נהגים ונוסעים:
(רשימה לבנה)
נהגים יוכלו לפרסם נסיעה (לבחור כיוון - חובה, להקיש שעה ב-4 ספרות - עם אפשרות לדילוג, מספר מקומות- עם אפשרות לדילוג, והקלטת הערה לפרטים נוספים - עם אפשרות לדילוג),
API ודאי יהיה צריך להיות מעורב בעסק, מה שכן, אני חושב שאפשר להסתדר רק עם מודול api
כמו כן יהיה לנהגים אפשרות לשמיעת נוסעים שהשאירו הודעה ולחייג אליהם ישירות בלחיצה על 0 (2 ערוצים מקבילים).
פורסמו פה כבר כמה קומבינות, לחיוג להשאיר ההודעה, כך שתוכל לעשות שהבקשה על מקש מסויים במהלך ההאזנה יעבור להקלטה של מינימום ומקסימום שניה 1, והנהגים יוכלו לשמוע מי תפס את הנסיעה, (כמובן שצריך ליצור הגבלה מסויימת לכמות ההודעות להשמעה בשלולית שמיעת השמות, ואכמ"ל)
נוסעים יוכלו לפרסם בקשה דומה, או להאזין להצעות של נהגים ולחייג אליהם ישירות בלחיצה על 0.
כנ"ל
כמו כן אני רוצה שיהיה שלוחה שבה כל אחד יכול לשמוע רק את ההודעות שלו ולמחוק אותן אם הנסיעה כבר לא רלוונטית,
לא רואה דרך בלי api.
בכל מקרה אני רוצה שההודעות ימחקו אוטומטית לאחר 3 שעות.
מודול api.
אני מבין במערכות ועדיין זה קצת גדול עלי אשמח אם תוכלו לעזור לי ולכוון אותי
תגיד איפה אתה צריך יותר הרחבה.
-
זה הקוד בJS שבינה כתבה לי
const express = require("express"); const mongoose = require("mongoose"); const app = express(); const port = process.env.PORT || 3000; const BASE_URL = "https://yemot-rides.onrender.com/ivr-api"; const mongoURI = process.env.MONGO_URI; // --- חיבור ל-MongoDB --- mongoose.connect(mongoURI, {useNewUrlParser:true, useUnifiedTopology:true}) .then(()=>console.log("Mongo connected")) .catch(err=>console.log("Mongo error:", err)); // --- מודלים --- const userSchema = new mongoose.Schema({ phone: {type:String, required:true, unique:true}, name_recorded: {type:Boolean, default:false}, createdAt: {type:Date, default:Date.now} }); const rideSchema = new mongoose.Schema({ type: {type:String, enum:["driver","passenger"], required:true}, driver_phone: {type:String, required:true}, direction: String, time: String, seats: String, note_id: String, createdAt: {type:Date, default:Date.now, expires:10800} }); const User = mongoose.model("User", userSchema); const Ride = mongoose.model("Ride", rideSchema); // --- מסלול IVR --- app.get("/ivr-api", async (req,res)=>{ const ApiPhone = req.query.ApiPhone || req.query.phone; const {ApiDigits, action, t, d, tm, s, r_id} = req.query; if(!ApiPhone || ApiPhone==="anonymous"){ return res.send("say=t-לא ניתן לזהות את מספר הטלפון&goto_all_endpoints=exit"); } try { // --- בדיקה אם המשתמש רשום --- let user = await User.findOne({phone: ApiPhone}); if(!user){ user = await User.create({phone: ApiPhone}); } // --- הקלטת שם מיידית --- if(!user.name_recorded && action!=="reg"){ const recName = `name_${ApiPhone}`; return res.send( `say=t-שלום! הקליטו את שמכם לאחר הצליל וסיימו בסולמית`+ `&record=${recName},1,10,no,no`+ `&go_to=${BASE_URL}?action=reg` ); } if(action==="reg"){ await User.updateOne({phone:ApiPhone},{name_recorded:true}); return res.send(`say=t-ההרשמה הושלמה&go_to=${BASE_URL}?action=main`); } // --- תפריט ראשי --- if(!action || action==="main"){ return res.send( `read=t-לנהגים הקישו 1 לנוסעים הקישו 2 למחיקת פרסומים הקישו 3`+ `=digits,1,1,1,7,yes,no&action=h_main` ); } if(action==="h_main"){ if(ApiDigits==="1") return res.send(`go_to=${BASE_URL}?action=d_menu`); if(ApiDigits==="2") return res.send(`go_to=${BASE_URL}?action=p_menu`); if(ApiDigits==="3") return res.send(`go_to=${BASE_URL}?action=del`); return res.send(`go_to=${BASE_URL}?action=main`); } // --- נהג --- if(action==="d_menu"){ return res.send( `read=t-לפרסום נסיעה הקישו 1 לשמיעת בקשות נוסעים הקישו 2`+ `=digits,1,1,1,7,yes,no&action=h_d` ); } if(action==="h_d"){ if(ApiDigits==="1") return res.send(`go_to=${BASE_URL}?action=sel_dir&t=driver`); if(ApiDigits==="2") return res.send(`go_to=${BASE_URL}?action=list&list_t=passenger`); return res.send(`go_to=${BASE_URL}?action=main`); } // --- נוסע --- if(action==="p_menu"){ return res.send( `read=t-לבקשת נסיעה הקישו 1 לשמיעת נהגים הקישו 2`+ `=digits,1,1,1,7,yes,no&action=h_p` ); } if(action==="h_p"){ if(ApiDigits==="1") return res.send(`go_to=${BASE_URL}?action=sel_dir&t=passenger`); if(ApiDigits==="2") return res.send(`go_to=${BASE_URL}?action=list&list_t=driver`); return res.send(`go_to=${BASE_URL}?action=main`); } // --- בחירת כיוון --- if(action==="sel_dir"){ return res.send( `read=t-מירושלים לבני ברק הקישו 1 מבני ברק לירושלים הקישו 2`+ `=digits,1,1,1,7,yes,no&action=h_dir&t=${t}` ); } if(action==="h_dir"){ if(t==="driver"){ return res.send( `read=t-הקישו שעת יציאה בארבע ספרות`+ `=digits,4,1,4,7,yes,no&action=set_time&t=${t}&d=${ApiDigits}` ); } return res.send(`go_to=${BASE_URL}?action=finish&t=${t}&d=${ApiDigits}`); } if(action==="set_time"){ return res.send( `read=t-הקישו מספר מקומות פנויים`+ `=digits,1,1,2,7,yes,no&action=finish&t=${t}&d=${d}&tm=${ApiDigits}` ); } // --- שמירה סופית --- if(action==="finish"){ await Ride.create({ type:t, driver_phone:ApiPhone, direction:d, time:tm, seats:ApiDigits }); return res.send(`say=t-הפרסום נשמר בהצלחה&go_to=${BASE_URL}?action=main`); } // --- רשימות --- if(action==="list"){ const listT = req.query.list_t; const items = await Ride.find({type:listT}).sort({createdAt:-1}).limit(1); if(items.length===0) return res.send(`say=t-אין כרגע פרסומים&go_to=${BASE_URL}?action=main`); const item = items[0]; let msg = "t-פרסום נסיעה. ."; if(item.time) msg+=`t-בשעה ${item.time}. .`; if(item.seats) msg+=`t-${item.seats} מקומות פנויים. .`; msg+="t-לחיוג הקישו 0 לחזרה הקישו 2"; return res.send(`read=${msg}=digits,1,1,1,7,yes,no&action=list_opt&r_id=${item._id}`); } if(action==="list_opt"){ if(ApiDigits==="0"){ const ride = await Ride.findById(r_id); if(ride) return res.send(`dial=${ride.driver_phone}`); } return res.send(`go_to=${BASE_URL}?action=main`); } // --- מחיקה --- if(action==="del"){ const count = await Ride.countDocuments({driver_phone:ApiPhone}); if(count===0) return res.send(`say=t-אין לכם פרסומים פעילים&go_to=${BASE_URL}?action=main`); return res.send(`read=t-נמצאו ${count} פרסומים למחיקה הקישו 7=digits,1,1,1,7,yes,no&action=del_ok`); } if(action==="del_ok" && ApiDigits==="7"){ await Ride.deleteMany({driver_phone:ApiPhone}); return res.send(`say=t-הפרסומים נמחקו&go_to=${BASE_URL}?action=main`); } return res.send(`go_to=${BASE_URL}?action=main`); } catch(err){ console.log(err); return res.send(`say=t-תקלה זמנית במערכת&goto_all_endpoints=exit`); } }); app.listen(port,()=>console.log("Server running on port", port));