- EldarProxy's Blog
- Log in to post comments
Просто пост на память... Когда только-только появился Blogger Api, я было очень вдохновился, потратил вечер, и так и не смог вычислить, куда же там засунуть тело поста, поскольку description вылезало в заголовке. С тех пор я теоретически понял, что заголовок, видимо, должен быть в <title>-</title>, а остальное тогда предположительно станет основным тектом поста, но запал уже пропал и проверять на практике стало неинтересно. Тем более, что Гугл и сам признал свои ошибки и обьявил этот API устаревшим -- они теперь используют некий Data API.
А вот на днях, возясь с сайтом своей жены, возникла потребность все-таки перенести посты автоматически, и пришлось все-таки разобраться. Не с Blogger API, а с его наследником Weblog API. Публикую здесь пример на питончике (для простоты и наглядности), поскольку при использовании этого интерфейса есть ряд граблей, на который лучше не наступать. Специфически:
- Формат запроса (см. ниже) отнюдь нетривиален
- Тело нужно запихивать в base64, если хочется использовать хоть какие таги
- Хоть и очевидно, но нужен заголовок запроса Content-Type: text/xml
- Формат данных далеко не у всех прогамм-серверов один и тот же, а многие его могут просто не поддерживать.
- Дата тоже не у всех серверов присутствует - может придется подкрутить скрипт на вашем сайте руками.
Ну, и собственно код:
import httplib
import base64def 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 bodyconn = 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")
Если кому скучно, нечего было досюда читать.