読者です 読者をやめる 読者になる 読者になる

不動産屋のラノベ読み

不動産売買営業だけどガチガチの賃貸派の人のブログ

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');
}

 
なんか汚いコードで気に入りません。あとは誰かよろしく。
 
 
 

追記

なんか動かなくなったんで確認したところ、現在、はてなWebhookが動作していないようです。
 
はてなに確認したところ、現在調査中ということです。あらら……