- 投稿日:2020-09-14T20:58:20+09:00
Instagramにアップロードされた写真を埋め込みHTML形式で取得してみた
はじめに
Instagramにアップロードされた写真を埋め込みHTML形式で取得してみました。
APIを使うために、Facebook developer にアプリを登録したり、Facebookページを作成したり、Instagramのアカウントをビジネスアカウントに切り替えたりと色々事前準備が必要でした。
トークンの取得方法は下記サイトがすごく丁寧に解説してくれていて、参考にさせていただきました。
https://navymobile.co.jp/instagram-graph-api今回は、Graph API用のアプリ(開発モード)とoEmbed用のアプリ(ライブモード)2つ作りました。
Facebookにレビューが通ればアプリは一つで実現できると思います。環境は下記になります。
macOS Catalina 10.15.6
Node.js v14.8.0
(Node.js Library)request 6.14.7コード
下記、コードになります。
(1) Graph API でアカウントに紐付く投稿のURLを取得
(2) oEmbedでURLを埋め込みHTMLに変換
の流れになります。APIの仕様は下記を参照しました。
・Graph API
https://developers.facebook.com/docs/instagram-basic-display-api/reference/user・oEmbed
https://developers.facebook.com/docs/instagram/oembedbatch_instagram.jsconst request = require('request'); const URL_INSTAGRAM_API='https://graph.facebook.com/v8.0/'; const INSTAGRAM_USERID=process.env.INSTAGRAM_USERID; const INSTAGRAM_APP_TOKEN=process.env.INSTAGRAM_APP_TOKEN; const INSTAGRAM_APP_OEMBED_TOKEN=process.env.INSTAGRAM_APP_OEMBED_TOKEN; const URL_INSTAGRAM_POSTS=URL_INSTAGRAM_API + INSTAGRAM_USERID + '?fields=name,media.limit(99){caption,like_count,media_url,permalink,timestamp,username,comments_count}&access_token=' + INSTAGRAM_APP_TOKEN; const URL_INSTAGRAM_OEMBED=URL_INSTAGRAM_API + 'instagram_oembed?fields=html,thumbnail_width,type,width&access_token=' + INSTAGRAM_APP_OEMBED_TOKEN + '&url='; var get_instagram_options_base = { url: '', method: 'GET', json: true }; var html_data = []; var get_instagram_options_1 = get_instagram_options_base; get_instagram_options_1.url = URL_INSTAGRAM_POSTS; request(get_instagram_options_1, function (error, response, posts) { var url_list = []; posts.media.data.forEach(data => { url_list.push(data.permalink); }); // console.log(url_list); urlToHtml_OEmbed( url_list, function() { console.log(html_data); return; } ); }); function urlToHtml_OEmbed(urls, callback) { if (urls.length == 0) { return callback(); } else { let url = urls.shift(); var get_instagram_options_2 = get_instagram_options_base; get_instagram_options_2.url = URL_INSTAGRAM_OEMBED + url; request(get_instagram_options_2, function (error, response, oembed) { html_data.push(oembed.html); // console.log(urls.length); urlToHtml_OEmbed( urls, callback ); }); } }実行結果は下記になります。
XXXXXXXXは各自の環境で置き換えて下さい。% export INSTAGRAM_USERID=XXXXXXXX % export INSTAGRAM_APP_TOKEN=XXXXXXXX % export INSTAGRAM_APP_OEMBED_TOKEN=XXXXXXXX % node batch_instagram.js [ '<blockquote class="instagram-media" data-instgrm-captioned data-instgrm-permalink="https://www.instagram.com/p/CEhFobmnEnM/?utm_source=ig_embed&utm_campaign=loading" data-instgrm-version="12" style=" background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:658px; min-width:326px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"><div style="padding:16px;"> <a href="https://www.instagram.com/p/CEhFobmnEnM/?utm_source=ig_embed&utm_campaign=loading" style=" background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100%;" target="_blank"> <div style=" display: flex; flex-direction: row; align-items: center;"> <div style="background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 40px; margin-right: 14px; width: 40px;"></div> <div style="display: flex; flex-direction: column; flex-grow: 1; justify-content: center;"> <div style=" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 100px;"></div> <div style=" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 60px;"></div></div></div><div style="padding: 19% 0;"></div> <div style="display:block; height:50px; margin:0 auto 12px; width:50px;"><svg width="50px" height="50px" viewBox="0 0 60 60" version="1.1" xmlns="https://www.w3.org/2000/svg" xmlns:xlink="https://www.w3.org/1999/xlink"><g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g transform="translate(-511.000000, -20.000000)" fill="#000000"><g><path d="M556.869,30.41 C554.814,30.41 553.148,32.076 553.148,34.131 C553.148,36.186 554.814,37.852 556.869,37.852 C558.924,37.852 560.59,36.186 560.59,34.131 C560.59,32.076 558.924,30.41 556.869,30.41 M541,60.657 C535.114,60.657 530.342,55.887 530.342,50 C530.342,44.114 535.114,39.342 541,39.342 C546.887,39.342 551.658,44.114 551.658,50 C551.658,55.887 546.887,60.657 541,60.657 M541,33.886 C532.1,33.886 524.886,41.1 524.886,50 C524.886,58.899 532.1,66.113 541,66.113 C549.9,66.113 557.115,58.899 557.115,50 C557.115,41.1 549.9,33.886 541,33.886 M565.378,62.101 C565.244,65.022 564.756,66.606 564.346,67.663 C563.803,69.06 〜(中略)〜 utm_source=ig_embed&utm_campaign=loading" style=" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px;" target="_blank"> ma sa</a> (@mamemame_s) on <time style=" font-family:Arial,sans-serif; font-size:14px; line-height:17px;" datetime="2016-08-13T10:54:00+00:00">Aug 13, 2016 at 3:54am PDT</time></p></div></blockquote>\n' + '<script async src="//platform.instagram.com/en_US/embeds.js"></script>' ]以上です。
- 投稿日:2020-09-14T19:40:51+09:00
【macOS】Virtual BoxにCent OSのインストール後、起動させるとクラッシュする問題
仮想環境の構築に死ぬ程ハマったので、備忘録として書きます。
・環境
macOS catalina Ver10.15.6Virtual Box 6.1.14
CentOS-8.2.2004-x86_64-dvd1.isoをインストールしようとした。
・状況
OSインストール後の再起動で、Virtual Box VMがクラッシュ。
その後起動しようとしても同様にクラッシュ。結論:Virtual Boxを6.0.14にダウングレードしたら起動できた
もう怖くないLinuxコマンド。手を動かしながらLinuxコマンドラインを5日間で身に付けよう
山浦先生のLinux講座を学ぶために環境構築しようとしたところ、何をやってもクラッシュした。
ダウングレードしてようやく成功したので、
・設定→ディスプレイ→グラフィックコントローラをVboxVGAに
・設定→ストレージ→光学ドライブアイコンクリック→仮想ドライブからディスクを消去
でやっと起動。
・試した事
仮想メモリ1024B→2048B ×
ブートメディアの順番変更 ×
仮想マシンにCentOSをインストールする ×
実機のメモリクリア ×
VirtualBoxへCentOS7をインストール ×
- 投稿日:2020-09-14T16:28:12+09:00
【解決済】heroku loginでハマった時の対処法
環境
Mac Catalina 10.15.6
zsh 5.7.1 (x86_64-apple-darwin19.0)
heroku/7.42.13 darwin-x64 node-v12.16.2現象
ターミナルで
heroku login
"heroku" Error: tunneling socket could not be established, cause=getaddrinfo ENOTFOUND proxy.server.com
と出る。これで30分くらい溶かしました...
解決方法
ターミナルで
export HTTP_PROXY=""
export HTTPS_PROXY=""
を実行するだけ。解決に至った経緯
heroku --version
とすると
› Warning: HTTPS_PROXY set to https://proxy.server.com:8000
› Warning: HTTP_PROXY set to http://proxy.server.com:8000
heroku/7.42.13 darwin-x64 node-v12.16.2と出たので、
HTTPS_PROXY
,HTTP_PROXY
のsetをなくせばいいのではないかと気づいた。
- 投稿日:2020-09-14T11:00:19+09:00
finderで隠しファイルを表示するショートカットキー
よく忘れるのでメモ
finderで隠しファイルを表示したいフォルダを開いて
command
+shift
+.
を押す。
- 投稿日:2020-09-14T10:31:16+09:00
MacでFlutterの開発環境を構築する手順
Flutterとは
Flutterとは、Googleによって開発されたモバイルアプリケーションSDK (Software Development Kit)です。
クロスプラットフォームに対応していて、1つのコードで複数のプラットフォーム(iOS,Androidなど)に対応したアプリケーションを開発することができます。開発環境構築手順
MacでFlutterの開発を始める為に開発環境を構築していきましょう。
※所要時間約1時間(ダウンロードやインストールをするので時間かかります。)1.Flutterをダウンロードする
下記の公式サイトからFlutterをダウンロードします。
https://flutter.dev/docs/get-started/install/macos
flutter_macos_1.20.3-stable.zip をクリックしてダウンロードします。
※1.20.3の部分はアップデートされると変わります。2.ファイルを解凍して、PATHを通す
作業ディレクトリを作成して、ダウンロードしたzipを解凍
※作業ディレクトリ名や作成場所は好きなところに作ってください。mkdir ~/development cd ~/development unzip ~/Downloads/flutter_macos_1.20.3-stable.zip次にPATHを通します。
[PATH_TO_FLUTTER]
ここには解凍したFlutterのディレクトリを書いてください。
bashの場合echo 'export PATH="$PATH:[PATH_TO_FLUTTER]/flutter/bin"' >> ~/.bash_profile source ~/.bash_profilezshの場合
echo 'export PATH="$PATH:[PATH_TO_FLUTTER]/flutter/bin"' >> ~/.zshrc source ~/.zshrcflutterコマンドが使えるようになっていれば成功です。
3.実行環境に必要なものを確認する
Flutterは
flutter doctorコマンドを実行することで
- 問題ないところには✔︎マーク
- 不足しているものには✖︎印
- 問題があるところには!マーク
が表示されて実行環境に何が足りないのか教えてくれますので、次は足りないものをインストールしていきましょう。
4.Android Studioをインストールする
下記の公式サイトからAndroid Studioをダウンロードします。
https://developer.android.com/studio/index.html
DOWNLOAD ANDROID STUDIO をクリックし、利用規約に同意してダウンロードします。ダウンロードが終わったらAndroid Studioを起動し、表示にしたがってインストールをします。
※いろいろと聞かれますが、基本的には全部Next,FinishをクリックすればOKです。Welcome to Android Studioの画面が出れば成功です。
5.Android Studioにプラグインを導入する
Android StudioにFlutterとDartのプラグインをインストールします。
起動画面から
1. Configure->Pluginsを選択
2. 検索ボックスにFlutterと入力
3. 出てきたFlutterという名称のプラグインをインストール
※DartプラグインはFlutterプラグインのインストールと同時にインストールされます。6.デバイスのエミュレータを導入する
Android Studioでデバイスのエミュレータを導入していきます。
起動画面から
1. Start a new Flutter projectを選択
2. Flutter Applicationを選択してNextをクリック
3. Project nameは任意の名前で入力しNextをクリック
4. Company domainは任意の名前で入力しFinishをクリック
5. エディタが表示されたら、メニューバーのTools->AVD Managerを選択
6. Create Virtual Deviceをクリック
7. Category->Phoneを選択されていることを確認し、任意のDeviceを選択してNextをクリック(自分はPixel 3aを選択しました)
8. 任意のOSをDownloadをクリックしてダウンロード(自分はAndroid10.0を選択しました)
9. ダウンロードした項目を選択し、Nextをクリック
10. 設定画面が出てきますが、何もせずにFinishをクリックこれでデバイスのエミュレータを導入することができました。
7.Androidのライセンスを許可する
Androidのライセンスを許可しないとflutter doctorを実行した際に!マークが出るので許可していきます。
flutter doctor --android-licenses
上記コマンドを実行するとライセンスに許可するかどうかを聞かれるので yを入力し、Enterを押して許可をしていきましょう。
flutter doctorを実行し、Android toolchainの部分に✔マークがついていれば成功です。
8.Xcodeをインストールする
XcodeはAppStoreからダウンロードできますのでダウンロードしましょう。
最新のMacOSを利用していない場合はダウンロードできない可能性がありますので以下を参考にダウンロードしてください。
Xcode - インストール可能 対応バージョン macOS 一覧 / Install Support macOS Version Listsインストールをすすめて
Welcome to Xcodeの画面が出れば成功です。9.CocoaPodsをインストールする
CocoaPodsというプラグインも必要なのでインストールします。
sudo gem install cocoapodsパスワードを聞かれますので自分のMacのパスワードを入力しましょう。
10.最後にflutter doctorで確認する
[✓] Flutter (Channel stable, 1.20.3, on Mac OS X 10.14.6 18G6020, locale ja-JP) [✓] Android toolchain - develop for Android devices (Android SDK version 30.0.2) [✓] Xcode - develop for iOS and macOS (Xcode 11.3.1) [✓] Android Studio (version 4.0)上記にような表示になっていれば環境構築完了です。
以上、これでFlutterでアプリを開発を始めることができます!
番外編 VSCodeで開発する場合
VSCodeで開発したい場合は、更に設定が必要なのでやっていきましょう。
※VSCodeのインストールは省略します。1.VSCodeにFlutterの拡張機能をインストールする
- Shift+Command+Xで拡張機能を表示
- 検索ボックスにFlutterと入力
- 出てきたFlutterの拡張機能をインストール
2.VSCodeでFlutter新規プロジェクトを作成
- Shift+Command+Pでコマンドパレットを表示
- 検索ボックスにFlutterと入力
- Flutter:New Projectをクリック
- 任意のプロジェクト名を入力
- プロジェクトを作成するディレクトリを聞かれるので任意の作業ディレクトリを指定する
3.VSCodeでデバイスのエミュレータを起動する
- プロジェクトを作成するとVSCodeの右下あたりにNo Deviceと表示されるのでクリック
- Start iOS SimulatorまたはStart Pixel3a API 29をクリック ※Androidのエミュレータは設定したデバイスによって違います。
4.最後にflutter doctorで確認する
[✓] Flutter (Channel stable, 1.20.3, on Mac OS X 10.14.6 18G6020, locale ja-JP) [✓] Android toolchain - develop for Android devices (Android SDK version 30.0.2) [✓] Xcode - develop for iOS and macOS (Xcode 11.3.1) [✓] Android Studio (version 4.0) [✓] VS Code (version 1.49.0) [✓] Connected device (1 available) • No issues found!上記にような表示になっていればVSCodeの設定完了です。
- 投稿日:2020-09-14T01:02:49+09:00
Golang基礎 + MacにGoをインストール
はじめに
Golang又はGo言語 とは
・コンパイル言語の中でも特に処理が高速
・2009年にGoogle開発された
・シンプルな構文
・コードの可読性が高い
・初心者はpythonやphpやRubyからのが良い勉強中なので間違っていたら教えてください。
開発環境
Visual Studio Code
MacGoのインストール
ターミナルで実行してください
1. homebrewを最新にします$ brew update2. Goのインストール
$ brew install go3. Goがインストールされたか確認バージョンが返ってくればOK
$ go versionプログラムの基本構造
順次進行
上から順に処理していく
条件分岐
特定の条件の時にAかBなどに分岐する
繰り返し
決まった回数や条件に当てはまる間は繰り返す
Goの記述方法
例)test.gopackage main ←Goのプログラムは1つはmainに属している必要がある import ("fmt") ←fmtパッケージをインストールしてる func main(){ ←関数を記述 mainからスタートする fmt.Println("hello") ←これはfmtパッケージを用いてhelloを表示する } 波かっこ内はブロックというGoのプログラムはなんらかのパッケージに属している必要があります
実行するにはターミナルに
$ go run ファイル名.go 上記の例だと $ go run test.go と記述これでhelloが表示されます。
変数の宣言仕方
例)test.gopackage main func main(){ var num int ←(var 変数名 型) num = 1 ←1を代入 fmt.Println(num) }実行すると1が表示される
宣言の省略すると
例)test.gopackage main func main(){ num := 1 ←宣言の省略書き方 ↑は var num int ←(var 変数名 型) num = 1 この2行と一緒 fmt.Println(num) }実行すると1が表示される
Goのデータ型
int 整数
float64 小数
string 文字列
bool turnかfalseが入る配列の宣言
変数 := [要素数]データ型{データ1、データ2、...}
例)test.gopackage main func main(){ a := [3]string{"sasa","sumika","takako"} ←配列の宣言 fmt.Println(a[0]) fmt.Println(a[1]) fmt.Println(a[2]) }実行すると
こうなりますsasa sumika takako配列の要素数の省略、変更
例)test.gopackage main func main(){ a := [...]string{"sasa","sumika","takako"} ←配列の宣言[...]で要素数を省略できる a[0] = "aki" fmt.Println(a[0]) fmt.Println(a[1]) fmt.Println(a[2]) }実行するとsasaがakiに変更されています
aki sumika takako条件分岐
例)test.gopackage main func main(){ if a := 0 ; a >= 20{ fmt.Println("20以上") } else if a == 0{ fmt.Println("0です") } else { fmt.Println("条件以外") }実行すると以下が表示されます。
0です繰り返しfor
for 変数 := 初期値; 条件; 増減式{}
例)test.gopackage main func main(){ for i := 0; i<=4; i++ { fmt.Println(i) }実行すると以下が表示されます。
0 1 2 3 4関数定義
func 関数名(引数の定義なくても良い){
retuen ←戻り値がいるなら
}例)test.gopackage main func say(){ ←引数なし fmt.Println("hello") } func say1(say string){ ←引数あり (変数 データ型) fmt.Println(say) } func say2(x,y int) int { ←引数戻り値1つあり (変数 データ型) 戻り値のデータ型{ return (x+y) } func say3(x,y int) (int, int) { ←引数戻り値2つあり (変数 データ型) 戻り値のデータ型{ return (x+y), (x-y) } func main(){ say() ←引数なし say1("hi") ←引数あり result := say2(5,3) ←引数戻り値1つあり fmt.Println(result) result2, result3 := say3(5,2) ←引数戻り値2つあり fmt.Println(result2, result3) }実行すると以下が表示されます。
hello hi 8 7 3構造体を定義
type 構造体名 struct {
フィールド
}例)test.gopackage main type Dog struct { ←構造体 name string age int } func main(){ var s Dog ←構造体の初期化 (var 変数名 構造体名) s.name = "poko" s.age = 5 省略バージョン上記と同じ意味 s := Dog{"poko",5} 一部部分に代入 s := Dog{name: "poko} 又は s := Dog{age: 5} fmt.Println(s) }実行すると以下が表示されます。
{ poko 5 }メソッド
例)test.gopackage main type Dog struct { ←構造体 name string age int } func (s Dog) aa() { ←メソッドと構造体を関連付け (変数 構造体名) 変数() { fmt.Println(s.name,s.age) } こうする事で、構造体にアクセスできるようになる。 s.nameは構造体Dogのnameにアクセスして情報を取得できる func (s Dog) aa2(name string, age int) { ←引数あり fmt.Println(name,age) } func (s Dog) aa3(age int) int { ←引数あり戻り値あり return age*2 func main(){ a1 := Dog{"poko",5} a1.aa() ←引数なし a1.aa2("domu",6) ←引数あり result := a1.aa3(2) ←引数あり戻り値あり fmt.Println(result) }実行すると以下が表示されます。
poko 5 domu 6 4