Skip to content.

kagome.lab.tkikuchi.net

Sections
Personal tools
You are here: Home » Members » tkikuchi's Home » 使い方など » 例えばニュースの自動投稿
Views

例えばニュースの自動投稿

Document Actions
まとめてユーザ登録した全員に強制的に何か書かせたいとき、ひな形を登録しておいてあげるといいかもしれないとか。
あくまでも例ではあるが、ニュース記事などは、以下のようにして自動投稿できる。

手順としては、

  1. ログインして Cookie を取得する
  2. ニュースオブジェクトを作成して id を取得する
  3. 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]
Created by tkikuchi
Last modified 2005-07-25 11:11
 

Powered by Plone

This site conforms to the following standards: