パスワードを忘れた? アカウント作成
179056 journal

WindVoiceの日記: すらど日記投稿スクリプト 2

日記 by WindVoice

過去に何人かのかたが同種のスクリプトを書かれている様子ですが、そのまま動作するようなものが見つからなかったので自分でフルスクラッチしました。

これは今作ろうと思っているものの副産物なのですが、他の方の役に立つかもしれないのでソースをそのまま置いておきます。責任は持てませんので、各自ご確認のうえでご使用ください。

もちろん冒頭あたりのユーザ名とパスワードが必要です。それから、私はUTF-8な環境で動作することをテストしました。環境はWindows 7 -> VMware Player -> OpenSolaris 2009.6 -> Perl 5.8.4(とモジュール各種)です。

#!/usr/bin/perl

use strict;

use HTTP::Request::Common qw(POST);
use HTTP::Cookies;
use LWP::UserAgent;

##### いわずと知れたユーザ名とパスワード
my $USERNAME = "someone";
my $PASSWORD = "password";

##### 日記をポストするときのパラメータ類。
# 許容される値は日記投稿ページのHTMLを参照のこと。
my $POSTTYPE        = "2";       # HTML 形式
my $TID             = "91";      # 日記
my $JOURNAL_DISCUSS = "enabled"; # コメント有効
my $PROMOTETYPE     = "post";    # ただの日記

##### 日記の題名を保存したファイル名
my $subjectfile = "./subject.txt";

##### 日記の本文を保存したファイル名
my $contextfile = "./context.txt";

##### Phase 1. データの準備
# 日記のタイトルを読み込む
open( IN, "<".$subjectfile );
my $description = <IN>;
close( IN );
if( length($description) == 0 ){
  die "あれ? 題名が空っぽ?\n";
}
# printf("題名:%s\n", $description);

# 日記の本文を読み込む
open( IN, "<".$contextfile );
my $article = do { local $/; <IN> };
close( IN );
if( length($article) == 0 ){
  die "あれ? 本文が空っぽ?\n";
}
#printf("本文:%s\n", $article);

##### Phase 2. slashdot.jpにログインしてCookieをもらう
my $url = 'http://srad.jp/login.pl';
my %formdata = (
    'unickname'  => $USERNAME,
    'returnto'   => 'http://srad.jp/journal.pl?op=edit',
    'op'         => 'userlogin',
    'upasswd'    => $PASSWORD,
    'login_temp' => 'yes',
    'userlogin'  => 'ログイン' );
my $request = POST( $url, [%formdata]);
my $cookie_jar = HTTP::Cookies->new( file => "./slashdot.cookie", autosave => 1 );
my $ua = LWP::UserAgent->new;
$ua->cookie_jar($cookie_jar);

# ログインページへアクセス!
my $res = $ua->request($request);
# print $res->as_string;  # for debug use

##### Phase 3. 日記ページへジャンプ
$url = 'http://srad.jp/journal.pl?op=edit';
$request = POST( $url );
$res = $ua->request($request);

# 日記ページからreskeyというnameのvalueを取り出す。
# print $res->as_string; # for debug use
my $html = $res->as_string;
my $reskey;
if( $html =~ /name=\"reskey\" value=\"([^\"]+)\"/m ){
  $reskey = $1;
  printf("reskey:%s\n", $reskey);
}else{
  die "日記ページからreskeyが取り出せなかった!\n";
}

##### Phase 4. あわてないあわてない、ひとやすみひとやすみ
printf("sleep 60 seconds.\n");
sleep( 60 );

##### Phase 5. プレビュー画面に遷移
%formdata = (
  'id'              => '',
  'state'           => 'editing',
  'preview'         => 'active',
  'reskey'          => $reskey,
  'description'     => $description,
  'article'         => $article,
  'posttype'        => $POSTTYPE,
  'tid'             => $TID,
  'journal_discuss' => $JOURNAL_DISCUSS,
  'promotetype'     => $PROMOTETYPE,
#  'op_save'         => ' 保存 ' );
  'op_preview'      => 'プレビュー' );

$request = POST( 'http://srad.jp/journal.pl', [%formdata] );
$res = $ua->request($request);
# print $res->as_string;  # for debug use

##### Phase 6. あわてないあわてない、ひとやすみひとやすみ
printf("sleep 60 seconds.\n");
sleep( 60 );

##### Phase 7. 保存する
%formdata = (
  'id'              => '',
  'state'           => 'editing',
  'preview'         => 'active',
  'reskey'          => $reskey,
  'description'     => $description,
  'article'         => $article,
  'posttype'        => $POSTTYPE,
  'tid'             => $TID,
  'journal_discuss' => $JOURNAL_DISCUSS,
  'promotetype'     => $PROMOTETYPE,
  'op_save'         => ' 保存 ' );
#  'op_preview'      => 'プレビュー' );

$request = POST( 'http://srad.jp/journal.pl', [%formdata] );
$res = $ua->request($request);
# print $res->as_string;  # for debug use

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2009年12月29日 21時30分 (#1695758)

    spam日記はこーゆーのを改造してるのでしょうか?
    正直、何の宣伝がしたいのかよくわからん奴が多すぎて意味不明なのですが。

    • by WindVoice (14680) on 2009年12月29日 21時41分 (#1695762) 日記

      日記にもspamがありますか? そうなら同種のものだと思います。日記のポストにはログイン後にもらうcookieを使わないといけないらしいので、このような仕組みを使うか、手作業になります。

      表のストーリーにつくコメントのほうは、ログインも不要ですしたいしたことはしていないんじゃないでしょうか。大体ああいったものは意外に個人的な手作業で行われているものだと思っています。頻度、少ないですしね。

      --
      人生は七転び八起き、一日は早寝早起き
      親コメント
typodupeerror

Stableって古いって意味だっけ? -- Debian初級

読み込み中...