Hướng dẫn dành cho nhà phát triển: Python

API Dữ liệu Blogger cho phép các ứng dụng khách xem và cập nhật nội dung Blogger dưới dạng nguồn cấp dữ liệu API Google Data.

Ứng dụng khách của bạn có thể sử dụng API Dữ liệu Blogger để tạo bài đăng trên blog mới, chỉnh sửa hoặc xoá bài đăng trên blog hiện có và truy vấn các bài đăng trên blog khớp với tiêu chí cụ thể.

Ngoài việc cung cấp một số thông tin cơ bản về các chức năng của API Dữ liệu Blogger, tài liệu này còn cung cấp các ví dụ về các hoạt động tương tác cơ bản với API Dữ liệu bằng cách sử dụng thư viện ứng dụng Python. Nếu bạn muốn tìm hiểu thêm về giao thức cơ bản mà thư viện sử dụng, hãy xem phần Giao thức trong hướng dẫn dành cho nhà phát triển này.

Nội dung

Đối tượng

Tài liệu này dành cho các lập trình viên muốn viết ứng dụng ứng dụng khách Python có thể tương tác với Blogger.

Tài liệu này giả định rằng bạn hiểu các ý tưởng chung đằng sau giao thức API Dữ liệu của Google.

Để biết thông tin tham khảo chung về API Dữ liệu Blogger, hãy xem Hướng dẫn tham khảo về giao thức.

Bắt đầu

Để được trợ giúp thiết lập thư viện ứng dụng, hãy xem Hướng dẫn bắt đầu.

Thư viện ứng dụng Python yêu cầu Python 2.2 trở lên. Sau khi tải thư viện ứng dụng xuống, bạn cũng cần tải và cài đặt gói ElementTree.

Tạo tài khoản Blogger

Bạn nên đăng ký một tài khoản Blogger để thử nghiệm. Blogger sử dụng Tài khoản Google, vì vậy, nếu bạn đã có Tài khoản Google, thì bạn đã sẵn sàng.

Chạy mã mẫu

Một ứng dụng mẫu đầy đủ đang hoạt động, chứa tất cả mã mẫu hiển thị trong tài liệu này, có trong tệp BloggerExample.py, trong thư mục gdata-python-client/samples/blogger/.

Ứng dụng mẫu thực hiện một số thao tác trên blog được cung cấp để minh hoạ cách sử dụng API Dữ liệu Blogger.

Bạn có thể chạy mẫu này với các đối số sau:

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

Để sử dụng các ví dụ trong tài liệu này trong mã của riêng mình, bạn cần có các câu lệnh import sau:

from gdata import service
import gdata
import atom

Xác thực với dịch vụ Blogger

Bạn có thể truy cập vào cả nguồn cấp dữ liệu công khai và riêng tư bằng Blogger Data API. Nguồn cấp dữ liệu công khai không yêu cầu xác thực, nhưng chỉ có thể đọc. Nếu bạn muốn chỉnh sửa blog, thì ứng dụng của bạn cần xác thực trước khi yêu cầu nguồn cấp dữ liệu riêng tư. Phương thức này có thể xác thực bằng bất kỳ phương pháp nào trong số ba phương pháp sau:xác thực OAuth, xác thực proxy AuthSub hoặc xác thực tên người dùng/mật khẩu ClientLogin.

Để biết thêm thông tin chung về việc xác thực bằng API Dữ liệu của Google, hãy xem tài liệu về xác thực.

Hầu hết các mẫu trong các phần tiếp theo của tài liệu này giả định rằng bạn có một thực thể GDataService đã được xác thực.

Xác thực OAuth

Để biết tài liệu về việc xác thực OAuth bằng thư viện GData Python, vui lòng xem phần OAuth trong Thư viện ứng dụng giao thức Google Data.

Xác thực proxy AuthSub

Phương thức xác thực proxy AuthSub được các ứng dụng web sử dụng khi cần xác thực người dùng với Tài khoản Google. Nhà điều hành trang web và mã ứng dụng không có quyền truy cập vào tên người dùng và mật khẩu của người dùng Blogger; thay vào đó, ứng dụng sẽ nhận được mã thông báo AuthSub đặc biệt cho phép ứng dụng thay mặt cho một người dùng cụ thể. Để biết thêm thông tin chi tiết, hãy xem tài liệu về AuthSub.

Khi người dùng truy cập vào ứng dụng của bạn lần đầu tiên, họ chưa được xác thực. Trong trường hợp này, bạn cần hiển thị một số thông tin và đường liên kết dẫn người dùng đến một trang của Google để xác thực yêu cầu truy cập vào blog của họ. Thư viện ứng dụng Python cung cấp một hàm để tạo URL của trang Google. Mã bên dưới truy xuất URL của trang 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

Phương thức GenerateAuthSubURL sẽ nhận các tham số sau (tương ứng với các tham số truy vấn mà trình xử lý AuthSubRequest sử dụng):

tiếp theo
URL của trang mà Google sẽ chuyển hướng người dùng đến sau khi xác thực.
phạm vi
Cho biết ứng dụng đang yêu cầu mã thông báo để truy cập vào nguồn cấp dữ liệu Blogger. Chuỗi phạm vi cần sử dụng là http://www.blogger.com/feeds/ (tất nhiên là được mã hoá URL).
bảo mật
Cho biết liệu ứng dụng khách có đang yêu cầu mã thông báo bảo mật hay không.
phiên
Cho biết liệu mã thông báo được trả về có thể được đổi lấy mã thông báo nhiều lần sử dụng (phiên) hay không.

Ví dụ trên cho thấy một lệnh gọi không yêu cầu mã thông báo bảo mật (giá trị của secureFalse). URL yêu cầu thu được có thể có dạng như sau:

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

Người dùng nhấp vào đường liên kết đến trang web của Google và xác thực vào Tài khoản Google của họ.

Sau khi người dùng xác thực, hệ thống AuthSub sẽ chuyển hướng họ đến URL mà bạn chỉ định trong tham số truy vấn next của URL AuthSubRequest. Hệ thống AuthSub sẽ thêm mã thông báo xác thực vào URL đó, dưới dạng giá trị của tham số truy vấn token. Ví dụ:

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

Có một số cách để truy xuất giá trị mã thông báo từ URL; ví dụ:

import cgi

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

Giá trị mã thông báo này đại diện cho một mã thông báo AuthSub dùng một lần. Trong ví dụ này, vì session = True đã được chỉ định, nên mã thông báo này có thể được trao đổi lấy mã thông báo phiên AuthSub bằng phương thức UpgradeToSessionToken. Phương thức này sẽ gọi dịch vụ AuthSubSessionToken:

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

Tức là bạn truyền mã thông báo dùng một lần vào phương thức UpgradeToSessionToken và giao diện AuthSub sẽ trả về một mã thông báo phiên.

Sau đó, ứng dụng của bạn có thể sử dụng giá trị mã thông báo phiên trong các lượt tương tác tiếp theo với Blogger. Thư viện ứng dụng sẽ tự động gửi mã thông báo cùng với các yêu cầu.

Xác thực tên người dùng/mật khẩu ClientLogin

Sử dụng phương thức xác thực ClientLogin nếu ứng dụng của bạn là một ứng dụng "đã cài đặt", độc lập, dành cho một người dùng (chẳng hạn như ứng dụng máy tính). Bạn chỉ cần gọi phương thức ProgrammaticLogin() trên thực thể GDataService và tất cả các lượt tương tác tiếp theo với Blogger sẽ được xác thực:

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()

Trong đoạn mã trên, chúng ta đặt ba thuộc tính trên thực thể GDataService. Phần đầu tiên là tên ứng dụng của chúng ta ở dạng companyName-applicationName-versionID. Phần thứ hai là tên của dịch vụ mà chúng ta muốn tương tác; phần thứ ba là địa chỉ của máy chủ.

Lưu ý rằng account_type được đặt rõ ràng thành GOOGLE. Nếu không đặt tham số này, người dùng G Suite sẽ không thể sử dụng thành công Blogger API.

Để biết thêm thông tin về quy trình xác thực ClientLogin, bao gồm cả các yêu cầu và phản hồi mẫu, hãy xem tài liệu Xác thực cho ứng dụng đã cài đặt.

Lưu ý: Sử dụng cùng một mã thông báo cho tất cả các yêu cầu trong một phiên nhất định; không lấy mã thông báo mới cho mỗi yêu cầu Blogger.

