ツイッターの偽アカウントは、思ったより危険

ツイッターの流行りに、偽アカウントがあります。偽鳩山首相だったり、偽管直人だったり、有名人がツイッターを始めるとなると、一斉にみんながフォローしまくりで、一気にフォロアが7,000名を超えることも稀ではありません。

# 幸いにして偽管直人のアカウントは削除されている(削除した?)ようで、
# 大きな問題には至りません。

しかし、偽アカウントを作ることにより、悪質な宣伝が可能なのも twitter です。

注意喚起のために、公開しておきますが、くれぐれも悪用しないように。
また、一般の方は、これを機会にフォローしっぱなしの状態を見直してください。

 

まず、twitterではアカウントは変更可能です。ホームページとなる http://twitter.com/アカウント名 は変更されてしまいますが、フォロアがタイムラインで見ている分には関係ありません。

image

ここのユーザー名を変えてしまうことで、例えば「moonmile」から「tomoaki_masuda」に変更が可能です。これを利用すると、偽アカウントの大量フォロアを、宣伝に有効活用(悪用)できます。

 

手順としては、以下のような感じです。

  1. 有名人の偽アカウントを取り、相互フォロアなどで一気に5,000名強のフォロアをかき集める。
  2. 偽アカウントであることが、ばれる。
  3. 偽アカウントのフォロアは、一般人が多いため、そのままになっていることが多い。
  4. 偽アカウントを、営業アカウントに切り替える。
    5,000名のフォロアも一緒に移行される。
  5. 営業アカウントから、宣伝、フィッシング、興味の引きそうなツイートを流す。
  6. フォロアは、見知らぬアカウントから宣伝、フィッシングが来ても、あまり気にしない。
    むしろ、引っ掛かる可能性が高い。

のような手順で悪質な営業が可能です。

アカウントに対して、スパム報告すれば大丈夫、かというとそうではありません。
一度、フォローししまうとフォローしたときの自分のアカウントを相手に通知してしまうので、アカウントからホームページやメールアドレスを探し出すことが可能です。

なので、更なる悪用方法として、

  • 収集したアカウントを使って、別の営業アカウントでフォローしまくる。
    → 偽アカウントに引っ掛かりやすい人が集められる。
  • ホームページやメールアドレスから、ダイレクトメールを送りやすくなる。
  • 日常的なツイートを分析して、引っ掛かりやすい人にDM等を送りやすくなる。

ことが考えられます。

まだ、この営業方法をやっているアカウントは見掛けないので(あるのかな?)、大丈夫だと思うのですが、営業セミナーとかも多いので年末までには確実に荒れそうですね。

そんな訳で、ひとまず、有名人の偽アカウントは、即効外しておくのが無難、という話でした。

~~

余談ですが、元鳩山由紀夫 @motohatoyama 君は、堂々と偽アカウント、つーか、GAGアカウントですのでご安心を(笑)。リツイートによるコラージュですね。

「百頭女」マックス・エルンスト
http://www.amazon.co.jp/dp/4309461476

へのオマージュです。

カテゴリー: 雑談 | 1件のコメント

【告知】300冊の漫画を無料で放出します。

仕事場の確保につき、300冊ほどの漫画を無料で差し上げます。 Yahoo! オークションも考えたのですが、手続きやら梱包やらが面倒なので、「送料着払い」の費用だけ頂いて、段ボールなりで送らせて頂きます。 思い立った経緯を少し書くと、

  • ちかぢか、自宅で仕事部屋を確保するのだが、漫画/小説の類が邪魔。
  • 子供が生まれるので、仕事部屋作る必要あり。
  • 漫画を「自炊」することも考えたのだが、ちょっと私には(感情的に)できそうもない。
  • Book offだと、保存状態の悪い本は捨てられてしまう。
  • 古本屋だと、新しめの本が売れないことが多い(かな?)
  • iPadで、いくつか小説を読んでみたが、これでもいい気がする。
  • 漫画の電子書籍も出てきた(ebookjapan.jpなど)ので、古めの本でも買えばOK。
  • 読みたいときは、ツタヤで借りるのもアリだし。

