دليل المطوّر: Python

تتيح Blogger Data API لتطبيقات العميل عرض محتوى Blogger وتعديله في شكل خلاصات Google Data API.

يمكن لتطبيق العميل استخدام Blogger Data API لإنشاء مشاركات مدونٍ جديدة وتعديل مشاركات المدونين الحالية أو حذفها والبحث عن مشاركات المدونين التي تتطابق مع معايير معيّنة.

بالإضافة إلى تقديم بعض المعلومات الأساسية حول إمكانات واجهة برمجة التطبيقات Data API في Blogger، يقدّم هذا المستند أمثلة على التفاعلات الأساسية مع واجهة برمجة التطبيقات Data API باستخدام مكتبة برمجة تطبيقات Python. إذا كنت مهتمًا بمعرفة المزيد عن الprotocolly الأساسي الذي تستخدمه المكتبة، اطّلِع على قسم البروتوكول في دليل المطوّر هذا.

المحتويات

الجمهور

هذا المستند مخصّص للمبرمجين الذين يريدون كتابة تطبيقات Python العملاء التي يمكنها التفاعل مع Blogger.

يفترض هذا المستند أنّك تفهم الأفكار العامة وراء بروتوكول Google Data APIs.

للحصول على معلومات مرجعية عامة حول Blogger Data API، يُرجى الاطّلاع على دليل مرجعي للبروتوكول.

الخطوات الأولى

للحصول على مساعدة في إعداد مكتبة العميل، يُرجى الاطّلاع على دليل البدء.

تتطلّب مكتبة Python للعملاء استخدام الإصدار 2.2 من Python أو إصدار أحدث. بعد تنزيل مكتبة البرامج، عليك أيضًا تنزيل حزمة ElementTree وتثبيتها.

إنشاء حساب على Blogger

ننصحك بإنشاء حساب على Blogger لأغراض الاختبار. يستخدم Blogger حسابات Google، لذا إذا كان لديك حساب على Google، لن تحتاج إلى إجراء أي إعدادات.

تشغيل نموذج الرمز

يتوفّر نموذج كامل لعمل العميل، يحتوي على جميع نماذج الرموز البرمجية المعروضة في هذا المستند، في ملف BloggerExample.py ضمن الدليل gdata-python-client/samples/blogger/.

ينفِّذ نموذج العميل عدّة عمليات على المدونة المقدَّمة لشرح استخدام Blogger Data API.

يمكنك تشغيل العيّنة باستخدام الوسيطات التالية:

python BloggerExample.py --email [email_address] --password [password]

لاستخدام الأمثلة الواردة في هذا المستند في الرمز البرمجي الخاص بك، ستحتاج إلى import البيانَين التاليَين:

from gdata import service
import gdata
import atom

المصادقة على خدمة Blogger

يمكنك الوصول إلى الخلاصات العامة والخاصة باستخدام Blogger Data API. لا تتطلّب الخلاصات العامة أي مصادقة، ولكنها تكون للقراءة فقط. إذا أردت تعديل المدونات، يجب أن يُجري العميل مصادقة قبل طلب ملفّات الاطّلاع الخاصة. ويمكنه إجراء المصادقة باستخدام أيّ من الطرق الثلاث التالية:مصادقة OAuth أو مصادقة AuthSub باستخدام وكيل أو مصادقة اسم المستخدم/كلمة المرور باستخدام ClientLogin.

لمزيد من المعلومات عن المصادقة باستخدام Google Data APIs بشكل عام، يُرجى الاطّلاع على مستندات مصادقة.

تستند معظم العيّنات في الأقسام اللاحقة من هذا المستند إلى أنّ لديك مثيل GDataService تمّت مصادقته.

مصادقة OAuth

للحصول على مستندات حول مصادقة OAuth باستخدام مكتبة Python GData، يُرجى الاطّلاع على OAuth في مكتبات برمجة تطبيقات Google Data Protocol.

مصادقة الخادم الوكيل لبروتوكول AuthSub

تستخدِم تطبيقات الويب المصادقة الوكيلة عبر AuthSub التي تحتاج إلى مصادقة المستخدمين على حسابات Google. لا يمكن لمشغّل الموقع الإلكتروني ورمز العميل الوصول إلى اسم مستخدم Blogger وكلمة مروره، وبدلاً من ذلك، يحصل العميل على رموز AuthSub خاصة تسمح له بالتصرّف نيابةً عن مستخدم معيّن. للحصول على معلومات أكثر تفصيلاً، يُرجى الاطّلاع على مستندات AuthSub.

