スポンサーサイト

Tags :
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

FC2Blogに画像をアップロードするAppleScriptが動作するかをチェックするスクリプト書いた

ちょっと前に
ドラッグ&ドロップでFC2ブログに複数の画像をまとめてアップロードするAppleScript その4
てのを書きましたが、先週あたりにFC2Blogの管理画面がアップデートされて、アップロードする画像を選択するフォームが複数表示されるように変更された為(どうせなら、はてなfotolifeみたいにダイアログ中で複数選択出来る様にすれば良いのに)、スクレイピングに頼っている部分が動作しなくなっていたので元エントリのスクリプトを更新しておきました。

で、今回も使ってる方からの報告で動作しなくなってるのを知ったんですが、そちらに頼ってばっかりなのも何なので、上記のAppleScriptが動作するかどうかをチェックして、もし動作しなくなる様なFC2Blogの仕様変更があった場合にはメールで知らせるようなスクリプトをPythonで書いてcronで回す事にしました。AppleScriptで書いても良かったんですけど、cronで動かすのでほぼ常時電源の入ってるLinux PCで使える様に。

やってる事は、上記のAppleScriptと同じ方法でアップロードを試みて、失敗するとSubjectにどの処理で失敗したのか、本文はその時サーバから返って来たHTMLを入れて自分宛にメールを送ります。始めはサーバとやり取りするのにurllib2を使って書いてたんですが、画像等の『multipart/form-data』をすんなりPOST出来ない感じだったので、手っ取り早くcurlコマンドをpopen2モジュールで呼び出して処理しています。
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys, re
import smtplib
from popen2 import popen3
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate
from BeautifulSoup import BeautifulSoup

#SMTPでメールを送信
def send_mail(subject, body):
    from_addr = 'sender@example.com'
    to_addr = 'receiver@example.com'
    encoding = 'ISO-2022-JP'

    #メッセージを生成
    msg = MIMEText(body.encode(encoding), 'plain', encoding)
    msg['Subject'] = Header(subject, encoding)
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()

    #送信
    s = smtplib.SMTP("localhost")
    s.sendmail(from_addr, [to_addr], msg.as_string())
    s.close()


#コマンドを実行し処理結果を返す
def popen(cmd):
    stdout, stdin, stderr = popen3(cmd)    
    rep = []
    for line in stdout: rep.append(line)
    return ''.join(rep)


def main():
    blogurl = 'http://MY_ACCOUNT.blog80.fc2.com/admin.php'
    uploadurl = 'http://blog80.fc2.com/control.php'
    passwd = 'MY_PASSWORD'
    id = 'MY_ACCOUNT'
    testfile = 'fc2blog_uploadtest.jpg'
    cookiefile = 'fc2uploader_cookie.txt'
    title = 'FC2Blog_uploadchaecker'
    
    #ログイン処理
    cmd  = 'curl -d "id=%s&pass=%s&mode=admin&mode=logging&process=in" -c "%s" -L "%s" | tail -n 300' % (id, passwd, cookiefile, blogurl)
    rep = popen(cmd)
    for line in rep.splitlines():
        if  'input type="password"' in line:
            send_mail(u'%s : ログインに失敗' % title, unicode(rep, 'EUC-JP'))
            sys.exit(0)

    #アップロード時にPOSTするcrcの値を取得
    cmd = 'curl -b %s -d "mode=control&process=upload" -L "%s" | grep \'name="crc"\' | sed \'s/\t*<input.*value=\"//\' | sed \'s/".*\'//' % (cookiefile, blogurl)
    rep = popen(cmd)
    crc =  rep.splitlines()[1]
    if crc == '':
        send_mail(u'%s : crc値の取得に失敗' % title, stdout.read())
        sys.exit()

    #テスト用画像をアップロード
    cmd  = 'curl -b %s -F "upfile[0]=@%s" -F mode=control -F process=upload -F width=200 -F height=200 -F overwrite=force -F type=upload -F crc=%s -F insert="" -L "%s"' % (cookiefile, testfile, crc, uploadurl)
    rep = popen(cmd)
    result = False
    for line in rep.splitlines():
        if testfile in line:
            result = True
    if result == True:
        #アップロード成功の場合
        soup = BeautifulSoup(rep)
        td = soup.find('td', 'manage')
        try:
            #ファイル削除用のcrc値、ファイルIDを取得
            m = re.search('fileno=([0-9]+)&crc=([0-9a-z]+)', str(td))
            fileno = m.group(1)
            crc = m.group(2)
            print fileno, crc
            #テスト用ファイルを削除
            cmd = 'curl -b %s -F mode=control -F process=upload -F type=delete -F no=%s -F crc=%s -F page=1 -F tail= -F sort=dd -L "%s"' % (cookiefile, fileno, crc, uploadurl)
            popen(cmd)
        except AttributeError:
            #ファイル削除用のcrc値、ファイルIDを取得出来ない場合
            send_mail(u'%s : 削除用ファイルID,crcの取得に失敗' % title, unicode(rep, 'EUC-JP'))
            sys.exit()
        #テスト用画像が削除出来ているかをチェック
        cmd = 'curl -b %s -d "mode=control&process=upload" -L "%s"' % (cookiefile, blogurl)
        rep = popen(cmd)
        for line in rep.splitlines():
            if testfile in line:
                send_mail(u'%s : ファイルの削除に失敗' % title, unicode(rep, 'EUC-JP'))
                sys.exit()
        send_mail(u'%s : 正常終了' % title, unicode(rep, 'EUC-JP'))
    else:
        #アップロード失敗
        send_mail(u'%s : ファイルのアップロードに失敗' % title, unicode(rep, 'EUC-JP'))
                
if __name__ == '__main__':
    main()
スポンサーサイト

ドラッグ&ドロップでFC2ブログに複数の画像をまとめてアップロードするAppleScript その4

以前のエントリで公開していた、ドラッグ&ドロップでFC2Blogに複数の画像をまとめてアップロードするAppleScriptの改良版です。

こちらのエントリからのトラックバックを受けて気が付いたんですが(ご指摘ありがとうございます)、去年のFC2Blogのリニューアルで管理画面の仕様が変わったため、アップロード用のスクリプトが動作しなくなっていました。

いやまあ作った本人が言うのも何ですが、ついこの間まで自宅にOSX使える環境が無くて、このスクリプトも自分では全然使ってなかったんですよね…。

ただ、利用しておられる方も少なからずいらっしゃるので、早速新しい管理画面に対応した改良版を作りました。


■使い方
・まず、スクリプトエディタにこのスクリプトをコピペして、9行目『ユーザ名』の部分を書き換えます。
・必要に応じてその下の、サムネイルを作成するかどうか、サムネイルのサイズ、同名ファイルがあった場合上書きするか、の項目を書き換えます。
・スクリプトを『アプリケーション』として保存します。
・アプリケーションとして保存したスクリプト(ドロップレット)にアップロードする画像をドロップします。
・ダイアログが表示されるので、ログインする時のパスワードを入力します。
・……しばらく待つ
・終了を知らせるダイアログが表示されます。

FC2ブログにアップロード出来ない種類のファイル(.psdや.xlsなど)をアップロードしようとしても、エラーなどは表示されず、ただ何もアップロードされずに終了します。

スクリプトを実行すると、ホームディレクトリ以下の『ライブラリ/Cookies』フォルダにサーバとのやり取りに使うCookieを保存したファイル『fc2uploader_cookie.txt』が作られます。削除されてもスクリプトを実行する度に作成されます。

■注意点
Safariを使用している方は、保存時にエラーが出る場合スクリプト中の『円マーク』を『バックスラッシュ』に置換してください。

■2009.3.20追記
FC2Blogが複数アップロード対応になったため動作しなくなっていたのを修正。

■2013.6.19追記
FC2Blogの仕様変更でスクリプトが動作しなくなっていたのを修正。

■動作確認
MacOSX 10.5.6
(*
ユーザー毎の初期設定
*)

--管理画面のURL
property myURL : "http://admin.blog.fc2.com/control.php"

--ユーザ名、もしくは登録しているメールアドレスを入れる ※必ず書き換えてください
property myID : "『ユーザ名』"

--アップロード時に自動的にサムネイルを作成するか(offの場合は""にする)
property createThumb : "on"

--アップロード時に作成されるサムネイルのサイズ(幅・高さ)
property thumbWidth : 250
property thumbHeight : 250

--同名のファイルが既にある場合、上書きするかどうか
-- 上書きする場合は"force" 別名で保存する場合は"rename"にする
property overwrite : "force"

(*
ユーザー毎の初期設定ここまで
*)


property msg1 : "管理画面のパスワードを入力" as Unicode text
property msg2 : "終了しました。" as Unicode text
property msg3 : "ログインに失敗しました。" as Unicode text
property cookiePath : " ~/Library/Cookies/fc2uploader_cookie.txt" ----保存するcookieのパス

