やったこと

webサービスを作るときに考えたことを垂れ流します

【AWS】スクレイピング中にグーグルのreCAPTCHAが出てきて困った。

AWSサーバーを使ってグーグル関連のページをいろいろスクレイピングをする実験をしてるんだけど、ときどきreCAPTCHAの認証画面が出てくることがある。
「私はロボットではありません」みたいな画面が出てきて、クリックしないと先に進めなくなるアレ。

体感的に3日くらいスクレイピングを続けていると、グーグル側から怪しまれてこの状態になってしまう。キャプチャを外さないとスクレイピングが続行できないので、かなり悩ましい問題・・。

いろいろ考えた末に、苦し紛れの対処法として、下記の記事みたいにスクレイピングサーバーでGUIを利用できるようにして、ブラウザ越しにグーグルを閲覧できる構成にした。
Amazon Linux2(CentOS)をGUI化する - Qiita

もしreCAPTCHA画面が出てきたら、スクレイピングサーバーから自分に向けてメールで通知。自分はサーバーにリモートアクセスして、ブラウザから目視で認証ボタンをクリックして、reCAPTCHAをクリアするというもの。

なんだか手動のダサい方法だけど、これしか思いつかなかった・・。

こういうことをあんましやりすぎるとグーグルに迷惑をかけてしまうかもしれないので、真似をする人はあくまで実験くらいにとどめておいてください・・。

【PHP】execでpythonのスクリプトを実行するのに手こずった!

PHPのexecのコマンドを使ってpythonスクリプトを実行しようとしたら、かなり手こずった・・。

pythonの環境は、下記の記事みたいに共用のディレクトリ「/usr/local/pyenv」の下にpythonをインストールしている。サーバーはAWS
【pyenv】当該サーバ内の全ユーザに指定したPythonバージョンを適用させる - SEワンタンの独学備忘録

普通にexecでスクリプトを実行すると、pyenvの環境変数の関係でエラー出まくってなかなかコードが実行できない。
簡単なコードなら実行できるかもしれないけど、いろいろライブラリをインポートしてるとどこかで突っかかる。

それで、結論から言うと以下のようにsudoを付けてコマンドを実行することにした。
(rootユーザーにはpuenvで必要な環境を設定している)
セキュリティ上危ないかもしれないけど、管理画面からしか実行しない処理なのでこれでよしとした。

<?php
$command = "sudo /usr/local/pyenv/shims/python /var/www/hogehoge/test.py 2>&1;";
exec($command,$output);
print_r($output)

visudoの設定には、下記のようにapachepythonのコマンドを実行できるようにした。

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
apache  ALL=(ALL)       NOPASSWD:/usr/local/pyenv/shims/python

なんだか無理やりなやり方だけど、うまくexecでpython実行する方法ないんだろうか・・。

【Python】requests_htmlを実行するとエラーになるぞ!

最近下記の記事みたく、Youtubeのチャット欄をスクレイピング取得しようとして遊んでるんだけど、
Pythonのコード実行すると「requests_html」というモジュールがエラーを吐いてしまい困った。

pythonでyoutubeのライブチャットを取得してテキストファイルに保存する - Qiita


Pythonは全然初心者なので、エラー内容はこんな感じなんだけど、正直なにが悪いのかよくわからない・・。

  File "/usr/bin/.pyenv/versions/python3.7/lib/python3.7/site-packages/pyppeteer/launcher.py", line 225, in get_ws_endpoint
    raise BrowserError('Browser closed unexpectedly:\n')
pyppeteer.errors.BrowserError: Browser closed unexpectedly:


そんで結論からいうと、下記の記事みたいにあらかじめいろいろライブラリをインストールしないといけなかったみたい。

CentOS7でPuppeteerを使う - Qiita

まとめてyumインストールしてみる。

yum -y install libX11 libXcomposite libXcursor libXdamage libXext libXi libXtst cups-libs libXScrnSaver libXrandr alsa-lib pango atk at-spi2-atk gtk3


これで一応エラー解消されてチャット欄を取得できるようにはなった。
もうちょっといろいろいじって勉強してみよう。

【PHP】添付ファイル付きのメールを送信したら中身が見れない !

以下の記事みたいな感じで、PHPで添付ファイル付き(pdf)のメールを送信する処理を作った。
qiita.com

しかし、受信メールをメーラーで確認すると、ファイルが0KBになってしまって中身が見られない・・。
GmailのようなWeb上のメーラーだと見られるんだけど、Outlookみたいなデスクトップのメーラーだと見られない。

結論から言うと、以下の添付ファイルを書き込む処理の最後に、一つ改行が足りないのが原因だったらしい。

  $filetitle = mb_convert_encoding($filetitle, 'ISO-2022-JP');
  $filetitle = "=?ISO-2022-JP?B?" . base64_encode($filetitle) . "?=";
  $body .= "Content-Type: {$mime_type}; name=\"{$filetitle}\"\n" .
           "Content-Transfer-Encoding: base64\n" .
           "Content-Disposition: attachment; filename=\"{$filetitle}\"\r\n";
  $body .= "\r\n"; //★ここを追加!
  $f_encoded = chunk_split(base64_encode($filebody));
  $body .= $f_encoded . "\r\n";

これを発見するのに一日費やしてしまった・・。
メールヘッダの仕様細かすぎんよ・・。

【MySQL】hostsファイルにアドレス追加したのにSQLで接続できないぞ!

SQLサーバーに外部からアクセスしようとしたけど、以下のようなエラーが出てはじかれてしまった・・。
「Host 'xxx.xxx.xxx.xxx' is not allowed to connect to this MariaDB server」

SQLサーバー側の「/etc/hosts」ファイルにはちゃんと接続元の情報を追加したはずなのに、なんかホスト情報を解決できてないみたい。なんでなんだろう?

答えはSQLを再起動してなかったから。

SQLには内部的に名前解決の情報がキャッシュされていて、「hosts」ファイルを書き換えてもこちらのキャッシュには反映されてなかったらしい。

「/usr/local/etc/rc.d/mysql-server restart」とコマンド叩いてSQLリスタートしたら、無事アクセスできるようなった。

めでたしめでたし。

AWSサーバーでディープフェイク動画を作ろうとしたら一苦労。

AWSサーバーに高級なGPUを積んであるプランがたくさんあるみたいなので、これを使って今流行りのディープフェイクの顔合成動画を遊んでみようと思った。

「g2.2xlarge」という一番安いEC2サーバーを借りて、もろもろのディープフェイク関連のライブラリをインストール。

いざ動画生成処理を走らせようとしたら、下記のようなエラーが出て怒られてしまった。

「Attempting to fetch value instead of handling error Internal: no supported devices found for platform CUDA」

どうも「Tensorflow」という機械学習のためのライブラリからエラーが出てるみたいなんだけど、正直原因よくわからん・・。

そんで結論から言うと、「g2.2xlarge」に積んであるGPU(GRID K520)が古いタイプなのがよくなかったみたい。
これはcapabilityという型番が3.0のものなんだけど、おそらくもっと新しい3.5以上のものでないと、自分が入れたディープラーニング処理は走らないみたい。

なので、もっと新しいGPUが積んである「p2.xlarge」のほうを借りて、実行してみたらうまくいった。

たぶんcapabilityの問題だと思うので、AWS機械学習処理がうまくいかなかった人は、最新仕様のサーバーを借りるようしてみてください・・。

以上!

【Wordpress】記事のコメント一覧に2chみたいに番号を振るよ!

ワードプレスの記事に付けられたコメント一覧に、2ch掲示板っぽく番号を付けるよ!

イメージとしてはこんな感じ・・。

1.名無しさん
 記念カキコ
2.名無しさん
 記念パピコ
3.名無しさん
 記念マキコ

functions.phpに以下のような関数を定義すると、そのコメントの番号を計算することができます!

//コメントIDから番号を計算して返却する
function get_comment_index($comment_id){
  global $wpdb;

  $result = $wpdb->get_results("SELECT * FROM wp_comments WHERE comment_ID='$comment_id'", ARRAY_A);
  if (!count($result)){
    return null;
  }

  $post_id = $result[0]['comment_post_ID'];
  $result = $wpdb->get_results("SELECT comment_ID, (SELECT COUNT(*)+1 FROM wp_comments B WHERE B.comment_post_ID='$post_id' AND B.comment_ID < A.comment_ID) AS 'index' FROM wp_comments A WHERE comment_ID='$comment_id'", ARRAY_A);

  if (!count($result)){
    return null;
  }
  return $result[0]['index'];
}


そして、コメント一覧を表示する処理の直前でこの関数をコールして、取得したコメント番号をechoで表示させてやります。

(うちが使っているテーマでは「class-twentytwenty-walker-comment.php」というファイルの中でコメント一覧を表示してた)

 $comment_index = get_comment_index($comment->comment_ID);
echo $comment_index.".";

 printf(
        '<span class="fn">%1$s</span><span class="screen-reader-text says">%2$s</span>',
        esc_html( $comment_author ),
        __( 'says:', 'twentytwenty' )
 );

これで名前の前に「.1」とか「.2」とかの番号が付くようになります!

以上!