職場と自宅のデジタルライブラリ

鍵と鍵の下での科学に関する記事に触発されました。 私の記事はこれについてではありませんが、性質は異なりますが、電子図書館へのアクセスについても述べています。



私は西洋の大学で働いていますが、まだ北の大学ではありません。研究分野の多くの記事を読む必要があります。 幸いなことに、ここで大学図書館は多くの電子図書館を購読しています(この喜びはいくらですか?いいえ、そうではありません-私たちの記事から何人のブルジョアが利益を得ますか?)。 私のテーマでは、ACM、IEEE、およびSpringerの3つのライブラリがあります。 そしてそれらの中に-私が必要なものの最大のシェア。 そして、すべてが素晴らしいだろうが、しかし1つがあります。



電子ライブラリ(EB)は、明らかにIPによってユーザーを識別します。 たぶん間違っているかもしれませんが、コンピューターが物理的に(ツイストペアケーブルを介して)大学のネットワークに接続されている場合にのみアクセスできます。 少なくとも、電子書籍のページには、その購読に記事をダウンロードできるように表示されます。 EBが記事のお金を要求し始めるとすぐに、ワイヤレスネットワーク経由で大学のネットワークに接続するだけで十分です。 大学の外では、同僚や自分の作品を読むための関税しか見られないことは明らかです。



しかし、自宅で仕事をすることを決めた場合(冗談です:3人のおてんば娘の前で働くことができます...)、または出張で、最終的に何かを確認し、明確にし、または単に読む必要がありました(非常に現実的な場合) ? ある時点で、どうにかしてこの問題を解決する必要があると判断しました。 ローカル管理者は、EBにリモートでアクセスする方法に関する解決策を考え出すように彼に依頼したのは私が最初ではなかったことにのみ満足しました。 何もする約束がない。 後で同僚から、全国的なリソースに何らかの解決策があることを学びましたが、それは何らかの形で不安定です-私の同僚がこのリソースを介してEBに接続する方法を示したにもかかわらず、何らかの理由で同じアクションが望ましい結果に至らなかった。



そして、PHPとJSには小さなプログラミングスキルがあるため、すべてを自分で行うことにしました。 ローカルネットワーク(電子ライブラリへのサブスクリプションが有効である)にユーザーフォルダーがあり、その中にPHPスクリプトを配置できることも事実です。 アイデアは次のようになりました。



PHPプロキシを検索した後、すべてのHTTPヘッダー(ユーザーCookieを含む)を送信する簡単なスクリプトが作成されました(Eric-Sebastien Lachanceに感謝)。 確かに、1)ユーザーが連絡できるドメインの数を制限し、2)大学の学生と従業員のみがそれを使用できるようにするために、大幅に拡張する必要がありました(まあ、なぜこれを誰もが利用できないのか理解しています...)、そしてユーザーがローカルネットワークにログオンしているかどうかを確認します(イントラネットでは、リモートでログインできます。ところで、自分だけを使用する場合は、この手順を省略できます)。 そのためには、記事のPDFへの実際のURLを除くすべてのリクエストで、イントラネット上のセッションのIDが必要です。 プロキシは、目的のCookie(私の場合はJSESSIONID)を送信された値に設定することでイントラネットページに要求を行い、イントラネットが肯定的な回答を受け取った場合、EBに要求を行います。