なので、手元にコレクションしている意味がなくなった…ところがあります。また、古本的な価値があるもの(松本零士関係)は、特に気にったものだけ手元に残して、あとは放出します。 ええと、一言書いておきますが、送り先の方が「自炊」しようが、古本に売ろうが構いません。 今の私には「場所は金なり」な状態になりつつあるもので。空いた場所は、コンピュータ関係の本がごっそり入る予定です(仕事だからね)。 そんな訳で、日焼けや少々のカビなど、状態はあまり良くないことを覚悟してください。まあ、大切に読んでいるので、そんなに汚れていはいないはずです。 最近は5年間ぐらいは、こんな感じで保存してありました。でも全く読み返さないので、決心に至ったわけですね。

 image image 

 注文は、出来る限りまとめてお願い致します。バラになると、全巻揃えたい人とかがアレなので。送る方(私)も手間ばかりかかってしまうので。 ひとまず、リストを晒しますね。 欲しい物があれば、masuda at moonmile.net にメールを下さるか、twitter @moonmile に御連絡ください。1ヵ月以内には整理する予定なので、ぼちぼちと送らせて頂きます。 取り消し線は、予約済みのものです。

書名 作者 出版社 巻数、備考
デカスロン 山田芳裕 小学館 全23巻
寄生獣 岩明均 講談社 全10巻
骨の音 岩明均 講談社 全1巻
クラダルマ 柴田昌弘 少年画報社 全18巻(9巻のみカバーなし)
ルパン三世 モンキー・パンチ 双葉社 全14巻(1巻紛失?探します)
バッコス 白土三平 小学館 全5巻
月下の棋士 能條純一 小学館 全32巻
BE FREE 江川達也 講談社 全12巻
愛しのバットマン 細野不二彦 小学館 全13巻
太郎 細野不二彦 小学館 全24巻
青空ふろっぴい 細野不二彦 小学館 全6巻
ギャラリーフェイク 細野不二彦 小学館 全31巻
I’m ナム 細野不二彦 小学館 全3巻
どっきりドクター 細野不二彦 小学館 全4巻
ママ 細野不二彦 小学館 全9巻
東京探偵団 細野不二彦 小学館 全6巻
ビールとメガホン 細野不二彦 小学館 全1巻
りざべーしょんプリーズ 細野不二彦 小学館 全2巻
Blow up! 細野不二彦 小学館 全2巻
うばにぃしてぃBoy! 細野不二彦 小学館 全1巻
あどりぶシネ倶楽部 細野不二彦 小学館 全1巻
J BOY 能條純一 小学館 全2巻、全3巻(2種類あり)
キスより簡単 石坂啓 小学館 全5巻
マネームーン 石坂啓 小学館 全3巻
熱拳!ムサシ 細野不二彦 小学館 全2巻(と思う)
タケルヒメ 細野不二彦 小学館 全1巻(と思う)
ザ・スリーパー 細野不二彦 小学館 全1巻(と思う)
S.O.S 細野不二彦 小学館 全2巻
V2パンツアー 松本零士 少年画報社 全2巻(1巻カバーなし)
超時空戦艦まほろば 松本零士 小学館 全2巻
蜃気楼綺譚 松本零士 小学館 全1巻
蛍の泣く島 松本零士 大都社 全1巻
蜃気楼フェリーアイランダー0 松本零士 大都社 全1巻
空間機甲団 松本零士 奇想天外社 全1巻
ハードメタル 松本零士 小学館 全2巻
ケースハード 松本零士 小学館 全3巻
無限海流漂流記 松本零士 小学館 全1巻(と思う)
天使の時空船 松本零士 潮出版社 3巻まで
ミステリーイヴ 松本零士 サンコミックス 全3巻
セクサロイド 松本零士 サンコミックス 全3巻(1巻を紛失?)
インセクト 松本零士 サンコミックス 全1巻
ミライザーバン 松本零士 サンコミックス 全2巻
機械化人都市 松本零士 双葉社 全1巻
元祖大四畳半大物語 松本零士 サンコミックス たぶん全巻
銀河鉄道999 松本零士 少年画報社 たぶん全巻

? こんなところですかね。 細野不二彦と松本零士が多いのは、ファンとして収集していたためです。保存する場所があれば、それでもいいのですが、まぁ、この機会に読みたい方に譲りましょう、という形ですね。 ~~~ 追記 2010/06/29 結局、細野不二彦全集は、BOOK OFFへ放出。面倒なので「宅本便」としました。松本零士のほうは、手元に残っているので、欲しい方はご連絡ください。場所あけ中なので、そのうち古書店行きになります。

追記 2010/07/05

20100705_02.jpg

ブックオフから通知。一冊20円ですね。裁断が96冊なので、ヒット率3割…

カテゴリー: 雑談 | 4件のコメント