عندما يزور مستخدم تطبيقك لأول مرة، لا يكون قد تم مصادقته بعد. في هذه الحالة، عليك عرض بعض المعلومات ورابط يؤدي إلى توجيه المستخدم إلى صفحة على Google لمصادقة طلبك للوصول إلى مدوّناته. توفّر مكتبة برامج Python دالة لإنشاء عنوان URL لصفحة Google. يسترجع الرمز أدناه عنوان URL لصفحة AuthSubRequest:

def GetAuthSubUrl():
  next = 'http://www.example.com/welcome.pyc'
  scope = 'http://www.blogger.com/feeds/'
  secure = False
  session = True
  blogger_service = service.GDataService()
  return blogger_service.GenerateAuthSubURL(next, scope, secure, session);

authSubUrl = GetAuthSubUrl();
print '<a href="%s">Login to your Google account</a>' % authSubUrl

تأخذ الطريقة GenerateAuthSubURL المَعلمات التالية (المتوافقة مع مَعلمات طلب البحث المستخدَمة من قِبل معالِج AuthSubRequest):

التالي
عنوان URL للصفحة التي من المفترض أن تعيد Google توجيه المستخدم إليها بعد المصادقة
نطاق
يشير إلى أنّ التطبيق يطلب رمز مرور للوصول إلى خلاصات Blogger. سلسلة النطاق التي يجب استخدامها هي http://www.blogger.com/feeds/ (بالطبع، تكون مُشفَّرة باستخدام عنوان URL).
آمن
يشير إلى ما إذا كان العميل يطلب رمزًا مميّزًا آمنًا.
جلسة
يشير إلى ما إذا كان يمكن استبدال الرمز المميّز الذي تم إرجاعه برمز مميّز متعدّد الاستخدام (للجلسة).

يعرض المثال أعلاه طلبًا لا يطلب رمز مميّزًا آمنًا (قيمة secure هي False). قد يبدو عنوان URL للطلب الناتج على النحو التالي:

https://www.google.com/accounts/AuthSubRequest?scope=http%3A%2F%2Fwww.blogger.com%2Ffeeds%2F&session=1&secure=0&next=http%3A%2F%2Fwww.example.com%2Fwelcome.pyc

يتّبع المستخدم الرابط المؤدي إلى موقع Google الإلكتروني ويُثبِّت هويته في حسابه على Google.

بعد مصادقة المستخدم، يعيد نظام AuthSub توجيهه إلى عنوان URL الذي حدّدته في مَعلمة طلب البحث next لعنوان URL AuthSubRequest. يُلحق نظام AuthSub رمزًا مميّزًا للمصادقة بهذا العنوان، وذلك بصفته قيمة مَعلمة طلب البحث token. على سبيل المثال:

http://www.example.com/welcome.pyc?token=yourAuthToken

هناك عدة طرق لاسترداد قيمة الرمز المميّز من عنوان URL، على سبيل المثال:

import cgi

parameters = cgi.FieldStorage()
authsub_token = parameters['token']

تمثّل قيمة الرمز المميّز هذا رمزًا مميزًا لبروتوكول AuthSub صالحًا لمرة واحدة. في هذا المثال، بما أنّه تم تحديد session = True، يمكن استبدال هذا الرمز المميّز برمز مميّز لجلسة AuthSub باستخدام طريقة UpgradeToSessionToken، التي تستدعي خدمة AuthSubSessionToken:

blogger_service = service.GDataService()
blogger_service.auth_token = authsub_token
blogger_service.UpgradeToSessionToken()

وهذا يعني أنّك تُمرِّر الرمز المميّز لمرة واحدة إلى UpgradeToSessionToken، وتُعرِض واجهة AuthSub رمزًا مميّزًا للجلسة.

يمكن لتطبيقك بعد ذلك استخدام قيمة رمز الجلسة في التفاعلات التالية مع Blogger. تُرسِل مكتبة العميل الرمز المميّز تلقائيًا مع الطلبات.

مصادقة اسم المستخدم/كلمة المرور في ClientLogin

استخدِم مصادقة ClientLogin إذا كان برنامجك هو برنامج مستقل ومُثبَّت لمستخدم واحد (مثل تطبيق مخصّص لأجهزة الكمبيوتر المكتبي). ما عليك سوى استدعاء ProgrammaticLogin() في مثيل GDataService ، وسيتم إثبات هوية جميع التفاعلات اللاحقة مع Blogger:

blogger_service = service.GDataService('user@example.com', 'secretPassword')
blogger_service.source = 'exampleCo-exampleApp-1.0'
blogger_service.service = 'blogger'
blogger_service.account_type = 'GOOGLE'
blogger_service.server = 'www.blogger.com'
blogger_service.ProgrammaticLogin()

في المقتطف أعلاه، ضبطنا ثلاث خصائص على مثيل GDataService. الأول هو اسم تطبيقنا في الشكل companyName-applicationName-versionID. والثاني هو اسم الخدمة التي نريد التفاعل معها، والثالث هو عنوان الخادم.

يُرجى ملاحظة أنّه تم ضبط account_type على GOOGLE بشكل صريح. سيؤدي عدم ضبط هذه المَعلمة إلى منع مستخدمي G Suite من استخدام واجهة برمجة التطبيقات Blogger API بنجاح.

لمزيد من المعلومات عن مصادقة ClientLogin، بما في ذلك نماذج طلبات واستجابات، يُرجى الاطّلاع على مستندات المصادقة للتطبيقات المثبّتة.

ملاحظة: استخدِم الرمز المميّز نفسه لجميع الطلبات في جلسة معيّنة، ولا تحصل على رمز مميّز جديد لكل طلب في Blogger.

ملاحظة: كما هو موضّح في مستندات ClientLogin ، قد يتعذّر إكمال طلب المصادقة ويُطلب منك حلّ اختبار CAPTCHA. إذا كنت تريد أن تطلب Google من المستخدمين إكمال اختبار CAPTCHA وتعالجه، عليك إرسال المستخدم إلى https://www.google.com/accounts/DisplayUnlockCaptcha?service=blogger (بدلاً من عنوان URL المخصّص لمعالجة اختبار CAPTCHA الوارد في مستندات ClientLogin ).

استرداد قائمة بالمدونات

توفّر Blogger Data API خلاصة تسرد المدونات الخاصة بمستخدم معيّن، وتُعرف هذه الخلاصة باسم "الخلاصة الوصفية".

يستخدم نموذج الرمز البرمجي التالي مثيلًا تمّت مصادقته من GDataService لاسترداد الخلاصة الوصفية ثم يطبع عنوان كل مدوّنة.

def PrintUserBlogTitles(blogger_service):
  query = service.Query()
  query.feed = '/feeds/default/blogs'
  feed = blogger_service.Get(query.ToUri())

  print feed.title.text
  for entry in feed.entry:
    print "\t" + entry.title.text

سجِّل عنوان URL المستخدَم من خلال طريقة Get. هذا هو عنوان URL التلقائي للخلاصة الوصفية، ويعرض قائمة بالمدوّنات للمستخدم الذي تمّت المصادقة عليه حاليًا. للوصول إلى خلاصة لمستخدم مختلف، يمكنك وضع معرّف المستخدم بدلاً من default في عنوان URL للخلاصة الوصفية. معرّف المستخدم هو سلسلة الأرقام التي تظهر في نهاية عنوان URL الخاص بملفه الشخصي.

يوضّح مقتطف الرمز البرمجي أدناه كيفية استخراج معرّف مدوّنة من السلسلة. ستحتاج إلى معرّف المدوّنة لإجراء عمليات الإنشاء والتعديل والحذف على المشاركات والتعليقات. يختار المقتطف أدناه المدونة الأولى التي يتم استرجاعها للمستخدم.

blog_id = feed.entry[0].GetSelfLink().href.split("/")[-1]

في نموذج BloggerExample.py، يتم إنشاء فئة BloggerExample ، ويتم ضبط معرّف المدوّنة في أداة الإنشاء لتسهيل الوصول إليه لاحقًا. في معظم الأمثلة التالية الواردة في هذا المستند، يتم تمرير blog_id كمتغيّر.

إنشاء المشاركات

تتيح لك Blogger Data API إنشاء إدخالات مدوّنة جديدة ونشرها، بالإضافة إلى إنشاء مسودات للإدخالات.

ملاحظة: لا يمكن حاليًا تحديد مؤلف مخصّص للمشاركة. ستظهر جميع المشاركات الجديدة كما لو أنّه تم إنشاؤها من قِبل المستخدم الذي تم مصادقة هويته حاليًا.

نشر مشاركة في مدوّنة

يمكنك استخدام مكتبة Python للعملاء لنشر إدخالات مدوّنة جديدة.

