カテゴリー「Perl」の11件の記事

2014-01-25

LWP::Simpleのmirrorをgetに変更した。掲示板監視スクリプト

某低価格レンタルサーバにperlで書いた簡単なスクリプトを置いて自社サイトの掲示板を監視して新しい書き込みがあるとメールで通知してくれるようにした。

掲示板データの取得にmirrorを使って取得していたが、どうもここ数日なんだか変なタイミングで通知が来ていたりして、どうにかして直そうと思った。

変なタイミングというか、データを丸々取得して解析して、最後の書き込みの番号を取得、保存してある最大番号と異なれば最大番号用ログを更新してメールを送信するんだが、送られてくるメールには最大番号が-1として最新データの内容は全部が空白。

まあ、これは掲示板の実装と監視スクリプトの実装に依存するので、ここで書いても仕方ないが。

今までは、滅多に来なかった間違いの通知が、一時間に一回くらいの頻度で来ていた。

で、結局、考えたのはmirrorはデータに更新があったら取得するっぽいので、getでダウンロードした方がいいんじゃないだろうか?と、どうせならCGIの実行結果をHTMLファイルで取得するのではなくて、ログデータをテキストで取得するように変更した。

変更後は一応通知メールは来ていないが、昨日も夜にはあまり来なかったので、数ヶ月間、様子をみる事にした。


| | コメント (0)

2009-05-29

XMLRPC::Liteで更新Ping

更新Pingを手動で送信したかったのですが、なかなかどうして、うまくできていない様子です。

perlソースはeucなので、タイトル部分はJcode->new ('ブログタイトル')->utf8;とかして、UTF8にしているつもりです。
XMLRPC::Transport::HTTP::CGIを使って、簡単なサーバーCGIを作って、ログを取ってみたりすると、ブログタイトルはUTF8だし、URLもちゃんと取得できているような気がする。
で、http://ping.bloggers.jp/rpc/とかに送信してみると、Thanks for the pingとか、Thanks for your pingとかなんとか、メッセージが戻ってきてる。
かといって、自分でブラウザで見てても、新着とかに表示されていない。

はて。何が原因なんだろうか。もしかして、そもそも、何かの制約があって、pingを受け取っても表示しないとか、送り元のIPで許可があるとか?

色々と調べた結果、どうやらうまくいっているようす。

で、このブログから適当なサーバーのCGIに更新Pingを送信させて、受信したXMLをファイルにログとして書き出させてみます。

以下のような簡単なCGIを一時的に設置してテストしてみました。

read (STDIN, $xml, $ENV{CONTENT_LENGTH});
open OUT, ">> ping.xml";
print OUT $xml . "\n\n";
close OUT;

で、受信した更新Pingをファイル出力します。

結果は、以下を標準出力に出力しました。

content-type: text/xml

<?xml version="1.0"?>
<methodResponse><params><param><value><struct>
<member><name>flerror</name><value><boolean>0</boolean></value></member>
<member><name>message</name></value><string>Thanks  for the ping.</string></value></member>
</struct></value></param></params></methodResponse>

さしあたて、この記事の更新Pingが送られるようにしてみました。
受信側のCGIレスポンスは、何でもかんでもベタに成功時のXMLを出力するようにしてあります。

結果、自分で送信してる物と、同じXMLが送られている事がわかりました。

MetaGatewayからの結果

<?xml version='1.0'?>
<methodCall>
<methodName>weblogUpdates.ping</methodName>
<params>
<param>
<value><string>TagoSuckのプログラム日記 たごろぐ</string></value>
</param>
<param>
<value><string>https://tagosuck.cocolog-nifty.com/tagolog/</string></value>
</param>
</params>
</methodCall>

という事は、レスポンスのメッセージを見ても、成功しているという事だと思います。
表示されないのは、送信しているXMLの問題ではないのではないか?という結論にしようとおもいます。

あまり頻繁に送っているつもりはないのですが、スパム扱いになってフィルタリングされてしまっているか、RSS参照で記事の更新を伴っていないという事か。
ハッキリは分かりませんが、この辺りで納得する事にしました。

実際、効果の程はわかりませんが、時々使ってみようと思います。



| | コメント (0) | トラックバック (1)

2009-05-19

楽天APIで自動アフィリエイトリンク作成

楽天ウェブサービス商品検索APIを使って、
ブログ記事に自動的にアフィリエイトリンク
作成するツールを作ってみました。

ウェブサービスを利用したリンクはURLが長くなるため、
大量にアフィリエイトリンクを埋め込みすぎると、
文字数制限の10,000バイトを超えてしまいます

そこで出現頻度を指定して、指定の出現頻度以上単語のみをキーワードとして商品検索するようにしました
ちなみに出現頻度は2~5から選択します。デフォルトで2です。

これでも、かなりの数の単語になります。
そこで、1byteのみの文字と2byteでも漢字以外の文字は
除外しました。

これで、対象がかなり熟語のみに絞られました。

次に、2回以上出現するキーワードを全てリンクにしてしまうと、
文字数がかさばるので、初回出現時のみリンクする事にしました。

文章を単語に区切るには、カカシ、チャセン、メカブなどの
形態素解析器で分かち書きします。
はPerlを使ったので、Text::Kakasi.pmを利用しました。

単語単位に切り分けができたら、連想配列のキーとして単語を登録します。
私は出現回数をカウントしているので、連想配列の値には、
ハッシュのリファレンスで、出現回数と商品検索結果のアフィリエイトURLを保存しています。
ここは、配列のリファレンスでもいいと思います。要素0に出現回数、要素1にURLでOKですね。