PSP、DSでツイッターを使う

iPadでツイッターを始めたのですが、これが結構いまいち。というのも、

  • 基本、PCに向かって仕事をしているので、ツイートはパソコン上で十分。
  • ソフトキーボードでミスタッチが多いので、「手早く感」が少ない。
  • あと、編集→投稿の手順があるのだが、iPad だとそれができない。

まあ、iPadのほうは別口で使うので、またの機会に登場願うとして、

 

ええ、そうです。「ツイッター講座」で無線LANができることが分かったので(設置は私なんですが…できることを最近気づいた orz )、

ひょっとすると、PSP、DSでも接続可能?

ってなことで、試してみました。

 

■PSPでtwitter

公式のtwitter.comには接続できないので、モバツイ http://movatwi.jp/ に接続します。

URL打ちがカーソル移動で設定しなければならず、結構大変なんですが、閲覧だけならば、まぁいいかな、と。携帯電話感覚(スマートフォン以外の)でカーソルを動かすことができます。

image

左下のアナログパッドでも動きますね。

image

PSPは液晶が綺麗なので、文字がきれいに出ます。意外に読みやすいです。

どうしても横長になってしまうのが、難点ですが、PSP専用クライアントが出れば(ある?)

  • 縦表示、あるいは、横2画面。
  • アナログパッドを意識した、ボタンの配置

ができて、結構使えると思います。

家で使う場合、携帯電話よりも画面が広いし、いいですよね。

子供ツイッターとか作れそう。

 

■DSiでtwitter

DSの場合も、モバツイを使います。DSの場合は、2画面構成なので、縦長に使えるのですが、標準モードではこんな感じ。上に全体像があって、下で拡大というブラウジングですね。

image

画面はPSPよりも、やや粗いのですが、携帯電話に慣れていれば、まあこんなもんか、という感じです。

image

DSの場合は、2画面を上下スクロールに使うことができます。

なので、こんな風にすると縦長に使えて結構便利です。

image 

DSの場合、タッチパネルの液晶なので、iPhoneやiPadと似たような使い方ができます。

文字を入力する場合も、PSPよりも早いですね。タッチペンでぽちぽち打つか、爪で打てばいいので、リプライも結構出来そうです。あと、手書き認識もあるので、文字を書きながらというのも可能です。

ちなみに、いたったー http://itatr.com を見てみると、

image

こんな感じですね。

携帯サイトが表示されるようになっていれば、これで読みやすい感じがします。

家で、ツイッターしたいときは、こういう方法もアリですね。

カテゴリー: 開発 | 32件のコメント

片想いは檸檬の味ツール

ツイッターの片想いを調べるツールです。。。って、「絡まったぁ」の整備前、と、フォロされているけど、フォローしなくちゃ駄目だったのかなぁ、を調べられます。

# フォロー返しが、得意じゃないもので、ちょっと相手をログを見てからフォローしてます。
# 逆に、フォローするけど連絡はしません。「ぼけ突っ込み」をしているのは私 @moonmile です。

さて、apiの回数制限の関係から本来ならば、jQuery を使うと良いのですが、実験用ツールなので、そのまま公開しちゃいます。

image

こんな感じに、

  • 両想い 相互フォローの場合は、ピンク
  • 片想い 自分だけがフォローしている場合は、レモン色
  • フォローされているだけだと、ブルー

になります。

http://moonmile.net/php/krm005.php

http://moonmile.net/php/krm005.php?id=アカウント

のようにアカウントが指定できます。

結構重たいので、1,000人しかチェックしていません。

api 的には、statuses/friends を使っているのですが、本来は friends/ids, followers/ids を使って、詳細情報を拾ってくるのが筋です。ただ、ids のほうは、一度に300名ぐらい拾ってこれるのですが、ID のみなので、その後の詳細を拾うために api 制限にすぐ引っ掛かります。それゆえ、statuses/friends のほうがいいんですなぁ。まあ、ID のほうは、別途使い道があるので、またの機会に。

私の場合

フォロー 105 フォロア 109 相互 68 トータル 146

な数値になります。これが、どのくらいが適正(?)なのかは不明ですが、幾人か統計を取ってみれば平均値みたいなのが出るでしょう。そうすると、バランスが悪い人は「営業目的かな?」ってな訳で、避けることができます。

そんな訳で、ソースも公開しておいます。ローカルでPHPが動く環境にすると、色々調べられますよ。

 <?php
