php製のslackのslash commandsで突然 failed to open stream: HTTP request failed! HTTP/1.1 426 Upgrade Required

状況

2021年10月上旬ごろから急にslackのスラッシュコマンドが反応しなくなった。

プログラムは既に4年が経過していて、php

↓停止したスラッシュコマンド

原因

slackがTLS1.0/TLS1.1の通信のサポートを廃止したから 多分

Slack での Transport Layer Security (TLS) の変更 セキュリティとデータ整合性に関する業界のベストプラクティスに従い、Slack は、TLS バージョン 1.0 および 1.1 へのサポートを 2020 年 2 月 19 日付で終了します。この日以降、TLS 1.2 へのアップグレードが未完了のサービスから Slack に送信されるリクエストはすべて到達しなくなります。

slack.com

file_get_contents がデフォルトだとHTTP/1.0を使うらしい

PHP 8.0.0 以降では、デフォルトは 1.1 です。 それより前のバージョンでは、デフォルトは 1.0 でした。

www.php.net

TLSのサポートされるのがHTTP/1.1かららしい

qiita.com

HTTP/1.0 でhttps接続するとTLS1.0かTLS1.1を使っていたのかもしれない

解決策

file_get_contentsからcurlに書き換えてHTTP/2にあげる

スラッシュコマンドの response_url を使って $json をPOSTするようにしてます

$response_url = "https://hooks.slack.com/commands/hoge/fuga";

$opts = [
    CURLOPT_VERBOSE => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0,
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_POSTFIELDS =>  json_encode($json)
];

$ch = curl_init($response_url);
curl_setopt_array($ch, $opts);
curl_exec($ch);
curl_close($ch);

file_get_contents をHTTP/1.1にする方法もある qiita.com

ちなみに:file_get_contents を使ってHTTP/2を使う方法が見つからなかった

動作環境

docker php:7.2-apache

参考

PHPのcurlでPOST - Qiita

curl エクステンションで HTTP/2 リクエストを送信する - Qiita

PHPのcURLがTLS1.2に対応しているか確認する - Qiita

PHP: curl_setopt - Manual

HTTPとHTTPSを探る - 自由帳

ブラウザ上でprocessingを編集と実行ができるprocessingrunを作った

概要

ちょっとしたprocessingのコードの挙動を確認したい時にさっと、ブラウザ上で動作する環境が欲しかったので作成しました。

f:id:matatsuna:20200613222211p:plain
processingrunのスクリーンショット

processingrun.nkmr.io

特徴

  • ボタンは、実行と停止ボタンのみ
  • 実行環境には、processing.js(既に開発終了)を使用しているため、普通の (インストール版) processingの記法で記述が可能
  • エディターには、VS Codemonaco-editorを使用しており、定義ファイルによる簡易的なコードの補完が可能

注意

  • 保存機能は一切ありません。(取得もしてません)
  • p5.jsの記法では動作しません。p5.jsでは、公式の p5.js Web Editor などを使用してください。

ニコニコ動画のURLの構造確認&動画IDを取得する正規表現(javascript)

要約

ニコ動のURLを入力させた時に、有効なURLかを判定し、動画ID抽出、URLを綺麗に揃えるスクリプト

経緯

ニコ動にある動画のIDは多くは sm******** だと思うが、歴史的には多くの英数2字が存在するらしい。 また、数字部分の長さも色んなものがあるらしい。ちゃんと定義したい。

ユーザにニコ動のURLを入力させるときにそのURLの構造が正しいか判定したい、また、短縮URLを直したい場面にどうぞ。

コード

// 対象URL
// https://nico.ms/sm********
// https://www.nicovideo.jp/watch/sm********

url = "https://www.nicovideo.jp/watch/sm8628149";

niconicoIdReg = /(?:sm|nm|so|ca|ax|yo|nl|ig|na|cw|z[a-e]|om|sk|yk)\d{1,14}\b/;
if (/(nicovideo\.jp|nico\.ms)/.test(url) && !/live/.test(url)) {
  let videoId = url.match(niconicoIdReg);
  if (videoId !== null) {
    console.log("www.nicovideo.jp/watch/" + videoId[0]);
  }
}

参考

動画IDを抽出する正規表現をニコ動のjsから、外枠をqiitaから拝借しました

http://nicovideo.cdn.nimg.jp/web/js/mylist2.js

入力された動画のURLを元に、ページに動画を自動で埋め込む - Qiita