やったこと

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

ツイアカがシャドウバンされてつらい。。

新しいサービスを作ったので、ツイッターのアカウントを作っていろいろ広報をしてる。

サイトの記事が更新されたタイミングでAPIを使って自分のツイアカから自動投稿、みんなに情報を周知しようとしてるんだけど、なぜかツイアカがすぐに運営側からシャドーバン(半凍結)扱いされてしまう。

おそらく自動投稿をするアカウントはスパムボットだとみなされて、ツイッター界から追放されてしまうのだろう。

なので、自動投稿はやめて手動投稿するようにした。下記の記事のように、コンテンツが更新されたら自分にLINEで通知するようにした。
LINE Messaging API を使ってLINEにメッセージ送信/メッセージ返信する - Qiita

LINEの通知が来たらその内容をコピペして、ツイッターに直接貼り付けてつぶやく。
食事中だろうが寝てようが風呂に入ってようが、通知が来たら即座につぶやく。

これを続けたら、二日くらいでシャドーバンが解除されて、またみんなにつぶやきを見てもらえるようになった。

めでたしめでたし。

【PHP】simple_html_domで国情報をセットする

PHPの「simple_html_dom」でスクレイピングをするときに、国の情報をセットする。
こうすると相手のサイトから日本語ベースのhtmlが返ってくる可能性ある。

以下のような感じで「Accept-language」に日本語をセットしてアクセスをするとよい。
(「user_agent」はiPhoneを偽装してる)

$url = "https://hogehoge.net/";
$context = stream_context_create();
stream_context_set_params($context, array('header' => 'Accept-language: ja\r\n', 'user_agent' => 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53'));
$html = file_get_html($url, 0, $context);

国際的なサイトならば、日本人が来たと思って日本語のページを返してくれる。

【PHP】円マークを置換するのに一苦労。

テキストファイルの中にある円マーク「¥」をpreg_replaceで消そうとしたんだけども、どうも正規表現がマッチしなくてうまく消せない。

よくある話かもしれないけど、環境によって円マークはいろんな文字コードで表現される。

円マークについて | Fusic Developers Weblog

自分の場合、この円マークは「(c2a5)」という文字コードだった。
なので下記のようにして消したった。

    $str = preg_replace('/\xC2\xA5/', '', $str);

おしまい。

【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";

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