最終的に、記事の中から単語を検索して、リンク付きの文字列と置換しました。

| | コメント (0) | トラックバック (0)

2008-01-22

モジュールをインストールしてみる

Linux でも apt とかでインストールすると、
必要なモジュールが変なところにインストールされて、
検索できなくなって、
最終的には自分でコピーしたり
リンクを作ったりしなくちゃいけなくなるので、
ソースからインストールした方が
楽っぽい。

必要なモジュールをダウンロードして、
tar や unzip とかで展開。

ドキュメントにインストール方は書いてあるけど、
ほとんどの場合は以下で OK

$ perl Makefile.PL
$ make
$ make test
# make install

| | コメント (0) | トラックバック (0)

2007-11-26

Perlでコールバック サブルーチンの引数としてサブルーチンの参照を渡す

サブルーチンの引数に、
配列、ハッシュ(連想配列)などを渡してきました。
今回は、サブルーチンにサブルーチンを渡します。
C言語のクイックソートのコールバックのように使えます。
渡し方は至って簡単です。
配列やハッシュを渡すのと同じように、
関数のアドレスを渡してやります。

下の例では、サブルーチンsubjectに、
サブルーチンcallbackの参照を渡します。
subject内では引数として渡された、
callbackをfuncという変数に代入し、
このfuncをコールします。
コールすると1秒間待機した後にループします。
このループを10回繰り返します。


01: sub callback
02: {
03:   my $val = $_[0];
04: 
05: # print "\x1b[0D;$val%\n\x1b[1A;";
06:   print "$val%\n";
07: }
08: 
09: sub subject
10: {
11:   my $func = $_[0];
12: 
13:   for ($i = 0; $i < 10; ++$i) {
14:     &$func($i * 10);
15:     sleep(1);
16:   }
17:   print "completed\n";
18: }
19: 
20: &subject(\&callback);


5行目のサブルーチンcallbackのコメントしてある箇所ですが、
Linuxではエスケープシーケンスが利用できますが、
Windows 2000/XPでは、エスケープシーケンスが
利用できないようですので、
Windows 2000/XP以外のOSでテストする場合には、
6行目をコメントとして、5行目を実行させると、
ちょっとそれらしい感じになるかも知れません。
Windows98などは、エスケープシーケンスが利用できるようです。
Windows Vistaは、多分できないと思います。
LinuxとWindows XPのみ検証済みです。

この程度のサブルーチンで、複数箇所から利用されない場合には、 無名サブルーチンの参照を渡してしまうと、もっと簡単になります。
可読性の問題は出てくるかもしれませんが。

callbackサブルーチンをコメント化してしまって、最後の &subject (\&callback); の部分を
&subject ( sub { print "$_[0]%\n"; } );
とすると、callbackサブルーチンを無名サブルーチンのリファレンスとして渡す事ができ、callbackサブルーチンを定義した場合と同じ結果が得られると思います。


| | コメント (0) | トラックバック (0)

2007-08-21

サブルーチンの引数としてハッシュを渡す Perl

サブルーチンの引数に配列を渡す方法を示しました。
サブルーチンの引数として配列を渡す Perl
今回は、連想配列 ( ハッシュ ) を渡してみようと思います。
方法、内容は配列の場合と同じように、参照渡しで引数を渡します。。
違いは、受け取った側のサブルーチンでのハッシュへのアクセス方法が、
多少違ってきます。

続きを読む "サブルーチンの引数としてハッシュを渡す Perl"

| | コメント (0) | トラックバック (0)

2007-08-20

サブルーチンの引数として配列を渡す Perl

サブルーチンの引数配列を渡します。
通常のサブルーチン呼び出しに、
配列を渡すとどうなるでしょう。
つまり、値渡しという形で引数を渡します。
配列ではなくハッシュを渡すには、
サブルーチンの引数としてハッシュを渡すをご覧ください。

続きを読む "サブルーチンの引数として配列を渡す Perl"

| | コメント (0) | トラックバック (0)

2007-08-15

半角/全角の変換

掲示板の利用者が、ほとんど初心者で、
機種依存文字、半角カタカナの使用に
まったく躊躇しない人達なので、
最低でも、半角カタカナは全角に変換しようと思います。
更に、全角の英数字などを使うので、
検索機能が正常に機能しなくなってしまいます。
そこで、英数記号は半角に変換します。

続きを読む "半角/全角の変換"

| | コメント (0) | トラックバック (0)

半角のみの書き込みを許さないCGI

ここ1, 2年で掲示板をかなり修正しています。
まず、禁止ワードを含む書き込みをチェックし、
禁止ワードを含む場合にはエラーを返すようにしました。
禁止ワードは、1行1ワードの正規表現で
別ファイルに登録するようにしました。
追加や修正、削除は、禁止ワードデータファイルに
正規表現を書く、削除する事で可能になります。
これで、しばらくの間は、スパムなども無く
無事だったのですが、
最近、海外からのスパムが増えてきました。
そこで、半角文字のみの書き込みを許可しないように
修正しようと思います。

続きを読む "半角のみの書き込みを許さないCGI"

| | コメント (0) | トラックバック (0)

2007-07-20

ハッシュの値に配列を格納する

Perlでも多次元配列が使いたい場合などは、多々あります。
できれば連想配列(ハッシュ)の値に配列を格納できると、
更に便利に使えると思います。
CSVファイルのデータを、特定のキーごとにまとめる際などには
役に立つのではないでしょうか。

続きを読む "ハッシュの値に配列を格納する"

| | コメント (1) | トラックバック (0)

より以前の記事一覧