if ( $_GET['id'] != "" ) {
 $username = $_GET['id'];
} else {
 $username = 'moonmile';
}
$cursor = "-1"; 
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>フォロー/フォロア of <?= $username ?></title>
</head>
<body> <?php $cnt_fre = 0;
$cnt_fol = 0;
$cnt_ff  = 0;
$cnt = 0;
$users = array(); // friendsを取得
for ( $i=0; $i<10; $i++ ) { $url = "http://api.twitter.com/1/statuses/friends/".$username.".xml";
$url = $url ."?cursor=".$cursor; $rss = simplexml_load_file($url); foreach ( $rss->users->user as $user ) {  $v = new stdClass;
 $id = $user->id;
 $v->id = $user->id;
 $v->name = $user->name;
 $v->sname = $user->screen_name;
 $v->icon = $user->profile_image_url;
 $v->lang = $user->lang;
 $v->friends = true;
 
 $users[(string)$id] = $v ;
 $cnt++; 
 $cnt_fre++; // echo "<tr><td>".$cnt."<td>".$id."<td>".$name."<td>".$sname."<td>".$icon."<td>".$lang."</tr>\n";
} $next = $rss->next_cursor;
$prev = $rss->previous_cursor;
/*
if ( $prev != "0" ) {
 echo "<a href='krm005.php?id=".$username."&cur=".$prev."'>prev</a> \n";
}
if ( $next != "0" ) {
 echo "<a href='krm005.php?id=".$username."&cur=".$next."'>next</a> \n";
}
*/
 if ( $next == "0" ) break;
 $cursor = $next; }
// followersを取得
$cursor = "-1";
for ( $i=0; $i<10; $i++ ) { $url = "http://api.twitter.com/1/statuses/followers/".$username.".xml";
$url = $url ."?cursor=".$cursor;
$rss = simplexml_load_file($url); foreach ( $rss->users->user as $user ) {  $id = $user->id;
 $v = $users[(string)$id];
 if ( $v ) {
  $v->followers = true;
  $cnt_ff++;
 } else {
  $v = new stdClass;
  $v->id = $user->id;
  $v->name = $user->name;
  $v->sname = $user->screen_name;
  $v->icon = $user->profile_image_url;
  $v->lang = $user->lang;
  $v->followers = true;
  $users[(string)$id] = $v ;
  $cnt++; 
 }
 $cnt_fol++;
} $next = $rss->next_cursor;
$prev = $rss->previous_cursor;
 if ( $next == "0" ) break;
 $cursor = $next; } ?> <?= $username ?><hr>
フォロー <?= $cnt_fre ?>
フォロア <?= $cnt_fol ?>
相互 <?= $cnt_ff ?>
トータル <?= $cnt ?>
<hr> <table>
<tr>
 <td>No.
 <td>ID
 <td>フォロー
 <td>フォロア
 <td>名前
 <td>アカウント
 <td>アイコン
</tr> <?php
foreach ( $users as $v ) {
 
 if ( $v->friends == true && $v->followers == true ) {
  $bgcol = "pink";
 } else if ( $v->friends == true ) {
  $bgcol = "lightyellow";
 } else {
  $bgcol = "aliceblue";
 }
 echo "<tr style='background-color: ".$bgcol."'>";
 echo "<td>".$cnt;
 echo "<td>".$v->id;
 if ( $v->friends == true ) {
  echo "<td>○";
 } else {
  echo "<td>-";
 }
 if ( $v->followers == true ) {
  echo "<td>○";
 } else {
  echo "<td>-";
 }
 echo "<td><a href='http://twitter.com/".$v->sname."'>".$v->name."</a>";
 echo "<td><a href='krm005.php?id=".$v->sname."'>".$v->sname."</a>";
 echo "<td><img src='".$v->icon."' width='48' height='48' />";
 echo "</tr>";
 $cnt--;
} ?>
</table>
</body>
</html>
カテゴリー: 開発 | 片想いは檸檬の味ツール はコメントを受け付けていません

ツイート専用アプリ(1)

ツイッターの地域サイトを作っている場合、複数名でアカウントを共有する必要がでてきます。また、個人のアカウントとは違ったアカウントで、地域ツイートをしないといけません。アカウント切り替えのアプリを使えばいいのですが、どうせならば、地域サイト専用のツール群を作っていこうかな、と。

板橋ツイッター by チーム板橋
http://itatr.com

では、私を含めて3名(他数名)が @teamitabashi のアカウントを共有している訳ですが、これが面倒くさい!!! というか、私が面倒。

