アマゾンProduct Advertising APIにてアダルト向け商品を判別するには?

TS3Y0099

うちのブログのサイドには、AmazonのWeb APIであるAmazon Produc Advertising APIを利用してブログのキーワードに関連する商品を表示する様にしているのですが、この間夜行バスの記事を書いた際に、夜行バスのキーワードに反応して、いわゆるアダルトなDVDの商品情報が表示されてしまっていました。これはまずいということですぐに対応策を調べて対処しましたが、その時参考にさせていただいたのが下記のサイトの記事になります。

AWS でアダルト向け(18禁)商品を判別する方法 for Amazon Associates Web Service API Version 2009-02-01 | さくらたんどっとびーず

結果として、perlソースの商品表示ループの中に以下の1行を追加することにより簡易対応しました。

foreach my $r (@{$$ary}) {
    &KCFG::initVal($r->{‘ItemAttributes’}->{‘Format’}[0],”);
    next if($r->{‘ItemAttributes’}->{‘Format’}[0] eq ‘アダルト’);

    $result_count++;

    &KCFG::initVal($r->{‘ASIN’},”);
    &KCFG::initVal($r->{‘DetailPageURL’},”);
    &KCFG::initVal($r->{‘MediumImage’}->{‘URL’},”);
    &KCFG::initVal($r->{‘SmallImage’}->{‘URL’},”);
    &KCFG::initVal($r->{‘ItemAttributes’}->{‘Title’},”);

ItemAttributesのFormatの箇所だけにアダルトの単語が入っていないかをチェックする処理なので片手落ちですが、とりあえずこれでそういう商品を表示しないように抑制できているようです。もう少し厳重にチェックしたい場合は参考にさせていただいたサイトを参考にして下さい。

また、ItemAttributesのFormatの内容をチェクするときは念の為にep(イコール)より正規表現でアダルトの単語が含まれているかどうかをチェックした方が安心かもしれないですね。

出来れば、アダルト商品を正確に判定できるフラグか除外できるオプションが欲しいところです。

◆2012.07.14追記

やっぱり、ItemAttributesのFormatのチェックだけでは、不十分だったので更に対処を行いました。

属性はperlで表すと

BrowseNodes->{BrowseNode}[?]->{Name}に”アダルト”の文言が含まれるかどうか
BrowseNodes->{BrowseNode}[?]->{Children}->{BrowseNode}[?]->{Name}に”アダルト”の文言が含まれるかどうか

をチェックするようにしました。

具体的にはRESTで得たXMLからデータを取得するループの中に以下のようなBrowseNodeの情報をチェックする処理を追加しました。これでだいたい弾けるとおもいます。また、R-15などもざっくり弾きたい場合は、’アイドル’という単語が含まれているかどうかをチェックするとよさそうです。アイドルという言葉を弾いても問題ない人は追加するといいでしょう。私はチェックするようにしました。

my $next = 0;
foreach my $r2 ( @{$r->{‘BrowseNodes’}->{‘BrowseNode’}} ){

    if($r2->{Name} =~ ‘アダルト’ || $r2->{Name} =~ ‘アイドル’){
#   if($r2->{Name} =~ ‘アダルト’){
        $next = 1;
        last;
    }
    next if(!defined($r2->{Children}) || $r2->{Children} eq ”);

    foreach my $r3 ( @{$r2->{Children}->{BrowseNode}} ){
        if($r3->{Name} =~ /アダルト/ || $r3->{Name} =~ /アイドル/){
#       if($r3->{Name} =~ /アダルト/){
            $next = 1;
            last;
        }
    }
    last if($next == 1);
}
if($next == 1){
    next;
}

BrowseNodeをチェックするためにはResponseGroupにBrowseNodesを指定しないといけないので取得する情報量が格段に増えてしまうのが難点ですね。

タグ : , ,