LoglessLove

愛は常に上書き保存 新ブログ→ http://www.loglesslove.net/blog

全体表示

[ リスト ]

真夜中に更新します。でもブログ主は多分寝てます。

ということで、前記事の「手を使わずにアレをする」の種と仕掛けは、PHP の PEAR::HTTP_Client にあります。
このクラスを使って、ページに対して値を渡します。
一つのインスタンスでログイン状態を保持することができますので、適当なブログにログインして書き込むことが可能になります。
ですからやることとしては、「ログインフォームと書き込みフォームに対して、値を送出する」に尽きます。

入力値については、目でソースを見て必要なものを設定します。
送信時(ボタン押下時)に javascript で設定されている値があればそれも追います。
また、スパム対策でフォームの1回のアクセスに対してキーが振られ、hidden で渡すようになっていることがあるので、これを抽出して入力値に加えてやります。

Yahoo! ブログの場合以下のような感じのプログラムで記事を投稿できました。
    /*  前準備 */

    // include_path に PEAR ディレクトリが追加されているものとする
    require_once('HTTP/Client.php');

    $id = 'buroguid';

    $dst_encoding = 'EUC-JP';    // ブログの文字コード
    $src_encoding = 'UTF-8';    // 本プログラムの文字コード

    $login_form = 'http://login.yahoo.co.jp/config/login'; 
    $login_action = 'http://login.yahoo.co.jp/config/login?'; 
    $post_form = 'http://blogs.yahoo.co.jp/' . $id . '/MYBLOG/write.html'; 
    $post_action = 'http://post2.blogs.yahoo.co.jp/' . $id . '/MYBLOG/write_proc.html';

    $key_pattern1 = '/<input type="hidden" [^"]*"\.u"[^v]+value="([^>^"]*)">/';
    $key_pattern2 = '/<input type="hidden" [^"]*"\.challenge"[^v]+value="([^>^"]*)">/';
    $key_pattern3 = '/<input type=["]*hidden["]* [^"]*tmp[^v]+value="([^>^"]*)">/';
    $key_pattern4 = '/<input type=["]*hidden["]* [^"]*crumb[^v]+value="([^>^"]*)">/';

    $login_params = array(
        'login' => $id,
        'passwd' => 'password',
        // ... 以降入力値を追加
    );

    $post_params = array(
        'title'=> '手を使わずにブログを書く実験',
        'content'=> 'この記事はプログラムから生成されました。\n詳細は後ほど手を使って書きます…。',
        // ... 以降入力値を追加
    );
    
    // 文字コードを変換する
    $post_params['title'] = mb_convert_encoding($post_params['title'], $dst_encoding, $src_encoding);
    $post_params['content'] = mb_convert_encoding($post_params['content'], $dst_encoding, $src_encoding);

    // UAも設定できる
    $defaultHeaders = array('User-Agent' => 'Opera/9.25 (Windows NT 5.1; U; ja)');

    /* ブログ記事生成処理 */

    // インスタンスを生成する
    $client =& new HTTP_Client(null, $defaultHeaders); 

    // ログインページで発行されるキーを取得する
    $client->get($login_form);
    $response = $client->currentResponse(); 

    $key1 = getKey($response['body'], $key_pattern1);
    $login_params['.u'] = $key1;
    $key2 = getKey($response['body'], $key_pattern2);
    $login_params['.challenge'] = $key2;

    // ログインする
    $client->post($login_action, $login_params); 
    $response = $client->currentResponse(); 

    // 書き込みページで発行されるキーを取得する
    $client->get($post_form); 
    $response = $client->currentResponse(); 
    $key3 = getKey($response['body'], $key_pattern3);
    $post_params['tmp'] = $key3;
    $key4 = getKey($response['body'], $key_pattern4);
    $post_params['crumb'] = $key4;

    // 書き込む
    $client->post($post_action, $post_params); 

    // 事件現場を確認する
    $client->get('http://blogs.yahoo.co.jp/' . $id); 
    $response = $client->currentResponse(); 
    print $response['body'];

    // キーを取得する関数
    function getKey($body, $pattern) {
        $match = array();
        $key = preg_match($pattern, $body, $match);
        $key = preg_replace($pattern, '$1', $match[0]);
        return $key;
    }
以上は少しでも仕様が変わると無効になります。
input 要素の属性の順番を変えてみたり、" で値を囲むのをやめてみたりされると、もう通用しません。
ただし基本はページに対して値を送るだけですので、こちらのプログラムを変化に強い仕様にするか、仕様変更を人が追いかけるかで、対応可能です。
いたちごっこする人はしてください。ヽ(´ー`)ノ

この記事に

閉じる コメント(0)

コメント投稿

顔アイコン

顔アイコン・表示画像の選択

名前パスワードブログ
絵文字
×
  • オリジナル
  • SoftBank1
  • SoftBank2
  • SoftBank3
  • SoftBank4
  • docomo1
  • docomo2
  • au1
  • au2
  • au3
  • au4
投稿

.


みんなの更新記事