API Dữ liệu Blogger cho phép các ứng dụng khách xem và cập nhật nội dung trên Blogger dưới dạng nguồn cấp dữ liệu API Dữ liệu của Google.
Ứng dụng khách của bạn có thể sử dụng API Dữ liệu Blogger để tạo bài đăng mới trên blog, chỉnh sửa hoặc xoá bài đăng hiện có trên blog và truy vấn các bài đăng trên blog phù hợ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ề tính năng của API dữ liệu Blogger, tài liệu này cung cấp các ví dụ về các lượt 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 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 này dành cho nhà phát triển.
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 các ứng dụng ứng dụng 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á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 trên Blogger, hãy xem Hướng dẫn tham chiếu 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 sử dụng.
Thư viện ứng dụng Python yêu cầu bạn sử dụng phiên bản 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 gói cài đặt ElementTree xuống.
Tạo tài khoản Blogger
Bạn nên đăng ký tài khoản Blogger để tham gia thử nghiệm. Blogger sử dụng Tài khoản Google, do đó, 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 hoạt động đầy đủ, chứa tất cả mã mẫu hiển thị trong tài liệu này, có sẵn 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ạ việc sử dụng API Dữ liệu Blogger.
Bạn có thể chạy mẫu 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 bạn, bạn sẽ cần
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 cách sử dụ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 muốn sửa đổi blog, khách hà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ư. Tính năng này có thể xác thực bằng 1 trong 3 phương thức 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 về việc xác thực bằng API dữ liệu của Google nói chung, hãy xem tài liệu xác thực.
Hầu hết mẫu trong các phần tiếp theo của tài liệu này đều giả định rằng bạn đã có một thực thể GDataService
đã xác thực.
Xác thực OAuth
Để xem tài liệu về việc xác thực OAuth bằng thư viện GPython, hãy xem OAuth trong Thư viện ứng dụng giao thức dữ liệu của Google.
Xác thực proxy AuthSub
Xác thực proxy AuthSub được sử dụng trong các ứng dụng web cần xác thực người dùng với Tài khoản Google. Toán tử trang web và mã ứng dụng khách không có quyền truy cập vào tên người dùng và mật khẩu cho người dùng Blogger; thay vào đó, ứng dụng lấy các mã thông báo AuthSub đặc biệt cho phép ứng dụng hành độ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à một đường liên kết đưa người dùng đến trang 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ã dưới đây 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
lấy các thông số sau
(tương ứng với các thông 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.
- xác định phạm vi của thứ nguyên.
- 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 sẽ sử dụng là
http://www.blogger.com/feeds/
(tất nhiên là mã hoá URL). - bảo mật
- Cho biết ứng dụng có yêu cầu mã thông báo bảo mật hay không.
- phiên hoạt động
- Cho biết liệu mã thông báo được trả về có thể đổi được mã thông báo đa dụng (phiên hoạt động) 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 secure
là False
). 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 đi theo đường liên kết đến trang web của Google và xác thực với Tài khoản Google của họ.
Sau khi người dùng xác thực, hệ thống AuthSub 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ột mã thông báo xác thực vào URL đó, làm 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 là mã thông báo AuthSub dùng một lần. Trong ví dụ này,
do session = True
được chỉ định, nên bạn có thể đổi mã thông báo này thành
mã thông báo phiên AuthSub bằng cách sử dụng phương thức UpgradeToSessionToken
để gọi dịch vụ AuthSubSessionToken
:
blogger_service = service.GDataService() blogger_service.auth_token = authsub_token blogger_service.UpgradeToSessionToken()
Điều này có nghĩa là bạn truyền mã thông báo dùng một lần vào phương thức
UpgradeToSessionToken
, còn giao diện AuthSub 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 trong các lần tương tác tiếp theo với Blogger. Thư viện ứng dụng khách 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 chế độ xác thực ClientLogin nếu ứng dụng của bạn là ứng dụng khách độc lập, người dùng đơn lẻ và được cài đặt" (chẳng hạn như ứng dụng dành cho máy tính). Bạn chỉ cần gọi phương thức ProgrammaticLogin()
trên bản sao GDataService
và mọi 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 sẽ đặt 3 thuộc tính cho phiên bản
GDataService
. Đầu tiên là tên của ứng dụng ở dạng companyName-applicationName-versionID. Thứ hai là tên của dịch vụ mà chúng ta muốn tương tác; thứ ba là địa chỉ máy chủ.
Lưu ý rằng account_type
được đặt thành GOOGLE
một cách rõ ràng. Nếu bạn không đặt thông số này, người dùng G Suite sẽ không thể sử dụng thành công API Blogger.
Để biết thêm thông tin về 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 ứ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 thu thập mã thông báo mới cho từng yêu cầu trên Blogger.
Lưu ý: Như đã mô tả trong tài liệu ClientLogin, yêu cầu xác thực có thể không thành công và yêu cầu xác thực CAPTCHA. Nếu bạn muốn Google đưa ra và xử lý hình ảnh xác thực CAPTCHA, hãy
chuyển người dùng đến
https://www.google.com/accounts/DisplayUnlockCaptcha?service=blogger
(thay vì đến URL xử lý hình ảnh xác thực (CAPTCHA) đã cung cấp trong tài liệu
ClientLogin.
Truy xuất danh sách blog
API Dữ liệu của Blogger cung cấp nguồn cấp dữ liệu liệt kê các blog cho 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 phiên bản GDataService
đã xác thực để truy xuất 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
Hãy lưu ý URL được phương thức Get
sử dụng. Đây là URL metafeed mặc định; URL này trả về danh sách các blog cho người dùng hiện đang được xác thực.
Để truy cập vào nguồn cấp dữ liệu cho một người dùng khác, bạn có thể đặt mã nhận dạng của người dùng đó vào vị trí default
trong URL nguồn cấp 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ã 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á đối với 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ã blog được đặt trong hàm dựng để dễ dàng
truy cập sau này. Trong hầu hết ví dụ sau, tài liệu này được truyền dưới dạng biến blog_id
.
Tạo bài đăng
API Dữ liệu của Blogger cho phép bạn tạo và xuất bản các mục nhập mới trên blog, cũng như việc tạo các mục nhập bản nháp.
Lưu ý: Tính năng đặt tác giả tùy chỉnh cho bài đăng hiện không được hỗ trợ. Tất cả bài đăng mới sẽ xuất hiện như thể chúng được tạo bởi người dùng hiện đã xác thực.
Đăng bài trên blog
Bạn có thể dùng thư viện ứng dụng Python để xuất bản các mục nhập 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 phiên bản thể hiện của GDataService
để chèn bài đăng đó. Sau đây là ví dụ về cách xuất bản một bài đăng mới trên blog:
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
Các bài đăng nháp được tạo theo cách tương tự như các bài đăng công khai, nhưng bạn cần đặt
phần tử mở rộng draft
trong bản sao GDataEntry
. Bạn có thể tạo bài đăng trên blog dưới dạng bản nháp bằng cách thêm các dòng được đánh dấu:
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 bài đăng nháp hiện có trên blog thành một bài đăng đã xuất bản bằng cách truy xuất bài đăng nháp, đặt thuộc tính nháp cho no
rồi cập nhật bài đăng. Chúng tôi sẽ đề cập đến việc truy xuất và cập nhật bài đăng trong hai phần tiếp theo.
Đang truy xuất bài đăng
Các phần sau đây mô tả cách truy xuất danh sách các 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 trên Blogger mà không cần xác thực. Do đó, bạn không cần đặt thông tin đăng nhập hoặc xác thực AuthSub trước khi truy xuất các bài đăng trên 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
với URL của 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 cách sử dụng tham số truy vấn
API Dữ liệu của Blogger cho phép bạn yêu cầu một tập hợp các mục nhập phù hợp với các tiêu chí
đã chỉ định, chẳng hạn như yêu cầu các bài đăng trên blog đã được phát hành hoặc cập nhật trong một phạm vi
ngày cụ thể. Để thực hiện việc này, bạn tạo một phiên bản Query
rồi gọi phương thức Get()
.
Ví dụ: để gửi một truy vấn phạm vi ngày, hãy đặt các thuộc tính published_min
và published_min
của phiên bản Query
.
Đoạn mã sau đây in tiêu đề và nội dung của từng bài đăng trên blog
được xuất bản giữa thời gian bắt đầu và thời gian kết thúc nhất định:
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 xây dựng bằng cách sử dụng cùng một URL nguồn cấp dữ liệu bài đăng dùng để truy xuất bài đăng.
API Dữ liệu của Blogger hỗ trợ các thuộc tính Query
sau:
- categories
- Chỉ định danh mục (còn gọi là nhãn) để lọc kết quả trong 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ãnFritz
vàLaurie
. Để chỉ định truy vấn danh mục đó trong thư viện ứng dụng Python, bạn có thể sử dụngquery.categories = ['Fritz','Laurie',]
- max_results
- Số mục nhập tối đa cần trả về.
- đã_công bố_tối thiểu, đã xuất bản_tối đa
- Giới hạn ngày xuất bản.
- chỉ_bắt_đầu
- Chỉ mục dựa trên 1 của kết quả đầu tiên được 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 bị bỏ qua trừ khi tham số
orderby
được đặt thànhupdated
.
Để 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 Blogger và Hướng dẫn tham khảo API dữ liệu của Google.
Đang cập nhật bài đăng
Để cập nhật một bài đăng hiện có trên blog, trước tiên, bạn truy xuất mục mà bạn muốn cập nhật, sau đó sửa đổi bài đăng đó rồi gửi đế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 trên blog, giả sử bạn đã truy xuất mục đó 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 các thuộc tính khác, bạn chỉ cần đặt các thuộc tính này trong thực thể GDataEntry
trước khi gọi Put
.
Lưu ý: Tính năng sửa đổi dữ liệu tác giả liên kết với các bài đăng hiện không được hỗ trợ.
Đang xóa bài đăng
Để xoá 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
, có dạng như sau:
def DeletePost(blogger_service, edit_link_href): blogger_service.Delete(edit_link_href)
Bình luận
API Dữ liệu của Blogger cho phép tạo, truy xuất và xóa bình luận. Tính năng cập nhật nhận xét 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 blog mà người dùng đã xác thực sở hữu.
Lưu ý: Chúng tôi hiện không hỗ trợ việc cài đặt tác giả tùy chỉnh cho nhận xét. Tất cả nhận xét mới sẽ xuất hiện như thể chúng được tạo bởi người dùng hiện đã xác thực.
Truy xuất nhận xét
Bạn có thể truy xuất nhận xét cho bài đăng cụ thể từ URL của nguồn cấp dữ liệu bình luận về 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ể nhận 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 trên blog:
http://www.blogger.com/feeds/blogID/comments/default
Đang xoá nhận xét
Để xoá một nhận xét, hãy chuyển URL chỉnh sửa của nhận xét đó vào 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)