なので、自分で使っている投稿専用アプリを皆で使えるように改造しました。いわば、最初の認証を外出しにしたってことですね。

PHPだと、いくつかライブラリがあるんですが、デスクトップアプリ(.NET)だと、資料が少なめで…かなり手間がかかりました。

WPFで作ったので、Windows + .NET Frameowork 3.5 以上となっています。

 ■何をするアプリなのか?

投稿だけッです。きっぱり!!!

■最初の設定

1. ブラウザを立ち上げて、投稿したいtwitterにログインしておきます。

image

image

2.ツイッター専用(TwNetPost)を立ち上げて「初期設定」ボタンを押します。

image

3.すると、ブラウザが立ち上げるので、アクセス許可をしてください。

image

4. 番号をコピーして、

image

5. ツイート専用に貼り付けます。

image

6. そして「続行」ボタンを押して、「認証成功」が出れば Ok です。

image

2回目から起動するときは、設定ファイル(twnetpost.xml)を読み込んで起動します。

 

ひとまず、これで別アカウントの投稿ができます。自分のアカウントはWEBサイトで閲覧しておいて、地域サイトのアカウントで、時々リツイートとかが出来るようになります。(コピぺですが)。

 

左上のアイコンは、twnetpost.exe と同じ場所に「twnetpost.png」という画像ファイルを置いてください。そのうち、twitter サイトから自動でダウンロードできるようにします。

ひとまず、実行ファイルのみをアップしておきます。

http://moonmile.net/up/twnetpost-001.zip

ソースの方は、少し整理したら後ほど。

カテゴリー: 開発 | ツイート専用アプリ(1) はコメントを受け付けていません

指定したTwitterアカウントの全ツイートを取得(perl版)

Twitterアカウントを指定して、全ての発言(ツイート)を取得するための perl スクリプトです。

目的は、

  • あなたの彼の浮気調査

でもいいし(笑)、真面目に解析してもいいし。私の場合は、先に書いた「絡ったー」がらみで使う予定です。

twitter api を使うとアクセス制限(1時間に500回ぐらいかな)となるので、公式サイト http://twitter.com/ から直接引っ張ってきます。なので、公式サイトの形式が変わると取れなくなるんですが、ま、ひとまず、こんな感じで取得できるとという例として。

インストールは、

  • activeperl などをダウンロード
  • wget をダウンロード
    分かる人は、cUrl に変更しても ok

コマンドラインから

perl krmall.pl [アカウント]

とすると、

  • 全発言のファイル アカウント.txt
  • 絡む人のファイル アカウント_st.txt

が作成されます。これをメモ帳で見る、ぐらいですね。HTML形式に変換し直すと、リンク先に飛べたりして便利です。

例えば、孫正義さんの全ツイートを取得する場合は、

perl krmall.pl masason

とします。

それなりに時間がかかりますが、WEBサイト等でクリックしていくよりも便利でしょう。

え~と、どういう風に取得しているかというと、

  1. 指定したアカウントのツイート数を取得
    http://twitter.com/アカウント
  2. 全ページ数 = ツイート数/20 + 1 を計算。
  3. ページ毎に過去を取得
    http://twitter.com/アカウント?page=n
  4. IDやツイートなどを検索して取り出し。

な感じです。いわゆるサイト経由のクローリングと同じです。

以下は、ソースコード。

