يحتوي هذا المستودع على برنامج نصي استخدمته لتنزيل مقاطع فيديو LinkedIn Live.
لاستخدام البرنامج النصي ، قم بتعديل متغيرات PUBLIC_URL
و VIDEO_ID
في linkedin.sh
.
ألقِ حديثًا مؤخرًا في اجتماع مجتمعي حيث كانوا يستخدمون LinkedIn Live الجديد لدفق الحدث. بعد الحدث ، قررت أنني أردت نسخة من الفيديو ولكن لا يبدو أن LinkedIn يتفق معي على أنه يجب أن يكون لدي نسخة من الفيديو الخاص بي. وأيضًا ، لم يتم عمل أي من مواقع تنزيل الفيديو الحالية ، ولم تفعل أي من النصائح المقدمة من الأشخاص الآخرين عبر الإنترنت أيضًا. يبدو أن LinkedIn قد غير الطريقة التي قاموا بها مقاطع الفيديو. لذا. علامة تبويب الشبكة كانت!
يوثق هذا المنشور القصير كيف تمكنت من تنزيل فيديو LinkedIn مع القليل من القرصنة على وحدة التحكم في Chrome و SHELL. يجب أن تكون مرتاحًا لخط الأوامر حتى تعمل الأشياء.
لذلك رأيت منشور LinkedIn مع مقطع فيديو تريده محليًا. نبدأ بالنقر على الفيديو بحيث يفتح في وضع يشبه المسرح. بالنسبة لمقطع الفيديو الخاص بي ، بدا عنوان URL:
https://www.linkedin.com/video/live/urn:li:ugcPost:%UGC_POST_ID%/
بمجرد تحميل الصفحة ، لا تضغط على التشغيل - افتح وحدة التحكم Chrome وانتقل إلى علامة التبويب الشبكة. اضغط الآن على اللعب وابحث عن علامة تبويب الشبكة لمكالمة manifest(format=m3u8-aapl-v3)
. يبدو أن هذه المكالمة تقدم طلبًا لاسترداد المتغيرات المحتملة للفيديو وينبغي أن تبدو الاستجابة مشابهة لـ:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=351536,RESOLUTION=340x192,CODECS="avc1.64000d,mp4a.40.5"
QualityLevels(200000)/Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXT-X-STREAM-INF:BANDWIDTH=709236,RESOLUTION=384x216,CODECS="avc1.640015,mp4a.40.5"
QualityLevels(550000)/Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXT-X-STREAM-INF:BANDWIDTH=1015836,RESOLUTION=512x288,CODECS="avc1.640015,mp4a.40.5"
QualityLevels(850000)/Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXT-X-STREAM-INF:BANDWIDTH=1526836,RESOLUTION=704x396,CODECS="avc1.64001e,mp4a.40.5"
QualityLevels(1350000)/Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXT-X-STREAM-INF:BANDWIDTH=2395536,RESOLUTION=960x540,CODECS="avc1.64001f,mp4a.40.5"
QualityLevels(2200000)/Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXT-X-STREAM-INF:BANDWIDTH=3724136,RESOLUTION=1280x720,CODECS="avc1.64001f,mp4a.40.5"
QualityLevels(3500000)/Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXT-X-STREAM-INF:BANDWIDTH=138976,CODECS="mp4a.40.5"
QualityLevels(128000)/Manifest(audio_und,format=m3u8-aapl-v3)
يتم استخدام البيان المذكور أعلاه لتحديد ما ينبغي أن يتم بث QualityLevel
عندما يكون BANDWIDTH
أعلى من معدل معين. سنرى كيف يتم استخدام ذلك لاحقًا.
يجب أن يكون للطلب التالي من الاهتمام الذي يجب أن يأتي بعد فترة وجيزة من اكتمال الطلب أعلاه من 6 Manifest(video,format=m3u8-aapl-v3,audiotrack=audio_und)
. النقر فوقها والانتقال إلى علامة تبويب الاستجابة ، يجب أن ترى ملفًا ضخمًا يتكون من خطوط مثل هذه:
...
#EXTINF:2.000000,no-desc
Fragments(video=%FRAGMENT_ID_1%,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXTINF:2.000000,no-desc
Fragments(video=%FRAGMENT_ID_2%,format=m3u8-aapl-v3,audiotrack=audio_und)
#EXTINF:2.000000,no-desc
Fragments(video=%FRAGMENT_ID_3%,format=m3u8-aapl-v3,audiotrack=audio_und)
...
يبدو أن هذه تحدد قائمة شظايا الفيديو التي تتدفق عبر متصفحاتك لتشكيل الفيديو الكامل.
إذا نظرنا إلى ما هو أقل قليلاً من الطلب أعلاه ، ستجد مكالمات الشبكة المسماة Fragments(video=%FRAGMENT_ID%,format=m3u8-aapl-v3,audiotrack=audio_und)
. حسنًا ، ألا يبدو ذلك مألوفًا؟
تحقق من عنوان URL الكامل للمكالمة (انقر بزر الماوس الأيمن على الصف ، ونسخ كهلة) من هذه الطلبات ويجب أن تجدها تشبه التنسيق التالي:
https://streamwus2-livectorprodmedia11-usw22.licdn.com/%UUID%/%SOME_VIDEO_ID%-livemanifest.ism/QualityLevels(2200000)/Fragments(video=%FRAGMENT_ID%,format=m3u8-aapl-v3,audiotrack=audio_und)
لاحظ QualityLevels
Fragments
. هذه هي المكالمة التي تسترجع شظايا البيانات التي يتم جمعها لتشكيل الفيديو الخاص بك.
لذلك نحن نعرف الآن كيف يتم بث الفيديو ، يمكننا تكرار ذلك بحد أدنى:
manifest...
، لاحظ QualityLevel
Manifest...
، انسخ عنوان URL كأمر حليقةQualityLevel
من الخطوة 2 ، قم بتعديل عنوان URL في طلب Curl بحيث يكون من أعلى جودةmanifest
.cat ./manifest | grep -v '#' | cut -f 2 -d '=' | cut -f 1 -d ',' > ./fragment_ids
touch video.mp4
while read FRAGMENT_ID ; do
echo ' processing ${FRAGMENT_ID} ' ;
curl ... >> video.mp4
done < ./fragment_ids ;