簡単!PHPでMySQLを使う

とりあえずメモメモ
実装サイト:AV Face

<?php
$dsn = 'mysql:host=ホスト名;dbname=データベース名';
$username = '    ';
$password = '    ';
$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);
$dbh = new PDO($dsn, $username, $password, $options);
$sql = "セレクト文";
$res = $dbh->query($sql);
$return = array();
$i = 0;
while($data = $res->fetch(PDO::FETCH_ASSOC)){
    $return[$i] = $data['url'];
    $i++;
} 
?>

PHPでFacebookアプリ 友達の写真を取得

ついにAV FaceFacebook連携機能を実装しました!
これで自分の友だちに似ているAV女優を簡単に見つけることができるようになりました。
一度やってみてくださいね(^^)

というわけで今回の記事ではPHPFacebook APIを叩く方法を紹介したいと思います。
AV Faceでは自分の友だちの写真のうち、一人で写っている写真だけを取得する処理をしていますのでその辺も含めて紹介します。

1. Facebook Developersへの登録
FacebookAPIをいじくるにはFacebook Developersへの登録が必要です。
登録はこちらからできます。

2. PHPFacebook API
今回はPHPでGraph APIをいじくるので、こちらからSDKをダウンロードします。
ダウンロードしたファイルの中にexamples/example.phpというファイルがあるのでそれを編集するところからスタートです。

3. アプリを登録
Facebook DevelopersのページのAppsから作りたいアプリの詳細を入力して登録します。
ここで注意してもらいたいのがアプリの名前!
当然私はAV Faceという名前で登録しようとしたのですが、エラーが出て登録できないのです。
ぐぐってみると、Facebookアプリの名前に"FACE"という文字を含んではいけないと…
仕方なく"AV Faith"という名前で登録しました…
登録したらApp IDとアプリのシークレットキーが与えられます。あとで使うので控えておきます。

4. コーディング
4-1. 女友達の名前とプロフィール画像を取得

<?php
require 'facebook/src/facebook.php';

$facebook = new Facebook(array(
  'appId'  => '   ',//Facebook developersから取得
  'secret' => '   ',//Facebook developersから取得
));

// Get User ID
$user = $facebook->getUser();

if ($user) {//ログインしている場合
    //女性友達の名前とプロフィール画像を取得
    $friends = $facebook->api('/me/friends?locale=ja_JP&fields=id,name,gender,picture&limit=1000','GET');
    $female_friends = array();
    $female_pic= array();
    $female_ids = array();
    for($i=0;$i<count($friends['data']);$i++){
        if($friends['data'][$i]['gender'] === "女性"){
            array_push($female_ids,$friends['data'][$i]['id']);
            array_push($female_friends,$friends['data'][$i]['name']);
            array_push($female_pic,$friends['data'][$i]['picture']['data']['url']);
        }
    }
} else {//ログインしていない場合
    $loginUrl = $facebook->getLoginUrl(
            array('scope' => 'friends_photos')//スコープ(パーミッションを指定)
    );
}
?>
  • 最初にFacebook APIを扱うためのクラスをインスタンス化しています。
  • 次にFacebookのユーザが固有に持つUser IDをgetUser()で取得しています。
  • アプリを承認していない場合はgetLoginUrl()で認証させるためのURLを取得しています。
    • 自分の友だちの画像を取ってくるにはfriends_photosのパーミッションが必要です。用途に合わせて適宜指定してください。
  • ログインしている場合、api('/me/friends?locale=ja_JP&fields=id,name,gender,picture&limit=1000','GET')でAPIを叩きに行きます。
    • /me/friendsは"自分"の"友達"を取得しているということになります。
    • locale=ja_JPとすることで取得する名前を英語から日本語にすることができます。
    • fieldsでは取得する情報の種類を指定します。ここではID,名前,性別,プロフィール写真を取得しています。
    • limitでは取得する情報の上限値を設けています。今回はlimit=1000として、自分の友だち1000人までを取得します。
  • apiを叩いた結果はJSON形式で返ってきます。ここでは、$friends['data'][$i]['gender']に女性or男性が入っているので、女性の場合には用意しておいた空の配列に必要なパラメータをpush_arrayしています。
  • あとは取得した配列を使ってhtmlに表示させるだけです。

