ページ

2016年7月31日日曜日

Feedlyの未読記事をSlackへGASで通知するBotの作成 2


前回の続きです。
前回はプロフィール情報をログ出力する所までやりました。
今回はまずは未読の件数を取得してみたいと思います。

未読件数一覧

早速試しに以下コマンドを叩いてみたください。
$ curl -H 'Authorization: OAuth {トークン}' https://cloud.feedly.com/v3/markers/counts
ずらずらっと件数とidがセットで返ってくると思います。
例)
{
  "unreadcounts": [
    {
      "count": 605,
      "id": "user/c805fcbf-3acf-4302-a97e-d82f9d7c897f/category/global.all",
      "updated": 1367539068016
    },
    {
      "count": 601,
      "id": "user/c805fcbf-3acf-4302-a97e-d82f9d7c897f/category/design",
      "updated": 1367539068016
    },
    {
      "count": 508,
      "id": "feed/http://www.autoblog.com/rss.xml",
      "updated": 1367539068016
    }
  ],
  "updated": 1367539057683
}
idがuser/から始まっているものは
user/・・・/category/global.allが全未読記事数
user/・・・/category/designがカテゴリー毎の未読記事数
となっています。
またidがfeed/から始まっているものは
それぞれ登録したブログ毎の未読記事数となります。

feed毎の未読記事件数を取得

前回プロフィール表示した時のsrc/main.jsを修正します。
/**
 * Entry function.
 */
function exec() {
  FeedlySlackBot.unread();
}

/**
 * FeedlySlackBot object.
 */
var FeedlySlackBot = {

  PROFILE_URL: 'https://cloud.feedly.com/v3/profile',
  UNREAD_COUNT_URL: 'https://cloud.feedly.com/v3/markers/counts',

  /**
   * Get auth string.
   *
   * @return {String}
   */
  auth: function() {
    return 'OAuth {トークン}';
  },

  /**
   * Log out profile info.
   */
  profile: function() {

    var auth = this.auth();
    var response = this.get(this.PROFILE_URL, auth);
    Logger.log(response.getContentText("UTF-8"));
  },

  /**
   * Get unread feeds.
   */
  unread: function() {

    var auth = this.auth();
    var response = this.get(this.UNREAD_COUNT_URL, auth);

    var feeds = [];
    // Parse json.
    var obj = JSON.parse(response.getContentText("UTF-8"));
    var unreadcounts = obj.unreadcounts;
    for (var i = 0; i < unreadcounts.length; i++) {
      var unread = obj.unreadcounts[i];
      if (unread.count > 0 && unread.id.indexOf('feed/') > -1) {
        Logger.log('unread => id : ' + unread.id + ', count : ' + unread.count);
        feeds.push(unread);
      }
    }

    if (feeds.length == 0) {
      Logger.log('Unread feed not found.');
      return;
    }
  },

  /**
   * Get response with auth.
   *
   * @param {String} url
   * @param {String} auth
   */
  get: function(url, auth) {
    var headers = {'Authorization' : auth};
    var options = {
      'method' : 'get',
      'contentType' : 'application/json;charset=utf-8',
      'headers' : headers
    };

    return UrlFetchApp.fetch(url, options);
  }
};
追加したunreadメソッドで未読件数をGETするリクエストを投げて、
結果をfeedsの配列に追加していってます。
その際に件数が1件以上、idがfeed/・・のみでフィルタリングしてます。
GoogleDriveにアップロードしてexecを実行するとログに
ブログ毎の未読件数一覧が表示されているかと思います。

アクセストークンが有効期限切れの場合

developer用のアクセストークンは30日で有効期限が切れます。
アクセストークンが有効期限切れの場合、以下のようなメッセージが帰ってきます。
{"errorCode":401, "errorId":"ap2-sv2.XXXXXXXXXX.XXXXXXX", "errorMessage":"token expired: XXXXXXXXXXX (-XXXXXX)"}%
401が帰ってきた場合は再度アクセストークンを作り直す必要があります。
ここら辺を継続的にできるようになればいいのですが・・
次回は未読記事のタイトルとURLをSlackにポストするまでをやってみたいと思います。

2016年7月27日水曜日

Atomまとめ5 - おすすめパッケージ紹介 -


最近のAtom環境ですが、フロントエンドの画面周りの開発時などで
個人的にかなり捗るとベストな環境を発見したので晒してみたいと思います。

オススメなパッケージ組み合わせ

いつもRailsPhoneGap-CLIなど開発する際には、livereloadさせながら
htmlcss,javascriptなど実装してるんですが、そういう場合に
この3つのパッケージを入れとくと凄く捗ります😄

👇実際に使ってる様子です
gif
browser-plus
前回も紹介しましたが、さらにlivereloadを有効にするには
このアイコンをクリックします。
emmet
既に使ってる方もいるとは思いますが、例えば・・・
<div id="hoge"><a href="" class="fuga"></a></div>
と書きたい時に
div#hoge>a.fuga
と書いてタブを押せばhtmlに展開してくれます🌟便利

platformio-ide-terminal
結構ターミナル系のパッケージ色々試しましたが、
WindowsとMac両方そつなく使えるのを探していたら
platformio-ide-terminalに出会いました
使い方はシンプルでエディッタ下部の+を押すとターミナルが出現します。
また複数ターミナルを開けるので便利です。
gif

2016年7月23日土曜日

Feedlyの未読記事をSlackへGASで通知するBotの作成 1


現在RSSリーダーは主にFeedlyを使ってるんですが、
未読記事を定期的にSlackにポストしてくれたら便利かな〜と思って
作ってみることにしました。
※ もしかしたら既にBotがある?かもしれませんが・・
事前準備

まずはここからログインし、FeedlyのDeveloper用のトークンをゲットします。

