スポンサーサイト

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

Twitterで『あの人』が自分をfollowしているかどうかを調べるAppleScript

ここんとこ仕事が立て込んでたので放置してしまいました。ちょっと軽めのネタを。

Twitterやってると突然、『follow整理します!』みたいな感じのPOSTが流れて来て、そんな時に自分のfollowerが減ってたりすると、『えっ?…オレ?』とか思ったりして、特に相手がお気に入りの人だったりするとちょっと気になったりするもんです。また、結構前にfollowしたけどfollow返されてたっけ?みたいに思ってもtwitterからの『followされました』メールをいちいちチェックするのも面倒です。

相手にremoveされたかを知るには、『りむったー』とか『Qwitter』等のサービスを利用すればremoveされた際に通知を受け取る事が出来ますが、そもそも一度もfollowされてない相手には関係がありません。

そこで、Twitter APIに用意されている『ユーザ間のfriend関係』を調べる機能を利用して『相手にfollowされてるかどうかを調べる』AppleScriptを書きました。この手のサービスやuser.jsも有りそうですが、探すヒマがあったら自分で書く、みたいな感じで。あと、高機能なTwitterクライアント使ってる人には必要無いかも知れません。

スクリプト中の『あなたのユーザ名』『パスワード』の部分を書き換えて実行し、気になる『あの人』のユーザ名を入力するとfollowされてるかどうかを表示します。





■動作確認
MacOSX 10.5.8
property user : "あなたのユーザ名"
property pass : "パスワード"

tell application "Finder"
	set friend to text returned of (display dialog "『あの人』のユーザ名を入力してください。" default answer "") as string
	try
		--set scpt to "curl --user \"" & user & ":" & pass & "\" -L \"http://twitter.com/friendships/exists.json?user_a=" & friend & "&user_b=" & user & "\""
		set scpt to "curl -L \"http://api.twitter.com/1/friendships/exists.json?user_a=" & friend & "&user_b=" & user & "\""
		set ret to do shell script scpt
	on error
		my myError()
	end try
	
	set mes to "『" & friend & "』さんは、あなたをfollowして"
	if ret is "true" then
		display dialog mes & "います。" buttons "OK" default button 1
	else if ret is "false" then
		display dialog mes & "いません。" buttons "OK" default button 1 with icon 2
	else
		my myError()
	end if
end tell

on myError()
	activate me
	display dialog "ユーザ名を正しく入力してください。" buttons "OK" default button 1
	error number -128
end myError
スポンサーサイト

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()

Ubuntu8.10でちょっと古めのスキャナEPSON GT-S600を使う

最近自宅で使ってるPCの環境をDebian sargeからUbuntu 8.10に入れ替えました。
OSのインストール自体はあっさり終わったんですが、スキャナを使おうとした際に若干引っかかった部分があったのでメモしておきます。

もともと『xsane』がインストールされていたので、Ubuntuだしひょっとしたらそのまま使えるんじゃないか…と思って起動してみたんですが、

ダメでした。2年程前のGT-S600なので、最近の機種ならどうなのか分かりませんが。

なので、以前のDebian sargeの時と同じく、エプソンスキャナのLinux用ドライバを提供しているアヴァシスのサイトから、機種毎に用意されているRPMパッケージ

『iscan-2.3.0-1.c2.i386.rpm』
『iscan-plugin-gt-s600-2.0.0-1.c2.i386.rpm』

を落としてきて、
sudo alien -i iscan*
でインストール。『/etc/sane.d/dll.conf』を開き、
epkowa
の一行を追加します。
Ubuntuを含むDebian系で注意する点として、記述されてるコメントにあるように、このファイルを『/etc/sane.d/dll.d』に移動しておく必要があります。

で、今のままだとスーパーユーザのみがスキャナを利用出来る状態なので、『/etc/udev/rules.d/40-basic-permissions.rules』ファイルの
# USB devices (usbfs replacement)
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0664"
SUBSYSTEM=="usb_device", MODE="0664"
の部分に
# USB devices (usbfs replacement)
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0664", GROUP="admin"
SUBSYSTEM=="usb_device", MODE="0664", GROUP="admin"
赤色で示した記述を追加しておくと、USBデバイスファイルの所有がadminグループとして作成されるので、一般ユーザでもadminグループに入っていればスキャナを利用出来るようになります。(Ubuntuではインストール時に作ったユーザはデフォルトでadminグループに入ってると思います)

この設定を反映させるためにPCを再起動するか、
sudo service udev restart
としてudevを再起動します。

これで『xsane』もしくは『iscan』を起動してスキャナが使用出来る状態になっている筈です。

USBデバイスファイルのパーミッションの問題に関しては、debian MLでのDebian Projectの武藤氏の発言が参考になりました。
[debian-users:50581] Re: lsusb が情報を表示しなくなった


iscanを起動した様子


xsaneを起動した様子