Lưu ý: Như mô tả trong tài liệu về ClientLogin, yêu cầu xác thực có thể không thành công và yêu cầu một thử thách CAPTCHA. Nếu bạn muốn Google đưa ra và xử lý thử thách CAPTCHA, hãy chuyển người dùng đến https://www.google.com/accounts/DisplayUnlockCaptcha?service=blogger (thay vì URL xử lý CAPTCHA được cung cấp trong tài liệu ClientLogin).

Truy xuất danh sách blog

API Dữ liệu Blogger cung cấp một nguồn cấp dữ liệu liệt kê các blog của một người dùng cụ thể; nguồn cấp dữ liệu đó được gọi là "metafeed".

Mã mẫu sau đây sử dụng một thực thể GDataService đã xác thực để truy xuất nguồn cấp dữ liệu siêu dữ liệu, sau đó in tiêu đề của từng blog.

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

Lưu ý URL mà phương thức Get sử dụng. Đây là URL nguồn cấp dữ liệu siêu mặc định; URL này trả về danh sách blog cho người dùng hiện đã xác thực. Để truy cập vào nguồn cấp dữ liệu của một người dùng khác, bạn có thể đặt mã nhận dạng của người dùng đó thay cho default trong URL nguồn cấp dữ liệu siêu dữ liệu. Mã nhận dạng của người dùng là chuỗi chữ số ở cuối URL hồ sơ của người dùng.

Đoạn mã dưới đây minh hoạ cách trích xuất mã nhận dạng blog từ nguồn cấp dữ liệu. Bạn sẽ cần mã blog để thực hiện các thao tác tạo, cập nhật và xoá bài đăng và bình luận. Đoạn mã dưới đây chọn blog đầu tiên được truy xuất cho người dùng.

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

Trong mẫu BloggerExample.py, một lớp BloggerExample sẽ được tạo và mã nhận dạng blog sẽ được đặt trong hàm khởi tạo để dễ dàng truy cập sau này. Đối với hầu hết các ví dụ sau trong tài liệu này, blog_id được truyền vào dưới dạng một biến.

Tạo bài đăng

Blogger Data API cho phép bạn tạo và xuất bản các mục mới trên blog, cũng như tạo bản nháp của các mục.

Lưu ý: Chúng tôi hiện chưa hỗ trợ tính năng đặt tác giả tuỳ chỉnh cho bài đăng. Tất cả bài đăng mới sẽ xuất hiện như thể chúng do người dùng hiện đã xác thực tạo.

Xuất bản bài đăng trên blog

Bạn có thể sử dụng thư viện ứng dụng Python để xuất bản các mục mới trên blog.

Trước tiên, hãy tạo một thực thể GDataEntry để biểu thị bài đăng trên blog. Sau đó, bạn có thể đặt tiêu đề, nội dung và các thuộc tính khác của bài đăng trên blog. Cuối cùng, hãy sử dụng thực thể GDataService để chèn bài đăng. Dưới đây là ví dụ về cách xuất bản một bài đăng trên blog mới:

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!')

Tạo bài đăng nháp trên blog

Bài đăng nháp được tạo giống như bài đăng công khai, nhưng bạn cần đặt thành phần mở rộng draft trong thực thể GDataEntry. Bạn có thể tạo bài đăng trên blog ở trên dưới dạng bản nháp bằng cách thêm các dòng được làm nổi bật:

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?')

Bạn có thể chuyển một bài đăng trên blog ở dạng bản nháp hiện có thành bài đăng đã xuất bản bằng cách truy xuất bài đăng ở dạng bản nháp, đặt thuộc tính bản nháp thành no, sau đó cập nhật bài đăng. Chúng ta sẽ tìm hiểu cách truy xuất và cập nhật bài đăng trong hai phần tiếp theo.

Truy xuất bài đăng

Các phần sau đây mô tả cách truy xuất danh sách bài đăng trên blog, có và không có tham số truy vấn.

Bạn có thể truy vấn nguồn cấp dữ liệu công khai của Blogger mà không cần xác thực. Do đó, bạn không cần đặt thông tin xác thực hoặc xác thực AuthSub trước khi truy xuất bài đăng từ một blog công khai.

Truy xuất tất cả bài đăng trên blog

Để truy xuất bài đăng của người dùng, hãy gọi phương thức GetFeed bằng URL nguồn cấp dữ liệu bài đăng trên blog:

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

Truy xuất bài đăng bằng tham số truy vấn