※ Feedlyのアカウントを持ってない方はこの機会にどうぞ
(⚠️Feedlyのまわし者ではありませんので・・)
ログインすると登録しているメールアドレスに認証用のメールが送られます。
送られたメールのリンクをクリックするとアクセス用のトークンがもらえます。

FeedlyのAPIを呼ぶ際に必要なトークンとなります。
試しに自分のプロフィール情報を取ってみます。
$ curl -H 'Authorization: OAuth {トークン}' https://cloud.feedly.com/v3/profile
{トークン}部分に上で取得したトークンを貼り付けます。
実行するとずらずらっとプロフィール情報が取得できたかと思います。
開発環境

次にローカルでの開発環境ですが、
こちらも以前の記事で紹介したnode-google-apps-scriptを使用します。
初期設定などは上の記事を参照して下さい。
※事前にnode.jsのインストールが必要です⚠️
まずはパッケージ情報や依存するパッケージなどを記述するpackage.jsonを作成します。
$ npm init
name: (....) feedly_slack_bot⏎ # 名前はfeedly_slack_bot
version: (1.0.0) ⏎
description: ⏎
entry point: (index.js) main.js ⏎ # 今回はmain.jsがメインファイル
・・・ 残りは好きなように設定
Is this ok? (yes) yes ⏎
以下のようなpackage.jsonが作成されているかと思います。
{
  "name": "feedly_slack_bot",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Slowhand0309",
  "license": "MIT"
}
ここで肝心のnode-google-apps-scriptをインストールします。
$ npm install node-google-apps-script --save-dev
これでGASへのアップロードがCLIで行えるようになります。
プロフィール表示

試しにGASでプロフィールを表示するまでをやってみます。
gapps initを行い、ローカルにgapps.config.jsonsrc/*.js
をダウンロードしてきます。
src/main.jsとし、↓に編集します。
/**
 * Entry function.
 */
function exec() {
  FeedlySlackBot.profile();
}

/**
 * FeedlySlackBot object.
 */
var FeedlySlackBot = {

  PROFILE_URL: 'https://cloud.feedly.com/v3/profile',

  /**
   * Get auth string.
   *
   * @return {String}
   */
  auth: function() {
    return 'OAuth {トークン}';
  },

  /**
   * Log out profile info.
   */
  profile: function() {

    var auth = this.auth();
    var response = this.get(this.PROFILE_URL, auth);
    Logger.log(response.getContentText("UTF-8"));
  },

  /**
   * Get response with auth.
   *
   * @param {String} url
   * @param {String} auth
   */
  get: function(url, auth) {
    var headers = {'Authorization' : auth};
    var options = {
      'method' : 'get',
      'contentType' : 'application/json;charset=utf-8',
      'headers' : headers
    };

    return UrlFetchApp.fetch(url, options);
  }
};
{トークン}は上で取得したトークンを設定して下さい。
アップロードし、
$ gapps upload
Google Drive上でexecを指定し実行するとログにプロフィール情報が
出力されているかと思います。
今回はここまで

2016年7月20日水曜日

番組で紹介されていたセブンの商品を購入


ちょっと前にとある番組でセブンイレブンの商品を紹介されていて
とても美味しそうだったので、実際に購入してみました。


まるでマンゴーを冷凍したような食感のアイスバー


税込 140円

これはその名の通り!!マンゴーを冷凍したかのような食感でした(まんま)。
しっとりとした食感で後味も良くてこれは人気なのがわかる




実際セブンに買いに行った時もこのアイスを買ってる人がちらほらいました。


金のビーフカレー


税込 398円

これは便利!!
何が便利かというと調理する時に湯煎とかしなくても(もちろん湯煎もできる)
レンジで袋のまま温めるだけ!! いや〜便利。

肝心の味もお肉が柔らかくてとても美味しく仕上がってました。




さばの塩焼き


税込 280円

こちらも少しフィルムを剥がしてレンジで温めるだけでいただけます。
しかも骨を機会 + 手作業で抜いてるらしいのでかぶりついて食べれます^^。


小籠包


税込 192円

こちらはフライパンでの調理になりますが、ま〜肉汁がすごい^^;
箸で少し割っただけで中から溢れてました。



皮ももっちりで本格的でした。

2016年7月16日土曜日

Android MarshmallowのPermission問題をPluginで解決


Android 6.0(Marshmallow)からpermissionモデルが新しくなってます。

Android 6.0未満はインストール時に必要なpermissionsを一括で
同意し、アプリの実装も許可されているものとして実装してます。
が、
Android 6.0からはインストール後の初期状態は全て拒否されており、
アプリを起動して必要になった時にユーザーに同意を求めます。

PhoneGapを使ってる場合

Javaでネイティブでゴリゴリ実装〜という場合は素直にユーザーの同意が
必要になった場合に
if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {
   // ユーザーに許可を求める
   ・・・・
}
といった具合に実装していかないといけませんが、PhoneGapなら
cordova-plugin-android-permissionsという便利なプラグインがっ!!

cordova-plugin-android-permissions


Android6.0未満の場合はpermissionチェックで全て許可済みになります。
今後の為に入れておいて損は無いかな〜と。
Install
$ phonegap cordova plugin add cordova-plugin-android-permissions
例)カメラのパーミッションが必要な場合
var permissions = cordova.plugins.permissions;
permissions.hasPermission(permissions.CAMERA, checkPermissionCallback, null);

function checkPermissionCallback(status) {
  if(!status.hasPermission) {
    var errorCallback = function() {
      console.warn('Camera permission is not turned on');
    }

    permissions.requestPermission(
      permissions.CAMERA,
      function(status) {
        if(!status.hasPermission) errorCallback();
      },
      errorCallback);
  }
}
指定できるpermission一覧はここで確認できます。