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

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

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

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

المحتويات

الجمهور

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

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

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

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

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

تتطلب مكتبة برامج Python توفّر Python 2.2 أو إصدار أحدث. بعد تنزيل مكتبة البرامج، عليك أيضًا تنزيل حزمة 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 باستخدام مكتبة GData في بايثون، يُرجى مراجعة OAuth في مكتبات عميل بروتوكول بيانات Google.

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

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

عندما يزور مستخدم تطبيقك لأول مرة، لا يكون قد تم مصادقته بعد. وفي هذه الحالة، ستحتاج إلى عرض بعض المعلومات ورابط توجيه المستخدم إلى صفحة Google لمصادقة طلبك للدخول إلى مدوناتهم. توفر مكتبة برامج بايثون دالة لإنشاء عنوان 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 خلاصة تسرد المدونات الإلكترونية التي user; تُعرف هذه الخلاصة باسم "الخلاصة".

يستخدم نموذج الرمز البرمجي التالي مثيلًا تمّت مصادقته من 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 استخدام Query التالية. المواقع:

الفئات
يحدد هذا الإعداد الفئات (المعروفة أيضًا باسم التصنيفات) لفلترة نتائج الخلاصة. على سبيل المثال، تعرض الدالة http://www.blogger.com/feeds/blogID/posts/default/-/Fritz/Laurie إدخالات بكل من التصنيفين Fritz وLaurie. لتحديد طلب البحث عن الفئة هذا في مكتبة برامج Python، يمكنك استخدام query.categories = ['Fritz','Laurie',]
max_results
الحد الأقصى لعدد الإدخالات التي سيتم عرضها
منشور_min، post_max
الحدّ الأدنى والأعلى لتاريخ نشر الإدخال
start_index
الفهرس المستند إلى 1 لأول نتيجة يتم استردادها (لتقسيم الصفحة إلى صفحات).
Update_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 بإنشاء التعليقات واستردادها وحذفها. لا تتوفّر إمكانية تعديل التعليقات (ولا تتوفّر على الويب). ).

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

لنشر تعليق، أنشئ عنصرًا من النوع 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)

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