شرح json python وتطبيق علي youtube api

شرح json python وتطبيق علي youtube api

شرح json python وتطبيق علي youtube api

مكتبة json بايثون: سوف تتعلم في هذا القسم كيفية قراءة وكتابة البيانات المشفرة بتنسيق JSON ، وتطبيق عملي علي youtube api.

شرح json في بايثون

JSON (JavaScript Object Notation) هو تنسيق بيانات شائع يستخدم لتمثيل البيانات المهيكلة. يستخدم لارسال واستقبال البيانات بين سكربت بايثون والسيرفر او بين لغات البرمجة المختلفة.

شكل بيانات json

النص المشفر بواسطة json هو مجرد نص عادي قابل للقراءة البشرية؛ نحصل علية من خلال تحويل كائن بايثون مثل القاموس dictionary الي نص json ، وهذا ما يحدث في كل لغات البرمجة التي تكتب وتقرأ تنسيق جسون.

في قسم انواع البيانات تعرفنا علي القاموس في بايثون وهو يكتب بالشكل التالي:

x = { "name":"ahmed", "age":15 }

عند تحويل القاموس السابق الي نص json يصبح كالتالي:

x = '{ "name":"ahmed", "age":15 }'

كل ما حدث هو تحويل كائن بايثون الي نص string ، ومن هنا يمكن حفظه في ملف او ارسالة باي وسيله الي لغة اخري او الي الخادم.

كما يمكن ايضا عكس العملية وتحويل النص الي كائن بايثون dictionary واستخراج البيانات كما فعلنا في درس python dictonary.

بعد ان تعرفت علي وظيفة تشفير json دعنا نتعرف علي طريقة العمل بمكتبة json في بايثون، وعلي كيفية قراءة، وكتابة - بيانات json.

استدعاء مكتبة json

كما هو الحال مع جميع المكتبات يجب استدعاء المكتبة قبل العمل بها داخل الكود ولاستدعاء مكتبة json نكتب التالي:

import json

من خلال الكود السابق تم استدعاء مكتبة json ، وهي الان جاهزة لتلقي جميع الطلبات الخاصة بقراءة، وكتابة تشفير json.

تحويل كائن بايثون الي نص json

يتم تحويل كائنات بايثون الي نصوص json من خلال دالة dumps ، وهي تقوم بتحويل الكائن بالكامل بكل ما يحتوية من بيانات الي نص json.

مثال

import json
x = { "name":"ahmed", "age":15 }
j = json.dumps(x)

print(type(x))
print(type(j))

في المثال السابق قمنا بالتصريح عن متغير x وقيمتة قاموس مع مفتاحان ، ثم قمنا بالتصريح عن متغير j وجعلنا قيمتة هي ناتج تحويل القاموس الي نص str ، ثم قمنا بطباعة نوع البيانات، وليس البيانات نفسها حتي تتمكن من مشاهدة الاختلاف بين نوع البيانات قبل التحويل وبعد التحويل.

وكما تشاهد نوع بيانات المتغير j هي string ، وهذا يعني انه تم تحويل القاموس x الي نص str ، وهو ما يتيح لنا ارسال كائن بين لغات البرمجة، وهو الاسلوب المتبع في برمجة الـ API.

تحويل نص json الي كائن بايثون

يتم تحويل نص json الي كائن بايثون من خلال دالة loads ، وهي التي تقوم بتحويل الكائن من الحالة النصية الي الحالة الطبيعية له في بايثون.

مثال

import json
x = '{ "name":"ahmed", "age":15 }'
j = json.loads(x)

print(type(x))
print(type(j))

في المثال السابق متغير x يساوي نص string وليس قاموس ولكن النص يحتوي علي صيغة قاموس صحيحة ، وهذا ما يجب التاكد منه قبل تحويل نص الي كائن بواسطة json.loads.

وعلي السطر التالي قمنا بتحويل النص الموجود في x الي كائن بايثون dictionary ، والان المتغير j يحتوي علي قاموس بايثون حقيقي من نوع dict.

بعد ان تم تحويل النص الي قاموس حقيقي يمكننا الان اجراء كل انواع العمليات الخاصة بالقاموس في بايثون من اضافة مفتاح جديد ، حذف مفتاح ، تعديل بيانات مفتاح ، او اي نوع من العمليات في بايثون مثل التكرار وما الي ذلك.