on open drop
	activate me
	set myPass to text returned of (display dialog msg1 default answer "")
	
	----ログイン処理&Cookie保存
	set loginScript to "curl -d \"id=" & myID & "&pass=" & myPass & "&mode=admin&mode=logging&process=in\" -c " & cookiePath & " -L " & myURL & " | tail -n 300"
	set response_login to do shell script loginScript as string
	----パスワードの入力フォームがレスポンスに含まれていた場合、ログイン失敗と判定(ちょっとこのへんが微妙…)
	if response_login contains "input type=\"password\"" then
		beep
		display dialog msg3 with icon 0 buttons "OK" default button 1
		error number -128
	end if
	
	--POST時に送信するCRCの値を取得(コード中にタブ記号が含まれています)
	set getCrcScript to "curl -b " & cookiePath & " -d \"mode=control&process=upload\" -L " & myURL & " | grep 'name=\"crc\"' | sed 's/	*<input.*value=\"//' | sed 's/\".*'//"
	set returnedCrc to 1st paragraph of (do shell script getCrcScript as string)
	
	----メインループ
	repeat with theFile in drop
		tell application "Finder"
			set fPath to POSIX path of theFile as Unicode text
			set uploadScript to "curl -b " & cookiePath & " -F \"upfile[0]=@" & fPath & "\" -F thumb=" & createThumb
			set uploadScript to uploadScript & " -F width=" & thumbWidth & " -F height=" & thumbHeight & " -F overwrite=" & overwrite
			set uploadScript to uploadScript & " -F mode=control -F process=upload -F type=upload -F crc=" & returnedCrc & " -F insert=\"\" -L " & myURL
			do shell script uploadScript
		end tell
	end repeat
	beep
	display dialog msg2 default button 1 buttons "OK"
end open

ドラッグ&ドロップでFC2ブログに画像をアップロードするAppleScriptその3

■追記
このエントリのスクリプトは、FC2Blogがリニューアルで仕様変更されたため動作しなくなっています。
リニューアル後のFC2Blogに対応した改良版は、下記のエントリで公開しています。
ドラッグ&ドロップでFC2ブログに複数の画像をまとめてアップロードするAppleScript その4
■追記ここまで


以前書いた、ドラッグ&ドロップでFC2ブログのサーバに画像をまとめてアップロードするAppleScriptですが、思いのほか反響があったのでちょっとだけ書き直しました。

変更点として
・以前のスクリプトではパスワード入力ミスなどでログインに失敗しても単に何も起こらないだけだったのを、今回はエラーメッセージを表示するようにした
・アップロード中は『くるくる』が表示されてアップロード処理中だとわかるようにした
・サーバから受け取ったCookieを、ホームディレクトリ下の 『ライブラリ/Cookies/fc2uploader_cookie.txt』として保存するようにした

使い方
・まずこのスクリプトをスクリプトエディタにコピペして、最初の行の<管理画面のURL>と、その下の<ユーザ名>の部分を書き換える
・そのスクリプトを『アプリケーション』として保存
・保存したスクリプトのアイコンに、アップロードしたい画像をまとめてドラッグ&ドロップ
・パスワードを聞いてくるので入力
・しばらく待つ
・『終了しました』のダイアログが表示されれば完了

FC2ブログにアップロード出来ない種類のファイル(.psdや.xlsなど)をアップロードしようとしても、エラーなどは表示されず、ただ何もアップロードされずに終了します。FC2ブログの管理画面の作りに依存してるので、リニューアルなどで変更されてしまうと動かなくなってしまうため、最低限の機能だけにしました。一応、以前作った『多機能版』もありますが。

property myURL : "<管理画面のURL>"
--"<ブログのURL>/admin.php"を入れる

property myID : "<ユーザ名>"
--FC2ブログのユーザ名を入れる

property msg1 : "管理画面のパスワードを入力" as Unicode text
property msg2 : "終了しました。" as Unicode text
property msg3 : "ログインに失敗しました。" as Unicode text
property cookiePath : " ~/Library/Cookies/fc2uploader_cookie.txt" ----保存するcookieのパス

on open drop
    activate me
    set myPass to text returned of (display dialog msg1 default answer "")
    
    ----ログイン処理&Cookie保存
    set loginScript to "curl -d \"id=" & myID & "&pass=" & myPass & "&mode=admin\" -c " & cookiePath & " -L " & myURL & " | tail -n 100"
    set response_login to do shell script loginScript as string
    
    ----パスワードの入力フォームがレスポンスに含まれていた場合、ログイン失敗と判定
    if response_login contains "input type=\"password\"" then
        beep
        display dialog msg3 with icon 0 buttons "OK" default button 1
        error number -128
    end if
    
    ----メインループ
    repeat with theFile in drop
        tell application "Finder"
            set fPath to POSIX path of theFile as Unicode text
            set uploadScript to "curl -b " & cookiePath & " -F \"upfile=@" & fPath & "\" -F  mode=upload -L " & myURL
            do shell script uploadScript
        end tell
    end repeat
    beep
    display dialog msg2 default button 1 buttons "OK"
