Friday, May 30, 2008

Автоматическая публикация на блогах...

Просто пост на память... (Ну, да, кросс-пост с персонального...) Когда только-только появился Blogger Api, я было очень вдохновился, потратил вечер, и так и не смог вычислить, куда же там засунуть тело поста, поскольку description вылезало в заголовке. С тех пор я теоретически понял, что заголовок, видимо, должен быть в <title>-</title>, а остальное тогда предположительно станет основным тектом поста, но запал уже пропал и проверять на практике стало неинтересно. Тем более, что Гугл и сам признал свои ошибки и обьявил этот API устаревшим -- они теперь используют некий Data API.

А вот на днях, возясь с сайтом своей жены, возникла потребность все-таки перенести посты автоматически, и пришлось все-таки разобраться. Не с Blogger API, а с его наследником Weblog API. Публикую здесь пример на питончике (для простоты и наглядности), поскольку при использовании этого интерфейса есть ряд граблей, на который лучше не наступать. Специфически:

  1. Формат запроса (см. ниже) отнюдь нетривиален
  2. Тело нужно запихивать в base64, если хочется использовать хоть какие таги
  3. Хоть и очевидно, но нужен заголовок запроса Content-Type: text/xml
  4. Формат данных далеко не у всех прогамм-серверов один и тот же, а многие его могут просто не поддерживать.
  5. Дата тоже не у всех серверов присутствует - может придется подкрутить скрипт на вашем сайте руками.

 Ну, и собственно код:

import httplib
import base64
 
def publishPost(title, time, descr):
                descr = base64.b64encode(descr)
                body1 = """
                <?xml version="1.0"?>
                <methodCall>
                   <methodName>metaWeblog.newPost</methodName>
                   <params>
                       <param><value><string>BlogId</string></value></param>
                       <param><value><string>YourUserId</string></value></param>
                       <param><value><string>YourPassword</string></value></param>
                       <param><value><struct>
                   <member><name>title</name><value>"""
                body2 = """</value></member>
                   <member><name>description</name><value><base64>"""
                body3 = """</base64></value></member>
                   <member><name>pubDate</name><value>"""
                body4 = """</value></member>
                                </struct></value></param>
                       <param><value><boolean>true</boolean></value></param> 
                   </params>
                </methodCall>
                """
                body = body1 + title + body2 + descr + body3 + time + body4
                print body
 
                conn = httplib.HTTPConnection("www.YourSite.com")
                headers = {"Content-Type": "text/xml"}
                conn.request("POST", "/path-to-xml-rpc-end-point/xmlrpc.php", body, headers)
                res = conn.getresponse()
 
                # Just to see what's the result
                print "Status: " + str(res.status)
                print "Headers: "
                print res.getheaders()
                print "Body: "
                print res.read()
                conn.close()

publishPost("My test tile", "date-time-in-right-format", "My test body")

Если кому скучно, нечего было досюда читать.

No comments: