今回は自動アダルトサイトの心臓部であるwordpress記事の作成機能を作ってみます、とはいってもwordpressには便利なWP関数が大量にあるのでフルスクラッチと比べればめっちゃ簡単に改造できます。ワードプレスを改造できればlaravelとかいらないんじゃないの?と思ったりします笑
記事の自動作成には前回の記事で取得したFANZAのセクシー動画データを利用します、準備できていない方はさらりと読んでみて下さい。
記事データを作る
前回までのステップでは連続的にDMMAPIから動画データを取得したり、wordpressのデータベースにFANZA動画を管理するテーブルを作ったりしました。一通り実装したい機能の準備は終わりましたんで組み立てていきましょう。
記事データを作ると言いましたが、wordpressの仕組み的にやる事は「wp_postsテーブルにデータを保存する」だけです。言い換えると、記事を手書きで書くという動作はwordpressのエディタ画面からwp_postsテーブルに保存するデータを手入力して、保存や公開ボタンを押した瞬間にwp_postsテーブルにデータが保存されているだけという割とシンプルな構造になってます。
以前書いた「YouTube APIのデータをPHPでMYSQLのDBに保存」記事でphpmyadminからwp_postsテーブルに直接入力したレコードが、記事として認識されるかを検証していますんで気になる方は読んでみて下さい。
投稿用のWP関数「wp_insert_post」を使って記事を作る
wordpressにはwp_insert_postという便利な独自関数が用意されていて、データベースへのレコード挿入を自前で書く必要はありません。記事として使いたいデータをwp_insert_postにセットして呼び出すだけで記事作成をやってくれます、便利~!
function fanza_get_video(){
require_once(ABSPATH. "wp-admin/includes/upgrade.php");
global $wpdb;
$table_name = $wpdb->prefix. "fanza_video";
$fanza_video_count = $wpdb->query( $wpdb->prepare("SELECT * from $table_name") );
var_dump($fanza_video_count);
$fanza_video_total_count = 11285;
$fanza_hits = 3;
$fanza_offset = $fanza_video_total_count - $fanza_video_count - $fanza_hits + 1;
if( $fanza_offset <= 0 ){
$fanza_offset = 1;
};
$search_option=array(
'api_id' => 'APIID',
'affiliate_id' => 'アフィリエイトID',
'site' => 'FANZA',
'service' => 'digital',
'floor' => 'videoa',
'hits' => $fanza_hits,
'offset' => $fanza_offset,
'sort' => 'date',
'article' => 'genre',
'article_id' => 1034,
);
$request_url='https://api.dmm.com/affiliate/v3/ItemList?'.http_build_query($search_option, '&');
$res_data=json_decode(@file_get_contents($request_url), true);
//var_dump($res_data["result"]["result_count"]);
for( $n = 0; $n < $res_data["result"]["result_count"]; $n++ ){
print($res_data["result"]["items"][$n]["content_id"]).'<br>';
print($res_data["result"]["items"][$n]["title"]).'<br>';
print($res_data["result"]["items"][$n]["volume"]).'<br>';
print($res_data["result"]["items"][$n]["review"]["count"]).'<br>';
print($res_data["result"]["items"][$n]["review"]["average"]).'<br>';
print($res_data["result"]["items"][$n]["URL"]).'<br>';
print($res_data["result"]["items"][$n]["affiliateURL"]).'<br>';
print($res_data["result"]["items"][$n]["imageURL"]["large"]).'<br>';
print($res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480']).'<br>';
print($res_data["result"]["items"][$n]["date"]).'<br>';
var_dump($res_data["result"]["items"][$n]["iteminfo"]["genre"]).'<br>';
var_dump($res_data["result"]["items"][$n]["iteminfo"]["actress"]).'<br>';
$insert_count = $wpdb->query( $wpdb->prepare(
"INSERT IGNORE INTO $table_name(
fanza_video_content_id,
fanza_video_title
) VALUE(%s, %s)",
$res_data["result"]["items"][$n]["content_id"],
$res_data["result"]["items"][$n]["title"]
));
if( $insert_count <= 0 ){
return;
}
$fanza_post_meta = array(
'post_title' => $res_data["result"]["items"][$n]["title"],
'post_content' =>
$res_data["result"]["items"][$n]["title"].
$res_data["result"]["items"][$n]["volume"].
$res_data["result"]["items"][$n]["review"]["count"].
$res_data["result"]["items"][$n]["review"]["average"].
$res_data["result"]["items"][$n]["URL"].
$res_data["result"]["items"][$n]["affiliateURL"].
$res_data["result"]["items"][$n]["imageURL"]["large"].
$res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480'].
$res_data["result"]["items"][$n]["date"],
'post_status' => 'publish',
'post_author' => 1,
);
remove_filter('content_save_pre', 'wp_filter_post_kses');
remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
$fanza_post_id = wp_insert_post($fanza_post_meta);
add_filter('content_save_pre', 'wp_filter_post_kses');
add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
}
return($res_data);
}
add_shortcode('fanza_get_video', 'fanza_get_video');
前回の記事でINSERT IGNORE INTOを用いて動画の重複チェック機能を作りましたが、これは挿入できた件数を返り値として返してくれます。これを利用して0以下だったらreturnする事でIGNOREによってスキップされた(重複した)動画は記事を生成しない事が可能です。
wp_insert_postには必要なパラメータを配列で用意する必要がありますが、前回printとかで表示したFANZA動画データがあるのでこれらをセットします、簡単ですね。
ただし、wp_insert_postではちょっと工夫すると悪さが出来てしまうiframeの入力を規制しており、埋め込み動画を認識させるにはwp_insert_postで前後で一時的に制限フィルタを解除してやる必要があります。
記事の中身を整える
先ほどはpost_contentパラメータに記事で使いたい動画データを突っ込んだだけなので、それっぽく見えるようにhtmlを加えて整えます。
function fanza_get_video(){
require_once(ABSPATH. "wp-admin/includes/upgrade.php");
global $wpdb;
$table_name = $wpdb->prefix. "fanza_video";
$fanza_video_count = $wpdb->query( $wpdb->prepare("SELECT * from $table_name") );
var_dump($fanza_video_count);
$fanza_video_total_count = 11285;
$fanza_hits = 1;
$fanza_offset = $fanza_video_total_count - $fanza_video_count - $fanza_hits + 1;
if( $fanza_offset <= 0 ){
$fanza_offset = 1;
};
$search_option=array(
'api_id' => 'APIID',
'affiliate_id' => 'アフィリエイトID',
'site' => 'FANZA',
'service' => 'digital',
'floor' => 'videoa',
'hits' => $fanza_hits,
'offset' => $fanza_offset,
'sort' => 'date',
'article' => 'genre',
'article_id' => 1034,
);
$request_url='https://api.dmm.com/affiliate/v3/ItemList?'.http_build_query($search_option, '&');
$res_data=json_decode(@file_get_contents($request_url), true);
//var_dump($res_data["result"]["result_count"]);
for( $n = 0; $n < $res_data["result"]["result_count"]; $n++ ){
print($res_data["result"]["items"][$n]["content_id"]).'<br>';
print($res_data["result"]["items"][$n]["title"]).'<br>';
print($res_data["result"]["items"][$n]["volume"]).'<br>';
print($res_data["result"]["items"][$n]["review"]["count"]).'<br>';
print($res_data["result"]["items"][$n]["review"]["average"]).'<br>';
print($res_data["result"]["items"][$n]["URL"]).'<br>';
print($res_data["result"]["items"][$n]["affiliateURL"]).'<br>';
print($res_data["result"]["items"][$n]["imageURL"]["large"]).'<br>';
print($res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480']).'<br>';
print($res_data["result"]["items"][$n]["date"]).'<br>';
var_dump($res_data["result"]["items"][$n]["iteminfo"]["genre"]).'<br>';
var_dump($res_data["result"]["items"][$n]["iteminfo"]["actress"]).'<br>';
$insert_count = $wpdb->query( $wpdb->prepare(
"INSERT IGNORE INTO $table_name(
fanza_video_content_id,
fanza_video_title
) VALUE(%s, %s)",
$res_data["result"]["items"][$n]["content_id"],
$res_data["result"]["items"][$n]["title"]
));
if( $insert_count <= 0 ){
return;
}
if( empty($res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480']) ){
$fanza_sample_video = '';
} else {
$fanza_sample_video = '<div style="width:100%; padding-top: 75%; position:relative;"><iframe width="100%" height="100%" max-width="1280px" style="position: absolute; top: 0; left: 0;" src="'.$res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480'].'" scrolling="no" frameborder="0" allowfullscreen></iframe></div>';
}
$fanza_post_meta = array(
'post_title' => $res_data["result"]["items"][$n]["title"],
'post_content' =>
'<p>'.$res_data["result"]["items"][$n]["title"].'</p>'.
'<p>'.$res_data["result"]["items"][$n]["volume"].'</p>'.
'<p>'.$res_data["result"]["items"][$n]["review"]["count"].'</p>'.
'<p>'.$res_data["result"]["items"][$n]["review"]["average"].'</p>'.
'<p>'.$res_data["result"]["items"][$n]["URL"].'</p>'.
'<p>'.$res_data["result"]["items"][$n]["affiliateURL"].'</p>'.
'<img src="'.$res_data["result"]["items"][$n]["imageURL"]["large"].'"></img>'.
$fanza_sample_video,
'post_status' => 'publish',
'post_author' => 1,
);
remove_filter('content_save_pre', 'wp_filter_post_kses');
remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
$fanza_post_id = wp_insert_post($fanza_post_meta);
add_filter('content_save_pre', 'wp_filter_post_kses');
add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
}
return($res_data);
}
add_shortcode('fanza_get_video', 'fanza_get_video');
FANZA動画データの内、sampleMovieURLに関しては動画毎にあったりなかったりします。なので、変数の中身を確認してデータが存在していれば$fanza_sample_videoにセット、なければ空欄にするという処理を追加しました。
とりあえず画像や動画は表示できるように整えましたが、こっから先の作り込みはデザインの話になるのでこれ以上作り込むのは止めておきます。基本は要素を<div>で囲ってCSSにカッコイイ感じで装飾してやればOKです。「css 装飾」とかで検索すればコピペコードがたくさんあるので、好きな奴を使って綺麗に表示して下さい。
カテゴリ・タグの付与
ワードプレスのカテゴリ・タグをどうやって分けるか問題をちょっと考えてみます、ここではFANZA動画データが出発点なので商品ページに掲載されているジャンル・女優名は取得しています。ではこれをそのままカテゴリ・タグに埋め込めばいいかと言うとちょい待てと。
原則としてwordpressは1記事1カテゴリなので、複数取得されるFANZAのジャンルや女優名の内どのキーワードでカテゴリを分類するかという問題があります。カテゴリは何を表すものか、タグは何を表すものかをしっかり定義する必要がありそうですね。
wordpress的カテゴリとタグの住み分け
一般的にカテゴリは縦の分類でタグは横の分類です、例えば果物のデータベースをカテゴリとタグに分類する場合、カテゴリに「あ行、か行、さ行、、、」/タグに「甘い、すっぱい、硬い、柔らかい、、」みたいな感じで分類します(実際は色々ありますよ)。
FANZAから取得できるジャンル・女優名の中身を見ているといずれも「動画の内容」を端的に表現するキーワードである事がわかるので、wordpressの分類としてこれらはタグに突っ込むのが適切なんじゃないかと思ってます。
カテゴリの分類に関してはユーザーの興味を深く分析しないと最適解は出ないと思うので、シンプルに有名サイトをパクるのが一番簡単で精度が出ると思います。今回は普通にFANZAのカテゴリ分けを参考にして「ビデオ、VR動画、素人、アニメ、成人映画、DVD、大人のおもちゃ、アニメ、PCゲーム、ブック、同人」くらいに分類するつもりですが、なるべく意味は同じで違うキーワードを探しましょう。
DMMAPIのデータをカテゴリ・タグに流用する
ただし現在取得しているDMMAPIの階層はvideoa=動画のみなので、他のジャンルのコンテンツデータは別途階層を調べてデータを取得する必要がありますが、やり方は同じなので説明は省略します。つまりこの解説記事では「動画」というジャンルを1個作ってすべてそこに突っ込むだけです笑
function fanza_get_video(){
require_once(ABSPATH. "wp-admin/includes/upgrade.php");
global $wpdb;
$table_name = $wpdb->prefix. "fanza_video";
$fanza_video_count = $wpdb->query( $wpdb->prepare("SELECT * from $table_name") );
var_dump($fanza_video_count);
$fanza_video_total_count = 11285;
$fanza_hits = 1;
$fanza_offset = $fanza_video_total_count - $fanza_video_count - $fanza_hits + 1;
if( $fanza_offset <= 0 ){
$fanza_offset = 1;
};
$search_option=array(
'api_id' => 'APIID',
'affiliate_id' => 'アフィリエイトID',
'site' => 'FANZA',
'service' => 'digital',
'floor' => 'videoa',
'hits' => $fanza_hits,
'offset' => $fanza_offset,
'sort' => 'date',
'article' => 'genre',
'article_id' => 1034,
);
$request_url='https://api.dmm.com/affiliate/v3/ItemList?'.http_build_query($search_option, '&');
$res_data=json_decode(@file_get_contents($request_url), true);
//var_dump($res_data["result"]["result_count"]);
for( $n = 0; $n < $res_data["result"]["result_count"]; $n++ ){
//print($res_data["result"]["items"][$n]["content_id"]).'<br>';
//print($res_data["result"]["items"][$n]["title"]).'<br>';
//print($res_data["result"]["items"][$n]["volume"]).'<br>';
//print($res_data["result"]["items"][$n]["review"]["count"]).'<br>';
//print($res_data["result"]["items"][$n]["review"]["average"]).'<br>';
//print($res_data["result"]["items"][$n]["URL"]).'<br>';
//print($res_data["result"]["items"][$n]["affiliateURL"]).'<br>';
//print($res_data["result"]["items"][$n]["imageURL"]["large"]).'<br>';
//print($res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480']).'<br>';
//print($res_data["result"]["items"][$n]["date"]).'<br>';
//var_dump($res_data["result"]["items"][$n]["iteminfo"]["genre"]).'<br>';
//var_dump($res_data["result"]["items"][$n]["iteminfo"]["actress"]).'<br>';
$insert_count = $wpdb->query( $wpdb->prepare(
"INSERT IGNORE INTO $table_name(
fanza_video_content_id,
fanza_video_title
) VALUE(%s, %s)",
$res_data["result"]["items"][$n]["content_id"],
$res_data["result"]["items"][$n]["title"]
));
if( $insert_count <= 0 ){
return;
}
if( empty($res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480']) ){
$fanza_sample_video = '';
} else {
$fanza_sample_video = '<div style="width:100%; padding-top: 75%; position:relative;"><iframe width="100%" height="100%" max-width="1280px" style="position: absolute; top: 0; left: 0;" src="'.$res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480'].'" scrolling="no" frameborder="0" allowfullscreen></iframe></div>';
}
$fanza_tags_array = array();
foreach( $res_data["result"]["items"][$n]["iteminfo"]["genre"] as $genre ){
array_push( $fanza_tags_array, $genre["name"] );
}
foreach( $res_data["result"]["items"][$n]["iteminfo"]["actress"] as $actress ){
array_push( $fanza_tags_array, $actress["name"] );
}
var_dump($fanza_tags_array);
$fanza_post_meta = array(
'post_title' => $res_data["result"]["items"][$n]["title"],
'post_content' =>
'<p>'.$res_data["result"]["items"][$n]["title"].'</p>'.
'<p>'.$res_data["result"]["items"][$n]["volume"].'</p>'.
'<p>'.$res_data["result"]["items"][$n]["review"]["count"].'</p>'.
'<p>'.$res_data["result"]["items"][$n]["review"]["average"].'</p>'.
'<p>'.$res_data["result"]["items"][$n]["URL"].'</p>'.
'<p>'.$res_data["result"]["items"][$n]["affiliateURL"].'</p>'.
'<img src="'.$res_data["result"]["items"][$n]["imageURL"]["large"].'"></img>'.
$fanza_sample_video,
'post_status' => 'publish',
'post_author' => 1,
'post_category' => array( 57 ),
'tags_input' => $fanza_tags_array,
);
remove_filter('content_save_pre', 'wp_filter_post_kses');
remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
$fanza_post_id = wp_insert_post($fanza_post_meta);
add_filter('content_save_pre', 'wp_filter_post_kses');
add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
}
return($res_data);
}
add_shortcode('fanza_get_video', 'fanza_get_video');
wp_insert_postには記事の作成と同時にカテゴリやタグも付与するパラメータがありますんで、上記の考察の通りDMMAPIから取得したジャンル・女優名はすべてタグに突っ込みつつ、カテゴリは1個を決め打ちなので先にwordpressの管理画面から「動画」カテゴリを手動で作っておきます。
DMMAPIから取得したジャンル・女優名の要素は多次元配列の状態なので、foreachでname要素だけを取り出し1次元配列に突っ込んでtags_inputパラメータにセットするだけです。
投稿した記事にサムネイルを設定する
記事作成を自動化する最後の工程です、サムネイルにはDMMAPIで取得したパッケージ画像のURLから画像をダウンロードして利用します。FANZAの画像は加工とか結構厳しいので公式の規約を一度確認しておくと安全です。
function fanza_get_video(){
require_once(ABSPATH. "wp-admin/includes/upgrade.php");
global $wpdb;
$table_name = $wpdb->prefix. "fanza_video";
$fanza_video_count = $wpdb->query( $wpdb->prepare("SELECT * from $table_name") );
var_dump($fanza_video_count);
$fanza_video_total_count = 11285;
$fanza_hits = 1;
$fanza_offset = $fanza_video_total_count - $fanza_video_count - $fanza_hits + 1;
if( $fanza_offset <= 0 ){
$fanza_offset = 1;
};
$search_option=array(
'api_id' => 'APIID',
'affiliate_id' => 'アフィリエイトID',
'site' => 'FANZA',
'service' => 'digital',
'floor' => 'videoa',
'hits' => $fanza_hits,
'offset' => $fanza_offset,
'sort' => 'date',
'article' => 'genre',
'article_id' => 1034,
);
$request_url='https://api.dmm.com/affiliate/v3/ItemList?'.http_build_query($search_option, '&');
$res_data=json_decode(@file_get_contents($request_url), true);
//var_dump($res_data["result"]["result_count"]);
for( $n = 0; $n < $res_data["result"]["result_count"]; $n++ ){
//print($res_data["result"]["items"][$n]["content_id"]).'<br>';
//print($res_data["result"]["items"][$n]["title"]).'<br>';
//print($res_data["result"]["items"][$n]["volume"]).'<br>';
//print($res_data["result"]["items"][$n]["review"]["count"]).'<br>';
//print($res_data["result"]["items"][$n]["review"]["average"]).'<br>';
//print($res_data["result"]["items"][$n]["URL"]).'<br>';
//print($res_data["result"]["items"][$n]["affiliateURL"]).'<br>';
//print($res_data["result"]["items"][$n]["imageURL"]["large"]).'<br>';
//print($res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480']).'<br>';
//print($res_data["result"]["items"][$n]["date"]).'<br>';
//var_dump($res_data["result"]["items"][$n]["iteminfo"]["genre"]).'<br>';
//var_dump($res_data["result"]["items"][$n]["iteminfo"]["actress"]).'<br>';
$insert_count = $wpdb->query( $wpdb->prepare(
"INSERT IGNORE INTO $table_name(
fanza_video_content_id,
fanza_video_title
) VALUE(%s, %s)",
$res_data["result"]["items"][$n]["content_id"],
$res_data["result"]["items"][$n]["title"]
));
if( $insert_count <= 0 ){
return;
}
if( empty($res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480']) ){
$fanza_sample_video = '';
} else {
$fanza_sample_video = '<div style="width:100%; padding-top: 75%; position:relative;"><iframe width="100%" height="100%" max-width="1280px" style="position: absolute; top: 0; left: 0;" src="'.$res_data["result"]["items"][$n]["sampleMovieURL"]['size_720_480'].'" scrolling="no" frameborder="0" allowfullscreen></iframe></div>';
}
$fanza_tags_array = array();
foreach( $res_data["result"]["items"][$n]["iteminfo"]["genre"] as $genre ){
array_push( $fanza_tags_array, $genre["name"] );
}
foreach( $res_data["result"]["items"][$n]["iteminfo"]["actress"] as $actress ){
array_push( $fanza_tags_array, $actress["name"] );
}
var_dump($fanza_tags_array);
$fanza_post_meta = array(
'post_title' => $res_data["result"]["items"][$n]["title"],
'post_content' =>
'<p>'.$res_data["result"]["items"][$n]["title"].'</p>'.
'<p>'.$res_data["result"]["items"][$n]["volume"].'</p>'.
'<p>'.$res_data["result"]["items"][$n]["review"]["count"].'</p>'.
'<p>'.$res_data["result"]["items"][$n]["review"]["average"].'</p>'.
'<p>'.$res_data["result"]["items"][$n]["URL"].'</p>'.
'<p>'.$res_data["result"]["items"][$n]["affiliateURL"].'</p>'.
'<img src="'.$res_data["result"]["items"][$n]["imageURL"]["large"].'"></img>'.
$fanza_sample_video,
'post_status' => 'publish',
'post_author' => 1,
'post_category' => array( 57 ),
'tags_input' => $fanza_tags_array,
);
remove_filter('content_save_pre', 'wp_filter_post_kses');
remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');
$fanza_post_id = wp_insert_post($fanza_post_meta);
add_filter('content_save_pre', 'wp_filter_post_kses');
add_filter('content_filtered_save_pre', 'wp_filter_post_kses');
$fanza_thumb_url = $res_data["result"]["items"][$n]["imageURL"]["large"];
$f = array();
$f['name'] = $fanza_post_id.'-'.$res_data["result"]["items"][$n]["content_id"].'.jpg';
$f['tmp_name'] = download_url($fanza_thumb_url);
$fanza_thumb_id = media_handle_sideload($f, $fanza_post_id);
wp_get_attachment_url( $fanza_thumb_id );
set_post_thumbnail( $fanza_post_id, $fanza_thumb_id );
}
return($res_data);
}
add_shortcode('fanza_get_video', 'fanza_get_video');
まずdownload_urlでDMMAPIのサムネイルURLから画像をダウンロードして、取得した画像は$fに画像名と一緒に格納しmedia_handle_sideloadでwordpress内のメディアにアップロードします。
するとサムネイルのIDが発行されるので、set_post_thumbnailに記事IDとサムネイルIDを指定するだけで記事の生成と同時にFANZAのパッケージ画像をサムネイルとしてセットする事ができます。
wp_get_attachment_urlは何かの内部処理で必要だった気がしますがいらないかもしれません、消してエラーでなかったらいらないです笑
まとめ
ようやく自動アダルトサイトのメイン機能である自動投稿部分が完成しました。全体の進捗としては7割くらいですが、使い方次第ではすでに十分価値のあるコピペスクリプトになってるんじゃないかと思います。
残りのタスクは自動投稿を実行するトリガーが「hello world!記事にアクセスする」事になってるので、これを時間で定期実行させる仕組みを次回の記事で作っていきます(‘ω’)ノ
DMMの商品データを一括取得するアプリ「DeepKiss」
DMMの商品をツイッターに投稿したりアフィリエイトサイトを作りたかったんですが、DMMAPIでは100件刻みでしかデータ取得が出来なかったのでMAX50,000件まで1発で取得できるデスクトップアプリを作りました。
使っている様子はこんな感じ。
DMMの商品データが大量にあればブログのランキング記事も簡単に作れるようになりますし、商品データベースとして用いればアフィリエイトサイトの構築も難しくないです。取得できる項目には在庫情報も含まれているので、限定品やレア物をピックアップすればそのまませどり用のリストにも使えます。
データ取得はアプリにお任せ、商品紹介でゴリゴリ稼ぎたい方はぜひお試し下さいm(_ _)m
個人開発プログラマーを応援するメンバーシップを始めました('ω')ノ
質問・要望・共同作業など、みんなのやりたい事をスマイルがお手伝いします。立ち上げたばかりでよく分かってないので、とりあえず何でもありやってみます。
コメント