أولاً، أنشئ مثيلًا GDataEntry لتمثيل مشاركة المدونة. يمكنك بعد ذلك ضبط العنوان والمحتوى والسمات الأخرى لمشاركة المدونة. أخيرًا، استخدِم مثيل GDataService لإدراج المشاركة. في ما يلي مثال على كيفية نشر مشاركة جديدة في مدوّنة:

def CreatePublicPost(blogger_service, blog_id, title, content):
  entry = gdata.GDataEntry()
  entry.title = atom.Title('xhtml', title)
  entry.content = atom.Content(content_type='html', text=content)
  return blogger_service.Post(entry, '/feeds/%s/posts/default' % blog_id)

blogEntry = CreatePublicPost(blogger_service, blog_id,
    title='I have the answer', content='Eureka! It is 42!')

إنشاء مسودة لمشاركة مدونة

يتم إنشاء مسودات المشاركات بالطريقة نفسها التي يتم بها إنشاء المشاركات العلنية، ولكن عليك ضبط عنصر الإضافة draft في مثيلGDataEntry. يمكن إنشاء مشاركة المدونة أعلاه كمسودة من خلال إضافة السطور التي تم تمييزها:

def CreateDraftPost(blogger_service, blog_id, title, content):
  entry = gdata.GDataEntry()
  entry.title = atom.Title('xhtml', title)
  entry.content = atom.Content(content_type='html', text=content)

  control = atom.Control()
  control.draft = atom.Draft(text='yes')
  entry.control = control

  return blogger_service.Post(entry, '/feeds/%s/posts/default' % blog_id)

draftEntry = CreateDraftPost(blogger_service, blog_id,
    title='I have the question',
    content='What do you get if you multiply six by nine?')

يمكنك تحويل مسودة حالية لمشاركة مدونة إلى مشاركة منشورة من خلال استرداد مسودة المشاركة وضبط سمة المسودة على no، ثم تعديل المشاركة. سنتناول استرداد المشاركات وتعديلها في القسمين التاليين.

استرداد المشاركات

توضّح الأقسام التالية كيفية استرداد قائمة بمشاركات المدونة، باستخدام ومعلمات طلب البحث بدونها.

يمكنك طلب البحث في خلاصة عامة على Blogger بدون مصادقة. لذلك، لست بحاجة إلى ضبط بيانات الاعتماد أو إجراء مصادقة AuthSub قبل استرداد المشاركات من مدوّنة علنية.

استرداد جميع مشاركات المدونة

لاسترداد مشاركات المستخدم، يمكنك استدعاء الطريقة GetFeed باستخدام عنوان URL لخلاصة مشاركة المدونة:

def PrintAllPosts(blogger_service, blog_id):
  feed = blogger_service.GetFeed('/feeds/' + blog_id + '/posts/default')

  print feed.title.text
  for entry in feed.entry:
    print "\t" + entry.title.text
    print "\t" + entry.content.text
    print "\t" + entry.updated.text
  print

استرداد المشاركات باستخدام مَعلمات طلب البحث

تتيح لك Blogger Data API طلب مجموعة من الإدخالات التي تتطابق مع معايير محدّدة، مثل طلب منشورات مدونة تم نشرها أو تعديلها في نطاق تاريخ معيّن. لإجراء ذلك، يمكنك إنشاء مثيل Query ثم استدعاء الأسلوب Get().

على سبيل المثال، لإرسال طلب بحث حسب النطاق الزمني، اضبط السمتَين published_min وpublished_min لنسخة Query. يطبع مقتطف الرمز التالي عنوان كل مشاركة مدوّنة منشورة بين وقت البدء والوقت المُحدَّد للانتهاء:

def PrintPostsInDateRange(blogger_service, blog_id, start_time='2007-04-01', end_time='2007-04-25'):
  query = service.Query()
  query.feed = '/feeds/' + blog_id + '/posts/default'
  query.published_min = start_time
  query.published_max = end_time
  feed = blogger_service.Get(query.ToUri())

  print feed.title.text + " posts between " + start_time + " and " + end_time
  for entry in feed.entry:
    print "\t" + entry.title.text
    print "\t" + entry.content.text
    print "\t" + entry.updated.text
  print

يُرجى ملاحظة أنّه تمّ إنشاء عنصر Query باستخدام عنوان URL لخلاصة الرسائل نفسه المستخدَم لاسترداد الرسائل.

تتيح Blogger Data API Query الخصائص التالية:

