Presso と Pocket を連携するスクリプトを作りました
自前のサーバを用意できない人向けに、クラウドで賄いました。
要 Googleドライブ
初めてのGASだったので、コードを書くのだけで疲れましたので、説明はおざなりです。需要があれば詳しくやります。ブクマがついたので、少し詳しくやります。
これはなに?
はてなのニュースアプリ「Presso」を Pocket と連携するためのスクリプトです。
具体的には、タグなしコメントなしの非公開ブクマが登録されると それを Pocket にも登録します。
今のところは快適。
使い方
Googleドライブにスクリプトを保存し使えるようにする
https://script.google.com/
↑にアクセスして、適当にプロジェクトを作って下さい。
「コード.gs」というファイルができると思うので、下記のスクリプトを貼りつけます。
メニューの「公開」「ウェブ アプリケーションとして導入」を選択します。
新しいバージョンを作り、「自分」「全員(匿名ユーザーを含む)」に設定して公開。
公開アドレスを控えておいてください。
次にスクリプトの認証をします。
「doPost」を選んで実行します。
認証画面が出たら、認証ボタンを押してください。エラーが出ますが気にしないでください。
Pocket API の Consumer Key を取得する
http://getpocket.com/developer/apps/new
↑にアクセスして、アプリケーションを作成します。
権限はAdd、プラットフォームはWebに設定します。
Consumer Key を控えておいてください。
はてなブックマーク Webhook を設定する
はてブの「設定」を開き、「外部サイト連携」タブを選びます。
「WebHook」に控えておいた公開アドレスを設定します。
「受け取るイベントの種類」は「ブックマークの追加/更新/削除」「非公開ブックマークのイベント通知も送信する」にチェックを入れてください。
その際にキーも登録し、控えておいてください。
oAuth認証をする。
控えた公開アドレスにアクセスし、最初のボックスに Consumer Key 次のボックスにWebhookキーを貼りつけて、登録ボタンを押してください。
上手くいけば、認証アドレスへのリンクが表示されるのでクリックし、Pocketの認証ページになります。
そこで認証をし、Google Apps Script に戻って「認証しました」が出たら終了です。
Pressoからブクマすると連携されていると思います。
コード
var properties = PropertiesService.getScriptProperties(); function doGet() { if ( properties.getProperty('consumer_key') && properties.getProperty('code') ){ return pocket_authorize(); } return showform(UiApp.createApplication()); } function doPost(post) { if (post.parameter.preperation == 1){ return pocket_oAuth( post ); } if ( (post.parameter.is_private == 1) && (post.parameter.comment == '') && (post.parameter.key == properties.getProperty('key'))){ if ( post.parameter.status == 'add' ) return pocket_add(post); // if ( post.parameter.status == 'delete' ) return pocket_delete(post); }else{ return HtmlService.createHtmlOutput('pass'); } } function pocket_add(post){ var response = UrlFetchApp.fetch("https://getpocket.com/v3/add", { 'method': 'post', 'muteHttpExceptions': true, 'payload':{ 'url': post.parameter.url, 'title': post.parameter.title, 'consumer_key': properties.getProperty('consumer_key'), 'access_token': properties.getProperty('access_token') } }) if (response.getResponseCode() != 200){ if (response.getResponseCode() >= 499) properties.deleteAllProperties(); return HtmlService.createHtmlOutput('error'); } return HtmlService.createHtmlOutput('add'); } function pocket_oAuth(post){ var app = UiApp.getActiveApplication(); var response = UrlFetchApp.fetch("https://getpocket.com/v3/oauth/request", { 'method': 'post', 'muteHttpExceptions': true, 'payload':{ 'consumer_key': post.parameter.consumer_key, 'redirect_uri': ScriptApp.getService().getUrl() } }) if (response.getResponseCode() != 200){ properties.deleteAllProperties(); return app.add(app.createLabel('認証失敗しました')); } var code = response.getContentText().replace('code=',''); properties.setProperties({ 'key': post.parameter.key, 'consumer_key': post.parameter.consumer_key, 'code': code }); return app.add( app.createAnchor('認証アドレス', 'https://getpocket.com/auth/authorize?request_token=' + code + '&redirect_uri=' + encodeURIComponent(ScriptApp.getService().getUrl()) )); } function pocket_authorize(){ var app = UiApp.createApplication(); var response = UrlFetchApp.fetch("https://getpocket.com/v3/oauth/authorize", { 'method': 'post', 'muteHttpExceptions': true, 'payload':{ 'consumer_key': properties.getProperty('consumer_key'), 'code': properties.getProperty('code') } }) if (response.getResponseCode() != 200){ properties.deleteAllProperties(); return app.add(app.createLabel('認証失敗しました')); } var access_token = response.getContentText().split('&')[0].replace(/access_token=/,''); properties.setProperties({'access_token': access_token}); return showform( app.add(app.createLabel('認証しました')) ); } function showform(app){ var form = app.createFormPanel(); form.add( app.createFlowPanel() .add(app.createFlowPanel() .add(app.createInlineLabel('Pocket Consumer Key')) .add(app.createTextBox().setName("consumer_key")) ) .add(app.createFlowPanel() .add(app.createInlineLabel('はてな Webhook キー')) .add(app.createTextBox().setName("key")) ) .add(app.createFlowPanel() .add(app.createHidden("preperation", "1")) .add(app.createSubmitButton("登録")) ) ); app.add(form); return app; } function pocket_delete(post){ //削除の処理をしないと、Presso でブクマをつけ外しすれば Pocket だけ残るね! return HtmlService.createHtmlOutput('delete'); }
なんか汚いコードで気に入りません。あとは誰かよろしく。