ユーザー認証
function verifyUser($authCookieValue) { global $authCheckURL; global $authSuccessHTML; global $authCookieName; $result = false; $error = ''; // create a new cURL resource $ch = curl_init(); if ($ch !== false) { // set URL and other appropriate options $header = array(); $header[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'; $header[] = 'Accept-Language: en-US,en;q=0.5'; $header[] = 'Connection: close'; $header[] = 'DNT: 1'; curl_setopt($ch, CURLOPT_URL, $authCheckURL); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_USERAGENT, 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0'); curl_setopt($ch, CURLOPT_COOKIESESSION, true); curl_setopt($ch, CURLOPT_COOKIE, $authCookieName.'='.$authCookieValue); curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate'); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // grab URL and pass it to the browser $response = curl_exec($ch); if($response === false) { $error = curl_error($ch); } else { $result = strpos($response, $authSuccessHTML) !== false; } curl_close($ch); } else { $error = 'cannot initialize cURL'; } return array( 'succeeded' => $result, 'error' => $error ); }
      
      







Google Chrome拡張機能はユーザー側で機能し(ページに埋め込まれたコードと、バックグラウンドで実行されるタブとCookieにアクセスするコードの2つの部分で構成されます)、URLが3つのライブラリのいずれかに属している場合、ページが特定のスキャンされますPDF記事へのリンクがあるすべてのページに存在する要素(もちろん、EBごとに、これらは異なる要素です)。 そのような要素が見つかった場合、PDF記事へのリンクが正しく形成されたプロキシリクエストがそこで置換されます。 (リンクを正しく形成するために、ページ上のどのデータからどのデータを検索するかは、かなりの時間がかかりました)。

ACMの例
 // proxy config var PROXY_URL = 'http://university.org/~user/proxy.php?'; var PROXY_URL_QUERY = 'urlForProxy='; var PROXY_ID_QUERY = 'idForProxy='; // page search and modification const var ACM_PDF_LINK_NAME = 'FullTextPDF'; var ACM_ARTICLE_ID_NAME = 'id'; var ACM_PURCHASE_LINK = 'https://dl.acm.org/purchase.cfm'; var ACM_QUERY_URL = 'http://dl.acm.org/ft_gateway.cfm'; var ACM_QUERY = 'id={0}'; var ACM_LINK = '<a name="' + ACM_PDF_LINK_NAME + '" title="FullText PDF" href="{0}" target="_blank"><img src="imagetypes/pdf_logo.gif" alt="PDF" class="fulltext_lnk" border="0">PDF</a> [proxy]'; // requests to the background page var REQUEST_AUTH = 'auth'; function setACMLink() { var pdfLink = document.getElementsByName(ACM_PDF_LINK_NAME)[0]; if (!pdfLink) { var i, id, param; var params = window.location.search.substr(1).split('&'); for (i = 0; i < params.length; i++) { param = params[i].split('='); if (param[0] === ACM_ARTICLE_ID_NAME) { id = param[1].indexOf('.') > 0 ? param[1].split('.')[1] : param[1]; break; } } if (id) { var link = PROXY_URL + ACM_QUERY.format(id) + '&' + PROXY_URL_QUERY + encodeURIComponent(ACM_QUERY_URL); // purchase link is a placeholder for a link to PDF var a, container; var links = document.getElementsByTagName('a'); for (i = 0; i < links.length; i++) { a = links[i]; if (a.href.indexOf(ACM_PURCHASE_LINK) === 0) { container = a.parentNode; container.innerHTML = ACM_LINK.format('#'); setClick(container.childNodes[0], link); break; } } } } } function setClick(elem, link) { elem.addEventListener('click', function (e) { commPort.postMessage({name: REQUEST_AUTH, href: link}); e.preventDefault(); return false; }); }
      
      







このリンクをクリックすると、大学のイントラネット上のセッションIDを含むCookie値がリクエストに添付されます。

イントラネットセッションIDを追加する
バックグラウンドコードで:

 // config var AUTH_URL = 'https://university.org/intranet'; var AUTH_COOKIE = 'JSESSIONID'; // const var REQUEST_AUTH = 'auth'; chrome.runtime.onConnect.addListener(function (port) { port.onMessage.addListener(function (request) { var answer = {toRequest: request.name}; if (request.name === REQUEST_AUTH) { // check the authorization on the select web-site answer.href = request.href; answer.result = false; answer.id = ''; chrome.cookies.get({url: AUTH_URL, name: AUTH_COOKIE}, function (cookie) { if (cookie) { answer.result = true; answer.id = cookie.value; } port.postMessage(answer); }); } }); });
      
      





ページに埋め込まれたコード内:

 var commPort = chrome.runtime.connect(); commPort.onMessage.addListener(function (answer) { if (answer.toRequest === REQUEST_AUTH) { // add an authorization id, and send the request to to the proxy window.location = answer.href + '&' + PROXY_ID_QUERY + answer.id; } });
      
      







確かに、IEEEに関する記事を開くために、私は多くのことをいじらなければなりませんでした。 IEEEの場合、サブスクリプション付きのユーザーIDを持つCookieを受信するために、プロキシを介して彼の電子アカウントのWebサイトのページを開く必要があります(Chromeでは追加のタブが開き、コンテンツをダウンロードするとすぐに閉じます)。 さらに、PHPで受信したCookie(後者はオプション)のドメインとパスの値を置き換えて、PDFリクエストとともにプロキシに自動的に送信できるようにする必要がありました:(識別子のこの追加リクエストの後)domain = ieeexplore.ieee .org、およびPDFへのリンクはすでに.ieeexplore.ieee.org / queryを指していませんが、university.org /〜user / proxy?url = ieeexplore.ieee.org%5Fqueryを指しているため、ドメイン=で編集する必要がありました。 university.org、パス= /〜〜ユーザー/プロキシ。

IEEEから受信したCookieの変更
 // config $cookieDomain = '.university.org'; $cookiePath = '/~user'; $headerArray = explode("\r\n", $response['header']); $js = ''; foreach ($headerArray as $headerLine) { if (strpos($destinationURL, 'ieee.org') !== false) { if (strpos($headerLine, 'Set-Cookie: ') !== false) { $cookieArray = explode(': ', $headerLine, 2); $headerLine = $cookieArray[0].': '; $cookieDataArray = explode('; ', $cookieArray[1]); $isFirstKey = true; $js .= ' document.cookie = "'; foreach ($cookieDataArray as $cdKey => $cookieData) { list($cname, $cvalue) = array_merge(explode('=', $cookieData), array('')); if ($cname === 'domain') { $cvalue = $cookieDomain; $cookieDataArray[$cdKey] = $cname.'='.$cvalue; } if ($cname === 'path') { $cvalue = $cookiePath; $cookieDataArray[$cdKey] = $cname.'='.$cvalue; } $headerLine .= ($isFirstKey ? '' : '; ').$cookieDataArray[$cdKey]; $js .= ($isFirstKey ? '' : '; ').$cookieDataArray[$cdKey]; $isFirstKey = false; } $js .= "\";\r\n"; } header($headerLine); if (strlen($js) > 0) { echo "\r\n<script>\r\n".$js.'</script>'; // insert JS code into the page to set IEEE session and identification cookies } } else { foreach ($headerArray as $headerLine) { header($headerLine); } } }
      
      







最後に注意したいのは、そのような実装の弱点です。



そして、これが完全なソースコードです。



PS誰かが最高の同じ便利な解決策を知っているなら、共有してください。 コードを取得、使用、編集、共有などできます。 一般的に、githubにアップロードするというアイデアがあります。コメントに要望があれば、そうします。

PPSコードをあまりscらないでください。コード自体よりも、どの種類のプロキシリクエスト(特にIEEEのEBの場合)を送信するかを判断するのに時間がかかりました。 不完全な場合もあります-常に正しいリンクに置き換えないでください。



All Articles