クリップボードにあるテキストをサーバ・プログラムに渡す

(1/1)
コピペのイラスト
ブラウザのブックマークレット機能を利用し、クリップボードにあるテキストをサーバ・プログラムに渡す方法を紹介する。ここでは例としてPHPで作ったサーバ・プログラムを使うが、サーバ・プログラムは Pythonでも Javaでも何でもよい。肝となるのはブックマークレットの方である。

目次

サンプル・プログラムの実行例

クリップボードにあるテキストをサーバ・プログラムに渡す

サンプル・プログラムのダウンロード

圧縮ファイルの内容
dispClipBoardText.phpサンプル・プログラム本体
dispClipBoardText.php 更新履歴
バージョン 更新日 内容
1.0.0 2025/01/18 初版

解説:サーバ・プログラム

ここでは PHPで作ったサーバ・プログラム "dispClipBoardText.php" を用意した。
GET渡しされた変数 text(クリップボードのテキストが入る)を画面に表示するだけのプログラムである。サーバ・プログラムは Pythonでも Javaでも何でもよい。

dispClipBoardText.php

  24: // 初期化処理 ================================================================
  25: define('INTERNAL_ENCODING', 'UTF-8');
  26: mb_internal_encoding(INTERNAL_ENCODING);
  27: mb_regex_encoding(INTERNAL_ENCODING);
  28: define('REFERENCE', 'https://www.pahoo.org/e-soul/webtech/js01/js01-19-01.shtm');
  29: 
  30: // プログラム・タイトル
  31: define('TITLE', 'クリップボードにあるテキストをサーバ・プログラムに渡す');
  32: 
  33: // 表示幅(ピクセル)
  34: define('WIDTH', 600);
  35: 
  36: /**
  37:  * 共通HTMLヘッダ
  38:  * @global string $HtmlHeader
  39: */
  40: $encode = INTERNAL_ENCODING;
  41: $title  = TITLE;
  42: $width  = WIDTH;
  43: $HtmlHeader =<<< EOT
  44: <!DOCTYPE html>
  45: <html>
  46: <head>
  47: <meta charset="{$encode}">
  48: <title>{$title}</title>
  49: <meta name="author" content="studio pahoo" />
  50: <meta name="copyright" content="studio pahoo" />
  51: <meta name="ROBOTS" content="NOINDEX,NOFOLLOW" />
  52: <meta http-equiv="pragma" content="no-cache">
  53: <meta http-equiv="cache-control" content="no-cache">
  54: <meta http-equiv="X-UA-Compatible" content="IE=edge">
  55: <meta name="viewport" content="width={$width},user-scalable=yes">
  56: 
  57: EOT;
  58: 
  59: /**
  60:  * 共通HTMLフッタ
  61:  * @global string $HtmlFooter
  62: */
  63: $HtmlFooter =<<< EOT
  64: </html>
  65: 
  66: EOT;
  67: 
  68: /**
  69:  * HTML BODYを作成する.
  70:  * @param   string $text 表示テキスト(クリップボードの内容)
  71:  * @return  string HTML BODY
  72: */
  73: function makeCommonBody($text) {
  74:     $refere = REFERENCE;
  75:     $title  = TITLE;
  76:     $version = '<span style="font-size:small;">' . date('Y/m/d版', filemtime(__FILE__)) . '</span>';
  77:     $width  = WIDTH;
  78: 
  79:     $body =<<< EOT
  80: <body>
  81: <h2>{$title} {$version}</h2>
  82: <p style="width:{$width}px;">
  83: クリップボードの内容:
  84: <span style="color:blue;">{$text}</span>
  85: </p>
  86: 
  87: <div style="border-style:solid; border-width:1px; margin:20px 0px 0px 0px; padding:5px; width:{$width}px; font-size:small; overflow-wrap:break-word; word-break:break-all;">
  88: ※参考サイト:<a href="{$refere}">{$refere}</a>
  89: </div>
  90: </body>
  91: 
  92: EOT;
  93:     return $body;
  94: }
  95: 
  96: // メイン・プログラム =======================================================
  97: // パラメータを取得する.
  98: $text = '';
  99: if (isset($_GET['text'])) {
 100:     $text = mb_convert_encoding($_GET['text'], INTERNAL_ENCODING, 'auto');
 101: }
 102: 
 103: // 表示HTMLを作成する.
 104: $HtmlBody = makeCommonBody($text);
 105: 
 106: // 画面に表示する.
 107: echo $HtmlHeader;
 108: echo $HtmlBody;
 109: echo $HtmlFooter;
 110: 
 111: //オブジェクトを解放する.
 112: $pbs = NULL;

解説:ブックマークレット

ブックマークレットを下記に示す。各自の環境に合わせサーバ・プログラム "dispClipBoardText.php" を配置したパスに書き換えてほしい。
javascript:(function(){
    navigator.clipboard.readText()
        .then(clipboradText => {
            window.open("http://(phpプログラムの配置パス)/dispClipBoardText.php?text=" + encodeURIComponent(clipboradText), "_blank");
        })
        .catch(errmsg => {
            alert("クリップボードの読み取りに失敗しました: " + errmsg);
        });
})();
クリップボードには、テキスト以外にも様々な形式のコンテンツを格納することができるが、このうちテキストを取り出すのが JavaScript の () メソッドである。これは Promise オブジェクトであるため、then句の中でクリップボードの内容を変数 clipboradText に格納する必要がある。
クリップボードから取得できなかった場合は、catch句の中でダイアログに警告を表示するようにした。

プログラム作成の背景

PHPを使った Bluesky投稿プログラムをつくっている過程で、クリップボードの内容をテキストボックスるに貼り付ける必要性が生まれた。そこで、投稿プログラムの中でクリップボードの内容を取得しようと考えた。
Windowsの PowerShellを使うと、Get-Clipboard コマンドレットでクリップボードを取得できることがわかっていたが、なぜか PHPの execsystem 関数経由ではうまく取得できない。Pythonでは取得できるのだが‥‥。
ここで落ち着いて考え直した――このケースでは、クライアントPCのクリップボード内容を取得するのだから、クライアント・プログラム(JavaScript)で書いてサーバ・プログラム(PHP)に渡すのが本来の流れである。そこで、クライアント・プログラムをブックマークレットとして実装することにした。

参考サイト

(この項おわり)
header