4-2. 一人で写っている画像を取得

<?php
$pics = $facebook->api('/'.$fb_id.'/photos?fields=images,tags&limit=99999','GET');
$fb_pics = array();
$j=0;
for($i=0;$i<count($pics['data']);$i++){
    if(count($pics['data'][$i]['tags']['data']) == 1){
        array_push($fb_pics,$pics['data'][$i]['images'][3]['source']);
        $j++;
    }
}

echo json_encode($fb_pics);
?>
  • $fb_idには友達のFacebook IDが入ります。api('/'.$fb_id.'/photos?fields=images,tags&limit=99999','GET')とすることで友達の写真の情報とタグ情報を取得できます。
  • for分の中では返ってきた写真を1つずつ処理しています。$pics['data'][$i]['tags']['data']にはその写真にタグが付けられている人の情報が配列で入っているのでcount()することでタグ付けされている人の人数がわかります。
  • ここでは写真にタグ付けされている人数が一人の場合のみ情報をarray_pushしたいのでfor文の中のif文で条件分岐しています。
  • タグがひとつの場合、$pics['data'][$i]['images'][3]['source']を配列にarray_pushしています。ここで$pics['data'][$i]['images']には異なる大きさの画像URLが配列で入っています。[3]は確か600x600位だったと思います。

PerlでTwitterボット

AV Faceの宣伝に使っているTwitterボットの作り方です。
PerlモジュールNet::Twitterを使って定期ポスト、 検索、自動フォローをします。
とても簡単。

$consumer_key = "";
$consumer_secret = "";
$token = "";
$token_secret = "";

$twit = Net::Twitter->new(
    consumer_key => $consumer_key,
    consumer_secret => $consumer_secret,
    access_token => $token,
    access_token_secret => $token_secret,
    ssl => 1
);
  • ツイート
    • update("投稿文");で投稿できる。
$tw_txt = "テスト";
$result = $twit->update($tw_txt);
  • 検索
    • queryは検索ワード
    • ツイートのIDがsince_idから検索をはじめる
    • foreachで1件ずつ解析
    • $result->{'text'}には検索したツイートの本文
    • $result->{'from_user'}にはそのツイートをしたユーザ名
    • $result->{'id'}にはツイートのIDが入っている
    • $twit->create_friend($fromUser);でフォロー
$query = "テスト";
$sinceId = 0;
$response = $twit->search({q => $query, since_id => $sinceId});
foreach $result ( reverse( @{$response->{'results'}} ) ) {
    $text = $result->{'text'};
    $fromUser = $result->{'from_user'};
    $statusId = $result->{'id'};
    $twit->create_friend($fromUser);
}
  • SinceIDを記録させておくファイルを用意
#file.txt
sinceID:0
  • 投稿、検索、フォロー(一人だけ)を同時に行うプログラム全体
#!/usr/bin/perl

use Net::Twitter;
use Encode;

#login
$consumer_key = "";
$consumer_secret = "";
$token = "";
$token_secret = "";

$twit = Net::Twitter->new(
    consumer_key => $consumer_key,
    consumer_secret => $consumer_secret,
    access_token => $token,
    access_token_secret => $token_secret,
    ssl => 1
);

#-- 発言するセリフの準備 --#
@text = ();
$text[0] = "あなたの気になるあの娘。その娘に似ている女優がAVに出演しているとつい見てしまいますよね。AV-Faceでは画像処理によって\"あの娘\"に似ているAV女優を特定します。 http://av-face.com #AV";
$text[2] = "";
$text[3] = "";
$text[4] = "";
$text[5] = "";