end open

AppleScriptでMovableType互換APIを使う

以前のエントリでFC2ブログ用の画像アップロードスクリプトを書いたんですが、FC2から受け取るcookieの中身が変わったらしく動かなくなっていたので、その部分を修整しておきました。まあ管理画面をスクレイピングしてるので、またいつ動かなくなるか判りませんけど。

そんなことしなくても良い様に、FC2ブログでもMovableType互換APIが使えるようになってるので(あまり積極的にはサポートしてないようですが)、アップロードの機能をちょこっと使ってみました。

MovableType APIの仕様は、こちらがまとまってて分かりやすいです。
『Movable Type で使える XML-RPC API』

画像ファイルをアップロードするには、Base64でエンコードする必要がありますが、OS Xにはopensslが入ってるのでdo shell script で呼び出せば簡単にエンコード済み文字列が得られます。
データを渡す際の項目名に『name』や『url』が指定されてますが、これらはAppleScriptではレコードの項目名(ラベル)として定義されてる予約語なので、『|name|』のようにエスケープする必要があります。

あと、XML-RPCを扱うAppleScriptを書く時に使える『AEXMLTutor』ってツールがあるんですが、上のペインがスクリプトエディタになってて、実行すると下のペインにXML-RPCでの送受信の内容が表示されるようになってるので便利です。



FC2ブログでは、画像をアップロードする時サムネイルを勝手に生成する機能もあって、このAPIではそれが生かせないので結局はフォームの内容をPOSTするしかないんですが。

property BlogID : "0"----FC2ブログでの扱いは不明
property myID : "<ユーザ名>"----FC2ブログではメールアドレス
property myPass : "<パスワード>"

on open drop
   repeat with theFile in drop
      tell application "Finder"
         set fName to name of theFile
         set fPath to quoted form of POSIX path of theFile
         ----画像をBase64でエンコード
         set encodedFile to (do shell script "openssl base64 < " & fPath)
         ----ファイルタイプを判別
         set fType to (do shell script "sips -g format " & fPath)
      end tell
      --------データ構造体
      set dataStruct to {bits:encodedFile, |name|:fName, type:"image/" & fType}
      --------メソッド呼び出し
      tell application "http://blog.fc2.com/xmlrpc.php"
         set ret to call xmlrpc {method name:"metaWeblog.newMediaObject", parameters:{BlogID, uname, pword, dataStruct}}
      end tell
   end repeat
end open

Lightbox対応FC2ブログ用アップロードスクリプト

■追記
このエントリのスクリプトは、FC2Blogがリニューアルで仕様変更されたため動作しなくなっています。
リニューアル後のFC2Blogに対応した改良版は、下記のエントリで公開しています。
ドラッグ&ドロップでFC2ブログに複数の画像をまとめてアップロードするAppleScript その4
■追記ここまで


◆FC2ブログ専用◆

ドラッグ&ドロップでFC2ブログのサーバに画像等のファイルをアップロードするAppleScriptその2。
前回のが、あまりにやっつけっぽいので、幾つか機能追加してもうちょっと真面目に書き直しました。

今回のは、アップロードした画像を表示するためのHTMLタグも勝手に生成してクリップボードに納めるようになっているので、それを記事中にペーストすれば管理画面の『ファイルアップロード』を経由することなくエントリを書く事が出来ます。生成するHTMLは、サムネイルを使用して表示する内容になってます。



あと、新たにLightbox JS v2.0に対応しました。(使わない選択も可)
Lightbox導入して画像を表示させる場合、<img>タグ中にtitleとrel属性を手作業で追加しないといけませんが、このスクリプトではそれらも含めたHTMLをクリップボードに納めます。


■使い方
  • <管理画面のURL>と<ユーザ名>の部分を書き換える
  • その下、Lightboxを使う場合は『1』に、使わない場合は『0』のまま
  • スクリプトをアプリケーションとして保存し、アップロードするファイルをドラッグ&ドロップ
  • パスワードを入力
..........でしばらく待つ。

あとは終了のダイアログが出ると、画像表示のHTMLがクリップボードにコピーされているのでそれを記事中にペーストします。
アップロードされたファイルが画像以外の場合、タグは生成されません。


■動作確認
Mac OS X 10.3.9
AppleScript 1.9.3
curl 7.10.2

