@יוסף-בן-שמעון כתבת לעשות ש"הדף יאזין להודעות מהפופאפ".
השאלה איך שולחים את ההודעה באמת (מהפופאפ לדף)?
צדיק תמים
-
עזרה עם בניית תוסף כרום -
עזרה עם בניית תוסף כרום@יוסף-בן-שמעון אמר בעזרה עם בניית תוסף כרום:
אבל אפשר לשלוח הודעות מהפופאפ לדף ומהדף לפופאפ
איך עושים כזה דבר? או שזה משהו ייחודי לתוספים?
-
מחפש גיבוי אמין וזול 500GB@avramk אצלי הקישור עובד, תנסה אולי לפתוח בגלישה בסתר את הקישור
-
עזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS)@יוסף-בן-שמעון למעשה התברר לי שבכלל לא מתקבלים הנתונים שאני מחפש... והכל בגלל אות אחת - pert (במקום part)...

הנה קוד מתוקן:/** * קבל מזהה ערוץ, חלץ (והחזר) רשימת מזהי סרטונים (כמערך) * @param {string} upledsChannelID מזהה ערוץ */ async function getVideoListForPlayList(upledsChannelID) { let arrayVideoID = [] let nextPageToken = "" let listVideo_Object do { const urlFetch = new URL("https://www.googleapis.com/youtube/v3/playlistItems") urlFetch.searchParams.append("part", "id,contentDetails") urlFetch.searchParams.append("playlistId", upledsChannelID) urlFetch.searchParams.append("maxResults", 50) urlFetch.searchParams.append("key", getTokenAPI()) if (nextPageToken) urlFetch.searchParams.append("pageToken", nextPageToken) const urlFetchEnd = urlFetch.toString() console.log(urlFetchEnd) listVideo_Object = await fetch(urlFetchEnd).then((res) => res.json()) nextPageToken = listVideo_Object.nextPageToken console.log(Math.ceil((await listVideo_Object.pageInfo.totalResults) / 50)) listVideo_Object.items.forEach((parit, index) => { // if (parit.id.kind === "youtube#video") { arrayVideoID.push(parit.contentDetails.videoId) // } }) console.log(listVideo_Object) } while (listVideo_Object.nextPageToken) console.log(arrayVideoID) return arrayVideoID } //בדיקה לדוגמה console.log(await getVideoListForPlayList("UUzlw5vTVVMPwBKElMt3gYQw")) //מפתח API (במקור מחזיר לפי מה שהמשתמש קבע וכו') function getTokenAPI() { return "AIzaSyAZIKWeEBpgEqZd64gkLxjOhNj4mgy7rZ0" }כשאני אומר טריק אני מתכוון לשורות 7, 19
-
עזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS)@יוסף-בן-שמעון למעשה למרות שהשתמשתי בשיטה של יצירת מופע של URL (וגם הכנסתי את התיקון שלך כאן, אבל זה כבר לא קשור כל כך...) נצרכתי לטריקים מעין זה...
זה הקוד שיצא לי:ראה קוד מתוקן בהמשך
רק משום מה זה לא מדפיס בסוף את arryYT (המערך המלא)... אבל כל הנתונים כן מתקבלים, ומודפסים כל אחד בתורו בשורה 25. -
עזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS)@יוסף-בן-שמעון הנה קטע קוד סופי לדוגמה:
/** * קבל מזהה סרטון, החזר שם סרטון, שם ערוץ, ומזהה ערוץ * @param {string} VideoID מזהה סרטון יוטיוב */ async function getChannelForVideoID(VideoID) { const GET_INFO_FOR_VIDEO_ID = new URL("https://www.googleapis.com/youtube/v3/videos") GET_INFO_FOR_VIDEO_ID.searchParams.append("id", VideoID) GET_INFO_FOR_VIDEO_ID.searchParams.append("key", getTokenAPI()) GET_INFO_FOR_VIDEO_ID.searchParams.append("part", "snippet") GET_INFO_FOR_VIDEO_ID.searchParams.append("fields", "items(snippet(channelTitle,channelId,title))") console.log(GET_INFO_FOR_VIDEO_ID.toString()) const infoVideo_Raw = await fetch(GET_INFO_FOR_VIDEO_ID) let infoVideo_Object = await infoVideo_Raw.json() let videoINFO = [infoVideo_Object.items[0].snippet.channelId, infoVideo_Object.items[0].snippet.channelTitle, infoVideo_Object.items[0].snippet.title] return videoINFO } console.log(await getChannelForVideoID("upjlMAKR-_0"))זה מספיק ברור? או שיש עוד מה לשפר (כמובן אני לא שואל בשביל הקטע הזה ספציפית, אלא לידיעה כללית)
מתייג גם את @Shaya -
ניתוח חולשת PwnKit (תגובות)@yossiz אמר בניתוח חולשת PwnKit:
תשתמשו בשפות בטוחות. בשפה אחרת באג זה היה נשאר באג, ולא היה מגיע לכדי חולשה.
לא הבנתי, זה שזה הגיע לחולשה זה מעלה או חיסרון? ובאיזה שפה מדובר פה? סליחה על הבורות.
-
עזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS)@יוסף-בן-שמעון כמו שכתבתי קודם השמות הם זמניים, יותר נוח לי להכין את הקטע קוד (כשמדובר בקטע מורכב ולא שאני כותב וזהו) עם שמות זמניים וקצרים שיותר מובנים לי במשמעות של הקטע הספציפי, ולאחר מכן כשאני משלב את זה בסקריפט אני נותן לזה מחדש שמות לפי המשמעות ביחס לפעולה הכללית של הסקריפט.
לגבי המחלקה URL והדוגמה שהבאת - זה נראה ממש מעולה, לא הכרתי את זה קודם (וגם כמדומני לא נתקלתי בזה בסקריפטים וקטעי קוד אחרים ברשת).
ולגבי העניין של להגדיר משתנה מחדש - אז לי אישית יותר קשה להבין קוד שלוקח נתון ומכניס אותו לתוך משתנה x, ואז מוטציה על x שמוכנסת לy, וכן הלאה, כשלמעשה בסופו של דבר משתמשים רק במוטציה האחרונה - לדוגמה y, אז מה העניין בעצם 'לשרשר' את זה? כל עוד אני צריך רק את התוצאה הסופית, למה לא לערוך את המשתנה הראשוני ולהכניס בו את התוכן לאחר העריכה, ולהשתמש בו?
במראה מקום הזה ששעייה הביא, בעצם כתוב שיש עניין ליצור למשל את האובייקט כבלתי ניתן לשינוי, אבל לא הבנתי מה מרוויחים מזה באמת? -
עזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS)@יוסף-בן-שמעון אמר בעזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS):
יש מחלקה בשם URL שלוקחת פרמטרים ומחזירה URL תקין עם פרמטרי חיפוש ושאר ירקות
אשמח להרחבה, ובכלל הייתי שמח להעמיק קצת יותר בכל העניין של כתיבה נכונה של קוד (או לפחות בעניינים ש @Shaya נגע)... זה אכן דבר חשוב.
אולי @dovid יוכל לפצל את הפוסטים האחרונים לנושא חדש? -
עזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS)@יוסף-בן-שמעון אמר בעזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS):
שם משתנה a1 זה לא תקין בעליל
אכן,
זה לא אמור להישאר ככה, זה רק בשביל כתיבת עצם הקוד, ככה יותר נוח.
למעשה אח"כ אני משכתב את שמות המשתנים והפונקציות@יוסף-בן-שמעון אמר בעזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS):
הוא משמש לכמה דברים בזה אחר זה
איזה דברים?
אני מגדיר אותו קודם כל כמערך עם מחרוזת ריקה בnextPageToken, בשביל תקינות הקריאה הראשונה.
חוץ מזה אין עוד שימוש -
עזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS)@shaya קודם כל את הקוד ההוא באמת גם לי היה קשה להבין...

אני צריך למצוא זמן יותר מתאים לקרוא בעיון את הקוד שלך (והמראי מקומות), אבל למעשה כתבתי את הקוד הזה:
שאמנם הוא חסר את הסדר שלך (למשל בהגדרתYOUTUBE_SEARCH_ENDPOINTשמקצר את שורת הקריאה בפועל), אבל הוא קצר בהרבה מהקוד שלך (וכמובן פועל היטב).
אני אישית סובר שקוד טוב הוא קוד חסכני (כמובן שמשיג את אותה תוצאה, ובצורה שברורה לי).async function lulaa(ChannelID) { let arryYT = [] let a1 = { nextPageToken: "", } let artToken = "" do { a1 = await fetch(`https://www.googleapis.com/youtube/v3/search?key=` + TokenAPI() + `&channelId=${ChannelID}&part=id&order=date&maxResults=50${artToken}${a1.nextPageToken}`) a1 = await a1.json() a1.items.forEach((parit, index) => { if (parit.id.kind === "youtube#video") { arryYT.push(parit.id.videoId) } }) artToken = "&pageToken=" } while (await a1.nextPageToken) console.log(arryYT) } function TokenAPI() { return "AIzaSyBUtCAp82VCsH5z3XmTMy1KMnLQ1g3Cqm0" }(הקוד הזה עצמו לא יעבוד, כי המפתח API הזה לא עובד כרגע, כי נגמרה המכסה היומית... שימוש בsearch לוקח 100 יחידות שימוש... צריך לבדוק אם ואיך ניתן לקבל את הנתונים בצורה רגילה. בכל מקרה עם מפתח אחר זה עובד היטב)
-
עזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS)@yossiz אמר בעזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS):
הפונקציה getNextPage לא קוראת לעצמה בקוד הנ"ל.
זה לא מה שקורה בשורות 28-30?
-
עזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS)@yossiz אמר בעזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS):
במקום כמה קריאות, אמור להיות שם לולאה שתנאי העצירה שלה זה אם לא התקבל nextPageToken
יפה! לא חשבתי על הכיוון הזה, (בעצם יצרתי פונקציה שקוראת לעצמה [בתנאי מסוים]). לכאורה הכי מתאים זה
do while.
עכשיו נשארת השאלה איך אני יודע שהכל הסתיים? -
עזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS)@יוסף-בן-שמעון עד 500 תוצאות זה כן אמור להיות מדויק בצורה הזאת, ולי זה מספיק, הקוד לא מתוכנן כרגע לעבוד על ערוצים יותר גדולים מזה.
מלבד זאת, גם אם אני יעשה את זה ככה, עדיין נשארת השאלה שבשבילה פתחתי את הנושא - איך אני יודע שכל הקריאות הסתיימו?
וכן כשאני נכנס ידנית (בדפדפן) לכתובות עם הpageToken, אני כן מצליח לקבל את כל התוכן, ככה שנראה שזה בעיה בקוד. -
עזרה - שרשור פרומיסים מותנה וביצוע פעולה רק בסיום כולם (JS)המטרה - לקבל מערך של מזהי סרטונים בערוץ מסוים ביוטיוב (לפי מזהה ערוץ) דרך הAPI של גוגל.
גוגל מאפשרת לקבל בכל פעם עד 50 תוצאות.
אם יש יותר - הAPI מחזיר ערךnextPageToken, שאותו מעבירים בפרמטרpageTokenבשאילתה החדשה, וכן הלאה עד שלא חוזר nextPageToken ואז זה אומר שאין עוד תוצאות.
בעצם מה שניסיתי לממש זה את המדריך הזה:
http://truelogic.org/wordpress/2017/06/20/7-youtube-data-api-paging-maxresults
כתבתי את הקוד הבא, שבעצם מבצע קריאה ראשונית, מקבל את התוכן ודוחף את מזהי הוידאו למערך "arryYT" ואז באם חוזר פרמטר nextPageToken מבצע שאילתה נוספת, מכניס למערך, ובאם עדיין יש nextPageToken מבצע שוב קריאה, וכן הלאה.
let arryYT = [] async function lulaa(ChannelID) { console.log("run") let a1 = await fetch(`https://www.googleapis.com/youtube/v3/search?key=` + TokenAPI() + `&channelId=${ChannelID}&part=id&order=date&maxResults=50`) a1 = await a1.json() console.log(Math.ceil(a1.pageInfo.totalResults / 50)) a1.items.forEach((parit, index) => { if (parit.id.kind === "youtube#video") { arryYT.push(parit.id.videoId) } }) if (a1.nextPageToken) { getNextPage(a1.nextPageToken) } if (a1.nextPageToken) { getNextPage(a1.nextPageToken) } async function getNextPage(nextPageToken) { console.log("run") let a1 = await fetch(`https://www.googleapis.com/youtube/v3/search?key=` + TokenAPI() + `&channelId=${ChannelID}&part=id&order=date&maxResults=50&pageToken=${nextPageToken}`) a1 = await a1.json() a1.items.forEach((parit, index) => { if (parit.id.kind === "youtube#video") { arryYT.push(parit.id.videoId) } }) } if (a1.nextPageToken) { getNextPage(a1.nextPageToken) } } function TokenAPI() { return "AIzaSyBUtCAp82VCsH5z3XmTMy1KMnLQ1g3Cqm0" }השאלה איך אני יודע שכל הקריאות (וניתוח הנתונים) הסתיימו בהצלחה? כדי להמשיך לשלב הבא - שליחת המערך המוכן של המזהים לפונקציה אחרת שתנתח אותם.
כמו כן, נראה שבכלל לא כל הנתונים מתקבלים...
בקריאה לדוגמה לערוץ הזה:lulaa("UCzlw5vTVVMPwBKElMt3gYQw")שיש 399 פריטים שבשביל לקבל אותם צריך 8 דפי מידע (בשורה 6 מודפס לקונסול המידע הזה), אבל בפועל הקונסולוגים שהכנסתי בשורות 19 ו3 מראים שזה רץ רק 4 פעמים, והתקבל מערך עם 195 פריטים בלבד (המספר בניקוי הפלייליסטים (שורה 8/23), ועדיין...).
גם כשחיכיתי עוד קצת, והדפסתי את המערך, לא היו בו את כל תוצאות נוספות...
הפונקציה TokenAPI במקור מחזירה מפתח API לפי מה שהמשתמש הגדיר (נשמר בlocalStroage) וכו', בשביל הדוגמה עשיתי שהיא תחזיר מפתח קבוע...
אשמח לעזרה.מקווה שזה מספיק ברור, כתבתי כבר את הפוסט והשקעתי זמן רב בניסוחו ועקב תקלה טכנית הוא נמחק, בתקווה להבנה...
-
תיעוד קוד בJavaScript@dovid נחמד מאוד, וטוב שצירפת תמונה לדוגמה, כי השלד והקישור לא ממש עזרו...
יש אופציה מהפופ-אפ שקופץ בריחוף, גם לקפוץ להגדרת הפונקציה? -
עזרה - ביטול פיצול שורות מציק בPrettier@dovid אכן עזר, תודה.
יש לך אולי איזה טריק שגם ההערות לא יזוזו לתוך הפונקציה? -
תיעוד קוד בJavaScript@www ממה שהבנתי מהקישור שנתת זה בעצם כלי לייצר תיעוד באופן אוטומטי..
אני צריך סה"כ משהו פנימי שיופיע לי כשאני עורך את הקוד בVSC -
עזרה - ביטול פיצול שורות מציק בPrettier@www אמר בעזרה - ביטול פיצול שורות מציק בPrettier:
יש מוסכמה מסויימת על אורך השורות, אא"כ יש לך עכבר אנכי...
העניין הוא שזה מחלק את זה עוד הרבה קודם...
לדוגמה כזו שורה

וגם זה לא ממש עוזר, שבמקום שורה כזו:alert("aaaaa aaaaaaaaa aaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaa")יהיה כזה:
alert( "aaaaa aaaaaaaaa aaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaa" )הכמה תווים אחורה האלה לא ממש עוזרים לעניין...
ואשמח לדעת איך אפשר לכתוב תיאור ככה שיראו אותו גם בריחוף על שם הפונקציה -
API לתרגום לעברית@אנא פעם הגעתי לAPI הזה: https://libretranslate.com/docs וחשבתי להשתמש בזה אז שלחתי לנטפרי, למעשה לא יצא לי להשתמש/לחקור את זה, תוכל לנסות
לפי מה שזכור לי הגעתי לזה מרשימה כלשהיא של API חינמיים