あと、これは今回のスキャナの利用には関係無かったみたいですが、Ubuntu 8.10はUSBのデバイスファイルを『/proc/bus/usb/』以下に作りません。
ls /proc/bus/usb/
. ..
なので、USB機器を使用しようとしてデバイスが見つからない等の不具合が出た場合、『/proc/bus/usb/』以下のデバイスファイルにアクセスしようとしてる可能性があるので、
sudo mount -rbind /dev/bus/usb /proc/bus/usb
として、『/proc/bus/usb/』からもアクセス出来るようにすれば解決するかもしれません。これを毎回やるのは面倒なので、『/etc/init.d/mountdevusbfs.sh』ファイルの
do_start () {
#
# Mount a tmpfs on /dev/shm
#
SHM_OPT=
[ "${SHM_SIZE:=$TMPFS_SIZE}" ] && SHM_OPT=",size=$SHM_SIZE"
domount tmpfs shmfs /dev/shm tmpfs -onosuid,nodev$SHM_OPT

#
# Mount /dev/pts. Master ptmx node is already created by udev.
#
domount devpts "" /dev/pts devpts -onoexec,nosuid,gid=$TTYGRP,mode=$TTYMODE

#
# Make /proc/bus/usb work
#
mount --rbind /dev/bus/usb /proc/bus/usb

}
のブロックに、赤色の部分の記述を付け加えておくと良いかもしれません。

debianでapt-getの質問に適当に"Y"押すと危険。

debian(sarge)でapt-getする際の質問に適当に答えてしまって、パッケージの依存関係がめちゃくちゃになりapt-getでのインストールが全くできなくなったので、その修復作業のメモ。

インストールが出来ないだけならまだしも、もともと入ってたgnomeとかnautilusまで消えてしまって、使用に思いっきり支障が出たのでこれはもう丸ごと再インストールか?…etchにアップグレードもしたいし…とか思いながらとりあえず修復を試みました。


以下、メモとか取る余裕は無かったんで覚えている限りの状況と作業を羅列。

・ランチャーからnautilusを起動しようとしたらエラーが出て起動出来なかったので、dpkg -lしてみるとgnome関連のパッケージが根こそぎremove(アンインストール)されてた。

・removeされたパッケージをapt-getで再インストールしようとしたが、libc6とそれに含まれるtzdata、localeが無い旨の依存関係のエラーが出る。

・どのパッケージをapt-getしようとしても、上記のlic6が…の依存関係で堂々めぐり。しかもlibc6自体はインストールされてる。

・apt-get -f installで依存関係を修復しようとしたら、カーネル以外殆んど全部じゃないか?ってくらいのパッケージをremoveする旨のメッセージが出て、恐くなってabort。

・どうやらlibc6に含まれる仮想パッケージのglibc-2.7が無い事で引っかかってる模様。

・apt-lineからのインストールを諦め、試しにlibc6のdebパッケージを落して来てdpkg -iでインストールしてみる。

・依存関係で弾かれる事無くインストール完了。

・gnome関連のパッケージも、最初は依存関係のエラーが出たが、apt-get -f installで修復した後、インストール完了。

以上で半日つぶれました。
apt-getとdpkgでは依存関係や仮想パッケージに関するふるまいが違うのかどうなのか…とりあえず同じ様な目に逢った人のために書いときます。

Debian sargeでEPSONのスキャナを使う

EPSONのスキャナGT-S600を買ったので、Debian sargeでセットアップしました。その時のメモ。

Linux用のドライバはエプソンアヴァシスから『IMAGE SCAN!』(パッケージ名『iscan』)として提供されてるのでそれを使います。インストールガイドが用意されているので基本的には書いてある通りにやればいいんですが、Debianの場合は若干注意する部分があります。

IMAGE SCAN!はバックエンドに『SANE』を使っているので、あらかじめapt-getしておきます。その際、最新のSANEがインストール出来るよう、apt-lineに
deb http://people.debian.org/~aurel32/SANE sarge main
を追加してインストール。

■2007-9-16追記■
現在上記のapt-lineは使用できない様ですが、リングサーバのsargeのapt-lineから取得できるSANEでも問題なく動作しました。
■追記ここまで■

次にエプソンアヴァシスのダウンロードページから、
『iscan-2.3.0-1.c2.i386.rpm』
『iscan-plugin-gt-s600-2.0.0-1.c2.i386.rpm』(選択した各機種用)
の2つのRPMパッケージを落してきて、alienコマンドでインストールします。

SANEでスキャナにアクセスするには、libusbを使う方法と、カーネルのscannerモジュールを使う方法の2通りありますが、今回はlibusbでの設定にしました。(kernel2.6からはscannerモジュールは外されてるらしい)

Debian sargeのデフォルトではrootしか/proc/bus/usb以下にあるスキャナのデバイスファイルにアクセスできないので、パーミッションを変更。

まず、

sane-find-scanner | grep 0x04b8

としてスキャナの接続先を確認。(0x04b8はエプソンのベンダID)

found USB scanner (vendor=0x04b8, product=0x0110) at libusb:001:002

の出力で最後の001:002がそのまま/proc/bus/usb以下のデバイスファイルの存在場所となるので

chmod 606 /proc/bus/usb/001/002

としてパーミッションを606に変更。

次に、Debianでの注意点として、『/etc/sane.d』にある設定ファイル、『dll.conf』を同じディレクトリにある『dll.d/』へ移動する必要があります。これはインストールガイドに載ってないのでハマりました。『dll.conf』のコメントに記載されてるのでちゃんと読めば解るんですが。
で、その『dll.conf』に

epkowa

の一行を加えます。

そして、『epkowa.conf』に

usb
#usb /dev/usb/scanner0 (カーネルモジュールの設定をコメントアウト)

の記述がある事を確認。


これで、一般ユーザで
scanimage -L

としてスキャナの機種名が表示されればOK。

SANE本家のフロントエンド『xsane』、もしくはエプソンアヴァシスの『IMAGE SCAN!(コマンドはiscan)』どちらからでもスキャン出来るようになります。
Profile
choco
Author : choco

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

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

Categories
Favorites


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