Views
例えばニュースの自動投稿
まとめてユーザ登録した全員に強制的に何か書かせたいとき、ひな形を登録しておいてあげるといいかもしれないとか。
あくまでも例ではあるが、ニュース記事などは、以下のようにして自動投稿できる。
手順としては、
- ログインして Cookie を取得する
- ニュースオブジェクトを作成して id を取得する
- id のオブジェクトの _edit_form へ、form-data で記事を送信する
form-data 作成のところで、別のユーティリティを使ったのが こちらにもある。
# -*- coding: cp932 -*-
# login simulator
import sys
import re
import time
import urllib
import httplib
import Cookie
import email.Message
host = 'hourglass.tkikuchi.net'
loginurl = 'http://%s/logged_in' % host
user = 'kagome'
password = '********'
submits = {'came_from': 'http://%s/' % host,
'__ac_name': user,
'__ac_password': password,
'submit': 'Log in',
}
# news item の必要データ
news_data = {'title': '犬夜叉危うし',
'description': 'またしても、桔梗に目移りした犬夜叉を狙う、怪しい影',
'text_format': 'structured-text',
'form.button.Save': 'Save',
'form.submitted': '1',
}
text = """\
と、思ったらそれは
- 七宝が化けていた
とか書いてみたりして。
"""
# login して Cookie を貰う
data = urllib.urlencode(submits)
conn = httplib.HTTPConnection(host)
conn.request('POST', loginurl, data)
resp = conn.getresponse()
cookie = resp.getheader('set-cookie')
c = Cookie.Cookie(cookie)
if c.has_key('__ac'):
ac_cookie = c['__ac'].value
else:
print "Can't log in!"
sys.exit()
conn.close()
secret = c['__ac'].value
# news item を作成し id を取得
createurl = 'http://%s/Members/%s/createObject?type_name=News+Item' \
% (host, user)
headers = {'Cookie': '__ac=%s;' % secret}
conn = httplib.HTTPConnection(host)
conn.request('GET', createurl, headers=headers)
resp = conn.getresponse()
redir = resp.getheader('location')
conn.close()
# id を取るところは違うかも知れない
id = redir.split('/')[5]
# multipart/form-data の作成
def multipart(data, text):
m = email.Message.Message()
m['Content-Type'] = 'multipart/form-data'
for k in data.keys():
v = unicode(data[k], 'cp932').encode('utf-8')
p = email.Message.Message()
p['Content-Disposition'] = 'form-data; name=%s' % k
p.set_payload(v)
m.attach(p)
text = unicode(text, 'cp932').encode('utf-8')
p = email.Message.Message()
p['Content-Disposition'] = 'form-data; name=text'
p.set_payload(text)
m.attach(p)
return m
# news の送信
m = multipart(news_data, text)
body = m.as_string().split('\n\n',1)[1]
editurl = 'http://%s/Members/%s/%s/newsitem_edit_form' % (host, user, id)
h = httplib.HTTPConnection(host)
headers = {'Content-Type': m['content-type'],
'Cookie': '__ac=%s;' % secret,
}
conn.request('POST', editurl, body, headers)
resp = conn.getresponse()
print resp.status, resp.reason
#for k in resp.msg.keys():
# print k, resp.msg[k]