■Firefoxからコピペする場合、バックスラッシュを円マークに置換する必要があります
property cr : (ASCII character 13)
property msg1 : "FC2ブログ管理画面のパスワードを入力" as Unicode text
property msg2 : "ログインに失敗しました。" as Unicode text
property msg3 : "終了しました。" as Unicode text
property msg4 : "以下のファイルは処理できませんでした。" as Unicode text
property msg5 : "以下のHTMLタグをクリップボードにコピーしました。" as Unicode text
global rel

--FC2ブログ管理画面のURL:"<ブログのURL>/admin.php"を入れる
property myURL : "<管理画面のURL>"

--ユーザ名を入れる
property myID : "<ユーザ名>"

--Lightboxに対応させる場合は 1 にする
property availLB : 0

on open drop
   if availLB is 1 then
      set rel to " rel=\"lightbox[roadtrip]\""
   else
      set rel to ""
   end if
   activate me
   set imageTags to ""
   set tempTag to ""
   set errList to {}
   set myPass to text returned of (display dialog msg1 default answer "")
   
   
   --ログイン処理&cookie取得
   set loginScript to "curl -d \"id=" & myID & "&pass=" & myPass & "&mode=admin\" -c - -L " & myURL & " | tail -n 40"
   set resultLogin to do shell script loginScript
   if resultLogin contains "http://blog.fc2.com/?mode=reminder" then --ログイン失敗なら
      beep
      display dialog msg2 with icon 2 buttons "OK" default button 1
      error number -128
   end if
   set myCookie to last word of (paragraph -2 of resultLogin)
   
   --最初のファイルがアップロード失敗した場合にチェックする為、現状を取得しておく
   set tempTag to my get_ImageTags(do shell script "curl -b \"cr=" & myCookie & "\" -F mode=upload -L " & myURL & " | tail -n 140 | head -n 20")
   
   
   --メインループ
   repeat with theFile in drop
      tell application "Finder"
         set fPath to POSIX path of theFile as Unicode text
         set fName to name of theFile
      end tell
      
      --アップロード処理
      try
         set uploadScript to "curl -b \"cr=" & myCookie & "\" -F upfile=@" & quoted form of fPath & " -F mode=upload -F upload[sumb]=checked  -L " & myURL & " | tail -n 140 | head -n 20"
         set returnHTML to (do shell script uploadScript)
         
         --タグ取得ルーチンへ
         set newTag to my get_ImageTags(returnHTML)
         
         --アップロード成功かチェック(アップロードページのHTMLで判断)
         if newTag is not tempTag then
            set imageTags to imageTags & newTag
            set tempTag to newTag
         end if
      on error
         set errList to errList & fName
      end try
   end repeat
   
   
   --終了処理
   activate me
   if errList is not {} then
      beep
      set myResult to ""
      repeat with aElement in errList
         set myResult to myResult & aElement & cr
      end repeat
      display dialog msg4 & cr & cr & myResult with icon 2 buttons "OK" default button 1
   end if
   beep
   if imageTags is "" then
      display dialog msg3 buttons "OK" default button 1
   else
      display dialog msg3 & cr & cr & msg5 & cr & cr & imageTags buttons "OK" default button 1
      set the clipboard to imageTags
   end if
end open


--返ってきたHTMLより画像URLを抽出しタグを生成
on get_ImageTags(returnHTML)
   set newTag to ""
   set countLines to count of paragraph of returnHTML
   repeat with rNum from 1 to countLines
      set theLine to paragraph rNum of returnHTML as string
      if theLine contains "title" then
         
         --元画像のURLを取得
         set extImgScript to "echo " & quoted form of theLine & " | sed s'/.*<a href=\"//' | sed s'/\".*//'"
         set imageURL to (do shell script extImgScript)
         
         --サムネイルのURLを取得
         set extThumbScript to "echo " & quoted form of theLine & " | sed s'/.*<img src=\"//' | sed s'/\".*//'"
         set thumbURL to (do shell script extThumbScript)
         exit repeat
      end if
   end repeat
   
   --画像表示用HTMLタグ生成
   if theLine contains "<img src=" then
      set newTag to "<a href=\"" & imageURL & "\" title=\"\"" & rel & "><img src=\"" & thumbURL & "\" alt=\"\" border=\"0\"></a>" & cr & cr
   end if
   return newTag
end get_ImageTags
Profile
choco
Author : choco

印刷・製版の現場を経て、広告制作会社でPhotoshopを使ったビジュアル制作を担当。

→現在は車載機器開発ベンダにて、組み込み3Dデータ作成やUIデザインなどを行っています。

Categories
Favorites


Search
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。