# 指定アカウントの全発言を取得
$user = $ARGV[0]; # アカウント
$wget = "wget"; if ( $user eq "" ) {
print "perl krmall.pl [アカウント]";
exit;
} # 現在のツイート数を取得
`$wget http://twitter.com/$user -Otemp.txt`;
open( FILE, "<temp.txt" );
while(<FILE>) {
if ( /<span id="update_count" class="stat_count">([0-9,]+)<\/span>/ ) {
$cnt = $1;
$cnt =~ s/,//;
break;
}
}
close( FILE ); $pmax = int($cnt/20)+1;
print "account: $user count: $cnt pages: $pmax\n";  # 指定アカウントを全て読み込み
unlink( "$user.txt" );
open( OUT, ">>$user.txt" ); for ($i=1; $i<=$pmax; $i++ ) {
`$wget http://twitter.com/$user?page=$i  -Otemp.txt`;

open( FILE, "<temp.txt" );
while(<FILE>) {
if ( /<span class="entry-content">/ ) {
$text = $_;
if ( !/<\/span>/ ) {
while(<FILE>) {
if ( /<\/span>/ ) {
$text .= $_;
last;
}
$text .= $_;
}
}
$text =~ s/\n//g;
$text =~ s/\r//g;
$text =~ /<span class="entry-content">(.*)<\/span>/;
$text = $1;

<FILE>; <FILE>;
$id = <FILE>;
$id =~ /status\/([0-9]+)/;
$id = $1;
$date = <FILE>;
$date =~ /data="{time:'([^']+)'}/;  #"
$date = $1;

$text =~ s/<[^>]+>//g;

print OUT "---\n";
print OUT "$id\n";
print OUT "$text\n";
print OUT "$date\n\n";
}
}
close( FILE );
}
close( OUT ); # "
# 統計表示
open( OUT, "<$user.txt");
open( ST,  ">${user}_st.txt");
while(<OUT>) {
if ( /^---/ ) {
$_ = <OUT>; chomp; $id = $_;
$_ = <OUT>; chomp; $text = $_;
$_ = <OUT>; chomp; $date = $_;

$_ = $text ;
@res = /(@[A-Za-z0-9_]+)/g;
foreach $re ( @res ) {
$users{ $re } = $users{ $re } + 1;
}
}
}
close( OUT );

foreach $re ( sort {$users{$b} <=> $users{$a}} keys %users ) {
if ( $re ne "@".$user ) {
print ST "$re (".$users{$re}.")\n";
}
}
close( ST );


2012/01/11 追記

上記のコードでは最新の公式クライアントでは動かないので、下記を試してみてください。C# で記述しています。

指定したTwitterアカウントの全ツイートを取得(暫定.NET版) | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/2851

カテゴリー: 開発 | 2件のコメント

C/C++辞典 発売です

年末年始とばたばたやっていた本が出来上がりました。秀和システムさんから出ます。

IMG_2079

http://www.shuwasystem.co.jp/products/7980html/2596.html

分厚い800ページって、ええ、原稿が削れなかったんです。あれやこれやと入れていったら、こんなページ数になってしまいました。薄い紙を使っているそうなので、あまり重たくなっていないので、ページz単価はお徳!!! というか、私のページ単価は安く??? なっています(笑)。まあ、どちらもいいんですが。

内容は、C言語の文法/関数を中心にC++のSTLまであります。STLは全ては網羅できないので、厳選した結果ですね。あと、CppUnitも加えてあるので、xUnitを使った単体試験を行うときに御利用下さい。

動作確認のためのサンプルコードが付いていますので、関数やクラスの使い方のヒントにしてください。

カテゴリー: 書籍 | C/C++辞典 発売です はコメントを受け付けていません

Twitterで返信を調査(絡まったァ)

Twitterで営業を掛けると言えば、フォロー&フォロー返しなのだが、フォローばかり多くなっても、それは「見ていない」のと同じになります。そう、個人的には、100名フォローしたら、その後は増やさない/増やせないかなぁ、と。

鬼った~
http://www.onitw.net/

20100518_01

のように、自動ツールを使ってフォロアを増やす方法もあれば、リツイートをたくさん付けてフォロアを増やす方法もあります。また、ハッシュタグで #followme を付けると、相互フォローを受け付けるローカルルール(?)も存在します。

このあたり、フォロー数が増えるのは単純に「楽しい」気がするので、悪いわけではないのですが、いざ、誰をフォローしようと考えた時、

  • フォロー数自体が当てにならない

ってことになりますよね。昨日の前夜祭でも話がありましたが、

  • フォローするときは、相手のフォローを読んで、趣味が合うかみていきましょう。
  • 趣味や諸々が合わないときは、フォローを削除しましょう。

ってのが、うまくツイッターを使う鉄則だったりします。

 

が、

まぁ、営業に使いたいと思うのは資本主義的に常なことで、営業に使うんだたら、もう少し調査しようよ/営業効果がある方法を取ろうよ、あるいは、営業ツイッターに引っかからないようにしようよ、

と思いついたのが「絡まったァ」です。

 

元ネタは、metionmap ですね。
http://apps.asterisq.com/mentionmap/

ツイッターアカウントを入れると、繋がりが強い人をグラフで表してくれます。

作成しているところは、http://asterisq.com/  という会社で、いろいろなネットワークをFlashを使って表現する老舗です。顧客動向などを調べるマーケティング調査を主にやっていますね。

さて、この metionmap を何回か使ってみたのですが、どうも、感覚的にちょっと違う気がしています。あって欲しい人がなかったり、ざっとみて無くてもいい人がいたり。もともと、どういうロジックでやっているのかと、