$rand = rand($#text + 1);
$tw_txt = $text[$rand];

#-- UTF8 --#
$tw_txt = decode('utf-8',$tw_txt);

#-- Twitterへ送信 --#
$result = $twit->update($tw_txt);#ツイート!
print "twit:$twit\n";
print "result:$result\n";
print "text:$tw_txt\n";

#-- 検索 --#
# ファイルの1行目を読み込む
$datafile = "file.txt";
open(FH, $datafile);
@list = <FH>;
# 1行ごとに処理
foreach $data_line( @list ) {
    @tmp = split(/:/,$data_line);
    $data{"$tmp[0]"} = $tmp[1];
}
close FH;

$sinceId = $data{'sinceID'};

#-- Twitter 検索 --#
print "search & sinceID:$sinceId\n";
$query = "ツイッター";
$query = decode('utf8',$query);
$response = $twit->search({q => $query, since_id => $sinceId});
foreach $result ( reverse( @{$response->{'results'}} ) ) {
    $text = $result->{'text'};
    $fromUser = $result->{'from_user'};
    $statusId = $result->{'id'};
    print "from:$fromUser\n";
    print "text:$text\n\n";
    $twit->create_friend($fromUser);
    print "followed:$fromUser\n";
    open(FH, ">$datafile");
    print FH "sinceID:$statusId";
    close FH;
}

定期的に動作させるならcronに登録して動かしてください。

ちなみに、ツイッターの規約で一定時間内に大量のユーザをフォローすることを禁止しているので程々にしないとアカウントを凍結されます。
(私も知らずに何度か凍結されました。)

AV Face

自分が作ったAV FaceというWEBサービスの宣伝です。

AV Faceは画像や画像URLを入力することでその画像に写っている人の顔を解析してその特徴からどのAV女優に似ているかを特定するサービスです。

f:id:donkeykey:20121202125029p:plain

WEBサービスを企画するとき、どうしてもエロ系に走ってしまうんですよ。
でもこの企画を思いついたときはこれだ!と思いました。
自分の友だちに似てるAV女優を見つけたらテンション上がるじゃないですか。
結構需要のあるサービスだと思うし、解析によって似てる女優を特定したらその女優が出演してるAVをリコメンドして直接広告収入になるんじゃないかと思うんです。


思い立って作り始めてから1ヶ月くらいになってようやく形になったのですが、PV数が上がらない…
しかも現時点での広告収入はたったの58円…

有効な宣伝手段がないとだめなんだなと。

現在の宣伝手段はTwitterのボット(@AVFace1)のみ。
こいつの仕事は3つ。

  1. 一定時間に一回用意した文言をランダムでTweet
  2. キーワード(AV 似)を呟いてる人をフォロー
  3. 自分宛の画像URL付きのリプに対してその画像に写っている人に似ているAV女優を特定してリプ

このTwitterボットの作り方ものちの記事で書く予定です。


さて、このサービスでは画像解析を行ってるんですが、
detectFace();
というAPIを使ってます。

これの使い方などものちの記事で。

AV FaceのPVと広告収入を上げるために試行錯誤していきます。

ども

ども、現在大学院1年生のPerl使いです。

 

…ブログの一番最初の記事って何書いたらいいのかな?

 

とりあえず、このブログの趣旨はプログラミング周りの知識まとめというと聞こえがいいですが、これまでに自分が制作したWEBサービスの宣伝とPVアップそして…

 

 

広告収入による不労所得でウハウハ!

 

 

が一番の目的です。ぶっちゃけ。

 

てなわけで、このブログでは過去に自分が作ったWEBサービスとか今作ってるWEBサービスの技術的な話というか、こうやって作ってるよっていう話を中心にまとめていくつもりです。

 

早速これまでに作ったWEBサービスの一覧をあげときます。

 

  1. Twitterリムられ通知サービス(現在サービス停止中)
  2. 各種Twitterボット(稼働中:@AVFace1
  3. ブラウザ上で書いた絵をGIFアニメにするサービス GIFアニメーカー ←流行らない気がしてならないので中断笑
  4. 画像解析によってその人に似たAV女優を特定するサービス AV Face ←現在進行中

 

あとはインターン先で作ったFacebookアプリがあるのですが、なんとなくこういうところで裏側を暴露するのは怖いのでやめときます笑