مثال

import json
x = '{ "name":"ahmed", "age":15 }'
j = json.loads(x)

print(j['name'])
j['name'] = 'mohamed'
print( j )

في هذا المثال تم تحويل نص جسون الي قاموس بايثون، وقمنا بطباعة المفتاح name قبل اجراء اي تعديلات ، ثم قمنا بتعديل قيمة مفتاح name في القاموس j ، ثم قمنا بطباعة القاموس بالكامل والنتيجة انه تم تغيير قيمة مفتاح name من ahmed الي mohamed.

اذا لم تتضح الصورة بعد قم باستبدال متغير j بمتغير x في الثلاثة اسطر الاخيرة واعد تشغيل المثال وشاهد المخرجات.

من خلال عمليات التحويل من json الي python والعكس يمكن لبايثون التواصل مع لغات اخري وليس بايثون فقط ويمكن ايضاً التواصل مع الـ API بمختلف شركاتها او تسمياتها ومنها - youtube api ، google maps api ، وهلم جرا.

للتوضبح اكثر سوف نقوم بعمل تطبيق بسيط لمعرفة بيانات مقطع فيديو علي يوتيوب بواسطة بايثون و youtube api.

import urllib
import json
videoId = 'vkzlsfKCR0w'
request_url = urllib.request.urlopen('https://www.googleapis.com/youtube/v3/videos?part=snippet%2CcontentDetails%2Cstatistics&id='+videoId+'&key=AIzaSyCnkC2VpMxrYRCy2H3TpfCafJEqlHEP-mw')
res = request_url.read()

data = json.loads(res)
print(data['items'][0]['snippet']['title'])

في المثال السابق قمنا باستدعاء مكتبة urllib حتي نتمكن من قراءة محتوي الرابط الخاص بخدمة youtube api ، وهو في كل الاحوال نص json اذا كان الرابط صحيح وبدون اخطاء.

بعد استدعاء المكتبات قمنا بفتح الرابط المطلوب والذي يحتوي علي id مقطع الفيديو ثم قمنا بتخزين النص داخل متغير res.

حتي هنا متغير res يحتوي علي بيانات مقطع الفيديو المطلوب في شكل نص json ، ولذلك سوف نقوم بتحويلة الي كائن بايثون من خلال json.loads ، وهكذا اصبح لدينا قاموس بايثون في متغير data.

بعد ان حصلنا علي كائن القاموس يمكننا الان استخراج البيانات المطلوبة ، وفي هذا المثال سوف نكتفي بطباعة عنوان مقطع الفيديو فقط ، ولكن يمكنك طباعة متغير res ومعرفة شكل الكائن واستخراج البيانات حسب مسار البيانات المطلوبة كما حدث مع title.

ملحوظة العنوان والوصف داخل نفس حاوية البيانات snippet لذلك اذا قمت بكتابة description بدلاً من title فسوف تطبع الوصف.

تنوية هام : مفتاح youtube api المستخدم في المثال خاص بنا للتدرب وتجربة الامثلة المشابهة ، ويرجي عدم استخدامه في مشاريعك الخاصة يمكنك انشاء مفتاحك الخاص مجاناً من خلال Google Developers Console.

json python قراءة تعليقات مقطع فيديو يوتيوب

في المثال التالي سوف نقوم بقراءة التعليقات علي مقطع فيديو في يوتيوب من خلال المكتبات urllib، json، و youtube api.

import urllib
import json
videoId = 'vkzlsfKCR0w'
request_url = urllib.request.urlopen('https://www.googleapis.com/youtube/v3/commentThreads?part=snippet&videoId='+videoId+'&key=AIzaSyCnkC2VpMxrYRCy2H3TpfCafJEqlHEP-mw')
res = request_url.read()

data = json.loads(res)
cmts = data['items']
print('video has %s comments:' % len(cmts))

for i in range(len(cmts)):
    author = data['items'][i]['snippet']['topLevelComment']['snippet']['authorDisplayName']
    comment = data['items'][i]['snippet']['topLevelComment']['snippet']['textDisplay']
    print('[USER]: {} - [COMMENT]: {}'.format(author, comment))

في المثال السابق ارسلنا طلب الي youtube api لقراءة التعليقات الموجودة علي مقطع الفيديو المطلوب وقمنا بحفظ الرد في متغير res.