http://asterisq.com/blog/2009/10/14/explore-your-twitter-network-with-mentionmap

を眺めていくと、twitter api 的に直近の150件以下の投稿(つぶやき)しか取れないみたいですね。というか、返信とハッシュタグで繋がっているだけです。

となれば、作るのは簡単そう。更に、仲間サーチっぽくグループが分かるようにしましょう。そう「類は友を呼ぶ」というやつです。

ロジックは簡単で、

  • 自分から直接、返信する相手(1次友達)を探る。
  • 1次友達から、自分に返信されている数を探る。

というように、相互に返信しているのか(会話しているのか?)を探っていきます。更に

  • 1次友達から2次友達を探る。
  • 2次友達から3次友達を探る。

のように、3世代まで探ります。

探る友達は、

  • 2回以上、返信/会話をした人

に限ります。

何故、1回だけの人を外すかというと、1回の場合は、「フォローありがとうございました」が多いので、パスします。挨拶だけですからね。まめに会話をしている人、身内、仲間、趣味が合う人、なんかが見つけられます。

そうすると、取り除ける対象は、

  • 営業のために、フォローをしている人
  • フォロアを増やすためにフォローを繰り返している人
  • 鬼ったーのような自動化を使っている人

となるはずです。

ひとまず、1次友達への返信の向きだけ、作ったものがこれです。
http://moonmile.net/php/twtl.php

直近の200ツイートを調べて、返信した数を調べます。最初は、私のアカウント(@moonmile)ですが、
http://moonmile.net/php/twtl.php?id=アカウント

のように指定すれば、誰のアカウントでも調査できます。
# たまにエラーになりますが、リロードすれば読み込めます。

試しに、私がいくつかの人を調べると、まさしく「類友」状態になります。ラノベ関係はラノベで固まるし、プログラム関係はプログラム関係で、漫画家は漫画家で固まっています。

という訳で、まずは、これをトポロジー的に解くためにコーディング中です。図形はあとから、データベースとして、

  • 返信元のアカウント(自分)
  • 返信先のアカウント(相手)
  • 順方向の返信数
  • 逆方向の返信数