الفئات
تُستخدَم لتحديد الفئات (المعروفة أيضًا باسم التصنيفات) لفلترة نتائج الخلاصة. على سبيل المثال، يعرض http://www.blogger.com/feeds/blogID/posts/default/-/Fritz/Laurie الإدخالات التي تحتوي على الملصقين Fritz وLaurie. لتحديد طلب البحث عن الفئة هذا في مكتبة Python للعملاء، يمكنك استخدام query.categories = ['Fritz','Laurie',]
max_results
الحد الأقصى لعدد الإدخالات التي سيتم عرضها
published_min وpublished_max
الحدّ الأدنى والأعلى لتاريخ نشر الإدخال
start_index
فهرس يستند إلى 1 للنتيجة الأولى التي سيتم استرجاعها (لصفحة البيانات).
updated_min وupdated_max
الحدّ الأقصى لتواريخ تعديل الإدخالات يتم تجاهل مَعلمات طلب البحث هذه ما لم يتم ضبط المَعلمة orderby على updated.

لمزيد من المعلومات عن مَعلمات طلب البحث، اطّلِع على دليل مرجعي لواجهة برمجة تطبيقات Blogger Data API ودليل مرجعي لواجهات برمجة تطبيقات Google Data API.

تعديل المشاركات

لتعديل مشاركة مدوّنة حالية، عليك أولاً استرداد الإدخال الذي تريد تعديله، ثم تعديله، ثم إرساله إلى Blogger باستخدام Put. تعمل المقتطف التالي من الرمز البرمجي على تعديل عنوان مدوّنة ، بافتراض أنّك سبق لك استرداد الإدخال من الخادم.

def UpdatePostTitle(blogger_service, entry_to_update, new_title='The REAL answer'):
  entry_to_update.title = atom.Title('xhtml', new_title)
  return blogger_service.Put(entry_to_update, entry_to_update.GetEditLink().href)

يعرض الرمز أعلاه GDataEntry يحتوي على المقالة المعدَّلة حديثًا بالكامل. لتعديل أيّ سمات أخرى، ما عليك سوى ضبطها في مثيل GDataEntry قبل استدعاء Put.

ملاحظة: لا يمكن حاليًا تعديل بيانات المؤلف المرتبطة بالمواد المتوفّرة في المشاركات.

حذف المشاركات

لحذف مشاركة، مرِّر عنوان URL لتعديل المشاركة إلى طريقة Delete في عنصر GDataService، على النحو التالي:

def DeletePost(blogger_service, edit_link_href):
  blogger_service.Delete(edit_link_href)

التعليقات

تتيح Blogger Data API إنشاء التعليقات واستردادها وحذفها. لا يمكن تعديل التعليقات (ولا تتوفّر هذه الميزة في واجهة الويب).

إنشاء التعليقات

لنشر تعليق، أنشئ عنصرًا من النوع GDataEntry وأدرِجه على النحو التالي:

def CreateComment(blogger_service, blog_id, post_id, comment_text='Mostly harmless'):
  feed_uri = '/feeds/' + blog_id + '/' + post_id + '/comments/default'

  entry = gdata.GDataEntry()
  entry.content = atom.Content(content_type='xhtml', text=comment_text)
  return blogger_service.Post(entry, feed_uri)

ملاحظة: لا يمكنك حاليًا نشر تعليقات إلّا في مدوّنة يملكها المستخدم الذي تمّت مصادقته.

ملاحظة: لا يمكن حاليًا تحديد مؤلف مخصّص للتعليقات. ستظهر جميع التعليقات الجديدة كما لو أنّها من إنشاء المستخدم الذي تمّت مصادقة هويته حاليًا.

استرداد التعليقات

يمكنك استرداد تعليقات مشاركة معيّنة من عنوان URL لخلاصة التعليقات الخاصة بالمشاركة:

def PrintAllComments(blogger_service, blog_id, post_id):
  feed_url = '/feeds/' + blog_id + '/' + post_id + '/comments/default'
  feed = blogger_service.Get(feed_url)

  print feed.title.text
  for entry in feed.entry:
    print "\t" + entry.title.text
    print "\t" + entry.updated.text
  print 

يمكنك أيضًا الحصول على التعليقات من جميع المشاركات باستخدام عنوان URL لخلاصة التعليقات في المدونة:

http://www.blogger.com/feeds/blogID/comments/default

حذف التعليقات

لحذف تعليق، عليك تمرير عنوان URL لتعديل التعليق إلى Delete طريقة على عنصر GDataService على النحو التالي:

def DeleteComment(blogger_service, post_id, comment_id):
  feed_url = '/feeds/' + post_id + '/comments/default/' + comment_id
  blogger_service.Delete(feed_url)

الرجوع إلى الأعلى