API Dữ liệu Blogger cho phép bạn yêu cầu một tập hợp các mục phù hợp với tiêu chí đã chỉ định, chẳng hạn như yêu cầu bài đăng trên blog được xuất bản hoặc cập nhật trong một phạm vi ngày nhất định. Để thực hiện việc này, bạn tạo một thực thể Query rồi gọi phương thức Get().

Ví dụ: để gửi truy vấn theo phạm vi ngày, hãy đặt thuộc tính published_minpublished_min của thực thể Query. Đoạn mã sau đây sẽ in tiêu đề và nội dung của từng bài đăng trên blog được xuất bản trong khoảng thời gian bắt đầu và kết thúc đã cho:

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

Lưu ý rằng đối tượng Query được tạo bằng chính URL nguồn cấp dữ liệu bài đăng dùng để truy xuất bài đăng.

API Dữ liệu Blogger hỗ trợ các thuộc tính Query sau:

danh mục
Chỉ định danh mục (còn gọi là nhãn) để lọc kết quả của nguồn cấp dữ liệu. Ví dụ: http://www.blogger.com/feeds/blogID/posts/default/-/Fritz/Laurie trả về các mục có cả nhãn FritzLaurie. Để chỉ định truy vấn danh mục đó trong thư viện ứng dụng Python, bạn có thể sử dụng query.categories = ['Fritz','Laurie',]
max_results
Số mục nhập tối đa cần trả về.
published_min, published_max
Giới hạn về ngày xuất bản mục nhập.
start_index
Chỉ mục dựa trên 1 của kết quả đầu tiên cần truy xuất (để phân trang).
updated_min, updated_max
Giới hạn về ngày cập nhật mục nhập. Các tham số truy vấn này sẽ bị bỏ qua trừ khi tham số orderby được đặt thành updated.

Để biết thêm thông tin về các tham số truy vấn, hãy xem Hướng dẫn tham khảo API dữ liệu của BloggerHướng dẫn tham khảo API dữ liệu của Google.

Cập nhật bài đăng

Để cập nhật một bài đăng trên blog hiện có, trước tiên, bạn truy xuất mục bạn muốn cập nhật, sau đó sửa đổi mục đó rồi gửi mục đó đến Blogger bằng phương thức Put. Đoạn mã sau đây sửa đổi tiêu đề của một mục nhập trên blog, giả sử rằng bạn đã truy xuất mục nhập đó từ máy chủ.

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)

Mã ở trên trả về một GDataEntry chứa toàn bộ bài đăng mới cập nhật. Để cập nhật bất kỳ thuộc tính nào khác, bạn chỉ cần đặt các thuộc tính đó trong bản sao GDataEntry trước khi gọi Put.

Lưu ý: Hiện tại, chúng tôi không hỗ trợ việc sửa đổi dữ liệu tác giả liên kết với bài đăng.

Xoá bài đăng

Để xoá một bài đăng, hãy truyền URL chỉnh sửa của bài đăng đó đến phương thức Delete trên đối tượng GDataService, như sau:

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

Bình luận

Blogger Data API cho phép tạo, truy xuất và xoá bình luận. Tính năng cập nhật bình luận không được hỗ trợ (cũng không có trong giao diện web).

Tạo nhận xét

Để đăng bình luận, hãy tạo một đối tượng GDataEntry và chèn đối tượng đó như sau:

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)

Lưu ý: Hiện tại, bạn chỉ có thể đăng bình luận lên một blog do người dùng đã xác thực sở hữu.

Lưu ý: Chúng tôi hiện không hỗ trợ tính năng đặt tác giả tuỳ chỉnh cho bình luận. Tất cả nhận xét mới sẽ xuất hiện như thể chúng do người dùng hiện đã được xác thực tạo ra.

Truy xuất bình luận

Bạn có thể truy xuất các bình luận cho một bài đăng cụ thể từ URL nguồn cấp dữ liệu bình luận của bài đăng đó:

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 

Hoặc bạn có thể lấy bình luận từ tất cả bài đăng bằng cách sử dụng URL nguồn cấp dữ liệu bình luận của blog:

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

Xoá bình luận

Để xoá một bình luận, hãy truyền URL chỉnh sửa của bình luận đó đến phương thức Delete trên đối tượng GDataService như sau:

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

Trở lại đầu trang