Twitterで強制的にPNG32でアップロードするツールを作った。

Twitterに画像をPNGでアップロードするツール
作りました。左上1pxの透明度を1%だけ落として強制的にPNG32でアップロードします。

Lenna(元画像)

Lenna(アップロード後)

差分

RGBAだと1だけ下がってるように見えます。ソースは以下。
retrorocket/twimage: Twitterで画像を強制的にPNGでアップできるようにする
PerlMagick便利ですね。

画像の引用元は以下です。
Lenna – Wikipedia

TimeLine Copierで1000人近くリストに入れようとするとTwitter側から不審なアクティビティ扱いされる。

お問い合わせがあったのですが、たまたま今日早く帰ってくることになってたので調査しました。
事象としては、3000人近いフォロワーがいるユーザがTimeLine Copierでリストを作ると、1000人超えた当たりでアカウントがロックされるというものです。
とりあえずガチャピンのフォロワーでリストを作ったのですがなるほど1000人くらいになったところでtwitterを覗くと以下の画面に飛ばされました。

ロックされた

私としてはどうしようもないので、800人位登録したら一旦登録を打ち切って、しばらく経った後に既存リストに追加してもらう機能を使ってもらうしかないですね。アプリは修正します。

追記(2017/06/28)

一回アカウントロックされるとしばらくcreate_allエンドポイントが使用不能になるみたいですね。めちゃくちゃ不便だ…。テスト用のアカウントで試したら500人でアウトだったので大事をとって300人位にしておくことにしました。

【未解決→解決】WPtouch Mobile Pluginが適用されたモバイルページでContact Form 7が動作しない。

未解決です。このサーバでしか起こらない問題かどうかすらもわかってません…。
Contact Form 7のv4.8とWPtouch Mobile Pluginのv4.3.18を導入している環境で、かつモバイルページからContact Form 7を使用して問い合わせを送信した場合、メールが送信されません。
WordPressのバージョンは4.8です。

最初nginxのキャッシュフラグの設定がおかしいかと思ったのですが、curlコマンドでPOSTした場合は正しく問い合わせが送信できるためWPtouchとの組み合わせが悪いと判断しました。(curlでUAをモバイル系にすると送信されないが、適当な文字列にすると送信できる)

php-fpmのログにもnginxのログにも何も出てないし、POSTを送信すると200OKしか返ってこないのでデバッグが面倒です。いま適用しているテーマはありがたいことにレスポンシブデザインなので、とりあえずWPtouchを無効にしました。

この現象がいつから起こっていたか把握できないため、過去スマホ・タブレット経由でcontactからお問い合わせを送信された方につきましては、お手数ですが再度送信をお願いいたします。すみません…。

追記(2017/08/08)

普通にContact Form 7用のjsがWPtouch用のテンプレートで読み込まれていないからでした。仕方ないので、footerに以下のコードを挿入して解消しました。
js無いと動かないんですね。そりゃそうか。

<script type='text/javascript'>
/* <![CDATA[ */
var wpcf7 = {"apiSettings":{"root":"https:\/\/retrorocket.biz\/wp-json\/contact-form-7\/v1","namespace":"contact-form-7\/v1"},"recaptcha":{"messages":{"empty":"\u3042\u306a\u305f\u304c\u30ed\u30dc\u30c3\u30c8\u3067\u306f\u306a\u3044\u3053\u3068\u3092\u8a3c\u660e\u3057\u3066\u304f\u3060\u3055\u3044\u3002"}}};
/* ]]> */
</script>
<script type='text/javascript' src='https://retrorocket.biz/wp-content/plugins/contact-form-7/includes/js/scripts.js?ver=4.8.1'></script>

このサイト(CentOS 7)のPHPを5.4から7.1にアップグレードした。

グーペのPHPバージョンを5.2から7.1にアップグレードしました – ペパボテックブログ
すぐ詐欺にあいそう、とよくいわれるくらい何かに影響を受けやすいのと、このサーバ上で動いているサービスのうち、PHPで動作しているものがWordPressしかないため、アップグレードすることにしました。
ちなみにWordPressの推奨PHPバージョンは7以上です。

アップグレード前

 !  ~  rpm -qa | grep php                                                                                                  2017年06月26日 22時05分45秒
php-mbstring-5.4.16-42.el7.x86_64
php-fpm-5.4.16-42.el7.x86_64
php-mysql-5.4.16-42.el7.x86_64
php-gd-5.4.16-42.el7.x86_64
php-common-5.4.16-42.el7.x86_64
php-pdo-5.4.16-42.el7.x86_64

yumのデフォルトバージョン、かつ最小構成ですね。ほぼ何も入ってなくて笑いました。ちなみにこのブログはphp-fpmとnginxの構成で動いています。
トラブル起こると嫌なのでfishからbashに切り替えてから作業しました。

インストール

$ sudo yum remove php-* # パッケージ削除
$ sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm # remiリポジトリ追加
$ sudo yum install --enablerepo=remi-php71 php-fpm php-mbstring php-mysqlnd php-pdo php-gd php-common

php-mysqlではなくphp-mysqlndを使えという記事が多かったのでこちらを採用しました。あと、場合によってはyum install epel-releaseしないとだめかもしれませんね。

php-fpmの設定

設定ファイルは/etc/php-fpm.d/www.confにありました。
userとgroupをnginxの実行ユーザに合わせています。

user = www-data
group = www-data

; unix socketでリスンしてるので設定を変更。ファイルのパーミッションをnginxが読めるように設定
listen = /var/run/php5-fpm.sock
listen.owner = www-data
listen.group = www-data

無事動くようになりました。x-powered-byはPHP/7.1.6ですね。ちなみに私はx-powered-byでバージョン隠さない派です。

TwitterのアイコンをAPI経由でアップロードするツールに強制PNGモードを追加した。

TwitterのアイコンをAPI経由でアップロードするツール

ImageMagickとPerlMagickを入れるのがひたすらめんどくさいという理由だけで対応してなかったのですが、アイコンも丸くなるし強制JPGにされるしでうんざりしたので対応しました。
githubには後でpushしておきます。ソースはこんな感じで、左上の1pxの透明度を1から0.99に変更して元画像に極力影響ないようにPNG32に変換しています。

	#PNG変換モード
	if($self->session("png32")){
		my $img = Image::Magick->new;
		$img->Read($image_file);
		$img->Set(alpha => 'On');
		my @pixels = $img->GetPixel(x=>0,y=>0);
		$pixels[3]=0.998; #透明度を99%にする。
		$img->SetPixel(x=>0, y=>0, color=>\@pixels);
		binmode(STDOUT);
		$img->Write("PNG32:".$image_file);
		undef $img;
	}

やっぱりImageMagick便利ですね。クライアント側で変換させてもよかったのですが、upico使用ユーザ層のITリテラシー的にクライアントで変換させると余計トラブルになりそうなのでやめました。
みんなもうちょっと自分で調べるとかしてくれるといいんですが。

入れたImageMagickは7.0.6で、PerlMagickがうまいこと入らなかったので以下の記事を参考にしました。
ImageMagickインストール済みのとこからImage::Magick(PerlMagick)をコンパイル・インストールする方法 – Qiita
make perl-sources してなくてハマりました。

追記(2017/06/29)

座標の指定方法が間違ってたので修正しました。