ثم بعد ذلك قمنا بتحويل نص json الي كائن بايثون dictionary ، وبتحليلنا لهيكل البيانات الوارد تبين ان جميع التعليقات داخل الحاوية items وهي من نوع بيانات القائمة list في بايثون.

بمعني ان items0 يساوي التعليق الاول وitems1 الثاني وهكذا حتي اخر تعليق في القائمة items ويمكننا معرفة عدد التعليقات من خلال معرفة طول القائمة items بواسطة دالة len كما هو مبين في سطر الطباعة الاول.

التالي هو نموذج او كائن او object التعليق داخل القائمة items ولكل تعليق نفس الهيكل مع اختلاف البيانات لكل تعليق. في مثالنا السابق كان هدفنا طباعة اسم اليوزر والتعليق فقط ، وبالنظر الي الشكل التالي يتبين لنا ان نص التعليق يوجد داخل مفتاح textDisplay او textOriginal ، واسم المؤلف authorDisplayName ، وجميع تلك البيانات موجودة داخل حاوية البيانات snippet.

المسار الكامل للبيانات المطلوبة هو:

snippet > topLevelComment > snippet

وجميعها من نوع بيانات القاموس dictionary وكما تعلمنا يتم الوصول للبيانات من خلال المفتاح (key) ، وفي القائمة بواسطة رقم الفهرس (index)؛ لذلك استخدمنا حلقة التكرار للتكرار في نطاق طول التعليقات items او في عدد التعليقات len items.

author = data['items'][i]['snippet']['topLevelComment']['snippet']['authorDisplayName']
comment = data['items'][i]['snippet']['topLevelComment']['snippet']['textDisplay']

شكل نموذج التعليق

{
      "kind": "youtube#commentThread",
      "etag": "-NZEoxHyY__jOD_dd8eDnWgyHiY",
      "id": "UgyAlwhuJeaKWA8Md1p4AaABAg",
      "snippet": {
        "videoId": "_qwbP25Acdo",
        "topLevelComment": {
          "kind": "youtube#comment",
          "etag": "IyTWV0MgPzmrExKYsjQzqF9PePI",
          "id": "UgyAlwhuJeaKWA8Md1p4AaABAg",
          "snippet": {
            "videoId": "_qwbP25Acdo",
            "textDisplay": "سبحان الله من اكتر البرامج الموثره جدااا فى الإنسان الله يرحمه ويغفر له دكتور مصطفى محمود ����",
            "textOriginal": "سبحان الله من اكتر البرامج الموثره جدااا فى الإنسان الله يرحمه ويغفر له دكتور مصطفى محمود ����",
            "authorDisplayName": "Hana Abdo",
            "authorProfileImageUrl": "https://yt3.ggpht.com/ytc/AL5GRJVnoy1SiLp0pLC8rXCAYyYCILXg8nZD08nGMQ=s48-c-k-c0x00ffffff-no-rj",
            "authorChannelUrl": "http://www.youtube.com/channel/UC7HNAeYLawnrKRm3XcFsntQ",
            "authorChannelId": {
              "value": "UC7HNAeYLawnrKRm3XcFsntQ"
            },
            "canRate": true,
            "viewerRating": "none",
            "likeCount": 16,
            "publishedAt": "2022-01-28T21:56:44Z",
            "updatedAt": "2022-01-28T21:56:44Z"
          }
        },
        "canReply": true,
        "totalReplyCount": 0,
        "isPublic": true
      }
    }

يمكنك مشاهدة الكثير من البيانات المنسقة بتنسيق json في الكائن السابق مثل رابط صورة البروفيل، و تاريخ النشر و الاعجابات، يمكنك اتباع نفس الاسلوب لاستخراج تلك البيانات من خلال تحديد المسار ونوع الحاوية وبمنتهي الهدوء تصل للهدف المطلوب. يتبع....

الاختبار

تحت الانشاء.

 

حلول الاعضاء
فتح الحلول مقابل 5
مقفل
output
terminal

Next

التعليقات

no comments found.
  • من خلال الضغط علي زر {;} في شريط الادوات يمكنك اضافة اكواد بايثون الي التعليق للتجربة اون لاين.
  • برجاء مراعاة قواعد الكتابة، والادب.