だけあれば、図が書けるようになります(F#向きだってのもあるなぁ)。

そう、前夜祭で話していたけど、「おそろしいツールでしょう?」。

twitter api はこちら
http://apiwiki.twitter.com/Twitter-API-Documentation

日本語がいい場合は、こっち。
http://watcher.moe-nifty.com/memo/docs/twitterAPI49.txt

カテゴリー: 開発 | 2件のコメント

Amazon アソシエイト API 調べ(2)

ざっくりと整理したのでサンプルソースをアップ。

Amazon APIのRequestへの電子署名添付(PHP版) | Yama’s Memorandum
http://memorandum.yamasnet.com/archives/Post-320.html

のソースを改変して、画像を表示させるようにしたもの。

サンプルの動作は、http://moonmile.net/php/amazon.php で確認できる。

探したい本のキーワード(例. 増田智明)を入力して、送信ボタンを押すと、画像付きのリストが表示される。先頭の行は、戻されるXMLの確認用で、そのままURLで指定するとamazon apiの返信が見られる。

20100517_01

20100517_02

20100517_03

実際は、複数ページで返されるので、Items/TotalResults, Items/TotalPages をチェックしないといけないだが、今回は省略。

ひとまず、これで物欲webはできそうだ。

<?php
if ($_POST["submit"] == "送信")
{
// Access Key ID と Secret Access Key は必須です

$access_key_id = ''; // ここに Access Key ID を入力';
$secret_access_key = ''; // 'ここに Secret Access Key を入力';

// RFC3986 形式で URL エンコードする関数
function urlencode_rfc3986($str)
{
    return str_replace('%7E', '~', rawurlencode($str));
}

// 基本的なリクエストを作成します
// - この部分は今まで通り
$baseurl = 'http://ecs.amazonaws.jp/onca/xml';
$params = array();
$params['Service']        = 'AWSECommerceService';
$params['AWSAccessKeyId'] = $access_key_id;
$params['Version']        = '2009-03-31';
$params['Operation']      = 'ItemSearch'; // ← ItemSearch オペレーションの例
$params['SearchIndex']    = 'Books';
$params['Keywords']       = $_POST['kw'];     // ← 文字コードは UTF-8
$params['ResponseGroup'] ='Small,Images';

#$params['IdType'] = 'ASIN';
#$params['ItemId'] = '479801382X';

// Timestamp パラメータを追加します
// - 時間の表記は ISO8601 形式、タイムゾーンは UTC(GMT)
$params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');

// パラメータの順序を昇順に並び替えます
ksort($params);

// canonical string を作成します
$canonical_string = '';
foreach ($params as $k => $v) {
    $canonical_string .= '&'.urlencode_rfc3986($k).'='.urlencode_rfc3986($v);
}
$canonical_string = substr($canonical_string, 1);

// 署名を作成します
// - 規定の文字列フォーマットを作成
// - HMAC-SHA256 を計算
// - BASE64 エンコード
$parsed_url = parse_url($baseurl);
$string_to_sign = "GET\n{$parsed_url['host']}\n{$parsed_url['path']}\n{$canonical_string}";
$signature = base64_encode(hash_hmac('sha256', $string_to_sign, $secret_access_key, true));

// URL を作成します
// - リクエストの末尾に署名を追加
$url = $baseurl.'?'.$canonical_string.'&Signature='.urlencode_rfc3986($signature);

# echo $url; // ← この URL にアクセスすれば、API リクエストができます

$response = file_get_contents($url);
$root = new SimpleXMLElement($response);
foreach ( $root->children() as $Items ) {
    if ( $Items->getName() == 'Items' ) {
        break;
    }
}

/*
$parsed_xml = simplexml_load_string($response);

  $Image_URL    = $parsed_xml->Items->Item->MediumImage->URL;
  $Title        = $parsed_xml->Items->Item->ItemAttributes->Title;
  $Author       = $parsed_xml->Items->Item->ItemAttributes->Author;
  $Creator      = $parsed_xml->Items->Item->ItemAttributes->Creator;
  $Creator_Role = $parsed_xml->Items->Item->ItemAttributes->Creator['Role'];
  $Publ_date    = $parsed_xml->Items->Item->ItemAttributes->PublicationDate;
*/
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?= $url ?>
<hr />
<table>
<? foreach ( $Items->children() as $Item ) {
    if ( $Item->getName() == 'Item' ) {
?>
<tr>
<td><a href="http://amazon.co.jp/dp/<?= $Item->ASIN ?>"><?= $Item->ASIN ?></a>
<td><img src="<?= $Item->SmallImage->URL ?>"
     width="<?= $Item->SmallImage->Width ?>"
     height="<?= $Item->SmallImage->Height ?>">

<td><?= $Item->ItemAttributes->Title ?>
</tr>
<? }} ?>
</table>

<?php
}
else
{
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>
</title>
<body>
<form method="post" action="amazon.php">

<table>
<tr>
    <td>キーワード:</td>
    <td><input type="text" name="kw" /></td>
</tr>
    <td></td>
    <td><input type="submit" name="submit" value="送信" /></td>
</tr>
</table>
<?php
}
?>

カテゴリー: 開発 | 1件のコメント

Amazon アソシエイト用の API 調べ(1)

備忘録的に記しておきます。

物欲 Web を本格化させたい(妄想込み)と思い立ち、Amazon API を Wordlpress 経由で調べる。

と、去年の夏あたりから仕様が変わったらしく、Access Key と Secret Key を必要するそうだ。

amazonアソシエイトを始めてみる-wordpress plugin編- – atl*weblog
http://weblog.atl-r.net/blog/amazon_affiliate_wpplugin/
Amazon APIのRequestへの電子署名添付(PHP版) | Yama’s Memorandum
http://memorandum.yamasnet.com/archives/Post-320.html

を参照すると、アソシエイト用のAPIの作り方が分かる。

API自体のドキュメントは、

http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/

に英語で書かれている。ここで必要なのは、API References → Operations のところ。

カート操作は置いておいて、物欲 web で必要なのは、

  • 商品の取得
    ItemSearch, ItemLookup

だけで、これを使って商品の情報と画像を引っ張って来れる。
ただし、商品情報と画像は、一度に取って来れないので、2度コールする必要がある。

最初はキーワード検索で

  • Operation: ItemSearch
  • Keywords: キーワード指定
  • ResponseGroup: Small,Images

この戻り値で、ItemAttributes 要素として、商品情報(本のタイトルなど)と画像が一度に取得できる。

実際に動作するサンプルは、後ほど整理してからアップします。

カテゴリー: 開発 | Amazon アソシエイト用の API 調べ(1) はコメントを受け付けていません